JavaScriptPOST /v0/profiles/{profile_uuid}/threads/{thread_uuid}/messages
Authorization: Bearer <access_token>
Content-Type: application/json
{
"message": "Thanks for reaching out - someone will call you within the hour.",
"type": "sms",
"is_draft": false
}Requires staff scope. You send into an existing thread — resolve or create the thread first.
Field | Notes |
|---|---|
| Required. The text body. |
| Required. |
| Send |
| Array of media names previously uploaded via |
| ISO-8601 timestamp with a timezone offset, in the future. Not allowed for |
⚠️ is_draft defaults to true. If you omit is_draft, the message is saved as an unsent draft and never delivered. Always send "is_draft": false when you mean to send.
Response
JSON{
"uuid": "...",
"thread": "...",
"message": "...",
"type": "sms",
"direction": "egress",
"state": "pending",
"creation": "<ISO-8601>",
"modification": "<ISO-8601>",
"sender": { ... }
}state will be:
pending— accepted and queued for delivery (this is the success case)scheduled— will send atscheduleddraft— saved but not sent (you omittedis_draft: false)
Other notes
The contact must have consent and must not be blocked, or you get a
422.There is no character limit enforced by the API. Long SMS bodies are split into multiple carrier segments and billed per segment.
Sending a message here also fires your
new_messagewebhook.