Send a DM
POST /v1/social/conversations/{id}/messages
Sends a direct message into an existing conversation, through the account that owns the thread. Side effects match the panel: the AI auto-reply is paused for the bridged contact and the send lands on that contact’s timeline.
Platform windows still apply. WhatsApp only accepts a free-form reply within 24
hours of the customer’s last message; outside it, and for an expired Meta token,
the response is 409 with error: provider_rejected and the network’s own
reason in details.ProviderCode. Requires scope social:write.
Authorizations
Section titled “Authorizations ”Parameters
Section titled “ Parameters ”Path Parameters
Section titled “Path Parameters ”Header Parameters
Section titled “Header Parameters ”A unique string of your choosing (a UUID works). The first request with this key runs normally and its response is stored for 24 hours; a retry with the same key returns that stored response verbatim, with Idempotency-Replayed: true, instead of writing again. Reusing a key with a different body returns 409.
Request Body required
Section titled “Request Body required ”At least one of text or mediaUrl must be present.
object
Publicly reachable URL of an image
Forwarded to the network so a retry is de-duplicated upstream as well as here. The Idempotency-Key header is used when this is omitted.
External id of the message being replied to
Responses
Section titled “ Responses ”Message accepted by the network.
One message inside a social DM thread.
object
Empty on an attachment-only message.
Attachment link. Inbound network media is rewritten to a signed proxy path on this host (relative, no credentials needed); outbound and already-public URLs pass through unchanged.
Speech-to-text for a voice note.
Inbound, the message rendered in the operator’s language. Outbound, the operator’s original wording (text then holds what the participant received).
The request body or parameters failed validation.
Standard error envelope for all v1 error responses.
object
Machine-readable error code.
Human-readable explanation of the error.
Optional structured context (field-level validation errors, etc.).
Example
{ "error": "bad_request", "message": "at least one of name, username, phone is required"}Missing or invalid bearer token.
Standard error envelope for all v1 error responses.
object
Machine-readable error code.
Human-readable explanation of the error.
Optional structured context (field-level validation errors, etc.).
Example
{ "error": "unauthorized", "message": "Invalid bearer principal"}The workspace’s plan does not include this module. The social inbox needs channel_social_inbox and the post scheduler needs marketing_social_scheduler; details.FeatureKey names the one that is missing. Upgrading unlocks it, there is nothing to retry.
Standard error envelope for all v1 error responses.
object
Machine-readable error code.
Human-readable explanation of the error.
Optional structured context (field-level validation errors, etc.).
Example
{ "error": "payment_required", "message": "your plan does not include this feature; upgrade to unlock it", "details": { "FeatureKey": "marketing_social_scheduler", "UpgradeRequired": true }}The API key does not have the required scope for this operation.
Standard error envelope for all v1 error responses.
object
Machine-readable error code.
Human-readable explanation of the error.
Optional structured context (field-level validation errors, etc.).
Example
{ "error": "forbidden", "message": "scope contacts:write is required"}The requested resource does not exist or is not owned by the caller.
Standard error envelope for all v1 error responses.
object
Machine-readable error code.
Human-readable explanation of the error.
Optional structured context (field-level validation errors, etc.).
Example
{ "error": "not_found", "message": "contact not found"}The request collides with existing state: a duplicate externalId, an Idempotency-Key replayed with a different body or still in flight, or a permanent delete blocked by records that still reference the contact.
Standard error envelope for all v1 error responses.
object
Machine-readable error code.
Human-readable explanation of the error.
Optional structured context (field-level validation errors, etc.).
Example
{ "error": "conflict", "message": "a contact with externalId 'shopify-cust-88213' already exists", "details": { "existingContactId": 4821 }}Per-key rate limit exceeded. Retry after the time indicated by X-RateLimit-Reset.
Standard error envelope for all v1 error responses.
object
Machine-readable error code.
Human-readable explanation of the error.
Optional structured context (field-level validation errors, etc.).
Example
{ "error": "rate_limited", "message": "rate limit exceeded"}Headers
Section titled “Headers ”Maximum requests allowed per minute for this key.
Requests remaining in the current window.
Unix timestamp (seconds) when the rate limit window resets.