Обратная связь - заполнение от имени пользователя

API обратной связи для пользователя бота

Документация для интеграции Telegram Web App, мобильного приложения или своего сайта: пользователь заполняет форму обратной связи от своего имени, без доступа к управлению ботом.

Логика совпадает с заполнением заявки в Telegram: те же вопросы, проверки и завершение.

Подробная спецификация полей доступна в интерактивной документации API вашей площадки (раздел «Обратная связь (пользователь)»).


Авторизация

Доступ к боту от имени владельца не нужен.

Все запросы отправляются методом POST в формате JSON.

Поля в каждом запросе

ПолеОписание
bot_idИдентификатор бота в BOT-T.
user_idИдентификатор пользователя в боте (не Telegram ID).
secret_user_keyСекретный ключ пользователя после регистрации или входа в боте.

Ключ и идентификатор пользователя выдаются при работе с API пользователей бота (например, после авторизации в Web App).

Ответ сервера

При успехе:

{ "result": true, "data": ... }

При ошибке:

{ "result": false, "message": "текст ошибки" }

Допустимо не более 120 запросов в минуту с одного IP-адреса.


Сценарий для Web App

  1. get-active — проверить, есть ли незавершённый черновик; если active: true, продолжить с answer_id.
  2. Если черновика нет — create (получить hello_text, первый вопрос и answer_id).
  3. Отвечать на вопросы, пока completed: true.
  4. При завершении показать end_text из ответа API.

list — история заявок пользователя по форме (без сохранения answer_id на клиенте).

sequenceDiagram
    participant App as Web App
    participant API as API обратной связи

    App->>API: get-active (message_id)
    alt active=true
        API-->>App: Текущий вопрос и answer_id
    else active=false
        App->>API: create
        API-->>App: hello_text, первый вопрос
    end
    loop Пока не completed
        App->>API: Ответ на вопрос
        API-->>App: Следующий вопрос
    end
    API-->>App: completed=true, end_text

Как заполнить заявку

  1. Создайте заявку — получите hello_text, первый вопрос и answer_id (сохраните его).
  2. Отвечайте на вопросы, пока в ответе не будет completed: true.
  3. Завершение — покажите end_text; заявка уходит администрации бота.

Какой метод вызывать для ответа

Тип вопросаЧто делать
Текстsubmit-input — отправить текст
Выбор одного вариантаsubmit-select — один раз с option_id; переход сразу
Выбор нескольких вариантовsubmit-select — toggle (повторный option_id снимает выбор); затем select-confirm
Ветвлениеsubmit-crossroad — выбрать ветку
Файлsubmit-file или submit-file-data; при нескольких файлах — file-end

Мультивыбор (select)

  • Каждый вызов submit-select переключает вариант: выбран → снят, не выбран → выбран.
  • Текущий набор — в question.selected_option_ids (массив option_id).
  • После выбора вызовите select-confirm — переход к следующему вопросу.
  • Нужен хотя бы один выбранный вариант; иначе validation_error и тот же вопрос.
  • skip для необязательного мультивыбора (confirm: true) временно можно использовать вместо select-confirm — переход без выбора.

Дополнительные действия

ДействиеКогда использовать
get-activeВосстановить черновик при открытии Web App
listСписок заявок пользователя по форме
continueСнова получить текущий вопрос по answer_id
startНачать заполнение заново
cancelОтменить заявку
viewПосмотреть заявку целиком, в том числе ответ администратора

Данные в ответе при прохождении формы

ПолеОписание
answer_idНомер заявки — нужен во всех следующих запросах
completedtrue — форма заполнена
hello_textПриветствие формы (только в ответе create)
end_textЗавершающий текст (при completed=true)
validation_errorТекст ошибки; тот же вопрос нужно отправить снова
await_more_filestrue — можно приложить ещё файлы, затем file-end
questionТекущий вопрос (если форма ещё не завершена)
answerУже введённые ответы и служебная информация

Текущий вопрос (question)

ПолеОписание
input_idИдентификатор вопроса для отправки ответа
type1 — текст, 2 — файл, 3 — выбор, 4 — ветвление
textТекст вопроса
confirmВопрос необязательный — можно skip
is_multipleНесколько вариантов или файлов
selected_option_idsВыбранные option_id (для type=3, мультивыбор)
optionsВарианты ответа (для выбора и ветвления)
file.max_sizeМакс. размер файла в байтах (0 — без ограничения)
file.allowed_extensionsДопустимые расширения/типы, например ["pdf","jpg"]

Пример (create)

{
  "result": true,
  "data": {
    "answer_id": 100,
    "completed": false,
    "hello_text": "Заполните заявку — мы ответим в течение суток.",
    "end_text": null,
    "validation_error": null,
    "await_more_files": false,
    "question": {
      "input_id": 5,
      "type": 1,
      "text": "Ваш email?",
      "confirm": false,
      "is_multiple": false,
      "selected_option_ids": [],
      "options": [],
      "file": null
    },
    "answer": {}
  }
}

Пример (завершение)

{
  "result": true,
  "data": {
    "answer_id": 100,
    "completed": true,
    "hello_text": null,
    "end_text": "Спасибо! Мы свяжемся с вами.",
    "question": null,
    "answer": {}
  }
}

Список методов

Базовый адрес: /v1/bot/user/feedback/ (к вашему домену API).

ДействиеМетодЧто передать дополнительно
Активный черновикget-activemessage_id формы
Список заявокlistmessage_id; опционально limit, offset
Создать заявкуcreatemessage_id; при необходимости — data
Начать зановоstartanswer_id
Текущий вопросcontinueanswer_id
Просмотр заявкиviewanswer_id
Ответ текстомsubmit-inputanswer_id, input_id, text
Переключить вариантsubmit-selectanswer_id, input_id, option_id
Подтвердить мультивыборselect-confirmanswer_id, input_id
Ветвлениеsubmit-crossroadanswer_id, input_id, option_id
Файл из Telegramsubmit-fileanswer_id, input_id, file_id, тип файла
Файл из приложенияsubmit-file-dataanswer_id, input_id, имя и base64
Завершить загрузку файловfile-endanswer_id, input_id
Пропустить вопросskipanswer_id, input_id, тип вопроса
Отменить заявкуcancelanswer_id

get-active

Поле в ответеОписание
activefalse — черновика нет
active: trueОстальные поля как в continue (question, answer_id и т.д.)

list

Поле в ответеОписание
itemsМассив заявок (новые первыми)
totalОбщее количество
limit, offsetПараметры пагинации

Файл из Telegram (submit-file)

Тип (file_kind)Описание
photoФото
videoВидео
documentДокумент (укажите имя файла)
stickerСтикер
animationGIF / анимация

Файл из вашего приложения (submit-file-data)

ПолеОписание
file_nameИмя с расширением, например report.pdf
file_dataСодержимое файла в кодировке base64

Ограничения — в question.file: max_size, allowed_extensions.

Если разрешено несколько файлов: загрузите каждый отдельным запросом, затем file-end.

Пропуск вопроса (skip)

Доступен только для необязательных вопросов (confirm: true).


Web App и Telegram

  • В ответе create приходит hello_text — покажите его в интерфейсе вместо сообщения в чат.
  • При completed=true используйте end_text вместо финального сообщения бота.
  • После успешного заполнения бот может дополнительно отправить уведомление в Telegram — по настройкам формы.

Вывод средств через форму

Если в боте включён вывод баланса через обратную связь:

  • через API модуля можно инициировать вывод и диалог в Telegram;
  • для Web App создайте заявку методом create, указав форму вывода и при необходимости номер заявки на вывод в поле data.

Частые проблемы

СитуацияЧто проверить
Отказ в доступеВерны ли user_id и secret_user_key для этого бота
Неверная формаmessage_id должен относиться к форме обратной связи этого бота
Заявка уже закрытаcreate или start; либо get-active для черновика
Мультивыбор не переходит дальшеВызван ли select-confirm после submit-select
Пустой мультивыборНужен хотя бы один элемент в selected_option_ids
Повтор по заказуДля этого заказа заявка уже была отправлена