Интеграции
Интеграции и письма
CRM и сопоставление полей, вебхуки, мессенджеры, таблицы, счётчики, письма опроса и своя почта
Состояние интеграций и журнал отправок
Права и тариф для всех методов этого раздела: тарифная опция самой интеграции
плюс право участника integrations. Право закрывает даже чтение — участник
без него не должен видеть, куда уходят ответы. Владелец воркспейса проходит
всегда.
Отказы:
| Ответ | Когда |
|---|---|
403 + blocked_by_access: true |
у участника нет права integrations |
403 + blocked_by_tariff: true |
тариф не включает эту интеграцию |
400 + code: not_connected |
журнал запрошен у неподключённой интеграции |
47. Состояние интеграций опроса
В API с 08.09.2026
Отвечает на «почему заявки не приходят»: по каждой интеграции сразу видно, подключена ли она, включена ли отправка и разрешает ли её тариф.
GET/quiz/{id}/integrations
Аутентификация: Обязательна
Пример ответа (200)
{
"status": true,
"quiz_id": 18547,
"integrations": {
"telegram": {"connected": true, "enabled": true, "allowed_by_tariff": true, "blocked": null},
"max": {"connected": false, "enabled": false, "allowed_by_tariff": true, "blocked": "not_connected"},
"amocrm": {"connected": true, "enabled": false, "allowed_by_tariff": true, "blocked": "disabled"},
"bitrix24": {"connected": false, "enabled": false, "allowed_by_tariff": false, "blocked": "blocked_by_tariff"},
"zapier": {"connected": false, "enabled": false, "allowed_by_tariff": true, "blocked": "not_connected"},
"google_sheets": {"connected": false, "enabled": false, "allowed_by_tariff": true, "blocked": "not_connected"}
}
}blocked — готовая причина, по которой ответы не уходят: blocked_by_tariff,
not_connected или disabled. Пусто — отправка работает.
Вебхуки в этот ответ не входят: у них своя настройка и свой журнал доставки.
48. Журнал отправок мессенджера
В API с 08.09.2026
Свой журнал отправок есть у Telegram и MAX. По нему видно причину, по которой сообщение не ушло: бота выгнали из группы, чат удалён, токен отозван.
GET/quiz/{id}/integrations/logs
Аутентификация: Обязательна
Query параметры
| Параметр | Тип | Обязательное | Описание |
|---|---|---|---|
integration |
string | Да | telegram или max. Другие значения — 422. |
page |
integer | Нет | Страница, по умолчанию 1. |
per_page |
integer | Нет | Записей на странице, 1–100, по умолчанию 20. |
Пример ответа (200)
{
"status": true,
"quiz_id": 18547,
"integration": "telegram",
"total": 143,
"page": 1,
"per_page": 20,
"last_page": 8,
"unsent_count": 3,
"logs": [...]
}unsent_count — сколько отправок сорвалось и ждёт повтора.
Неподключённая интеграция отвечает 400 с кодом not_connected, а не пустым
списком: журнала в этом случае не существует, и пустой список означал бы, что
отправок не было.
49. Досылка неотправленного
В API с 08.09.2026
Когда причину отказа устранили — бота вернули в группу, токен перевыпустили, — накопившееся можно дослать: либо одну запись журнала, либо все неудачные за период.
POST/quiz/{id}/integrations/logs/resend
Аутентификация: Обязательна
Тело запроса (JSON)
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
integration |
string | Да | telegram или max. |
log_id |
integer | Нет | Одна запись журнала. |
date_from |
date | Нет | Начало периода для досылки всех неудачных. |
date_to |
date | Нет | Конец периода, не раньше date_from. |
Без log_id и без периода дошлются все неудачные отправки. log_id вместе с
периодом — 422: это разные действия, и вместе они означали бы, что период
молча проигнорирован.
Пример ответа (200)
{
"status": true,
"quiz_id": 18547,
"integration": "telegram",
"resent": 3
}Отправка ответов в CRM
Молчащая интеграция выглядит одинаково при трёх разных причинах: отправка выключена, тариф её не включает или на стороне CRM отозвали токен. Последнее со стороны опроса не видно вообще — поэтому проверка связи здесь отдельным методом.
{crm} в путях — amocrm или bitrix24. Другое значение — 422 с кодом
unknown_crm. Опрос без подключённой CRM — 400 с кодом not_connected:
это не пустое состояние, а отсутствие настройки.
Права и тариф — как во всём разделе: тарифная опция этой CRM плюс право
участника integrations.
50. Состояние подключения CRM
В API с 08.09.2026
GET/quiz/{id}/integrations/crm/{crm}
Аутентификация: Обязательна
Пример ответа (200)
{
"status": true,
"quiz_id": 18547,
"crm": "bitrix24",
"connected": true,
"is_active": false
}51. Включить или выключить отправку в CRM
В API с 08.09.2026
POST/quiz/{id}/integrations/crm/{crm}/toggle
Аутентификация: Обязательна
Тело запроса (JSON)
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
is_active |
boolean | Да | Включить отправку или выключить. Принимаются и строки "true" / "false". |
Пример ответа (200)
{"status": true, "quiz_id": 18547, "crm": "bitrix24", "is_active": true}Отказ записи — 400 с кодом toggle_failed.
52. Проверить, живо ли подключение
В API с 08.09.2026
Токен отзывают на стороне CRM, и со стороны опроса это выглядит как молчащая интеграция. Метод обращается к порталу и отвечает, отвечает ли он.
GET/quiz/{id}/integrations/crm/{crm}/check
Аутентификация: Обязательна
Пример ответа (200)
{
"status": true,
"quiz_id": 18547,
"crm": "bitrix24",
"is_active": true,
"connection_ok": false
}Мёртвая связь — это результат проверки, а не сбой вызова, поэтому ответ
успешный: смотреть надо на connection_ok.
53. Справочники CRM и текущее сопоставление
В API с 08.09.2026
То же, что видит человек в форме настройки: поля лида, сделки, контакта и компании, воронки со стадиями, ответственные. Рядом — сопоставление, сохранённое у опроса сейчас.
GET/quiz/{id}/integrations/crm/{crm}/fields
Аутентификация: Обязательна
Query параметры
| Параметр | Тип | Обязательное | Описание |
|---|---|---|---|
sections |
array | Нет | lead, deal, contact, company, users, pipelines, types. По умолчанию lead и contact: каждый справочник — отдельный запрос в CRM. Принимается и строкой через запятую. |
deal_category_id |
integer | Нет | Воронка, чьи стадии нужны (только Bitrix24). Без неё портал отдаёт стадии воронки по умолчанию. |
Пример ответа (200)
{
"status": true,
"quiz_id": 18547,
"crm": "bitrix24",
"is_active": true,
"sections": ["lead", "pipelines"],
"directories": {
"lead": {...},
"deal_categories": [...],
"deal_stages": [...]
},
"current_mapping": {"lead": {"enabled": true, "fields": {...}}}
}Различия CRM отдаются как есть, а не подгоняются друг под друга: у amoCRM
сделка и есть лид, поэтому разделы deal и types приходят со значением
null — это ответ, а не сбой. У Bitrix24 раздел pipelines возвращает два
справочника: воронки (deal_categories) и стадии (deal_stages).
Отозванный доступ к порталу — 400 с кодом connection_lost, сбой обращения к
справочникам — 400 с кодом directories_failed. Справочники читаются живыми
запросами в CRM, поэтому вызов не мгновенный.
Сопоставление полей опроса с полями CRM
Неверная форма сопоставления не вызывает ошибки при сохранении, а молча ломает доставку: заявки начинают приходить пустыми или встают не в ту воронку, и заметить это можно много позже. Поэтому каждое значение проверяется до записи.
Две CRM устроены по-разному, поэтому и методы разные. За один вызов правится одна сущность или один блок: правка одного не сбрасывает остальное, а непереданные ключи остаются прежними.
121. Bitrix24: сопоставление по сущностям
В API с 08.09.2026
POST/quiz/{id}/integrations/bitrix24/mapping/{entity}
{entity} — lead, contact, company, deal; другое значение — 422 с
кодом unknown_entity.
| Поле | Тип | Описание |
|---|---|---|
enabled |
boolean | Создавать эту сущность при ответе. |
fields |
object | {"ПОЛЕ": {"widget_id": "..."}} или {"ПОЛЕ": {"static_value": "..."}}, до 200 полей. |
title_type |
string | Field — название из вопроса, Static — заданный текст. |
title_value |
string | Идентификатор вопроса или сам текст, смотря по title_type. |
company_title_value |
string | Название компании. |
status |
string | Стадия лида (только lead). |
add_id_to_title |
boolean | Добавлять номер к названию (только lead). |
category_id |
integer | Воронка (только deal). |
default_stage |
string | Стадия сделки (только deal). |
link_to_lead |
boolean | Привязать сделку к лиду (только deal). |
Набор полей заменяется целиком, но только когда его передали: вызов без
fields оставляет прежний набор. Каждое поле берёт значение откуда-то одного —
поле с обоими источниками даёт 422 с кодом field_ambiguous (адаптер в этом
случае взял бы вопрос и молча проигнорировал постоянное значение), поле без
источников — field_empty.
Стадия принадлежит воронке. У воронки по умолчанию стадия не начинается с
«C», у воронки N обязана начинаться с «CN:». Несовместимая — 422 с кодом
stage_mismatch; стадия у сущности, кроме сделки — stage_deal_only. Воронка
берётся из вызова, а если её не передали — из уже сохранённых настроек.
В ответе есть stage_dropped: сервис молча выбрасывает стадию, которую не
принял, и это единственный способ узнать, что она не записалась.
122. amoCRM: сопоставление по блокам
В API с 08.09.2026
POST/quiz/{id}/integrations/amocrm/mapping/{block}
{block} — deal (сделка), list (контакты, компании, каталоги), task
(задача); другое значение — 422 с кодом unknown_block.
| Поле | Тип | Описание |
|---|---|---|
active |
array | Что создавать: номера воронок у сделки, 0 — контакт и 1 — компания у списков, номера каталогов портала. |
titles |
object | Название по номеру воронки или списка: идентификатор вопроса либо текст. |
statuses |
object | Стадия по номеру воронки. |
users |
object | Ответственный по номеру воронки или списка. |
use_price |
object | Брать сумму сделки из набранных баллов. |
bind |
object | {"ID поля CRM": "UUID вопроса"}, до 200 полей. |
subtype |
object | Уточнение вида значения у сопоставленного поля. |
Каждое значение сверяется с живыми справочниками портала. Отказы приходят
кодом: pipeline_unknown (нет такой воронки), status_mismatch (стадия из
другой воронки), field_unknown (нет такого поля), bind_not_widget (значение
поля берётся из ответа, поэтому здесь нужен вопрос, а не текст),
subtype_without_bind, user_unknown, title_empty,
directories_unavailable.
Пустой список active означает «не создавать» — это значение, а не отсутствие
значения, и оно сохраняется. Ключи, которых нет в этом методе (например значения
полей-списков, их заводит кабинет), сохраняются как были.
Без живого подключения к порталу метод отвечает 400 с кодом connection_lost
и ничего не записывает: справочников не прочитать, а проверять нечем.
Прежний метод POST /amocrm/quiz/{id}/settings остаётся как есть, но он
принимает массив настроек без проверок — на новых интеграциях лучше
использовать этот.
Интеграции
AmoCRM: Аккаунт
В API с 19.02.2026
Получает общую информацию об аккаунте AmoCRM: воронки, пользователи, типы задач и дополнительные поля.
GET/amocrm/account
Аутентификация: Обязательна
Пример ответа (200)
{
"pipelines": [...],
"users": [...],
"task_types": [...],
"custom_fields": [...]
}AmoCRM: Списки
В API с 19.02.2026
Получает каталоги (списки) из AmoCRM.
GET/amocrm/lists
Аутентификация: Обязательна
Пример ответа (200)
{
"response": {
"items": [...]
}
}AmoCRM: Опросы
В API с 19.02.2026
Возвращает список опросов пользователя с информацией об активности интеграции AmoCRM.
GET/amocrm/quiz
Аутентификация: Обязательна
Query параметры
Аналогичны GET /quiz (sort, order, limit, offset, folder_id).
Пример ответа (200)
[
{
"id": 123,
"name": "Опрос с Amo",
"amocrm_is_active": true,
"folder": { ... }
}
]AmoCRM: Настройки опроса
В API с 19.02.2026
Получение или сохранение настроек AmoCRM для конкретного опроса.
Получение: GET /amocrm/quiz/{id}/settings
Сохранение: POST /amocrm/quiz/{id}/settings
Тело запроса для сохранения (JSON)
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
settings |
array | Да | Массив настроек сопоставления полей |
is_active |
boolean | Нет | Флаг активности интеграции |
Вебхуки опроса
Вебхук уводит ответы в свою систему. Значения заголовков в ответах подменяются
на ***: там носят ключи и токены доступа, отдавать их обратно незачем. Имена
заголовков видны — по ним понятно, что настроено.
Тариф проверяется на записи: настраивать отправку, которой тариф не даст сработать, смысла нет. Выключить вебхук можно на любом тарифе — запрет касается настройки, а не отказа от неё.
54. Список вебхуков
В API с 08.09.2026
GET/quiz/{id}/webhooks
{
"status": true,
"quiz_id": 18547,
"is_active": true,
"items": [{"id": 50, "title": "Наша CRM", "url": "https://example.com/hook",
"method": "post", "is_active": true, "incomplete": false, "hours": 0,
"headers": [{"name": "Authorization", "value": "***"}]}]
}55. Создать вебхук
В API с 08.09.2026
POST/quiz/{id}/webhooks
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
title |
string | Да | Название, до 255 символов. |
url |
string | Да | Адрес. Только публичный http(s): адрес закрытой сети отклоняется. |
method |
string | Да | get, post, put, patch. |
body |
array | Нет | Состав отправляемых данных. |
body_naming |
array | Нет | Свои имена полей. |
headers |
array | Нет | [{"name": "...", "value": "..."}]. |
incomplete |
boolean | Нет | Отправлять незавершённые ответы. |
hours |
integer | Нет | Через сколько часов считать ответ незавершённым: 0, 1, 6, 12, 24. |
is_active |
boolean | Нет | Сразу включить отправку. По умолчанию вебхук создаётся выключенным. |
В ответе — webhook_id нового вебхука и полный список items.
Повторный вызов с тем же url и method вебхук не задваивает: приходит
400 с кодом webhook_exists и webhook_id уже существующего. Иначе приёмник
начал бы получать по два запроса на каждый ответ.
56. Изменить вебхук
В API с 08.09.2026
POST/quiz/{id}/webhooks/{webhookId}
Поля те же, все необязательные: непереданное остаётся прежним. Заголовки при
этом сохраняются, хотя запись перезаписывает вебхук целиком — прежнее
состояние подмешивается на нашей стороне. Передали headers — они заменяют
прежний список полностью.
Неизвестный вебхук — 400 с кодом webhook_not_found.
57. Удалить вебхук
В API с 08.09.2026
DELETE/quiz/{id}/webhooks/{webhookId}
58. Включить или выключить вебхук
В API с 08.09.2026
POST/quiz/{id}/webhooks/{webhookId}/toggle
| Поле | Тип | Обязательное |
|---|---|---|
is_active |
boolean | Да |
59. Журнал доставки вебхука
В API с 08.09.2026
GET/quiz/{id}/webhooks/{webhookId}/logs
| Параметр | Тип | Описание |
|---|---|---|
page |
integer | Страница, по умолчанию 1. |
per_page |
integer | 1–30, по умолчанию 20. В журнале лежат тела запросов и ответов, поэтому предел ниже обычного. |
Значения заголовков в записях журнала подменяются на ***, как и в списке
вебхуков: журнал хранит те же ключи доступа к приёмнику, которыми пользуется
досылка. Имена заголовков видны.
60. Досылка вебхука
В API с 08.09.2026
POST/quiz/{id}/webhooks/{webhookId}/logs/resend
| Поле | Тип | Описание |
|---|---|---|
log_id |
integer | Одна запись журнала. |
date_from |
date | Y-m-d. Начало периода. |
date_to |
date | Y-m-d. Конец периода. |
log_id вместе с периодом — 422.
Уведомления в Telegram и MAX
Тарифная опция мессенджера (telegram, max) плюс право integrations.
101. Мессенджер опроса
В API с 08.09.2026
| Действие | HTTP |
|---|---|
| Состояние | GET /quiz/{id}/integrations/messenger/{messenger} |
| Действия | POST /quiz/{id}/integrations/messenger/{messenger} |
{messenger} — telegram или max; другое значение даёт 422 с кодом
unknown_messenger.
| Поле | Тип | Описание |
|---|---|---|
action |
string | activate, deactivate, delete, toggle_buttons, save_widgets, remove_recipient, test. |
buttons_enabled |
boolean | Для toggle_buttons. Кнопки под сообщением. |
subject |
string | Тема сообщения, до 70 символов. |
hidden_widget_ids |
array | UUID вопросов, которые не попадают в сообщение, до 500. |
recipient_id |
string | Для remove_recipient. У Telegram это номер чата, у MAX — идентификатор человека. |
{
"status": true, "quiz_id": 18547, "messenger": "telegram", "is_active": true,
"subject": "Новая заявка", "buttons_enabled": true,
"bot_url": "https://t.me/webask_bot?start=1f0c...",
"recipients": [{"id": 123456789, "title": "Отдел продаж"}],
"hidden_widget_ids": ["b3f1c2d4-..."]
}Подключение делает человек. activate заводит интеграцию и выдаёт bot_url —
по этой ссылке бота добавляют в чат или группу; пока этого не сделали, отправлять
некуда. Получатели появляются сами, когда бота добавили.
Список исключённых вопросов задаётся целиком: чего в нём нет, то в сообщение вернётся. Непереданный список не трогается — иначе правка одной темы сняла бы все исключения, и вопросы с персональными данными снова ушли бы в чат.
test отправляет пробное сообщение всем подключённым получателям. Выключенная
интеграция — 400 с кодом inactive, интеграция без получателей — 400 с кодом
no_recipients, сбой отправки — 400 с кодом test_failed.
Опрос без подключённого мессенджера — 400 с кодом not_connected для всего,
кроме activate.
Google Таблицы
Подключение остаётся в кабинете: там вход в аккаунт Google и выбор файла на
Диске. Тарифная опция googleSheets плюс право integrations.
102. Выгрузка ответов в таблицу
В API с 08.09.2026
| Действие | HTTP |
|---|---|
| Состояние | GET /quiz/{id}/integrations/google-sheets |
| Действия | POST /quiz/{id}/integrations/google-sheets |
| Поле | Тип | Описание |
|---|---|---|
action |
string | activate, deactivate, delete, save_widgets, save_switchers, set_sync_mode, sync_now, export_all. |
hidden_widget_ids |
array | Обязателен для save_widgets, до 500. Вопросы, которые в таблицу не попадают. |
enable_timestamp |
boolean | Столбец со временем ответа. |
enable_personal_data |
boolean | Персональные данные респондента. |
sync_mode |
string | Для set_sync_mode: realtime, scheduled, manual. |
schedule_hour, schedule_minute |
integer | Обязательны при scheduled: 0–23 и 0–59. |
export_mode |
string | Для export_all: new_file, new_sheet, replace. |
{
"status": true, "quiz_id": 18547, "is_active": true,
"table_title": "Ответы опроса", "table_url": "https://docs.google.com/...",
"access": "ok", "requires_reconnect": false,
"enable_timestamp": true, "enable_personal_data": false,
"sync_mode": "scheduled", "schedule_hour": 9, "schedule_minute": 30,
"last_synced_at": "2026-09-09 09:30:12", "hidden_widget_ids": []
}access — состояние доступа к таблице. Чаще всего выгрузка замолкает именно
из-за отозванного на стороне Google доступа, и тогда приходит
requires_reconnect: true: переподключение делают в кабинете.
Список исключённых вопросов задаётся целиком, поэтому для save_widgets он
обязателен: вызов без него снял бы все исключения, и в таблицу поехали бы
вопросы, которые автор оттуда убрал. Для save_switchers нужен хотя бы один
переключатель — незаданный не трогается, и вызов без обоих ничего бы не изменил.
sync_now досылает всё, что ещё не уехало в таблицу; export_all выгружает
накопившиеся ответы заново — новым файлом, новым листом или заменой прежнего.
Опрос без подключённой интеграции — 400 с кодом not_connected.
Zapier
Связки собираются на стороне Zapier — здесь только то, слушает ли он этот опрос.
Права и тариф как во всём разделе: опция zapier плюс право integrations.
99. Zapier у опроса
В API с 08.09.2026
| Действие | HTTP |
|---|---|
| Состояние | GET /quiz/{id}/integrations/zapier |
| Включить, выключить, отключить | POST /quiz/{id}/integrations/zapier с полем action: activate, deactivate, delete |
{"status": true, "quiz_id": 18547, "connected": true, "is_active": true, "hooks": 2}hooks — сколько связок на стороне Zapier слушает опрос.
delete сносит и подписки: связка на стороне Zapier перестанет получать ответы,
и собирать её придётся заново там же. В ответе — removed_hooks. Опрос без
подключения — 400 с кодом not_connected.
Счётчики и пиксели
Google Аналитика, Яндекс.Метрика, пиксель VK и пиксель Meta. У каждого своя
тарифная опция (googleStats, yaMetrika, vkPixel, fbPixel) плюс общее для
раздела право integrations.
100. Счётчик опроса
В API с 08.09.2026
| Действие | HTTP |
|---|---|
| Состояние | GET /quiz/{id}/integrations/counters/{service} |
| Запись, включение, выключение, отключение | POST /quiz/{id}/integrations/counters/{service} |
{service} — google, yandex, vk, fb. Другое значение — 422 с кодом
unknown_service.
| Поле | Тип | Описание |
|---|---|---|
action |
string | save, activate, deactivate, delete. |
counter |
string | Номер счётчика или пикселя, до 20 символов. |
version |
string | Только Google: ga4 или прежняя ua. |
is_webvisor |
boolean | Только Яндекс: запись действий посетителя. |
{"status": true, "quiz_id": 18547, "service": "yandex", "counter": "87654321", "is_active": true}Номер и признак включённости пишутся и в запись интеграции, и в версию
опроса — рендер читает версию. Поэтому включённый счётчик действительно
появляется на странице, а после delete копия в версии снимается и счётчик
перестаёт вставляться.
Отключение ненастроенного счётчика — 400 с кодом not_connected.
Письма опроса
Копия ответа автору и письмо респонденту. Код подтверждения адреса наружу не отдаётся — это хеш от четырёхзначного числа, то есть девять тысяч вариантов: по нему чужой адрес подтверждается перебором и начинает получать копии ответов.
79. Настройки писем опроса
В API с 08.09.2026
GET/quiz/{id}/emails
Возвращает настройки, получателей копий (без кода подтверждения) и списки вопросов, исключённых из письма автору и из письма респонденту.
80. Шаблон письма
В API с 08.09.2026
POST/quiz/{id}/emails/template
Поля с приставкой owner_ — письмо автору, client_ — письмо респонденту:
subject (до 500), letter (до 5000), use_default_tmpl, reply_to_address,
send_promo_code, formatted_letter (HTML из редактора, до 50 000),
raw_html + raw_enabled (полностью свой HTML, работает только со своим SMTP).
Отдельно client_source — имя скрытой переменной, из которой берётся адрес
респондента.
81. Какие вопросы не попадают в письмо
В API с 08.09.2026
POST/quiz/{id}/emails/questions
| Поле | Тип | Описание |
|---|---|---|
owner_excluded_questions |
array | UUID вопросов, исключённых из письма автору. |
client_excluded_questions |
array | То же для письма респонденту. |
Непереданный список не трогается — у двух писем исключения независимы. Переданный пустым означает «в письмо идут все вопросы».
UUID сверяется с виджетами черновика опроса: выдуманный или чужой
идентификатор даёт 400 с кодом unknown_questions и списком в поле unknown.
Раньше такой uuid записывался молча и ни на что не влиял.
Настроек писем у опроса ещё нет — 400 с кодом emails_not_initialized.
82. Включить или выключить письмо
В API с 08.09.2026
POST/quiz/{id}/emails/toggle
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
type |
string | Да | owner или client. |
enabled |
boolean | Да |
Письмо уже в этом состоянии — ответ 200 с unchanged: true: внутри сервис
переключает состояние, а не выставляет его, и повторный вызов иначе вернул бы всё
как было.
83. Получатели копий ответов
В API с 08.09.2026
| Действие | HTTP |
|---|---|
| Добавить | POST /quiz/{id}/emails/recipients с полем email |
| Удалить | DELETE /quiz/{id}/emails/recipients/{emailId} |
| Включить/выключить | POST /quiz/{id}/emails/recipients/{emailId}/toggle |
| Подтвердить или переслать код | POST /quiz/{id}/emails/recipients/{emailId}/confirm |
Заведённый адрес начинает получать копии только после подтверждения: код уходит
на сам адрес, а не выдаётся вызывающему. Подтверждение — action: "confirm" с
полем confirmation_code; повторная отправка кода — action: "resend_code".
84. Своя почтовая служба аккаунта
В API с 08.09.2026
Требует отдельное право участника account_smtp: в настройках своей почты
лежит пароль от почтового ящика аккаунта.
POST/workspace/{workspace_id}/smtp
| Поле | Тип | Описание |
|---|---|---|
action |
string | show, logs, enable, disable, test. |
limit, offset |
integer | Для logs, до 100 записей. |
Журнал приходит полем logs, рядом — total, limit, offset: имя то же, что
у журналов интеграций и вебхуков.
test обращается к почтовому серверу и отвечает 200 с полем
connection_ok: неудачная проверка — это её результат, а не сбой вызова.
Заведение и правка настроек своей почты остаются в кабинете — API их не принимает.
Состояние e-mail рассылок
Только чтение. Отправлять и править кампании через API нельзя: письмо уходит живым людям, и отменить его невозможно — такое решение принимает человек.
114. Раздел состояния рассылок
В API с 08.09.2026
GET/workspace/{workspace_id}/mailings
| Параметр | Тип | Обязательное | Описание |
|---|---|---|---|
section |
string | Да | Что смотрим, список ниже. |
campaign_id |
integer | Для campaign и recipients |
|
list_id |
integer | Для contacts |
|
search |
string | Нет | Отбор по названию или адресу. |
statuses |
array | Нет | Статусы доставки для recipients; пустой список — все. |
days |
integer | Нет | Окно для reputation, 1–365, по умолчанию 30. |
limit, offset |
integer | Нет | До 200 записей. |
Разделы: campaigns — список кампаний, campaign — одна кампания,
recipients — получатели с результатом доставки, contact_lists — списки
контактов со сводкой, contacts — контакты одного списка, templates —
шаблоны писем, reputation — доля отказов и жалоб (по ней почтовые службы
решают, пускать ли письма аккаунта дальше), balance — остаток писем на счету,
settings — настройки рассылок, smtp_logs — журнал отправок.
Разделы читаются по одному: каждый обращается к своему сервису, и тянуть их все разом означало бы платить за то, чего не спрашивали.
Кампании или списка с таким идентификатором в аккаунте нет — 400 с кодом
not_found и полем section: по нему видно, чего именно нет. Это отсутствие
записи, а не сбой чтения.