Отправить сообщение с контактом (vCard)
Отправляет карточку контакта. message.type равен contact, а message.contacts — структурированный массив (одна или несколько карточек); UnifyPort генерирует vCard. Каждая карточка требует name; поля phones[].number, emails[].address, organization и title необязательны. Пока только WhatsApp; пустой массив contacts или карточка без name возвращает 400 invalid_request, а провайдеры, отличные от WhatsApp, возвращают 400 unsupported_message_type. Необязательный непрозрачный дескриптор ответа WhatsApp, возвращаемый, когда канал предоставляет идентификатор сообщения, на который можно ответить. Это не id родительского сообщения.
https://api.unifyport.ai/v1/messagesЗаголовки
X-Api-KeyAPI-ключ рабочей области. Рабочая область определяется по этому заголовку.
Content-TypeИспользуйте application/json при отправке JSON-тела запроса.
Параметры пути
У этого эндпоинта нет параметров пути.
Тело запроса
account_idАккаунт провайдера, отправляющий сообщение.
toobjectобязательноПолучатель: id и type.
toПолучатель: id и type.
idИдентификатор получателя на стороне провайдера.
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.
urlПубличный URL медиафайла для медиа-сообщений.
file_urlАльтернативный URL медиафайла для файловых адаптеров провайдера.
file_keyСсылка на файл у провайдера или в хранилище, если поддерживается.
captionНеобязательная подпись для image, video, document или file.
contacts[]object[]Одна или несколько структурированных карточек для message.type=contact.
contacts[]Одна или несколько структурированных карточек для message.type=contact.
nameОтображаемое имя контакта; обязательно для каждой карточки.
phones[]object[]Телефонные номера в карточке контакта.
phones[]Телефонные номера в карточке контакта.
numberНомер телефона; обязателен для каждой записи phone.
typeНеобязательная метка телефона, например CELL или WORK.
emails[]object[]Адреса электронной почты в карточке контакта.
emails[]Адреса электронной почты в карточке контакта.
addressАдрес электронной почты; обязателен для каждой записи email.
typeНеобязательная метка электронной почты, например WORK или HOME.
organizationНеобязательное название организации контакта.
titleНеобязательная должность контакта.
provider_dataobjectОпции провайдера, например parse_mode для Telegram или seconds / waveform для аудио WhatsApp. Для ответа с цитатой используйте reply_to верхнего уровня.
provider_dataОпции провайдера, например parse_mode для Telegram или seconds / waveform для аудио WhatsApp. Для ответа с цитатой используйте reply_to верхнего уровня.
secondsНеобязательная длительность аудио WhatsApp в секундах; значение должно быть неотрицательным.
waveformНеобязательная строка данных формы волны для аудиосообщений WhatsApp.
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.
mentions[]object[]Участники, на которых ссылаются заполнители {{@<id>}} в text или caption.
mentions[]Участники, на которых ссылаются заполнители {{@<id>}} в text или caption.
idИдентификатор участника у провайдера, соответствующий заполнителю {{@<id>}}.
Тело ответа
message_idИдентификатор сообщения UnifyPort (msg_...) для принятого сообщения.
account_idАккаунт провайдера, к которому относится этот ответ.
statusСтатус приёма; accepted означает, что сообщение поставлено в очередь на доставку провайдеру.
provider_refСсылка на сообщение на стороне провайдера, как только провайдер её назначит.
reply_tokenНеобязательный непрозрачный дескриптор ответа WhatsApp, возвращаемый, когда канал предоставляет идентификатор сообщения, на который можно ответить. Это не id родительского сообщения.
Ответы
200Запрос выполнен. См. пример тела ответа.
400Тело запроса, путь или параметры некорректны.
401Заголовок X-Api-Key отсутствует или недействителен.
409Запрошенная операция конфликтует с существующим аккаунтом провайдера или ресурсом.
500Сервис столкнулся с неожиданной ошибкой.
501Выбранный провайдер не реализует эту операцию.
502Адаптер или вышестоящий провайдер не смог завершить операцию.
Запрос
curl -X POST https://api.unifyport.ai/v1/messages \
-H "X-Api-Key: <YOUR_API_KEY>" \
-H "Content-Type: application/json" \
-d '{
"account_id": "acc_example",
"to": {
"id": "user_example",
"type": "user"
},
"message": {
"type": "contact",
"contacts": [
{
"name": "Jane Doe",
"phones": [{ "number": "+8613800000000", "type": "CELL" }],
"emails": [{ "address": "jane@example.com" }],
"organization": "ACME",
"title": "PM"
}
]
}
}'Ответ
{
"data": {
"message_id": "msg_example",
"account_id": "acc_example",
"status": "accepted",
"provider_ref": "provider_msg_example",
"reply_token": "<opaque WhatsApp reply handle>"
}
}