Публичный API

Справочник по маршрутам, запросам, успешным ответам и ошибкам публичного api.

Общие правила

Base URL https://uapi.qform.io
Авторизация Все публичные маршруты требуют заголовок Authorization: Bearer <token>
Формат ответа Основной формат - JSON. Скачивание файла возвращает бинарный поток.
Пагинация Списковые методы используют параметры Spring Data: page, size, sort. Ответ может быть обернут в HATEOAS-структуру с _embedded, _links, page.

Типовые заголовки

Authorization: Bearer <token> Accept: application/json

Content-Type по типам запросов

Тип запроса Content-Type
Создание заявки application/x-www-form-urlencoded
Создание персональной ссылки application/x-www-form-urlencoded
Обновление статуса заявки application/x-www-form-urlencoded; charset=utf-8
Загрузка файла multipart/form-data

Ошибки

Ошибки возвращаются в едином JSON-формате. Поле details присутствует только когда есть детализация по полям.

{ "timestamp": "2026-05-19T00:00:00Z", "status": 422, "error": "Unprocessable Entity", "message": "Field 'name' is required", "details": { "name": "Field name is required" } }
HTTP status Когда возникает Примеры message
400 Bad Request Некорректный тип параметра, validation exception, неподдерживаемый content type, необработанная ошибка. Validation failed, Content-Type is not supported
401 Unauthorized Токен отсутствует, некорректен или не может быть обработан security-фильтром. Зависит от security layer.
403 Forbidden Доступ запрещен. Access denied
404 Not Found Не найден сайт, форма, заявка или файл. Site not found, Form not found, File not found
422 Unprocessable Entity Данные запроса не проходят бизнес-валидацию. Field 'data' contains invalid JSON, Invalid PersonalLinkDTO

Пользователь

GET /api/users/me

Возвращает данные пользователя по токену.

Успешный ответ: 200 OK

{ "id": 1, "username": "userName", "email": "user@example.com" }

Частые ошибки

401 Unauthorized при отсутствующем или некорректном bearer token.

Сайты

GET /api/sites/get

Возвращает сайты, доступные API-токену.

Query Тип Обязателен Описание
page number нет Номер страницы, по умолчанию 0.
size number нет Размер страницы, по умолчанию 10.
sort string нет Сортировка Spring Data, по умолчанию name,DESC.

Успешный ответ: 200 OK

{ "_embedded": { "siteDtoList": [ { "id": 43429, "name": "Main site" } ] }, "page": { "size": 10, "totalElements": 1, "totalPages": 1, "number": 0 } }

Формы и поля

GET /api/forms/get

Возвращает формы, доступные API-токену.

Query Тип Обязателен Описание
page number нет Номер страницы.
size number нет Размер страницы.
sort string нет Сортировка, по умолчанию id,DESC.

Успешный ответ: 200 OK

{ "_embedded": { "formDTOList": [ { "id": 21748, "name": "Lead form", "formId": "form_xxxxx", "status": 1 } ] }, "page": { "size": 10, "totalElements": 1, "totalPages": 1, "number": 0 } }

GET /api/forms/{id}/fields

Возвращает поля формы и варианты ответов для option-полей.

Path Тип Обязателен Описание
id number да ID формы.

Успешный ответ: 200 OK

[ { "id": 63309, "name": "fire_question_1", "typeId": "RADIO", "required": 1, "label": "Что необходимо сделать в первую очередь при обнаружении пожара?", "orderField": 1, "answerEvaluationEnabled": true, "options": [ { "key": "answer-1", "value": "Позвонить 101 или 112", "isCorrect": true, "comment": "Первым делом нужно вызвать пожарных." }, { "key": "answer-2", "value": "Размотать пожарный гидрант", "isCorrect": false, "comment": "Сначала нужно сообщить о пожаре." } ] } ]

Поля answerEvaluationEnabled, options[].isCorrect и options[].comment возвращаются для RADIO, если для поля настроена оценка правильных ответов.

Частые ошибки

404 Not Found или Forms not found, если форма не найдена или недоступна токену.

Заявки

GET /api/leads/get

Возвращает заявки, доступные API-токену.

Query Тип Обязателен Описание
dateFrom number нет Нижняя граница даты заявки. Если не передана, используется 0.
page, size, sort mixed нет Параметры пагинации. По умолчанию сортировка date,DESC.

Успешный ответ: 200 OK

{ "_embedded": { "leadDataDTOList": [ { "id": 405910, "date": 1715060000, "formId": 21748, "status": 1, "formName": "Lead form", "fields": { "name": "Ivan", "fire_question_1": "Позвонить 101 или 112" }, "correctAnswersResult": { "correctAnswersCount": 1, "wrongAnswersCount": 0, "allAnswersCount": 1, "correctAnswersPercent": 100 } } ] }, "page": { "size": 10, "totalElements": 1, "totalPages": 1, "number": 0 } }

GET /api/leads/get/{siteId}/{formId}

Возвращает заявки конкретной формы на конкретном сайте.

Параметр Тип Где Описание
siteId number path ID сайта.
formId number path ID формы.
dateFrom number query Нижняя граница даты заявки.
page, size, sort mixed query Параметры пагинации.

Успешный ответ: 200 OK

Формат ответа такой же, как у GET /api/leads/get.

Частые ошибки

404 Site not found, 404 Form not found.

GET /api/leads/get/data/{leadId}

Возвращает детальные данные одной заявки.

Path Тип Обязателен Описание
leadId number да ID заявки.

Успешный ответ: 200 OK

{ "id": 405910, "date": 1715060000, "formId": 21748, "status": 1, "formName": "Lead form", "fields": { "name": "Ivan", "fire_question_1": "Позвонить 101 или 112", "file_field": [ "https://uapi.qform.io/api/file/get/123" ] }, "fileInfo": { "123": { "fileSize": 102400, "fileName": "file.pdf" } }, "leadInfo": { "referer_host": "example.com", "referer_path": "/page", "utm_source": "ads" }, "userInfo": { "yandex_client_id": "12345", "google_client_id": null }, "comments": [], "correctAnswersResult": { "correctAnswersCount": 1, "wrongAnswersCount": 0, "allAnswersCount": 1, "correctAnswersPercent": 100 }, "answerMeta": { "fire_question_1": { "answerType": "correct", "comment": "Первым делом нужно вызвать пожарных.", "correctAnswer": "Позвонить 101 или 112" } } }

fields остается картой фактических ответов. Метаданные правильных ответов находятся рядом в correctAnswersResult и answerMeta.

Частые ошибки

404 Lead or form not found, 404 Site not found.

POST /api/leads/update-status/

Обновляет статус заявки.

Content-Type: application/x-www-form-urlencoded; charset=utf-8

Form field Тип Обязателен Описание
leadId number да ID заявки.
status number да Новый статус. Разрешены значения -1, 0, 1, 2, 3, 4.

Успешный ответ: 200 OK

Возвращает детальную структуру заявки, как GET /api/leads/get/data/{leadId}.

POST /api/leads/{id}/add

Создает заявку в форме.

Content-Type: application/x-www-form-urlencoded

Параметр Тип Где Обязателен Описание
id number path да ID формы.
status number form да Статус заявки, должен быть от 0 до 4.
leadStatus number form нет Статус, который сохраняется в заявке.
data string form нет JSON-массив как строка. Формат описан в разделе Формат data.
siteSource, pageSource string form нет Источник сайта и страницы.
utm_source, utm_medium, utm_campaign, utm_content, utm_term string form нет UTM-метки.
timeZone, device, userAgent, advAgree, ip, os, isUserAgree mixed form нет Дополнительные параметры заявки.
personalToken string form нет Токен персональной ссылки, если заявка создается по предзаполненной заявке.

Успешный ответ: 201 Created

{ "id": 405910 }

Частые ошибки

422 Field 'data' contains invalid JSON, 422 Field '...' is invalid, 400 Validation failed.

Персональные ссылки

Файлы

POST /api/file/upload

Загружает файл во временную директорию temporary/.... Затем возвращенный payload используется в data при создании заявки или персональной ссылки.

Content-Type: multipart/form-data

Параметр Тип Где Обязателен Описание
formId number query да ID формы.
fieldName string query да Имя file-поля формы.
file file form-data да Загружаемый файл.

Успешный ответ: 200 OK

{ "file_id": "uuid-file-id", "filename": "file.pdf", "objectKey": "temporary/uuid_file.pdf" }

Частые ошибки

400 Content-Type is not supported, 404 Form not found, 422 Field is not file, ошибки размера или типа файла.

GET /api/file/get/{id}

Скачивает файл, привязанный к записи qform_lead_data.

Path Тип Обязателен Описание
id number да ID записи qform_lead_data с типом FILE.

Успешный ответ: 200 OK

Возвращает бинарный поток с заголовками Content-Type: application/octet-stream и Content-Disposition: attachment.

Частые ошибки

404 File not found, 404 Lead or form not found, 404 Site not found.

Формат data

data передается как строка с JSON-массивом. Это не raw JSON body, а form field внутри application/x-www-form-urlencoded.

Базовые правила

  • name обязателен и должен соответствовать реальному имени поля формы.
  • Корневой key не поддерживается.
  • Для single-value полей используется value.
  • Для multi-value полей используется values.
  • Нельзя передавать value и values вместе.
  • readOnly разрешен только в POST /api/personal/{id}/add.
  • Для option-based multi fields, например CHECKBOX и VOTE, достаточно передавать values[].key. Значение option label сервис возьмет из БД.

Single text field

[ { "name": "form_123_text_x", "value": "Ivan" } ]

Single option fields

Для RADIO, SELECT, CIRCLE, SLIDER передается ключ выбранной опции в value.

[ { "name": "form_123_radio_x", "value": "radio_option_1" } ]

Checkbox

[ { "name": "form_123_checkbox_x", "values": [ { "key": "checkbox_option_1" }, { "key": "checkbox_option_2" } ] } ]

Vote

[ { "name": "form_123_vote_x", "values": [ { "key": "vote_option_1" }, { "key": "vote_option_2" } ] } ]

Rating, Smile, Numeric Scale

[ { "name": "form_123_rating_x", "value": "4" }, { "name": "form_123_smile_x", "value": "5" }, { "name": "form_123_scale_x", "value": "7" } ]

File, single

Сначала файл загружается через POST /api/file/upload. Затем возвращенный objectKey передается в data.

[ { "name": "form_123_file_x", "value": "{\"objectKey\":\"temporary/uuid_file.pdf\",\"filename\":\"file.pdf\"}" } ]

File, multiple

[ { "name": "form_123_file_x", "values": [ { "key": "temporary/uuid_file_1.pdf", "value": "{\"objectKey\":\"temporary/uuid_file_1.pdf\",\"filename\":\"file1.pdf\"}" }, { "key": "temporary/uuid_file_2.pdf", "value": "{\"objectKey\":\"temporary/uuid_file_2.pdf\",\"filename\":\"file2.pdf\"}" } ] } ]

Personal link prefill with readOnly

[ { "name": "form_123_text_x", "value": "Ivan", "readOnly": true }, { "name": "form_123_checkbox_x", "values": [ { "key": "checkbox_option_1" } ], "readOnly": true } ]

Поддерживаемые dynamic field types

CHECKBOX, DATE, FILE, RATING, RADIO, SELECT, TEXTAREA, TEXT, TIME, PHONE, HIDDEN, EMAIL, NUMBER, RANDOMIZER, VOTE, SMILE, CIRCLE, NUMERIC_SCALE, AUTH, SLIDER.

Static/display field types

Обычно не передаются в data: SUBMIT, TEXT_BLOCK, IMAGE, VIDEOWIDGET, VIDEOGALLERY, IMAGEGALLERY, LINK.

Оставить комментарий