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

Опросы

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

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

Markdown для нейросетей Актуально на 15.10.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-код и печать

Пароли и QR-код требуют право участника settings. Печатной версии хватает любого из двух прав — settings или view_results: печать ничего в опросе не меняет. При значении «только свои» печатаются только опросы, созданные участником.


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.

Логотип в центре кода загружают в кабинете. PNG- и JPG-логотип вклеивается в код, SVG-логотип — нет: код собирается без логотипа (не покрыто тестом). С SVG-логотипом код рисует конструктор QR в кабинете.


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

В API с 08.09.2026

POST/quiz/{id}/print

Поле Тип Описание
format string pdf (по умолчанию), word, txt, html.
font string little, medium (по умолчанию), large.
sheet object Что будет на листе. Не передан — лист печатается как раньше. Поля ниже.

Поля sheet — все необязательны, не переданное берёт значение по умолчанию. Флаги принимают true/false, 1/0, "1"/"0".

Поле Значения По умолчанию Что на листе
header флаг false Заголовок и описание приветствия в начале листа; без приветствия — название опроса
logo флаг false Логотип из темы опроса; нет в теме — ничего
qr флаг false Рамка «Пройти онлайн» с адресом опроса и QR-кодом
fields флаг false Поля «Имя», «Дата», «Подпись» после вопросов
lines 2, 4, 6 нет Линейки для письма под многострочным свободным ответом вместо рамки
paper a4, letter a4 Размер листа — pdf и word
numbering флаг true Номер перед вопросом
page_numbers флаг false Номер страницы внизу каждого листа — pdf и word
copyright флаг true Надпись сервиса внизу листа
  • Значение вне таблицы — 422 по полю (sheet.lines, sheet.paper, …).
  • Надпись сервиса снимается только на тарифе с отключаемым копирайтом. Без него copyright: false не отклоняется, а игнорируется. На таком тарифе надписи нет и тогда, когда её отключили в настройках брендинга воркспейса.
  • В txt нет логотипа, QR-кода, размера листа и номеров страниц; в html — размера листа и номеров страниц. Эти опции там игнорируются.

В ответе приходит сам файл (Content-Disposition: attachment), а не JSON — как и у остальных выгрузок v3. Собрать не удалось — 400 с кодом print_failed. Нет ни settings, ни view_results на опрос — 403 {status: false, blocked_by_access: true}.

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 —

Порядок в списке — личный для владельца ключа: другим участникам он не меняется. Список папок (pos в выдаче) сортируется по личной позиции, для непереставленных папок — по общей. Папка пространства, к которой у пользователя нет доступа, в порядок не попадает.

Идентификатор созданной папки приходит полем 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, иначе по идентификатору копировался бы любой чужой опрос.

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

Счётчики и пиксели шаблона (Google Analytics, Яндекс.Метрика, VK, Facebook) в опрос не переносятся — даже если шаблон сохранили с ними раньше: события шли бы в чужой счётчик.

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


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

В API с 08.09.2026

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

POST/quiz/ai

Поле Тип Обязательное Описание
folder_id integer Да Куда положить опрос.
prompt string Да Описание: о чём опрос. Длиннее 2000 символов — усекается при сборке.
source_text string Нет Исходный материал, по которому строить вопросы, например текст статьи. До 100 000 символов (длиннее — 422); в сборку идут первые 20 000; вопросы пишутся на языке материала, если prompt не просит другой язык. Модели велено брать из материала только содержание, а распоряжения — из prompt; полной гарантии от указаний внутри текста это не даёт. С 2026-10-09.
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. Тот же ответ, если место ещё есть, но этот файл в него не помещается (картинка варианта ответа считается всегда; медиа вопроса — только когда у пространства нет рабочего своего хранилища).

Файл больше лимита тарифа на один файл (max_upload_size) — 422 { "status": false, "code": "file_too_big", "max_upload_size": <байты> }.

Файл передаётся обычной загрузкой формы (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.