Conversations
Sends a new message into the conversation. The path id selects the conversation; the JSON body carries the message content and options. Set private: true to post an internal note that the contact cannot see, or false for an outgoing reply. Returns the created message object (with its assigned id, created_at, status, and any attachments). For replies that include a file, use the messages_with_attachment endpoint instead.
curl --request POST \
--url 'https://api.nabrah.ai/api/ext/omni_v2/conversation/conversation/<id>/messages' \
--header 'X-API-Key: <your-api-key>' \
--header 'Content-Type: application/json' \
--data '{
"content": "Thanks for reaching out — we have shipped your replacement and it will arrive within 3 business days.",
"message_type": "outgoing",
"private": false,
"content_type": "text",
"content_attributes": {}
}'{
"content": "string",
"content_attributes": {},
"content_type": "string",
"conversation_id": 0,
"created_at": 0,
"echo_id": "string",
"id": 0,
"inbox_id": 0,
"message_type": 0,
"private": false,
"sender": {
"id": 0,
"name": "string",
"available_name": "string",
"avatar_url": "string",
"type": "string"
},
"source_id": "string",
"status": "string",
"attachments": [
{
"id": 0,
"account_id": 0,
"message_id": 0,
"thumb_url": "string",
"data_url": "string",
"file_size": 0,
"file_type": "string",
"extension": "string",
"width": 0,
"height": 0,
"created_at": 0,
"sender": {
"id": 0,
"name": "string",
"available_name": "string",
"avatar_url": "string",
"type": "string",
"availability_status": "string",
"thumbnail": "string",
"additional_attributes": {},
"custom_attributes": {},
"email": "string",
"identifier": "string",
"phone_number": "string",
"blocked": false
},
"coordinates_lat": 0,
"coordinates_lng": 0,
"fallback_title": "string",
"meta": {}
}
]
}Base your request on these fields (only content is typically required).
contentThe message text/body to send.
contentmessage_typeUse outgoing (the default) for replies and for WhatsApp templates. template is not accepted and returns 422.
message_typeprivateWhen true the message is an internal note visible only to agents; when false it is delivered to the contact.
privateLeave content_type as text and content_attributes empty. To show buttons, send an approved template that includes them.
content_typecontent_attributestemplate_paramsSends an approved WhatsApp template instead of a free-form message. See WhatsApp templates below. campaign_id is not needed.
template_paramsTemplates are how you reach a customer outside the 24-hour window, for example to confirm or remind an appointment.
To message a number that has never written to you, first open a conversation with POST /api/ext/omni_v2/whatsapp and contact_phone, then post the template into it here. Sent this way, the template shows in the inbox and the customer's reply continues in the same conversation.
Shape"template_params": { "name", "language", "category", "processed_params" }name and language must match a template that is approved for this WhatsApp number, for example appointment_confirmation and en. category is optional. Send these fields directly in template_params; WhatsApp's own template object and components list are not accepted.
template_paramsVariables"processed_params": { "1": "Sara", "2": "12 Oct, 10:00" }Values for {{1}}, {{2}}, … in the template body, as strings, keyed by position.
contentRequired. It is the text shown in the conversation history; the customer receives the template. Use the filled-in template text.
contentOutside the 24-hour customer-service window only templates are delivered. A plain message sent outside it is accepted but is then marked failed.
The response is the created message. Delivery to WhatsApp happens right after; read status (sent, delivered, read or failed) on the message from GET /api/ext/omni_v2/conversation/conversation/{id}/messages.
ErrorsA message that cannot be created returns 422 with the reason in detail, for example Message rejected: Validation failed: Name is required when template_params has no name. Nothing is sent in that case.
Outgoing messages on Instagram and TikTok conversations are only delivered inside the platform's reply window.
Returned when the window has closed: 24 hours after the customer's last message on Instagram, 48 hours on TikTok. Private notes are not affected. On Instagram, team members replying from the platform can still reply for up to 7 days; API sends cannot.
If the platform refuses a message after it was accepted, a private note starting with "Not delivered" is added to the conversation.
X-API-KeystringheaderrequiredYour workspace API key. Create one in the dashboard under API keys.
idintegerrequiredInteger id of the conversation to post the message into.
From a list endpoint or GET.../conversation/{id}.
Send a plain-text reply that is delivered to the contact.
{
"content": "Thanks for reaching out — we have shipped your replacement and it will arrive within 3 business days.",
"message_type": "outgoing",
"private": false,
"content_type": "text",
"content_attributes": {}
}Successful Response
application/json
Validation Error
application/json