API reference
Objects
The resources the API returns, with every attribute and an example. Attributes marked "or null" are always present and may be null.
The message object#
An outbound message you sent, or an inbound message received on one of your channels.
Attributes
idstringUnique identifier, prefixed
msg_.objectstringAlways
message.Value:
messagemodestringMode of the API key that created the message.
Possible values
livetestchannel_idstringChannel the message was sent or received on.
channel_typestringType of that channel.
Possible values
whatsapptelegramsmssms_otpmessengerinstagramtiktokdirectionstringoutboundfor messages you send,inboundfor messages you receive.Possible values
outboundinboundtostringRecipient identifier. For inbound messages, the identifier of your channel.
fromstringSender identifier. For outbound messages, the identifier of your channel.
typestringContent type. One of the common types (
text,attachments,template,button,list,cta_url,location,contacts,poll) or a channel-specific type listed in the channelcapabilities.contentobjectThe content, under a single key equal to
type.Show child attributesHide child attributes
textobjectPlain text. Supported on every channel.
Show child attributesHide child attributes
bodystringMessage text, 1 to 4096 characters.
1 to 4096 characters
preview_urlbooleanAsk the channel to render a preview for the first URL in
body, where the channel supports it.
attachmentsarray of objectsA media message. The array must contain exactly one item. Supported on every channel except
sms_otp.Exactly 1 item
Show child attributesHide child attributes
typestringKind of media.
Possible values
imagevideodocumentaudiovoicestickerurlstringPublicly reachable HTTPS URL of the file. It is fetched at send time.
captionstringText shown with the media, where the channel supports captions.
Up to 1024 characters
filenamestringFile name shown to the recipient for documents.
Up to 255 characters
templateobjectA pre-approved WhatsApp message template. Required to start a conversation outside the 24-hour customer service window.
Show child attributesHide child attributes
namestringTemplate name as approved in WhatsApp Manager.
1 to 512 characters
languageobjectTemplate language.
Show child attributesHide child attributes
codestringLanguage or locale code of the approved translation, for example
enoren_US.2 to 15 characters
componentsarray of objectsValues for the template variables, in the WhatsApp Cloud API component format. Omit for templates without variables.
Show child attributesHide child attributes
typestringWhich part of the template the parameters fill.
Possible values
headerbodybuttonsub_typestringButton kind, for
buttoncomponents (for exampleurlorquick_reply).indexstringZero-based button position, for
buttoncomponents.parametersarray of objectsParameter values in template order.
buttonobjectA message with one to three quick-reply buttons. A tap arrives as an inbound message carrying the button
id.Show child attributesHide child attributes
headerobjectOptional header shown above the body.
Show child attributesHide child attributes
typestringHeader kind.
Possible values
texttextstringHeader text, up to 60 characters.
1 to 60 characters
bodyobjectMain message text.
Show child attributesHide child attributes
textstringBody text.
1 to 1024 characters
footerobjectOptional small print below the body.
Show child attributesHide child attributes
textstringFooter text, up to 60 characters.
1 to 60 characters
actionobjectThe buttons.
Show child attributesHide child attributes
buttonsarray of objectsOne to three reply buttons.
1 to 3 items
Show child attributesHide child attributes
replyobjectA reply button.
Show child attributesHide child attributes
idstringYour identifier for the button. Returned when the recipient taps it.
1 to 256 characters
titlestringButton label, up to 20 characters.
1 to 20 characters
listobjectA WhatsApp list picker: one button that opens a menu of rows grouped into sections.
Show child attributesHide child attributes
headerobjectOptional header shown above the body.
Show child attributesHide child attributes
typestringHeader kind.
Possible values
texttextstringHeader text, up to 60 characters.
1 to 60 characters
bodyobjectMain message text.
Show child attributesHide child attributes
textstringBody text.
1 to 1024 characters
footerobjectOptional small print below the body.
Show child attributesHide child attributes
textstringFooter text, up to 60 characters.
1 to 60 characters
actionobjectThe menu.
Show child attributesHide child attributes
buttonstringLabel of the button that opens the list, up to 20 characters.
1 to 20 characters
sectionsarray of objectsGroups of rows.
Show child attributesHide child attributes
titlestringSection heading, up to 24 characters.
1 to 24 characters
rowsarray of objectsSelectable rows.
Show child attributesHide child attributes
idstringYour identifier for the row. Returned when the recipient selects it.
1 to 200 characters
titlestringRow label, up to 24 characters.
1 to 24 characters
descriptionstringOptional second line, up to 72 characters.
Up to 72 characters
cta_urlobjectA WhatsApp message with a single button that opens a URL.
Show child attributesHide child attributes
headerobjectOptional header shown above the body.
Show child attributesHide child attributes
typestringHeader kind.
Possible values
texttextstringHeader text, up to 60 characters.
1 to 60 characters
bodyobjectMain message text.
Show child attributesHide child attributes
textstringBody text.
1 to 1024 characters
footerobjectOptional small print below the body.
Show child attributesHide child attributes
textstringFooter text, up to 60 characters.
1 to 60 characters
actionobjectThe link button.
Show child attributesHide child attributes
parametersobjectShow child attributesHide child attributes
display_textstringButton label, up to 20 characters.
1 to 20 characters
urlstringURL opened when the button is tapped.
locationobjectA map pin. Supported on WhatsApp and Telegram.
Show child attributesHide child attributes
latitudenumberLatitude in decimal degrees.
-90 to 90
longitudenumberLongitude in decimal degrees.
-180 to 180
namestringName of the place.
Up to 255 characters
addressstringAddress of the place.
Up to 1024 characters
contactsarray of objectsOne or more contact cards in the provider contact format. Forwarded to the channel without further validation. Supported on WhatsApp and Telegram.
Show child attributesHide child attributes
nameobjectContact name.
Show child attributesHide child attributes
formatted_namestringFull display name.
first_namestringGiven name.
last_namestringFamily name.
phonesarray of objectsPhone numbers.
Show child attributesHide child attributes
phonestringPhone number in E.164 format.
typestringLabel such as
CELL,WORKorHOME.
pollobjectA Telegram poll.
Show child attributesHide child attributes
questionstringPoll question, up to 300 characters.
1 to 300 characters
optionsarray of stringsTwo to ten answer options of up to 100 characters each.
2 to 10 items
statusstringDelivery status. Outbound:
queued,sending,sent,delivered,readorfailed. Inbound:received.Possible values
queuedsendingsentdeliveredreadfailedreceivederrorobject or nullWhy the message failed.
nullunlessstatusisfailed.Show child attributesHide child attributes
codestringFailure reason.
provider_errorwhen the channel provider rejected or could not deliver the message.messagestringHuman-readable explanation.
provider_codestring or nullError code returned by the channel provider.
nullwhen the provider gave none.
referencestring or nullYour own identifier, as supplied when sending.
Up to 255 characters
metadataobjectKey-value pairs supplied when sending. Empty object if none.
billingobjectHow the message was paid for.
Show child attributesHide child attributes
sourcestringpackage: one package credit was consumed.wallet:amount_microswas debited from the wallet.none: not billed (test mode and inbound messages).Possible values
packagewalletnoneamount_microsintegerAmount debited from the wallet in micro-USD.
0unlesssourceiswallet.package_grant_idstring or nullPackage the credit came from, when
sourceispackage.refundedbooleanWhether the charge was returned because the message failed.
senderobject or nullInbound messages: what the channel reported about the sender.
nullon outbound messages and when the channel reported nothing.Show child attributesHide child attributes
namestring or nullDisplay name the sender has on the channel (the WhatsApp profile name, the Telegram first and last name).
usernamestring or nullHandle on the channel, where the channel has one (Telegram, Instagram).
contact_idstring or nullInbound messages: the contact that had the sender's identifier when the message arrived (
ct_…), ornullwhen there is none. Alwaysnullon outbound messages.created_attimestampWhen the message was accepted or received.
updated_attimestampWhen the message last changed: usually its latest status change. Filter on it with
updated_after.sent_atstring or nullWhen the provider accepted the message.
delivered_atstring or nullWhen the message reached the recipient device.
read_atstring or nullWhen the recipient read the message, on channels that report it.
failed_atstring or nullWhen the message failed.
{
"id": "msg_2b1Xw9aQ3rT8yU0pL4kZ",
"object": "message",
"mode": "live",
"channel_id": "ch_7Hq2mN5vB8cX1zL0pK3j",
"channel_type": "whatsapp",
"direction": "outbound",
"to": "+971501234567",
"from": "+971800123456",
"type": "text",
"content": {
"text": {
"body": "Your code is 482910"
}
},
"status": "delivered",
"error": null,
"reference": "order-1042",
"metadata": {
"user_id": "u_17"
},
"billing": {
"source": "package",
"amount_micros": 0,
"package_grant_id": "grant_5tGh2Kp9LmQ4xW7nB1cD",
"refunded": false
},
"sender": null,
"contact_id": null,
"created_at": "2026-10-05T09:30:00.000Z",
"updated_at": "2026-10-05T09:30:02.871Z",
"sent_at": "2026-10-05T09:30:01.210Z",
"delivered_at": "2026-10-05T09:30:02.871Z",
"read_at": null,
"failed_at": null
}The channel object#
A sender you connected: a WhatsApp Business number, a Telegram bot, an SMS number and so on.
Attributes
idstringUnique identifier, prefixed
ch_. Sandbox channels usech_test_<type>.objectstringAlways
channel.Value:
channelmodestringtestfor the built-in sandbox channels,livefor connected channels.Possible values
livetesttypestringChannel type.
Possible values
whatsapptelegramsmssms_otpmessengerinstagramtiktoknamestringDisplay name you chose.
identifierstringSender identity on the channel: phone number, bot username, sender ID, page ID or account ID. Always
sandboxfor the built-in sandbox channels.statusstringsuspendedchannels cannot send.Possible values
activesuspendedconnection_statusstringState of the link to the provider. Messages can be sent only while
connected.Possible values
pendingconnectedreconnectingdisconnectedblockedcapabilitiesarray of stringsMessage types the channel accepts as
typewhen sending.created_attimestampWhen the channel was created.
{
"id": "ch_7Hq2mN5vB8cX1zL0pK3j",
"object": "channel",
"mode": "live",
"type": "whatsapp",
"name": "Support line",
"identifier": "+971800123456",
"status": "active",
"connection_status": "connected",
"capabilities": [
"text",
"attachments",
"template",
"button",
"list",
"cta_url",
"location",
"contacts",
"flow",
"product",
"product_list",
"catalog",
"carousel",
"location_request"
],
"created_at": "2026-10-01T08:00:00.000Z"
}The webhook endpoint object#
A URL on your server that receives events.
Attributes
idstringUnique identifier, prefixed
we_.objectstringAlways
webhook_endpoint.Value:
webhook_endpointmodestringMode of the API key that created the endpoint. The endpoint receives events of this mode only.
Possible values
livetesturlstringHTTPS URL that receives the events.
descriptionstring or nullYour note about the endpoint.
eventsarray of stringsSubscribed event types.
["*"]means all.Possible values
message.sentmessage.deliveredmessage.readmessage.failedmessage.receivedchannel.connectedchannel.disconnectedbalance.lowpackage.exhaustedpackage.expiringcampaign.startedcampaign.pausedcampaign.completedcampaign.failed*statusstringdisabledendpoints receive nothing. An endpoint is disabled automatically after 50 consecutive failed deliveries.Possible values
activedisabledfiltersobjectServer-side filters. An event is delivered only when it matches every filter that is set; events that do not carry the filtered property (for example
balance.low) always pass.Show child attributesHide child attributes
channel_idstringOnly events about this channel: messages on it, and its own
channel.*events.directionstringOnly message events of this direction.
Possible values
outboundinbound
metadataobjectKey-value pairs supplied by whoever created the endpoint, for its own bookkeeping. Empty object if none.
sourcestring or nullThe tool that owns the endpoint (
zapier,n8n,make…), ornullfor an endpoint created by hand. An endpoint with asourceis removed automatically after 30 days of uninterrupted failures.created_byobject or nullWho created the endpoint.
nullfor endpoints older than this field.Show child attributesHide child attributes
typestringA console user or an API key.
Possible values
userapi_keyidstringID of that user or key.
has_verification_tokenbooleanWhether deliveries carry the
OmniMessage-Verification-Tokenheader. The token itself is never returned.secretstringSigning secret, prefixed
whsec_. Returned only when the endpoint is created and when the secret is rolled.created_attimestampWhen the endpoint was created.
{
"id": "we_3kL9pQ2wE5rT8yU1iO4a",
"object": "webhook_endpoint",
"mode": "live",
"url": "https://example.com/hooks/omni",
"description": "Production delivery receipts",
"events": [
"message.delivered",
"message.failed",
"message.received"
],
"status": "active",
"filters": {},
"metadata": {},
"source": null,
"created_by": {
"type": "api_key",
"id": "key_1qW4eR7tY0uI3oP6aS9d"
},
"has_verification_token": false,
"created_at": "2026-10-02T11:15:00.000Z"
}The event object#
The body of every webhook request.
Attributes
idstringUnique identifier, prefixed
evt_. Stable across retries: use it to deduplicate.objectstringAlways
event.Value:
eventtypestringEvent type.
Possible values
message.sentmessage.deliveredmessage.readmessage.failedmessage.receivedchannel.connectedchannel.disconnectedbalance.lowpackage.exhaustedpackage.expiringcampaign.startedcampaign.pausedcampaign.completedcampaign.failedwebhook.testmodestringMode the event belongs to.
Possible values
livetestcreated_attimestampWhen the event occurred.
dataobjectEvent payload.
Show child attributesHide child attributes
objectobjectThe resource the event is about, as it was when the event occurred: a message for
message.*, a channel forchannel.*, the balance forbalance.low, a package forpackage.*, a campaign forcampaign.*.Message · show attributes · hide attributes
idstringUnique identifier, prefixed
msg_.objectstringAlways
message.Value:
messagemodestringMode of the API key that created the message.
Possible values
livetestchannel_idstringChannel the message was sent or received on.
channel_typestringType of that channel.
Possible values
whatsapptelegramsmssms_otpmessengerinstagramtiktokdirectionstringoutboundfor messages you send,inboundfor messages you receive.Possible values
outboundinboundtostringRecipient identifier. For inbound messages, the identifier of your channel.
fromstringSender identifier. For outbound messages, the identifier of your channel.
typestringContent type. One of the common types (
text,attachments,template,button,list,cta_url,location,contacts,poll) or a channel-specific type listed in the channelcapabilities.contentobjectThe content, under a single key equal to
type.Show child attributesHide child attributes
textobjectPlain text. Supported on every channel.
Show child attributesHide child attributes
bodystringMessage text, 1 to 4096 characters.
1 to 4096 characters
preview_urlbooleanAsk the channel to render a preview for the first URL in
body, where the channel supports it.
attachmentsarray of objectsA media message. The array must contain exactly one item. Supported on every channel except
sms_otp.Exactly 1 item
Show child attributesHide child attributes
typestringKind of media.
Possible values
imagevideodocumentaudiovoicestickerurlstringPublicly reachable HTTPS URL of the file. It is fetched at send time.
captionstringText shown with the media, where the channel supports captions.
Up to 1024 characters
filenamestringFile name shown to the recipient for documents.
Up to 255 characters
templateobjectA pre-approved WhatsApp message template. Required to start a conversation outside the 24-hour customer service window.
Show child attributesHide child attributes
namestringTemplate name as approved in WhatsApp Manager.
1 to 512 characters
languageobjectTemplate language.
Show child attributesHide child attributes
codestringLanguage or locale code of the approved translation, for example
enoren_US.2 to 15 characters
componentsarray of objectsValues for the template variables, in the WhatsApp Cloud API component format. Omit for templates without variables.
Show child attributesHide child attributes
typestringWhich part of the template the parameters fill.
Possible values
headerbodybuttonsub_typestringButton kind, for
buttoncomponents (for exampleurlorquick_reply).indexstringZero-based button position, for
buttoncomponents.parametersarray of objectsParameter values in template order.
buttonobjectA message with one to three quick-reply buttons. A tap arrives as an inbound message carrying the button
id.Show child attributesHide child attributes
headerobjectOptional header shown above the body.
Show child attributesHide child attributes
typestringHeader kind.
Possible values
texttextstringHeader text, up to 60 characters.
1 to 60 characters
bodyobjectMain message text.
Show child attributesHide child attributes
textstringBody text.
1 to 1024 characters
footerobjectOptional small print below the body.
Show child attributesHide child attributes
textstringFooter text, up to 60 characters.
1 to 60 characters
actionobjectThe buttons.
Show child attributesHide child attributes
buttonsarray of objectsOne to three reply buttons.
1 to 3 items
Show child attributesHide child attributes
replyobjectA reply button.
Show child attributesHide child attributes
idstringYour identifier for the button. Returned when the recipient taps it.
1 to 256 characters
titlestringButton label, up to 20 characters.
1 to 20 characters
listobjectA WhatsApp list picker: one button that opens a menu of rows grouped into sections.
Show child attributesHide child attributes
headerobjectOptional header shown above the body.
Show child attributesHide child attributes
typestringHeader kind.
Possible values
texttextstringHeader text, up to 60 characters.
1 to 60 characters
bodyobjectMain message text.
Show child attributesHide child attributes
textstringBody text.
1 to 1024 characters
footerobjectOptional small print below the body.
Show child attributesHide child attributes
textstringFooter text, up to 60 characters.
1 to 60 characters
actionobjectThe menu.
Show child attributesHide child attributes
buttonstringLabel of the button that opens the list, up to 20 characters.
1 to 20 characters
sectionsarray of objectsGroups of rows.
Show child attributesHide child attributes
titlestringSection heading, up to 24 characters.
1 to 24 characters
rowsarray of objectsSelectable rows.
Show child attributesHide child attributes
idstringYour identifier for the row. Returned when the recipient selects it.
1 to 200 characters
titlestringRow label, up to 24 characters.
1 to 24 characters
descriptionstringOptional second line, up to 72 characters.
Up to 72 characters
cta_urlobjectA WhatsApp message with a single button that opens a URL.
Show child attributesHide child attributes
headerobjectOptional header shown above the body.
Show child attributesHide child attributes
typestringHeader kind.
Possible values
texttextstringHeader text, up to 60 characters.
1 to 60 characters
bodyobjectMain message text.
Show child attributesHide child attributes
textstringBody text.
1 to 1024 characters
footerobjectOptional small print below the body.
Show child attributesHide child attributes
textstringFooter text, up to 60 characters.
1 to 60 characters
actionobjectThe link button.
Show child attributesHide child attributes
parametersobjectShow child attributesHide child attributes
display_textstringButton label, up to 20 characters.
1 to 20 characters
urlstringURL opened when the button is tapped.
locationobjectA map pin. Supported on WhatsApp and Telegram.
Show child attributesHide child attributes
latitudenumberLatitude in decimal degrees.
-90 to 90
longitudenumberLongitude in decimal degrees.
-180 to 180
namestringName of the place.
Up to 255 characters
addressstringAddress of the place.
Up to 1024 characters
contactsarray of objectsOne or more contact cards in the provider contact format. Forwarded to the channel without further validation. Supported on WhatsApp and Telegram.
Show child attributesHide child attributes
nameobjectContact name.
Show child attributesHide child attributes
formatted_namestringFull display name.
first_namestringGiven name.
last_namestringFamily name.
phonesarray of objectsPhone numbers.
Show child attributesHide child attributes
phonestringPhone number in E.164 format.
typestringLabel such as
CELL,WORKorHOME.
pollobjectA Telegram poll.
Show child attributesHide child attributes
questionstringPoll question, up to 300 characters.
1 to 300 characters
optionsarray of stringsTwo to ten answer options of up to 100 characters each.
2 to 10 items
statusstringDelivery status. Outbound:
queued,sending,sent,delivered,readorfailed. Inbound:received.Possible values
queuedsendingsentdeliveredreadfailedreceivederrorobject or nullWhy the message failed.
nullunlessstatusisfailed.Show child attributesHide child attributes
codestringFailure reason.
provider_errorwhen the channel provider rejected or could not deliver the message.messagestringHuman-readable explanation.
provider_codestring or nullError code returned by the channel provider.
nullwhen the provider gave none.
referencestring or nullYour own identifier, as supplied when sending.
Up to 255 characters
metadataobjectKey-value pairs supplied when sending. Empty object if none.
billingobjectHow the message was paid for.
Show child attributesHide child attributes
sourcestringpackage: one package credit was consumed.wallet:amount_microswas debited from the wallet.none: not billed (test mode and inbound messages).Possible values
packagewalletnoneamount_microsintegerAmount debited from the wallet in micro-USD.
0unlesssourceiswallet.package_grant_idstring or nullPackage the credit came from, when
sourceispackage.refundedbooleanWhether the charge was returned because the message failed.
senderobject or nullInbound messages: what the channel reported about the sender.
nullon outbound messages and when the channel reported nothing.Show child attributesHide child attributes
namestring or nullDisplay name the sender has on the channel (the WhatsApp profile name, the Telegram first and last name).
usernamestring or nullHandle on the channel, where the channel has one (Telegram, Instagram).
contact_idstring or nullInbound messages: the contact that had the sender's identifier when the message arrived (
ct_…), ornullwhen there is none. Alwaysnullon outbound messages.created_attimestampWhen the message was accepted or received.
updated_attimestampWhen the message last changed: usually its latest status change. Filter on it with
updated_after.sent_atstring or nullWhen the provider accepted the message.
delivered_atstring or nullWhen the message reached the recipient device.
read_atstring or nullWhen the recipient read the message, on channels that report it.
failed_atstring or nullWhen the message failed.
Channel · show attributes · hide attributes
idstringUnique identifier, prefixed
ch_. Sandbox channels usech_test_<type>.objectstringAlways
channel.Value:
channelmodestringtestfor the built-in sandbox channels,livefor connected channels.Possible values
livetesttypestringChannel type.
Possible values
whatsapptelegramsmssms_otpmessengerinstagramtiktoknamestringDisplay name you chose.
identifierstringSender identity on the channel: phone number, bot username, sender ID, page ID or account ID. Always
sandboxfor the built-in sandbox channels.statusstringsuspendedchannels cannot send.Possible values
activesuspendedconnection_statusstringState of the link to the provider. Messages can be sent only while
connected.Possible values
pendingconnectedreconnectingdisconnectedblockedcapabilitiesarray of stringsMessage types the channel accepts as
typewhen sending.created_attimestampWhen the channel was created.
Balance · show attributes · hide attributes
objectstringAlways
balance.Value:
balancecurrencystringAlways
USD.Value:
USDwallet_microsintegerWallet balance in micro-USD (1 USD = 1,000,000).
packagesarray of objectsActive packages with credits remaining, earliest expiry first.
Show child attributesHide child attributes
idstringUnique identifier, prefixed
grant_.namestringPackage name.
quotaintegerMessages included.
remainingintegerMessages left.
channel_typesarray of strings or nullChannel types the credits apply to.
nullmeans every channel type.expires_attimestampWhen unused credits expire.
credits_remainingintegerSum of
remainingacrosspackages.
Package · show attributes · hide attributes
idstringUnique identifier, prefixed
grant_.namestringPackage name.
quotaintegerMessages included.
remainingintegerMessages left.
channel_typesarray of strings or nullChannel types the credits apply to.
nullmeans every channel type.expires_attimestampWhen unused credits expire.
Webhook endpoint · show attributes · hide attributes
idstringUnique identifier, prefixed
we_.objectstringAlways
webhook_endpoint.Value:
webhook_endpointmodestringMode of the API key that created the endpoint. The endpoint receives events of this mode only.
Possible values
livetesturlstringHTTPS URL that receives the events.
descriptionstring or nullYour note about the endpoint.
eventsarray of stringsSubscribed event types.
["*"]means all.Possible values
message.sentmessage.deliveredmessage.readmessage.failedmessage.receivedchannel.connectedchannel.disconnectedbalance.lowpackage.exhaustedpackage.expiringcampaign.startedcampaign.pausedcampaign.completedcampaign.failed*statusstringdisabledendpoints receive nothing. An endpoint is disabled automatically after 50 consecutive failed deliveries.Possible values
activedisabledfiltersobjectServer-side filters. An event is delivered only when it matches every filter that is set; events that do not carry the filtered property (for example
balance.low) always pass.Show child attributesHide child attributes
channel_idstringOnly events about this channel: messages on it, and its own
channel.*events.directionstringOnly message events of this direction.
Possible values
outboundinbound
metadataobjectKey-value pairs supplied by whoever created the endpoint, for its own bookkeeping. Empty object if none.
sourcestring or nullThe tool that owns the endpoint (
zapier,n8n,make…), ornullfor an endpoint created by hand. An endpoint with asourceis removed automatically after 30 days of uninterrupted failures.created_byobject or nullWho created the endpoint.
nullfor endpoints older than this field.Show child attributesHide child attributes
typestringA console user or an API key.
Possible values
userapi_keyidstringID of that user or key.
has_verification_tokenbooleanWhether deliveries carry the
OmniMessage-Verification-Tokenheader. The token itself is never returned.secretstringSigning secret, prefixed
whsec_. Returned only when the endpoint is created and when the secret is rolled.created_attimestampWhen the endpoint was created.
Campaign · show attributes · hide attributes
idstringUnique identifier, prefixed
cmp_.objectstringAlways
campaign.Value:
campaignmodestringMode of the API key that created the campaign. Test-mode campaigns run against the sandbox and are free.
Possible values
livetestnamestringName of the campaign.
channel_idstringChannel the campaign sends on.
channel_typestringType of that channel.
Possible values
whatsapptelegramsmssms_otpmessengerinstagramtiktokstatusstringdraftuntil launched;scheduledwhile waiting forschedule.send_at;queuedwhile the audience snapshot is taken;sending;paused; thencompleted,cancelledorfailed.Possible values
draftscheduledqueuedsendingpausedcompletedcancelledfailedpause_reasonstring or nullWhy the campaign is paused.
insufficient_balancemeans the funds ran out: top up, then resume.Possible values
useradmininsufficient_balancechannel_unavailablenullfailure_reasonstring or nullWhy the campaign failed.
audienceobjectWho the campaign is sent to.
Segment · show attributes · hide attributes
typestringValue:
segmentsegment_idstringSegment ID. The rules are evaluated when sending starts.
List · show attributes · hide attributes
typestringValue:
listlist_idstringContact list ID.
Tags · show attributes · hide attributes
typestringValue:
tagstagsarray of stringsContacts carrying these tags.
1 to 20 items
matchstringWhether a contact needs one of the tags or all of them.
Possible values
anyall
Pasted recipients · show attributes · hide attributes
typestringValue:
adhoccountintegerNumber of recipients supplied with the campaign.
save_as_contactsbooleanWhether the recipients are saved as contacts when the campaign starts.
messageobjectWhat is sent:
typeand the content object under the key named bytype, exactly as inPOST /v1/messages. Strings may contain merge tags such as{{first_name}},{{last_name}},{{full_name}},{{phone}},{{email}},{{locale}}and{{attributes.<key>}}; each recipient gets their own value. Unknown tags are rejected when the campaign is saved.Show child attributesHide child attributes
typestringMessage type. Must be one of the
capabilitiesof the channel. Live WhatsApp campaigns must usetemplate.
merge_fallbacksobjectValue used for a merge tag when a recipient has none.
require_opt_inbooleanWhen
true, only contacts whose consent for the channel type isopted_inare messaged; the others are skipped asno_consent.consent_declaredbooleanWhether you declared that the recipients agreed to be contacted. Required to launch.
scheduleobjectWhen the campaign sends.
Show child attributesHide child attributes
send_atstring or nullWhen sending starts.
nullstarts as soon as the campaign is launched.timezonestringIANA time zone of
send_window. Defaults to the time zone of the account.send_windowobject or nullLocal-time window outside which nothing is sent (quiet hours). A window whose
endis not after itsstartruns overnight.Show child attributesHide child attributes
startstringStart,
HH:MM.endstringEnd,
HH:MM.
recipient_timezonebooleanApply
send_windowin the time zone of each contact that has one, instead oftimezone.
throttle_per_secondintegerMost messages per second the campaign sends.
1 to 100
countersobjectProgress.
totalis fixed when the audience snapshot is complete;queued + sent + failed + skipped + cancelledequalstotal.Show child attributesHide child attributes
totalintegerRecipients in the snapshot.
queuedintegerRecipients not sent to yet.
sentintegerMessages accepted and not failed. Includes delivered and read.
deliveredintegerMessages delivered. Includes read.
readintegerMessages read.
failedintegerMessages rejected or failed.
skippedintegerRecipients that were never sent to.
cancelledintegerRecipients left unsent when the campaign was cancelled.
skip_reasonsobjectSkipped recipients by reason.
costobjectGateway fee of the campaign. Fees of the channel provider (for example Meta conversation fees) are billed by the provider and are not included.
Show child attributesHide child attributes
currencystringAlways
USD.Value:
USDestimated_wallet_microsinteger or nullEstimate made at launch of what the wallet would be charged, in micro-USD.
nullbefore launch.estimated_creditsinteger or nullEstimate made at launch of the package credits that would be used.
wallet_microsintegerCharged to the wallet so far, net of refunds for failed messages, in micro-USD.
package_creditsintegerPackage credits used so far, net of credits returned for failed messages.
created_attimestampWhen the campaign was created.
launched_atstring or nullWhen the campaign was launched.
started_atstring or nullWhen sending started.
paused_atstring or nullWhen the campaign was last paused.
completed_atstring or nullWhen the last recipient was processed.
cancelled_atstring or nullWhen the campaign was cancelled.
{
"id": "evt_6hJ9kL2zX5cV8bN1mQ4w",
"object": "event",
"type": "message.delivered",
"mode": "live",
"created_at": "2026-10-05T09:30:02.900Z",
"data": {
"object": {
"id": "msg_2b1Xw9aQ3rT8yU0pL4kZ",
"object": "message",
"mode": "live",
"channel_id": "ch_7Hq2mN5vB8cX1zL0pK3j",
"channel_type": "whatsapp",
"direction": "outbound",
"to": "+971501234567",
"from": "+971800123456",
"type": "text",
"content": {
"text": {
"body": "Your code is 482910"
}
},
"status": "delivered",
"error": null,
"reference": "order-1042",
"metadata": {
"user_id": "u_17"
},
"billing": {
"source": "package",
"amount_micros": 0,
"package_grant_id": "grant_5tGh2Kp9LmQ4xW7nB1cD",
"refunded": false
},
"sender": null,
"contact_id": null,
"created_at": "2026-10-05T09:30:00.000Z",
"updated_at": "2026-10-05T09:30:02.871Z",
"sent_at": "2026-10-05T09:30:01.210Z",
"delivered_at": "2026-10-05T09:30:02.871Z",
"read_at": null,
"failed_at": null
}
}
}The balance object#
Prepaid funds of the account: the wallet and the active message packages.
Attributes
objectstringAlways
balance.Value:
balancecurrencystringAlways
USD.Value:
USDwallet_microsintegerWallet balance in micro-USD (1 USD = 1,000,000).
packagesarray of objectsActive packages with credits remaining, earliest expiry first.
Show child attributesHide child attributes
idstringUnique identifier, prefixed
grant_.namestringPackage name.
quotaintegerMessages included.
remainingintegerMessages left.
channel_typesarray of strings or nullChannel types the credits apply to.
nullmeans every channel type.expires_attimestampWhen unused credits expire.
credits_remainingintegerSum of
remainingacrosspackages.
{
"object": "balance",
"currency": "USD",
"wallet_micros": 48250000,
"packages": [
{
"id": "grant_5tGh2Kp9LmQ4xW7nB1cD",
"name": "100K messages",
"quota": 100000,
"remaining": 81234,
"channel_types": null,
"expires_at": "2027-10-05T00:00:00.000Z"
}
],
"credits_remaining": 81234
}The pricing object#
Effective per-message wallet prices for the account.
Attributes
objectstringAlways
pricing.Value:
pricingcurrencystringAlways
USD.Value:
USDdataarray of objectsOne entry per channel type.
Show child attributesHide child attributes
channel_typestringChannel type.
Possible values
whatsapptelegramsmssms_otpmessengerinstagramtiktokunit_price_microsintegerPrice of one outbound message in micro-USD.
{
"object": "pricing",
"currency": "USD",
"data": [
{
"channel_type": "whatsapp",
"unit_price_micros": 1000
},
{
"channel_type": "telegram",
"unit_price_micros": 300
},
{
"channel_type": "sms",
"unit_price_micros": 500
},
{
"channel_type": "sms_otp",
"unit_price_micros": 500
},
{
"channel_type": "messenger",
"unit_price_micros": 500
},
{
"channel_type": "instagram",
"unit_price_micros": 500
},
{
"channel_type": "tiktok",
"unit_price_micros": 500
}
]
}The usage object#
Outbound message volume and spend for a date range.
Attributes
objectstringAlways
usage.Value:
usagefromdateFirst day of the range (UTC, inclusive).
todateLast day of the range (UTC, inclusive).
group_bystringThe grouping that was applied.
Possible values
daychannel_typedataarray of objectsUsage rows.
Show child attributesHide child attributes
periodstring or nullUTC day the row covers.
nullwhengroup_byischannel_type. Days and channel types without usage have no row.channel_typestringChannel type the row covers.
Possible values
whatsapptelegramsmssms_otpmessengerinstagramtiktokmessagesintegerOutbound messages accepted.
package_creditsintegerMessages paid with package credits.
wallet_microsintegerAmount debited from the wallet, in micro-USD.
failedintegerMessages that ended
failed.refunded_microsintegerPart of
wallet_microsreturned to the wallet because the message failed, in micro-USD. Net wallet spend iswallet_micros - refunded_micros. Package credits returned for failed messages are already deducted frompackage_credits.
totalsobjectSums across
data.Show child attributesHide child attributes
messagesintegerOutbound messages accepted.
package_creditsintegerMessages paid with package credits.
wallet_microsintegerAmount debited from the wallet, in micro-USD.
failedintegerMessages that ended
failed.refunded_microsintegerPart of
wallet_microsreturned to the wallet because the message failed, in micro-USD. Net wallet spend iswallet_micros - refunded_micros. Package credits returned for failed messages are already deducted frompackage_credits.
{
"object": "usage",
"from": "2026-10-01",
"to": "2026-10-05",
"group_by": "day",
"data": [
{
"period": "2026-10-01",
"channel_type": "whatsapp",
"messages": 1200,
"package_credits": 1000,
"wallet_micros": 200000,
"failed": 12,
"refunded_micros": 2000
},
{
"period": "2026-10-01",
"channel_type": "telegram",
"messages": 310,
"package_credits": 310,
"wallet_micros": 0,
"failed": 0,
"refunded_micros": 0
},
{
"period": "2026-10-02",
"channel_type": "whatsapp",
"messages": 980,
"package_credits": 980,
"wallet_micros": 0,
"failed": 4,
"refunded_micros": 0
}
],
"totals": {
"messages": 2490,
"package_credits": 2290,
"wallet_micros": 200000,
"failed": 16,
"refunded_micros": 2000
}
}The account object#
The account and API key behind the current request.
Attributes
objectstringAlways
account.Value:
accountidstringUnique identifier, prefixed
acc_.namestringAccount name.
modestringMode of the API key used for the request.
Possible values
livetestapi_keyobjectThe API key used for the request. The secret is never returned.
Show child attributesHide child attributes
idstringUnique identifier, prefixed
key_.namestringKey name set in the console.
scopesarray of stringsScopes granted to the key.
Possible values
messages:writemessages:readchannels:readchannels:writewebhooks:readwebhooks:writebilling:readcontacts:readcontacts:writecampaigns:readcampaigns:writeintegrations:readintegrations:writeevents:readevents:write
capabilitiesarray of stringsFeatures of the API this account can use, for example
automation_events. Clients treat a missing entry (or a missing field) as "not available"; new entries appear over time.
{
"object": "account",
"id": "acc_8nM3bV6cX9zL2kJ5hG1f",
"name": "Acme Logistics",
"mode": "live",
"api_key": {
"id": "key_1qW4eR7tY0uI3oP6aS9d",
"name": "Production backend",
"scopes": [
"messages:write",
"messages:read",
"channels:read"
]
},
"capabilities": [
"automation_events",
"webhook_filters",
"test_inbound",
"events_feed"
]
}The WhatsApp template object#
A message template registered on the WhatsApp Business Account of a channel.
Attributes
idstringTemplate ID assigned by WhatsApp.
namestringTemplate name. Use it as
template.namewhen sending.languagestringLanguage code. Use it as
template.language.codewhen sending.categorystringWhatsApp template category, for example
UTILITY,MARKETINGorAUTHENTICATION.statusstringReview status at WhatsApp, for example
APPROVED,PENDINGorREJECTED. Only approved templates can be sent.componentsarray of objectsTemplate structure as defined in WhatsApp Manager.
variablesobjectWhat a send has to fill in, read from
components: one entry per placeholder, in the order the parameters are sent. Lets a form show one labelled field per variable.Show child attributesHide child attributes
headerarray of objectsPlaceholders of a text header.
Show child attributesHide child attributes
keystringThe placeholder as written between the braces: a position (
1) or, for named parameters, a name.examplestring or nullThe example value the template was submitted with, when WhatsApp reports one.
bodyarray of objectsPlaceholders of the body.
Show child attributesHide child attributes
keystringThe placeholder as written between the braces: a position (
1) or, for named parameters, a name.examplestring or nullThe example value the template was submitted with, when WhatsApp reports one.
buttonsarray of objectsButtons that take a value: dynamic URLs and copy-code buttons.
Show child attributesHide child attributes
indexintegerPosition of the button in the template, from 0: the
indexof the button component when sending.typestringButton type in lower case, for example
urlorcopy_code.variablesarray of objectsValues the button takes.
Show child attributesHide child attributes
keystringThe placeholder as written between the braces: a position (
1) or, for named parameters, a name.examplestring or nullThe example value the template was submitted with, when WhatsApp reports one.
countintegerTotal number of values.
{
"id": "1203948571029384",
"name": "order_shipped",
"language": "en",
"category": "UTILITY",
"status": "APPROVED",
"components": [
{
"type": "BODY",
"text": "Hi {{1}}, your order {{2}} has shipped."
},
{
"type": "BUTTONS",
"buttons": [
{
"type": "URL",
"text": "Track order",
"url": "https://example.com/track/{{1}}"
}
]
}
],
"variables": {
"header": [],
"body": [
{
"key": "1",
"example": null
},
{
"key": "2",
"example": null
}
],
"buttons": [
{
"index": 0,
"type": "url",
"variables": [
{
"key": "1",
"example": null
}
]
}
],
"count": 3
}
}The batch result object#
Per-item outcome of a batch send.
Attributes
objectstringAlways
batch.Value:
batchdataarray of objectsOne entry per submitted message, in request order.
Show child attributesHide child attributes
indexintegerZero-based position of the message in the request.
statusintegerHTTP status the message would have received from
POST /v1/messages.messageobjectPresent when the item was accepted (
status202).errorobjectPresent when the item was rejected.
Show child attributesHide child attributes
typestringError category. Maps one-to-one to the HTTP status class of the response.
Possible values
invalid_request_errorauthentication_errorbilling_errorpermission_errornot_found_errorconflict_errorchannel_errorrate_limit_errorapi_errorcodestringStable machine-readable code. Branch on this, not on
message.messagestringHuman-readable explanation. May change; do not parse.
paramstringPath of the request field the error relates to, for example
text.body.detailsarray of objectsIndividual validation failures, when there are several.
Show child attributesHide child attributes
paramstringField path.
codestringValidation failure code, for example
missing_fieldorinvalid.messagestringExplanation.
request_idstringID of the request, also sent as
X-Request-Id. Quote it when contacting support.doc_urlstringLink to the documentation for
code.
acceptedintegerNumber of accepted messages.
rejectedintegerNumber of rejected messages.
{
"object": "batch",
"data": [
{
"index": 0,
"status": 202,
"message": {
"id": "msg_2b1Xw9aQ3rT8yU0pL4kZ",
"object": "message",
"mode": "live",
"channel_id": "ch_7Hq2mN5vB8cX1zL0pK3j",
"channel_type": "whatsapp",
"direction": "outbound",
"to": "+971501234567",
"from": "+971800123456",
"type": "text",
"content": {
"text": {
"body": "Your code is 482910"
}
},
"status": "queued",
"error": null,
"reference": "order-1042",
"metadata": {},
"billing": {
"source": "package",
"amount_micros": 0,
"package_grant_id": "grant_5tGh2Kp9LmQ4xW7nB1cD",
"refunded": false
},
"sender": null,
"contact_id": null,
"created_at": "2026-10-05T09:30:00.000Z",
"updated_at": "2026-10-05T09:30:02.871Z",
"sent_at": null,
"delivered_at": null,
"read_at": null,
"failed_at": null
}
},
{
"index": 1,
"status": 402,
"error": {
"type": "billing_error",
"code": "insufficient_balance",
"message": "No package credits remain and the wallet balance is below the message price.",
"request_id": "req_0aB3cD6eF9gH2iJ5kL8m",
"doc_url": "https://omnimessage.co/docs/errors#insufficient_balance"
}
}
],
"accepted": 1,
"rejected": 1
}The error response object#
Body of every non-2xx response.
Attributes
errorobjectDetails of a failed request.
Show child attributesHide child attributes
typestringError category. Maps one-to-one to the HTTP status class of the response.
Possible values
invalid_request_errorauthentication_errorbilling_errorpermission_errornot_found_errorconflict_errorchannel_errorrate_limit_errorapi_errorcodestringStable machine-readable code. Branch on this, not on
message.messagestringHuman-readable explanation. May change; do not parse.
paramstringPath of the request field the error relates to, for example
text.body.detailsarray of objectsIndividual validation failures, when there are several.
Show child attributesHide child attributes
paramstringField path.
codestringValidation failure code, for example
missing_fieldorinvalid.messagestringExplanation.
request_idstringID of the request, also sent as
X-Request-Id. Quote it when contacting support.doc_urlstringLink to the documentation for
code.
{
"error": {
"type": "invalid_request_error",
"code": "parameter_missing",
"message": "text.body is required.",
"param": "text.body",
"details": [
{
"param": "text.body",
"code": "missing_field",
"message": "Required"
}
],
"request_id": "req_0aB3cD6eF9gH2iJ5kL8m",
"doc_url": "https://omnimessage.co/docs/errors#parameter_missing"
}
}