Сообщения
Отправить сообщение с контактом (vCard)
Отправляет карточки контактов. message.contacts должен быть непустым массивом, а name каждой карточки — непустой строкой. Пока поддерживает только WhatsApp; неверные данные возвращают 400 invalid_request.
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-тела запроса.
Тело запроса
provider_dataobjectОпции отправки провайдера, действующие только для поддерживаемых провайдеров и типов сообщений. seconds для WhatsApp audio/video — неотрицательное целое. Только для video допустим диапазон от 0 до 4294967295, waveform — только для audio. Для ответа с цитатой используйте reply_to верхнего уровня, если он поддерживается. Для sticker поле provider_data нужно опустить или передать пустой объект; не объект возвращает 400 invalid_request, непустой объект — 400 provider_invalid_request.
provider_dataОпции отправки провайдера, действующие только для поддерживаемых провайдеров и типов сообщений. seconds для WhatsApp audio/video — неотрицательное целое. Только для video допустим диапазон от 0 до 4294967295, waveform — только для audio. Для ответа с цитатой используйте reply_to верхнего уровня, если он поддерживается. Для sticker поле provider_data нужно опустить или передать пустой объект; не объект возвращает 400 invalid_request, непустой объект — 400 provider_invalid_request.
secondsНеобязательная длительность сообщений WhatsApp audio и video в секундах как неотрицательное целое. Только для video допустим диапазон от 0 до 4294967295.
minimum: 0
waveformНеобязательные данные waveform для сообщений WhatsApp типа audio. Непустые значения должны использовать стандартную кодировку Base64 и после декодирования быть разбираемыми JSON-данными waveform; пустая строка считается отсутствием значения, а другие ошибки формата возвращают HTTP 400 provider_invalid_request.
account_idАккаунт провайдера, отправляющий сообщение.
minLength: 1
toobjectобязательноПолучатель: id и type.
toПолучатель: id и type.
idИдентификатор получателя на стороне провайдера.
minLength: 1
typeСтандартный тип беседы: user, group или channel. Группы объявлений сообщества WhatsApp по-прежнему используют group.
enum: user, group, channel
messageobjectобязательноНормализованный payload сообщения. Текст — message.text, медиа — message.url.
messageНормализованный payload сообщения. Текст — message.text, медиа — message.url.
typeТип сообщения: text, image, video, audio, document, file, contact, link_preview, poll или sticker.
enum: text, image, video, audio, document, file, contact, link_preview, poll, sticker
textНепустой текст, обязательный для text и link_preview. Для link_preview нужен хотя бы один непробельный символ; WhatsApp также требует включить в текст link_preview.url без изменений.
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Непустая ссылка на файл провайдера или хранилища; медиа требует один источник.
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Необязательная должность контакта.
link_previewobjectОбязателен вместе с text только для message.type=link_preview; нельзя смешивать с другими данными сообщения. Общая структура требует только url; необязательные title и description допускают пустую строку, но не null. Политика отправки WhatsApp в этом API требует непустые title/image_url и ограничивает title до 255, а description до 1024 символов Unicode.
link_previewОбязателен вместе с text только для message.type=link_preview; нельзя смешивать с другими данными сообщения. Общая структура требует только url; необязательные title и description допускают пустую строку, но не null. Политика отправки WhatsApp в этом API требует непустые title/image_url и ограничивает title до 255, а description до 1024 символов Unicode.
urlОбязательная целевая ссылка: абсолютный HTTP(S) URI с именем хоста без пробельных символов; в квадратных скобках допустимы только литералы IPv6. Сохраняется без изменений; доступность ресурса не гарантируется.
pattern: ^[Hh][Tt][Tt][Pp][Ss]?://(?:[^/?#@\s]*@)?(?:\[[0-9A-Fa-f:.]+\]|[^/?#:@\s\[\]]+)(?::[0-9]*)?(?:[/?#]|$)
titleНеобязательный заголовок предпросмотра; пустая строка допустима, null запрещён. WhatsApp требует непустое значение длиной до 255 символов Unicode.
descriptionНеобязательное описание предпросмотра; пустая строка допустима, null запрещён. WhatsApp допускает до 1024 символов Unicode.
image_urlНеобязательный URI изображения; для WhatsApp обязателен и не может быть пустым. Нужен абсолютный HTTP(S) URI с именем хоста без пробельных символов; в квадратных скобках допустимы только литералы IPv6. Сохраняется без изменений; доступность ресурса не гарантируется.
pattern: ^[Hh][Tt][Tt][Pp][Ss]?://(?:[^/?#@\s]*@)?(?:\[[0-9A-Fa-f:.]+\]|[^/?#:@\s\[\]]+)(?::[0-9]*)?(?:[/?#]|$)
pollobjectОбязателен только для message.type=poll; нельзя смешивать с text или другими данными сообщения. Требуются question, options и max_selections. Вопрос и заголовки вариантов сохраняются без изменений. Общая структура не ограничивает длину вопроса, максимальное число вариантов или повторение заголовков; провайдеры могут вводить дополнительные ограничения.
pollОбязателен только для message.type=poll; нельзя смешивать с text или другими данными сообщения. Требуются question, options и max_selections. Вопрос и заголовки вариантов сохраняются без изменений. Общая структура не ограничивает длину вопроса, максимальное число вариантов или повторение заголовков; провайдеры могут вводить дополнительные ограничения.
questionОбязательный вопрос опроса с хотя бы одним непробельным символом; сохраняется без изменений.
minLength: 1 · pattern: \S
options[]object[]Обязательный массив минимум из двух вариантов, каждый с title.
minItems: 2
options[]Обязательный массив минимум из двух вариантов, каждый с title.
minItems: 2
titleОбязательный заголовок варианта с хотя бы одним непробельным символом. Отправляется без trim, изменения регистра или нормализации Unicode.
minLength: 1 · pattern: \S
max_selectionsОбязательное максимальное число выбираемых вариантов на одного участника, не число участников. Целое от 1 до количества options, проверяемое API. Числа с целым значением, например 1.0 и 1e0, равны 1; дробные значения недопустимы.
minimum: 1
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 сообщения. Нужен канал с поддержкой цитат.