К содержанию
API v3

Опросы

Управление опросом

История публикаций и корзина, пароли и QR-код, папки и шаблоны, сборка опроса по описанию

Markdown для нейросетей Актуально на 21.09.2026

История публикаций и восстановление

Требуют право участника settings: история и возврат — это правка опроса.


61. История публикаций опроса

В API с 08.09.2026

Каждая публикация оставляет снимок. Черновик в историю не входит — это текущее состояние, а не точка в ней.

GET/quiz/{id}/versions

Параметр Тип Описание
page integer Страница, по умолчанию 1.
per_page integer 1–50, по умолчанию 20. Снимок весит немало: это полная структура опроса.

Список публикаций приходит полем items, рядом — total, page, per_page, last_page.


62. Вернуть опрос к прежней публикации

В API с 08.09.2026

POST/quiz/{id}/versions/{versionId}/restore

Возврат ложится в черновик: респонденты продолжают видеть опубликованную версию, пока опрос не опубликуют заново. В ответе это отражено полем published: false.

JSON
{"status": true, "quiz_id": 18547, "version_id": 90412, "published": false, "quiz": {...}}

Неизвестная версия, версия другого опроса или попытка вернуть текущий черновик — 400 с кодом restore_failed и пояснением в message. Опрос под оплаченной кампанией за респондентов — 423, см. «Заморозка опроса кампанией» ниже.


Заморозка опроса кампанией

С 2026-09-18.

Пока по опросу идёт оплаченная кампания за респондентов, его состав менять нельзя: респонденты проходят то, что оплачено и промодерировано. До оплаты правки открыты — сумма пересчитывается перед платежом.

Под замком: POST /quiz/{id}/save, POST /quiz/{id}/publish, POST /quiz/{id}/conditions, POST /quiz/{id}/versions/{versionId}/restore. Настройки опроса (POST /quiz/{id}/settings/info), интеграции, темы и работа с ответами замком не закрыты — так же, как в конструкторе.

Отказ — 423 с состоянием замка:

JSON
{
    "status": false,
    "editing_lock": {
        "locked": true,
        "can_edit": false,
        "reason": "respondent_campaign",
        "campaign": {"id": 7, "title": "Кампания #1", "status": "in_progress"}
    }
}

То же состояние приходит в GET /quiz/{id} полем editing_lock (там null, когда замка нет) — по нему видно заранее, что правка не пройдёт, и почему. Замок снимается сам по завершении кампании; снять его досрочно может только поддержка.


63. Вернуть опросы из корзины

В API с 08.09.2026

POST/workspace/{workspace_id}/quiz/restore

Поле Тип Обязательное Описание
ids array Да Идентификаторы опросов.

Требует право delete_quiz: возврат отдаёт опрос обратно тому, кто его удалил. Без права — 403 с blocked_by_access: true.

Возвращённый опрос снова занимает место в тарифе, поэтому лимит проверяется до возврата: 403 с blocked_by_tariff: true. Это строже, чем в кабинете, где возврат из корзины лимит не проверяет, — иначе лимит обходится через корзину.


Пароли доступа, QR-код и печать

Всё в этом разделе требует право участника settings.


94. Пароли доступа к закрытому опросу

В API с 08.09.2026

Действие HTTP
Список GET /quiz/{id}/passwords
Завести POST /quiz/{id}/passwords с полем password или списком passwords
Сменить значение POST /quiz/{id}/passwords/{passwordId} с полем password
Удалить DELETE /quiz/{id}/passwords/{passwordId}

Одинаковые значения внутри одной пачки записываются один раз: два одинаковых пароля получили бы разные номера, и номер в ответах перестал бы однозначно указывать на респондента. С уже выданными паролями значение не сверяется — они хранятся хешами.

Сами пароли не возвращаются ни в одном ответе — они хранятся хешами. Виден номер пароля: он оседает в визите и по нему автор узнаёт респондента в ответах.

Пачка ограничена 50 значениями за вызов. Ограничение намеренное: bcrypt стоит около 50 мс на пароль, и пятьсот значений упирались бы в таймаут, откатывая всю пачку. На большее число делайте несколько вызовов.

Номера не переиспользуются после удаления: повторно выданный номер слил бы прежнего респондента с новым.

JSON
{"status": true, "quiz_id": 18547, "added": 3,
 "passwords": [{"password_id": 91, "number": 1}, {"password_id": 92, "number": 2}]}

Пароль другого опроса — 400 с кодом password_not_found. Если пароль найден, но запись не удалась, приходит password_save_failed (смена) или password_delete_failed (удаление): такой вызов имеет смысл повторить, а заводить пароль заново не нужно.


95. QR-код опроса

В API с 08.09.2026

Действие HTTP
Состояние GET /quiz/{id}/qr-code
Собрать POST /quiz/{id}/qr-code
Поле Тип Описание
format string png, svg, eps.
size integer 100–1000 пикселей.
color, background string #RRGGBB.
margin integer 0–10.
force boolean Пересобрать с теми же настройками.

Непереданное берётся из прошлой сборки, а не из умолчаний: иначе запрос «сделай код побольше» вернул бы чёрный код вместо фирменного.

Повторный запрос с теми же настройками отдаёт уже готовый код и regenerated: false — каждая сборка пишет новый файл и списывает место с тарифа.

Код ведёт на опубликованный опрос: у неопубликованного кодировать нечего, и это видно по полю is_published.


96. Печатная версия опроса

В API с 08.09.2026

POST/quiz/{id}/print

Поле Тип Описание
format string pdf (по умолчанию), word, txt, html.
font string little, medium (по умолчанию), large.

В ответе приходит сам файл (Content-Disposition: attachment), а не JSON — как и у остальных выгрузок v3. Собрать не удалось — 400 с кодом print_failed.

PDF собирает headless-браузер, поэтому он заметно медленнее остальных форматов; txt и html готовятся из данных опроса напрямую.


Папки аккаунта и избранные вопросы


97. Папки

В API с 08.09.2026

Действие HTTP Право
Создать POST /workspace/{workspace_id}/folders с полем name create_folder
Переименовать POST /workspace/{workspace_id}/folders/{folderId}/rename с полем name rename_folder
Удалить DELETE /workspace/{workspace_id}/folders/{folderId} delete_folder
Порядок в списке POST /workspace/{workspace_id}/folders/reorder с полем folder_ids

Идентификатор созданной папки приходит полем folder_id — он нужен для переименования, доступа участников и переноса опросов.

Одноимённые папки не заводятся — 400 с кодом duplicate_name: список станет неразличимым, а «положи в папку N» неоднозначным.

Удаление папки уносит лежащие в ней опросы, а с ними ответы респондентов. Поэтому при непустой папке приходит 422 с кодом confirm_required и числом опросов в поле quizzes; повторите запрос с confirm_delete_quizzes: true. Папку по умолчанию удалить нельзя — 400 с кодом default_folder: это единственное место, куда падают новые опросы.

Порядок задаётся только своими папками: чужой идентификатор в списке — 400, иначе он сдвинул бы папки другого аккаунта.


98. Библиотека избранных вопросов

В API с 08.09.2026

Действие HTTP
Список GET /workspace/{workspace_id}/favorite-questions
Сохранить или изменить POST /workspace/{workspace_id}/favorite-questions
Удалить DELETE /workspace/{workspace_id}/favorite-questions/{questionId}

Поля записи: name, widget_type, data, необязательные choice_type, choice_multiple, source_quiz_id, source_widget_id. С полем favorite_question_id правится существующая запись, без него заводится новая.


Шаблоны и сборка опроса по описанию


111. Свои шаблоны аккаунта

В API с 08.09.2026

GET/workspace/{workspace_id}/templates

Параметр Тип Описание
limit integer 1–100, по умолчанию 20.
offset integer Сдвиг по списку.

Шаблоны приходят полем items; has_more говорит, набралась ли страница целиком, то есть стоит ли запрашивать следующую.


112. Создать опрос из шаблона

В API с 08.09.2026

Требует право create_quiz и не обходит тарифный лимит на число опросов.

POST/quiz/from-template

Поле Тип Обязательное Описание
template_id integer Да Шаблон общего каталога или свой шаблон аккаунта.
folder_id integer Да Куда положить копию.
name string Нет По умолчанию берётся название шаблона.

Годятся ровно две вещи: каталожный шаблон и свой шаблон аккаунта. Обычный опрос — 400 с кодом template_not_found, иначе по идентификатору копировался бы любой чужой опрос.

Тема шаблона копируется себе, а не остаётся ссылкой на чужую запись: иначе правка у автора каталога меняла бы вид ваших опросов.

Опрос создаётся черновиком — в ответе needs_publish: true.


113. Собрать опрос по описанию

В API с 08.09.2026

Требует право create_quiz.

POST/quiz/ai

Поле Тип Обязательное Описание
folder_id integer Да Куда положить опрос.
prompt string Да Описание: о чём опрос.
project string Нет Название проекта или бренда.
ai_type string Нет quiz или test с подсчётом баллов.
with_logic boolean Нет Сразу расставить переходы между вопросами.

Сборка идёт очередью. Ответ приходит сразу с quiz_id и ai_status: "pending": опрос уже создан заготовкой, а вопросы появятся, когда сборка закончится. Готовность видна в самом опросе — поле ai_quiz_job в GET /quiz/{id}.

Тариф, папку, членство и суточный предел проверяет сама сборка; отказ приходит как 400 с кодом generation_failed и пояснением.


Медиа опроса

Требуют право участника files_upload и платный тариф; при исчерпанном дисковом месте загрузка отклоняется сразу — 403 с кодом disk_limit_reached и признаком blocked_by_tariff: true.

Файл передаётся обычной загрузкой формы (multipart/form-data), полем file. Ни ссылки, ни base64 здесь нет — в отличие от ассистента, которому иначе файл не передать.


115. Картинка, видео или звук для вопроса

В API с 08.09.2026

POST/quiz/{id}/media

Поле Тип Обязательное Описание
type string Да image, video, audio.
file file Да Сам файл.

Формат проверяется содержимым файла, а не полем type: тип задаёт лишь подпись. Иначе под видом картинки принимался бы любой файл, включая html и svg, которые отдаются с исполняемым типом. Неподходящий формат — 422.

JSON
{"status": true, "quiz_id": 18547, "type": "image",
 "url": "https://storage.webask.io/...", "multimedia_field": "imgUrl"}

multimedia_field подсказывает, куда подставить ссылку в структуре вопроса: imgUrl, videoUrl или audioUrl.


116. Картинка варианта ответа

В API с 08.09.2026

POST/quiz/{id}/media/widget-image

Поле file, форматы jpeg, jpg, png, webp, gif. Ссылку подставляют в choiceImageEntities[].link.