Send a message
Changed onSends a message to one or more recipients using a template. Supports multi-channel broadcast — when multiple channels are specified (e.g. ["sms", "whatsapp"]), a separate message is created for each (recipient, channel) pair. To choose which of your own numbers a send goes out from, use 'channels': {"sms": [{"from": ["+12125550000", "+14155550000"]}]}. Each channel holds a list of entries, each with 'from' and optionally 'country' and 'strategy'; 'country' and 'strategy' are stored but not acted on yet, so every entry's numbers apply to every recipient on that channel. Every number listed must be an active sender on your account. Like the other account-level preconditions below, that is checked per message rather than when the request is received: the request is still accepted with 202, and each affected message is reported as BLOCKED with error code BUSINESS_029 on GET /messages/{id} and the message.blocked webhook. Each channel's numbers restrict which numbers that channel may use; it does not choose channels — 'channel' does, and the two can be combined. With 'channel' left at auto-detect, a recipient best served by a channel you listed no numbers for still goes out on it. Where several of the listed numbers could serve a recipient, routing prefers the one whose area code matches theirs. Keys: sms, whatsapp, rcs, mms. Returns immediately with per-recipient message IDs for async tracking via webhooks or the GET /messages/{id} endpoint. Sends gated before any delivery attempt do not reject the request — an account-level precondition such as insufficient balance, a template not approved for sending, or free-form content with no open conversation with the contact. The send is accepted with 202 and the affected messages are reported as BLOCKED on GET /messages/{id} and the message.blocked webhook. To send later, set scheduled_at (ISO-8601 with an explicit UTC offset; a value without one is rejected) between 1 minute and 30 days ahead: the response is a ScheduledSendMessageResponse (the same fields plus scheduled_at; status is still QUEUED), each message then moves to SCHEDULED, is held and released at that time (within a few minutes), and a message.scheduled webhook fires once it is held. Balance and template approval are evaluated at release, not at acceptance. Quiet hours are not checked when the request is accepted: if the time falls inside a legally protected quiet-hours window for a recipient, that message is moved to the next allowed time at release and a second message.scheduled webhook reports the new scheduled_at. An account may hold at most 1,000,000 scheduled messages at once (429 LIMIT_001).
Request
- Base URLhttps://api.sent.dm
- URLhttps://api.sent.dm/v3/messages
- Auth
- API key in header x-api-key
- or HTTP bearer
Headers
Unique key to ensure idempotent request processing. Must be 1-255 alphanumeric characters, hyphens, or underscores. Responses are cached for 24 hours per key per customer.
Profile UUID to scope the request to a child profile. Only organization API keys can use this header. The profile must belong to the calling organization.
Request body
Example request
{
"to": [
"+14155551234",
"+14155555678"
],
"channel": [
"sms",
"whatsapp"
]
}Response
Message accepted for processing (QUEUED). data is a SendMessageResponse, or for a request that carried scheduled_at a ScheduledSendMessageResponse: the same fields plus scheduled_at. Status is QUEUED in both, and each scheduled message moves to SCHEDULED once it is held
Changes
- breaking
added
subschema #2: SentDmServicesEndpointsCustomerAPIv3MessagesRequestsSendMessageV3Request_Propertiesto the request bodyallOflist - breaking
added to the
response propertyoneOflist for the response status - breaking
added to the
response propertyoneOflist for the response status - breaking
added to the
response propertyoneOflist for the response status - breaking
added to the
response propertyoneOflist for the response status - warning
removed
subschema #2: SentDmServicesEndpointsCustomerAPIv3RequestsSendMessageV3Request_Propertiesfrom the request bodyallOflist - info
the endpoint scheme security
BearerAuthwas added to the API - info
added the non-success response with the status
- info
removed the non-success response with the status
- info
added to the
response propertyallOflist for the response status - info
added to the
response propertyallOflist for the response status - info
added to the
response propertyallOflist for the response status - info
added to the
response propertyallOflist for the response status - info
added to the
response propertyallOflist for the response status - info
removed from the
response propertyallOflist for the response status - info
removed from the
response propertyallOflist for the response status - info
removed from the
response propertyallOflist for the response status - info
removed from the
response propertyallOflist for the response status - info
removed from the
response propertyallOflist for the response status - info
removed from the
response propertyoneOflist for the response status - info
removed from the
response propertyoneOflist for the response status - info
removed from the
response propertyoneOflist for the response status - info
removed from the
response propertyoneOflist for the response status
- breaking
- breaking
added to the
/request propertyallOflist - breaking
removed from the
/request propertyoneOflist - breaking
the
/request property type changed from no type toobject - info
added the new optional request property
/ - info
the request property
/became nullable
- breaking