Сообщения
Отправить медиасообщение
Отправляет медиасообщение. Укажите непустой message.url, message.file_url или message.file_key; URL должен быть абсолютным HTTP(S). Для WhatsApp audio и video seconds — неотрицательное целое число секунд. Только для video диапазон составляет от 0 до 4294967295.
https://api.unifyport.ai/v1/messagesПеред вызовом
Используйте X-Api-Key нужного рабочего пространства на сервере. Перед запуском замените все заполнители.
Завершите авторизацию и проверьте runtime_status. Авторизация и соединение — разные состояния; HTTP-успех не доказывает готовность.
Откуда взять параметры
- account_id
- Возьмите data.id из создания или запроса аккаунта. Идентификатор относится к рабочему пространству X-Api-Key. Получить аккаунт
- to.id · to.type
- Для ответа скопируйте data.conversation.id и data.conversation.type из message.received в to.id и to.type. Для нового адресата следуйте правилам идентификаторов канала. Поддержка единого отправления сообщений
Параметры запроса
Заголовки
X-Api-KeyAPI-ключ рабочей области. Рабочая область определяется по этому заголовку.
Content-TypeИспользуйте application/json при отправке JSON-тела запроса.
Тело запроса
account_idАккаунт провайдера, отправляющий сообщение.
minLength: 1
toobjectобязательноПолучатель: id и type.
toПолучатель: id и type.
idИдентификатор получателя на стороне провайдера.
minLength: 1
typeТип получателя: user, group или channel.
enum: user, group, channel
messageobjectобязательноНормализованный payload сообщения. Текст — message.text, медиа — message.url.
messageНормализованный payload сообщения. Текст — message.text, медиа — message.url.
typeТип сообщения: text, image, video, audio, document, file или contact.
enum: text, image, video, audio, document, file, contact
textНепустой текст, обязательный при message.type=text.
minLength: 1
captionНеобязательная подпись для image, video, document или file.
urlНепустой абсолютный HTTP(S) URL; медиа требует url, file_url или file_key.
format: uri · pattern: ^[Hh][Tt][Tt][Pp][Ss]?://
file_urlНепустой альтернативный абсолютный HTTP(S) URL; медиа требует один источник.
format: uri · pattern: ^[Hh][Tt][Tt][Pp][Ss]?://
file_keyНепустая ссылка на файл провайдера или хранилища; медиа требует один источник.
minLength: 1
contacts[]object[]Непустой массив карточек, обязательный при message.type=contact.
minItems: 1
contacts[]Непустой массив карточек, обязательный при message.type=contact.
minItems: 1
nameНепустое отображаемое имя, обязательное для каждой карточки.
minLength: 1
phones[]object[]Телефонные номера в карточке контакта.
phones[]Телефонные номера в карточке контакта.
numberНомер телефона; обязателен для каждой записи phone.
typeНеобязательная метка телефона, например CELL или WORK.
emails[]object[]Адреса электронной почты в карточке контакта.
emails[]Адреса электронной почты в карточке контакта.
addressАдрес электронной почты; обязателен для каждой записи email.
format: email
typeНеобязательная метка электронной почты, например WORK или HOME.
organizationНеобязательное название организации контакта.
titleНеобязательная должность контакта.
provider_dataobjectОпции провайдера, например parse_mode для Telegram или seconds для WhatsApp audio / video как неотрицательное целое. Только для video допустим диапазон от 0 до 4294967295; waveform остаётся доступным только для audio. Для ответа с цитатой используйте reply_to верхнего уровня.
provider_dataОпции провайдера, например parse_mode для Telegram или seconds для WhatsApp audio / video как неотрицательное целое. Только для video допустим диапазон от 0 до 4294967295; waveform остаётся доступным только для audio. Для ответа с цитатой используйте reply_to верхнего уровня.
secondsНеобязательная длительность сообщений WhatsApp audio и video в секундах как неотрицательное целое. Только для video допустим диапазон от 0 до 4294967295.
minimum: 0
waveformНеобязательные данные waveform для сообщений WhatsApp типа audio. Непустые значения должны использовать стандартную кодировку Base64 и после декодирования быть разбираемыми JSON-данными waveform; пустая строка считается отсутствием значения, а другие ошибки формата возвращают HTTP 400 provider_invalid_request.
reply_toobjectЦель цитируемого ответа. Скопируйте data.message.reply_token из входящего webhook без изменений в reply_to.reply_token запроса отправки.
reply_toЦель цитируемого ответа. Скопируйте data.message.reply_token из входящего webhook без изменений в reply_to.reply_token запроса отправки.
reply_tokenНепрозрачный токен ответа, скопированный без изменений из data.message.reply_token входящего webhook.
minLength: 1
mentions[]object[]Список целей @ для группового сообщения. type=member использует соответствующий id участника Provider; type=all означает @всех и действует только при поддержке Provider, иначе возвращается unsupported_message_type.
mentions[]Список целей @ для группового сообщения. type=member использует соответствующий id участника Provider; type=all означает @всех и действует только при поддержке Provider, иначе возвращается unsupported_message_type.
typeТип цели @. Если опустить, для совместимости со старыми запросами считается member; type=member требует id, а type=all передается без id и применим только к групповым чатам.
enum: member, all
idИдентификатор участника Provider, обязательный при type=member.
minLength: 1
Как понять результат
Сохраните message_id и provider_ref для сопоставления событий и диагностики. accepted не подтверждает доставку. Проверяйте её по событиям квитанций только при поддержке каналом; форматы идентификаторов различаются.
reply_token — Необязательный непрозрачный дескриптор ответа WhatsApp, возвращаемый, когда канал предоставляет идентификатор сообщения, на который можно ответить. Это не id родительского сообщения.
Ответ 200 OK
{
"request_id": "<REQUEST_ID>",
"data": {
"message_id": "msg_example",
"account_id": "acc_example",
"status": "accepted",
"provider_ref": "provider_msg_example",
"reply_token": "<opaque WhatsApp reply handle>"
}
}
Тело ответа
message_idИдентификатор сообщения UnifyPort (msg_...) для принятого сообщения.
account_idАккаунт провайдера, к которому относится этот ответ.
statusСтатус приёма; accepted означает, что сообщение поставлено в очередь на доставку провайдеру.
provider_refСсылка на сообщение на стороне провайдера, как только провайдер её назначит.
reply_tokenНеобязательный непрозрачный дескриптор ответа WhatsApp, возвращаемый, когда канал предоставляет идентификатор сообщения, на который можно ответить. Это не id родительского сообщения.
Ответы
200200 OK
Запрос выполнен. См. пример тела ответа.
400Bad Request
Тело запроса, путь или параметры некорректны.
401Unauthorized
Заголовок X-Api-Key отсутствует или недействителен.
409Conflict
Запрошенная операция конфликтует с существующим аккаунтом провайдера или ресурсом.
500Internal Server Error
Сервис столкнулся с неожиданной ошибкой.
501Not Implemented
Выбранный провайдер не реализует эту операцию.
502Bad Gateway
Адаптер или вышестоящий провайдер не смог завершить операцию.
При ошибке запроса
Проверьте HTTP и error.code/numeric_code, сохраните request_id. Исправьте параметры, завершите авторизацию или проверьте runtime. До повторной отправки или записи выясните результат предыдущей попытки. Справочник ошибок
- invalid_request · 10000 · 400
- Проверьте обязательные поля, форматы и условия канала, затем исправьте запрос.
- invalid_api_key · 11001 · 401
- Проверьте X-Api-Key и активность рабочего пространства.
- provider_not_ready · 30009 · 409
- Восстановите авторизацию и соединение, выясните предыдущий результат перед повтором.
- unsupported_message_type · 36000 · 400
- Выберите поддерживаемую операцию или тип. Повтор не меняет возможности канала.
- invalid_reply_token · 36006 · 400
- Копируйте входящий reply_token без изменений, не создавайте его из ID сообщения. Нужен канал с поддержкой цитат.