Form Make

JSON-схема экспорта и импорта форм

Полная спецификация JSON-структуры форм платформы Form Make. Используйте этот документ для программного создания форм через функцию импорта.

При импорте поле id корневого объекта игнорируется и генерируется автоматически. Поля updatedAt и createdAt устанавливаются сервером.


Корневой объект

ПолеТипОбязательноеОписание
titlestringДаНазвание формы
descriptionstring | nullНетОписание формы
settingsobjectДаОбъект настроек формы
questionsarrayДаМассив вопросов и разделов

Настройки формы (settings)

Объект settings содержит четыре блока конфигурации.

Основные (settings.main)

ПолеТипПо умолчаниюОписание
requiredQuestionsByDefaultbooleantrueНовые вопросы обязательны по умолчанию
disableCopybooleanfalseЗапретить копирование текста формы
showAnswersbooleantrueПоказывать ответы респонденту после прохождения
showCorrectAnswersbooleantrueПоказывать правильные ответы
isUserAuthnumber0Авторизация: 0 — анонимный доступ, 1 — требуется авторизация
acceptUntilnumber0Дедлайн приёма ответов (Unix timestamp, мс). 0 — без ограничений
attemptsAllowednumber1Количество допустимых попыток прохождения

Оценивание (settings.mark)

ПолеТипОписание
typenumberРежим оценивания: 2 — включено
systemnumber | nullШкала оценивания: 5 — пятибалльная
marksarrayМассив оценок с порогами

Каждый элемент массива marks:

ПолеТипОписание
markstringОценка (например "5", "4")
ballnumberМинимальный порог баллов в процентах (0–100)
namestringНазвание оценки (например "Отлично")

Пример:

json"mark": {
  "type": 2,
  "system": 5,
  "marks": [
    { "mark": "5", "ball": 85, "name": "Отлично" },
    { "mark": "4", "ball": 70, "name": "Хорошо" },
    { "mark": "3", "ball": 50, "name": "Удовлетворительно" },
    { "mark": "2", "ball": 25, "name": "Неудовлетворительно" },
    { "mark": "1", "ball": 0, "name": "Очень плохо" }
  ]
}

Дополнительные (settings.other)

ПолеТипПо умолчаниюОписание
isViewValidQuestionbooleantrueПодсвечивать валидность вопросов при заполнении
isViewFinalResultbooleanfalseПоказывать финальный результат
enabledRealTimeAcceptUntillbooleanfalseВключить таймер обратного отсчёта
durationRealTimeAcceptUntillnumber60000Длительность таймера в миллисекундах

Кастомизация (settings.customization)

ПолеТипОписание
themestringЦветовая тема формы (например "lime", "blue", "violet", "rose")

Структура вопроса

Каждый элемент массива questions — это объект вопроса. Все типы вопросов разделяют общий набор полей.

Общие поля

ПолеТипОписание
idstringУникальный идентификатор (UUID v7)
typestringТип вопроса (см. раздел «Типы вопросов»)
titlestringТекст вопроса или заголовок
requiredbooleanОбязательный ли вопрос для заполнения
only_correctbooleanРежим проверки правильных ответов
settingsobjectНастройки вопроса
answersarrayВарианты ответов
criterionsarrayКритерии (для табличных/матричных вопросов и сопоставления)
correctIdsstring[]Массив ID правильных ответов

Настройки вопроса (question.settings)

ПолеТипОписание
ballsbooleanВключена ли балловая оценка за вопрос
balls_countnumberКоличество баллов за правильный ответ
orderstringСортировка вариантов: "not" — без сортировки, "word" — по алфавиту, "random" — случайный порядок

Дополнительные поля (необязательные)

ПолеТипОписание
descriptionstring | nullОписание/инструкция к вопросу
enabledDescriptionbooleanПоказывать ли описание
bannerstring | nullURL изображения-баннера вопроса
commentstring | nullКомментарий автора
helpobject | nullПодсказка для респондента

Объект help:

ПолеТипОписание
valuestringТекст подсказки
ballnumberШтраф в баллах за использование подсказки

Типы вопросов

Все доступные значения поля type:

ТипНазваниеКатегория
input_textВвод текстаТекст
textТекст (без вопроса)Текст
phoneНомер телефонаТекст
emailЭлектронная почтаТекст
numberЧислоТекст
linkСсылкаТекст
optionОдин вариантВыбор из вариантов
optionsНесколько вариантовВыбор из вариантов
choice_gridОценка по шкалеВыбор из вариантов
multi_choice_gridОценка по шкале (Мн. выбор)Выбор из вариантов
comparisonСопоставлениеВыбор из вариантов
orderУказание порядкаВыбор из вариантов
filling_gapsЗаполнение пропусковВыбор из вариантов
fileЗагрузка файловДругое
sectionРаздел (этап)Другое

input_text — Ввод текста

Поле для свободного текстового ввода. Поддерживает проверку правильного ответа по точному совпадению.

  • answers — массив с одним элементом, содержащим эталонный ответ ({ id, label }). Пустой массив, если правильный ответ не задан.
  • correctIds — массив с id правильного ответа из answers.
  • settings.ballstrue для включения начисления баллов.
  • help — необязательная подсказка.
json{
  "id": "q1",
  "type": "input_text",
  "title": "Назовите столицу Франции",
  "answers": [
    { "id": "a1", "label": "Париж" }
  ],
  "correctIds": ["a1"],
  "criterions": [],
  "required": true,
  "only_correct": true,
  "settings": { "balls": true, "balls_count": 2, "order": "not" },
  "description": "Введите название города",
  "enabledDescription": true,
  "help": { "value": "Город на Сене", "ball": 1 }
}

text — Информационный блок

Текстовый блок без поля для ответа. Используется для инструкций, пояснений и промежуточных комментариев внутри формы.

  • answers — всегда пустой массив.
  • correctIds — не используется.
  • settings.ballsfalse.
json{
  "id": "q2",
  "type": "text",
  "title": "Внимательно прочитайте условия перед следующим блоком вопросов",
  "answers": [],
  "correctIds": [],
  "criterions": [],
  "required": true,
  "only_correct": false,
  "settings": { "balls": false, "order": "not", "balls_count": 1 }
}

phone — Номер телефона

Поле ввода с маской телефонного номера. Без проверки правильного ответа.

json{
  "id": "q3",
  "type": "phone",
  "title": "Укажите контактный номер телефона",
  "answers": [],
  "correctIds": [],
  "criterions": [],
  "required": true,
  "only_correct": false,
  "settings": {}
}

email — Электронная почта

Поле ввода с валидацией формата email. Без проверки правильного ответа.

json{
  "id": "q4",
  "type": "email",
  "title": "Введите ваш адрес электронной почты",
  "answers": [],
  "correctIds": [],
  "criterions": [],
  "required": true,
  "only_correct": false,
  "settings": {}
}

number — Число

Поле для ввода числового значения. Поддерживает проверку правильного ответа.

  • answers — массив с одним элементом, содержащим правильное число в виде строки.
  • correctIds — массив с id правильного ответа.
json{
  "id": "q5",
  "type": "number",
  "title": "Сколько будет 2 + 2?",
  "answers": [
    { "id": "a5", "label": "4" }
  ],
  "correctIds": ["a5"],
  "criterions": [],
  "required": true,
  "only_correct": false,
  "settings": { "balls": true, "balls_count": 1, "order": "not" }
}

Поле ввода с валидацией формата URL. Без проверки правильного ответа.

json{
  "id": "q6",
  "type": "link",
  "title": "Укажите ссылку на ваш GitHub-репозиторий",
  "answers": [],
  "correctIds": [],
  "criterions": [],
  "required": true,
  "only_correct": false,
  "settings": {}
}

option — Один вариант ответа

Вопрос с выбором одного правильного варианта из нескольких.

  • answers — массив вариантов ответа ({ id, label }).
  • correctIds — массив с одним id правильного варианта.
  • settings.order — сортировка: "not", "word", "random".
json{
  "id": "q7",
  "type": "option",
  "title": "Какой HTTP-метод используется для получения данных?",
  "answers": [
    { "id": "a7-1", "label": "GET" },
    { "id": "a7-2", "label": "POST" },
    { "id": "a7-3", "label": "DELETE" },
    { "id": "a7-4", "label": "PATCH" }
  ],
  "correctIds": ["a7-1"],
  "criterions": [],
  "required": true,
  "only_correct": true,
  "settings": { "balls": true, "balls_count": 1, "order": "not" }
}

options — Несколько вариантов ответа

Вопрос с выбором нескольких правильных вариантов (чекбоксы).

  • answers — массив вариантов.
  • correctIds — массив id всех правильных вариантов.
json{
  "id": "q8",
  "type": "options",
  "title": "Выберите технологии, относящиеся к Frontend",
  "answers": [
    { "id": "a8-1", "label": "HTML5" },
    { "id": "a8-2", "label": "CSS3" },
    { "id": "a8-3", "label": "React" },
    { "id": "a8-4", "label": "PostgreSQL" },
    { "id": "a8-5", "label": "Docker" }
  ],
  "correctIds": ["a8-1", "a8-2", "a8-3"],
  "criterions": [],
  "required": true,
  "only_correct": true,
  "settings": { "balls": true, "balls_count": 1, "order": "random" }
}

choice_grid — Оценка по шкале

Матричный вопрос: для каждой строки (критерия) респондент выбирает один вариант из столбцов. Используется для шкальных оценок.

  • answers — столбцы (шкала значений).
  • criterions — строки (оцениваемые критерии), формат: { id, label }.
  • correctIds — обычно пустой (субъективная оценка).
json{
  "id": "q9",
  "type": "choice_grid",
  "title": "Оцените ваш уровень владения (от 1 до 5)",
  "answers": [
    { "id": "col-1", "label": "1" },
    { "id": "col-2", "label": "2" },
    { "id": "col-3", "label": "3" },
    { "id": "col-4", "label": "4" },
    { "id": "col-5", "label": "5" }
  ],
  "criterions": [
    { "id": "row-1", "label": "HTML/CSS" },
    { "id": "row-2", "label": "JavaScript" },
    { "id": "row-3", "label": "React" }
  ],
  "correctIds": [],
  "required": true,
  "only_correct": false,
  "settings": { "balls": false, "order": "not", "balls_count": 1 }
}

multichoicegrid — Оценка по шкале (Мн. выбор)

Матричный вопрос с множественным выбором: для каждой строки можно отметить несколько столбцов.

  • answers — столбцы таблицы.
  • criterions — строки таблицы.
  • correctIds — массив строк формата "criterionId:answerId", задающий правильные пары «строка:столбец».
json{
  "id": "q10",
  "type": "multi_choice_grid",
  "title": "Сопоставьте технологии с областями применения",
  "answers": [
    { "id": "col-1", "label": "React" },
    { "id": "col-2", "label": "Python" },
    { "id": "col-3", "label": "PostgreSQL" }
  ],
  "criterions": [
    { "id": "row-1", "label": "Frontend" },
    { "id": "row-2", "label": "Backend" },
    { "id": "row-3", "label": "Базы данных" }
  ],
  "correctIds": [
    "row-1:col-1",
    "row-2:col-2",
    "row-3:col-3"
  ],
  "required": true,
  "only_correct": false,
  "settings": { "balls": true, "balls_count": 1, "order": "not" }
}

comparison — Сопоставление

Задание на установление соответствия: каждому элементу левого столбца (answers) нужно сопоставить элемент правого столбца (criterions).

  • answers — элементы левого столбца ({ id, label }).
  • criterions — элементы правого столбца. Каждый критерий содержит поле answerId, указывающее на id соответствующего ответа из answers.
  • correctIds — обычно пустой, связь задаётся через answerId в criterions.
json{
  "id": "q11",
  "type": "comparison",
  "title": "Сопоставьте HTTP-коды с их значениями",
  "answers": [
    { "id": "left-1", "label": "200" },
    { "id": "left-2", "label": "404" },
    { "id": "left-3", "label": "500" }
  ],
  "criterions": [
    { "id": "right-1", "label": "OK", "answerId": "left-1" },
    { "id": "right-2", "label": "Not Found", "answerId": "left-2" },
    { "id": "right-3", "label": "Internal Server Error", "answerId": "left-3" }
  ],
  "correctIds": [],
  "required": true,
  "only_correct": false,
  "settings": { "balls": true, "balls_count": 1, "order": "not" }
}

order — Указание порядка

Респондент расставляет элементы в правильном порядке. Порядок элементов в массиве answers — это правильный порядок.

  • answers — элементы в правильном порядке. При отображении перемешиваются (если settings.order = "random").
  • correctIds — обычно пустой, правильный порядок определяется позицией в массиве.
json{
  "id": "q12",
  "type": "order",
  "title": "Расположите этапы разработки в правильном порядке",
  "answers": [
    { "id": "s1", "label": "Анализ требований" },
    { "id": "s2", "label": "Проектирование" },
    { "id": "s3", "label": "Разработка" },
    { "id": "s4", "label": "Тестирование" },
    { "id": "s5", "label": "Развёртывание" }
  ],
  "criterions": [],
  "correctIds": [],
  "required": true,
  "only_correct": false,
  "settings": { "balls": true, "balls_count": 1, "order": "random" }
}

filling_gaps — Заполнение пропусков

Составной вопрос: текст с вставленными полями ввода и выпадающими списками. Массив answers содержит фрагменты трёх типов:

Тип фрагментаОписание
textСтатический текст
inputПоле ввода с вариантами (options)
selectВыпадающий список с вариантами (options)
  • answers[].type — тип фрагмента: "text", "input" или "select".
  • answers[].label — текст для фрагментов типа "text".
  • answers[].options — массив вариантов для "input" и "select" ({ id, label }).
  • correctIds — массив id правильных вариантов из options полей input и select.
json{
  "id": "q13",
  "type": "filling_gaps",
  "title": "Заполните пропуски в определении",
  "answers": [
    { "id": "f1", "type": "text", "label": "HTML расшифровывается как " },
    {
      "id": "f2",
      "type": "select",
      "options": [
        { "id": "opt-1", "label": "HyperText Markup Language" },
        { "id": "opt-2", "label": "HighText Machine Language" },
        { "id": "opt-3", "label": "HyperTool Multi Language" }
      ]
    },
    { "id": "f3", "type": "text", "label": ". Файлы имеют расширение " },
    {
      "id": "f4",
      "type": "input",
      "options": [
        { "id": "opt-4", "label": ".html" }
      ]
    }
  ],
  "correctIds": ["opt-1", "opt-4"],
  "criterions": [],
  "required": true,
  "only_correct": false,
  "settings": { "balls": true, "balls_count": 1 }
}

file — Загрузка файлов

Поле для загрузки файла респондентом. Без проверки правильного ответа.

json{
  "id": "q14",
  "type": "file",
  "title": "Загрузите скриншот выполненного задания",
  "answers": [],
  "correctIds": [],
  "criterions": [],
  "required": true,
  "only_correct": false,
  "settings": { "balls": false, "order": "not", "balls_count": 1 }
}

section — Раздел (этап)

Разделитель, который делит форму на логические этапы (страницы). Не является вопросом — используется для структурирования формы.

  • enabledTitle — отображать ли заголовок раздела.
  • enabledDescription — отображать ли описание раздела.
  • banner — URL баннера раздела.
  • settings.order — порядок вопросов внутри раздела: "not" — по порядку, "random" — случайный.

Первый элемент массива questions всегда является разделом — это корневой этап формы. Каждый последующий элемент section начинает новый этап.

json{
  "id": "sec-1",
  "type": "section",
  "title": "Теоретическая часть",
  "answers": [],
  "criterions": [],
  "required": true,
  "only_correct": true,
  "settings": { "order": "not" },
  "description": "Ответьте на вопросы по теории",
  "enabledTitle": true,
  "enabledDescription": true
}

Готовый пример для импорта

Полный пример JSON-формы, готовый для импорта через функцию «Импорт формы»:

json{
  "title": "Тестирование по основам веб-разработки",
  "description": "Демонстрационная форма с различными типами вопросов",
  "settings": {
    "main": {
      "requiredQuestionsByDefault": true,
      "disableCopy": false,
      "showAnswers": true,
      "showCorrectAnswers": true,
      "isUserAuth": 0,
      "acceptUntil": 0,
      "attemptsAllowed": 1
    },
    "mark": {
      "type": 2,
      "system": 5,
      "marks": [
        { "mark": "5", "ball": 85, "name": "Отлично" },
        { "mark": "4", "ball": 70, "name": "Хорошо" },
        { "mark": "3", "ball": 50, "name": "Удовлетворительно" },
        { "mark": "2", "ball": 0, "name": "Неудовлетворительно" }
      ]
    },
    "other": {
      "isViewValidQuestion": true,
      "isViewFinalResult": false,
      "enabledRealTimeAcceptUntill": false,
      "durationRealTimeAcceptUntill": 60000
    },
    "customization": {
      "theme": "lime"
    }
  },
  "questions": [
    {
      "id": "sec-1",
      "type": "section",
      "title": "Основы HTML и CSS",
      "answers": [],
      "criterions": [],
      "required": true,
      "only_correct": true,
      "settings": { "order": "not" },
      "description": "Вопросы по базовым технологиям фронтенда",
      "enabledTitle": true,
      "enabledDescription": true
    },
    {
      "id": "q-1",
      "type": "option",
      "title": "Какой тег используется для создания гиперссылки в HTML?",
      "answers": [
        { "id": "a1", "label": "<a>" },
        { "id": "a2", "label": "<link>" },
        { "id": "a3", "label": "<href>" },
        { "id": "a4", "label": "<url>" }
      ],
      "correctIds": ["a1"],
      "criterions": [],
      "required": true,
      "only_correct": true,
      "settings": { "balls": true, "balls_count": 1, "order": "not" }
    },
    {
      "id": "q-2",
      "type": "options",
      "title": "Выберите валидные CSS-свойства",
      "answers": [
        { "id": "b1", "label": "color" },
        { "id": "b2", "label": "font-size" },
        { "id": "b3", "label": "text-bold" },
        { "id": "b4", "label": "margin" },
        { "id": "b5", "label": "box-color" }
      ],
      "correctIds": ["b1", "b2", "b4"],
      "criterions": [],
      "required": true,
      "only_correct": true,
      "settings": { "balls": true, "balls_count": 2, "order": "random" }
    },
    {
      "id": "q-3",
      "type": "input_text",
      "title": "Какое CSS-свойство задаёт цвет текста?",
      "answers": [
        { "id": "c1", "label": "color" }
      ],
      "correctIds": ["c1"],
      "criterions": [],
      "required": true,
      "only_correct": true,
      "settings": { "balls": true, "balls_count": 1, "order": "not" },
      "help": { "value": "Подсказка: это английское слово", "ball": 1 }
    },
    {
      "id": "sec-2",
      "type": "section",
      "title": "Практическая часть",
      "answers": [],
      "criterions": [],
      "required": true,
      "only_correct": true,
      "settings": { "order": "not" },
      "enabledTitle": true,
      "enabledDescription": false
    },
    {
      "id": "q-4",
      "type": "comparison",
      "title": "Сопоставьте HTML-теги с их назначением",
      "answers": [
        { "id": "d1", "label": "<p>" },
        { "id": "d2", "label": "<h1>" },
        { "id": "d3", "label": "<img>" }
      ],
      "criterions": [
        { "id": "e1", "label": "Параграф", "answerId": "d1" },
        { "id": "e2", "label": "Заголовок", "answerId": "d2" },
        { "id": "e3", "label": "Изображение", "answerId": "d3" }
      ],
      "correctIds": [],
      "required": true,
      "only_correct": false,
      "settings": { "balls": true, "balls_count": 1, "order": "not" }
    },
    {
      "id": "q-5",
      "type": "order",
      "title": "Расположите теги в порядке вложенности HTML-документа",
      "answers": [
        { "id": "f1", "label": "<!DOCTYPE html>" },
        { "id": "f2", "label": "<html>" },
        { "id": "f3", "label": "<head>" },
        { "id": "f4", "label": "<body>" }
      ],
      "criterions": [],
      "correctIds": [],
      "required": true,
      "only_correct": false,
      "settings": { "balls": true, "balls_count": 1, "order": "random" }
    }
  ]
}