Docs
ChangelogالعربيةDashboard
DocumentationAPI reference
API referenceSend a message
  • Introduction
  • Authentication
    • GETVerify API key
  • Agents
    • POSTCreate agent
    • GETList agents
    • GETGet agent
    • PUTUpdate agent
    • DELDelete agent
    • POSTLink analysis groups to an agent
    • GETList analysis groups for an agent
  • Tools
    • POSTCreate tool
    • GETList tools
    • GETGet tool
    • PUTUpdate tool
    • DELDelete tool
    • POSTLink a tool to an agent
    • DELUnlink a tool from an agent
    • GETList tools for an agent
    • GETList agents for a tool
  • Analysis groups
    • POSTCreate analysis group
    • GETList analysis groups
    • GETGet analysis group
    • PUTUpdate analysis group
    • DELDelete analysis group
    • POSTLink an agent to an analysis group
    • POSTLink agents to an analysis group
    • GETList agents for an analysis group
    • DELUnlink an analysis group from an agent
  • Knowledge bases
    • POSTCreate knowledge base
    • GETList knowledge bases
    • GETGet knowledge base
    • PATCHUpdate knowledge base
    • DELDelete knowledge base
  • Documents
    • POSTAdd PDF document
    • POSTAdd text document
    • POSTAdd URL document
    • GETList documents
    • GETGet document
    • DELDelete document
  • Calls
    • POSTCreate outbound call
    • GETGet call
    • POSTSearch calls
    • POSTGet call analytics
    • POSTExport calls
    • GETGet recording download URL
    • POSTCreate outbound call (legacy path)
  • Web calls
    • POSTCreate web call
    • POSTCreate web call (legacy path)
  • SIP inbound
    • POSTCreate SIP inbound trunk
    • GETList SIP inbound trunks
    • GETGet SIP inbound trunk
    • DELDelete SIP inbound trunk
  • SIP outbound
    • POSTCreate SIP outbound trunk
    • GETList SIP outbound trunks
    • GETGet SIP outbound trunk
    • DELDelete SIP outbound trunk
  • Agent inbound links
    • POSTLink an agent to an inbound trunk
    • GETList agent inbound links
    • DELDelete agent inbound link
  • Text to speech
    • POSTGenerate speech
    • GETList voices
    • GETGet voice
    • POSTClone a voice
    • DELDelete cloned voice
  • Speech to text
    • POSTTranscribe an audio file
    • GETGet transcription job
    • GETList transcription jobs
    • WSStream speech to text
  • Contacts
    • POSTCreate contact
    • GETList contacts
    • GETSearch contacts
    • GETGet contact
    • PATCHUpdate contact
    • GETList conversations for a contact
  • Conversations
    • GETList conversations
    • POSTFilter conversations
    • POSTList conversations by contact
    • GETGet conversation
    • GETList conversation messages
    • POSTSend a message
    • POSTSend a message with an attachment
    • GETList conversation attachments
    • POSTAssign conversation
    • POSTChange conversation status
    • POSTChange conversation priority
    • POSTMark conversation as seen
  • Tickets
    • POSTCreate ticket
    • GETList tickets
    • POSTFilter tickets
    • POSTList tickets by contact
    • GETGet ticket
    • GETList ticket messages
    • POSTAdd a ticket message
    • POSTAdd a ticket message with attachments
    • POSTAssign ticket
    • POSTChange ticket status
    • POSTChange ticket priority
    • POSTChange ticket type
    • POSTCreate ticket inbox
    • GETList ticket inboxes
    • PATCHUpdate ticket inbox
    • DELDelete ticket inbox
  • WhatsApp
    • POSTConnect a WhatsApp number
    • GETList WhatsApp inboxes
    • GETGet WhatsApp inbox
    • PATCHUpdate WhatsApp inbox
    • DELDelete WhatsApp inbox
    • POSTCreate WhatsApp conversation
    • GETList WhatsApp conversations
    • POSTFilter WhatsApp conversations
    • POSTList WhatsApp conversations by contact
    • POSTAssign an agent to a WhatsApp number
    • GETGet the agent on a WhatsApp number
    • DELRemove the agent from a WhatsApp number
    • POSTGet WhatsApp analytics
  • Instagram
    • GETList Instagram accounts
    • GETGet Instagram account
    • DELDelete Instagram account
    • GETList Instagram conversations
    • POSTFilter Instagram conversations
    • POSTList Instagram conversations by contact
    • POSTAssign an agent to an Instagram account
    • GETGet the agent on an Instagram account
    • DELRemove the agent from an Instagram account
  • TikTok
    • GETList TikTok accounts
    • GETGet TikTok account
    • DELDelete TikTok account
    • GETList TikTok conversations
    • POSTFilter TikTok conversations
    • POSTList TikTok conversations by contact
    • POSTAssign an agent to a TikTok account
    • GETGet the agent on a TikTok account
    • DELRemove the agent from a TikTok account

Conversations

Send a message

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.

POST
https://api.nabrah.ai/api/ext/omni_v2/conversation/conversation/{id}/messages
Send a message
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": {}
    }
  ]
}

Request body fields

Base your request on these fields (only content is typically required).

content

The message text/body to send.

content
message_type

Use outgoing (the default) for replies and for WhatsApp templates. template is not accepted and returns 422.

message_type
private

When true the message is an internal note visible only to agents; when false it is delivered to the contact.

private
content_type / content_attributes

Leave content_type as text and content_attributes empty. To show buttons, send an approved template that includes them.

content_typecontent_attributes
template_params

Sends an approved WhatsApp template instead of a free-form message. See WhatsApp templates below. campaign_id is not needed.

template_params

WhatsApp templates

Templates are how you reach a customer outside the 24-hour window, for example to confirm or remind an appointment.

New numbers

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_params
Variables"processed_params": { "1": "Sara", "2": "12 Oct, 10:00" }

Values for {{1}}, {{2}}, … in the template body, as strings, keyed by position.

content

Required. It is the text shown in the conversation history; the customer receives the template. Use the filled-in template text.

content
24-hour window

Outside the 24-hour customer-service window only templates are delivered. A plain message sent outside it is accepted but is then marked failed.

Delivery status

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.

Errors

A 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.

Instagram and TikTok reply windows

Outgoing messages on Instagram and TikTok conversations are only delivered inside the platform's reply window.

409 reply_window_closed

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.

Not delivered

If the platform refuses a message after it was accepted, a private note starting with "Not delivered" is added to the conversation.

Authorization

X-API-Keystringheaderrequired

Your workspace API key. Create one in the dashboard under API keys.

Path parameters

idintegerrequired

Integer id of the conversation to post the message into.

From a list endpoint or GET.../conversation/{id}.

Body

application/json

Send a plain-text reply that is delivered to the contact.

Outgoing reply
{
  "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": {}
}

Response

200

Successful Response

application/json

422

Validation Error

application/json

PreviousList conversation messagesNextSend a message with an attachment
© 2026 Nabrah. All rights reserved.
ChangelogPrivacy PolicyTerms of Service