GET /api/users/me
Возвращает данные пользователя по токену.
Успешный ответ: 200 OK
{ "id": 1, "username": "userName", "email": "user@example.com" } Частые ошибки
401 Unauthorized при отсутствующем или некорректном bearer token.
Справочник по маршрутам, запросам, успешным ответам и ошибкам публичного 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 |
|---|---|
| Создание заявки | 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 |
Возвращает данные пользователя по токену.
{ "id": 1, "username": "userName", "email": "user@example.com" } 401 Unauthorized при отсутствующем или некорректном bearer token.
Возвращает сайты, доступные API-токену.
| Query | Тип | Обязателен | Описание |
|---|---|---|---|
page | number | нет | Номер страницы, по умолчанию 0. |
size | number | нет | Размер страницы, по умолчанию 10. |
sort | string | нет | Сортировка Spring Data, по умолчанию name,DESC. |
{ "_embedded": { "siteDtoList": [ { "id": 43429, "name": "Main site" } ] }, "page": { "size": 10, "totalElements": 1, "totalPages": 1, "number": 0 } } Возвращает формы, доступные API-токену.
| Query | Тип | Обязателен | Описание |
|---|---|---|---|
page | number | нет | Номер страницы. |
size | number | нет | Размер страницы. |
sort | string | нет | Сортировка, по умолчанию id,DESC. |
{ "_embedded": { "formDTOList": [ { "id": 21748, "name": "Lead form", "formId": "form_xxxxx", "status": 1 } ] }, "page": { "size": 10, "totalElements": 1, "totalPages": 1, "number": 0 } } Возвращает поля формы и варианты ответов для option-полей.
| Path | Тип | Обязателен | Описание |
|---|---|---|---|
id | number | да | ID формы. |
[ { "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, если форма не найдена или недоступна токену.
Возвращает заявки, доступные API-токену.
| Query | Тип | Обязателен | Описание |
|---|---|---|---|
dateFrom | number | нет | Нижняя граница даты заявки. Если не передана, используется 0. |
page, size, sort | mixed | нет | Параметры пагинации. По умолчанию сортировка date,DESC. |
{ "_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 } } Возвращает заявки конкретной формы на конкретном сайте.
| Параметр | Тип | Где | Описание |
|---|---|---|---|
siteId | number | path | ID сайта. |
formId | number | path | ID формы. |
dateFrom | number | query | Нижняя граница даты заявки. |
page, size, sort | mixed | query | Параметры пагинации. |
Формат ответа такой же, как у GET /api/leads/get.
404 Site not found, 404 Form not found.
Возвращает детальные данные одной заявки.
| Path | Тип | Обязателен | Описание |
|---|---|---|---|
leadId | number | да | ID заявки. |
{ "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.
Обновляет статус заявки.
Content-Type: application/x-www-form-urlencoded; charset=utf-8
| Form field | Тип | Обязателен | Описание |
|---|---|---|---|
leadId | number | да | ID заявки. |
status | number | да | Новый статус. Разрешены значения -1, 0, 1, 2, 3, 4. |
Возвращает детальную структуру заявки, как GET /api/leads/get/data/{leadId}.
Создает заявку в форме.
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 | нет | Токен персональной ссылки, если заявка создается по предзаполненной заявке. |
{ "id": 405910 } 422 Field 'data' contains invalid JSON, 422 Field '...' is invalid, 400 Validation failed.
Создает одну или несколько персональных ссылок и сохраняет prefill-данные.
Content-Type: application/x-www-form-urlencoded
| Параметр | Тип | Где | Обязателен | Описание |
|---|---|---|---|---|
id | number | path | да | ID формы. |
name | string | form | да | Название персональной ссылки. |
isActive | boolean | form | да | Активность ссылки. |
isMulti | boolean | form | да | Многоразовая ссылка или нет. |
link_count или linkCount | number | form | нет | Количество ссылок, по умолчанию 1, допустимый диапазон 1..100. |
data | string | form | нет | JSON-массив как строка. В этом route разрешено поле readOnly. |
leadStatus, siteSource, pageSource, UTM, timeZone, device, userAgent, advAgree, ip, os, isUserAgree | mixed | form | нет | Дополнительные параметры prefill. |
{ "id": 10, "name": "Personal link name", "personalLink": "https://.../token" } { "items": [ { "id": 10, "name": "Personal link name 1", "personalLink": "https://.../token-1" }, { "id": 11, "name": "Personal link name 2", "personalLink": "https://.../token-2" } ] } 422 Invalid PersonalLinkDTO, 422 Field link_count must be between 1 and 100, 422 Error creating personal link.
Возвращает персональные ссылки формы.
| Параметр | Тип | Где | Описание |
|---|---|---|---|
siteId | number | path | ID сайта. |
formId | number | path | ID формы. |
page, size, sort | mixed | query | Параметры пагинации. По умолчанию сортировка id,DESC. |
{ "_embedded": { "personalLinkDTOList": [ { "id": 10, "name": "Personal link name", "isActive": true, "isMulti": false, "status": 0, "url": "token" } ] }, "page": { "size": 10, "totalElements": 1, "totalPages": 1, "number": 0 } } Загружает файл во временную директорию temporary/.... Затем возвращенный payload используется в data при создании заявки или персональной ссылки.
Content-Type: multipart/form-data
| Параметр | Тип | Где | Обязателен | Описание |
|---|---|---|---|---|
formId | number | query | да | ID формы. |
fieldName | string | query | да | Имя file-поля формы. |
file | file | form-data | да | Загружаемый файл. |
{ "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, ошибки размера или типа файла.
Скачивает файл, привязанный к записи qform_lead_data.
| Path | Тип | Обязателен | Описание |
|---|---|---|---|
id | number | да | ID записи qform_lead_data с типом FILE. |
Возвращает бинарный поток с заголовками Content-Type: application/octet-stream и Content-Disposition: attachment.
404 File not found, 404 Lead or form not found, 404 Site not found.
data передается как строка с JSON-массивом. Это не raw JSON body, а form field внутри application/x-www-form-urlencoded.
name обязателен и должен соответствовать реальному имени поля формы.key не поддерживается.value.values.value и values вместе.readOnly разрешен только в POST /api/personal/{id}/add.CHECKBOX и VOTE, достаточно передавать values[].key. Значение option label сервис возьмет из БД.[ { "name": "form_123_text_x", "value": "Ivan" } ] Для RADIO, SELECT, CIRCLE, SLIDER передается ключ выбранной опции в value.
[ { "name": "form_123_radio_x", "value": "radio_option_1" } ] [ { "name": "form_123_checkbox_x", "values": [ { "key": "checkbox_option_1" }, { "key": "checkbox_option_2" } ] } ] [ { "name": "form_123_vote_x", "values": [ { "key": "vote_option_1" }, { "key": "vote_option_2" } ] } ] [ { "name": "form_123_rating_x", "value": "4" }, { "name": "form_123_smile_x", "value": "5" }, { "name": "form_123_scale_x", "value": "7" } ] Сначала файл загружается через POST /api/file/upload. Затем возвращенный objectKey передается в data.
[ { "name": "form_123_file_x", "value": "{\"objectKey\":\"temporary/uuid_file.pdf\",\"filename\":\"file.pdf\"}" } ] [ { "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\"}" } ] } ] [ { "name": "form_123_text_x", "value": "Ivan", "readOnly": true }, { "name": "form_123_checkbox_x", "values": [ { "key": "checkbox_option_1" } ], "readOnly": true } ] CHECKBOX, DATE, FILE, RATING, RADIO, SELECT, TEXTAREA, TEXT, TIME, PHONE, HIDDEN, EMAIL, NUMBER, RANDOMIZER, VOTE, SMILE, CIRCLE, NUMERIC_SCALE, AUTH, SLIDER.
Обычно не передаются в data: SUBMIT, TEXT_BLOCK, IMAGE, VIDEOWIDGET, VIDEOGALLERY, IMAGEGALLERY, LINK.
Оставить комментарий