Опросы
Управление опросом
История публикаций и корзина, пароли и QR-код, папки и шаблоны, сборка опроса по описанию
История публикаций и восстановление
Требуют право участника 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.
{"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 с состоянием замка:
{
"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 мс на пароль, и пятьсот значений упирались бы в таймаут, откатывая всю пачку. На большее число делайте несколько вызовов.
Номера не переиспользуются после удаления: повторно выданный номер слил бы прежнего респондента с новым.
{"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.
{"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.