List conversation messages
Retrieves a paginated list of the authenticated customer's messages across all conversations, ordered by created date (most recent first).
page*integerint32page_size*integerint32x-profile-id?stringProfile 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.
uuidMessages retrieved successfully
application/json- response
Standard API response envelope for all v3 endpoints
success?booleanIndicates whether the request was successful
data?|nullThe response data (null if error)
error?|nullError details (null if successful)
meta?Metadata about the request and response
curl -X GET 'https://api.sent.dm/v3/conversations?page=1&page_size=20'{ "success": true, "data": { "messages": [ { "id": "6ba7b810-9dad-11d1-80b4-00c04fd430c8", "customer_id": "41681f0a-15b4-45ab-afca-d9af35b4d3a1", "contact_id": "14b278db-6db8-448f-a5db-8d6ce46a3451", "phone": "+1234567890", "phone_international": "+1 234-567-890", "region_code": "US", "template_id": null, "template_name": null, "template_category": null, "channel": "sms", "message_body": null, "status": "DELIVERED", "direction": "OUTBOUND", "created_at": "2026-11-12T15:27:26.7774385+00:00", "price": 0.0075, "active_contact_price": 0, "events": null, "reason_code": null, "reason": null } ], "pagination": { "page": 1, "page_size": 20, "total_count": 1, "total_pages": 1, "has_more": false, "cursors": null } }, "error": null, "meta": { "request_id": "req_7X9zKp2jDw", "timestamp": "2026-11-12T15:32:26.7774401+00:00", "version": "v3" }}Cancel a scheduled message POST
Calls off a message you scheduled with `scheduled_at`, before it is released for sending. The message moves to `CANCELLED`, which is terminal, and it is never sent. **Only a SCHEDULED message can be cancelled.** A message that has already been released — queued, in flight, or finished — returns 409. The release sweeper runs continuously, so a cancellation sent within about a minute of the scheduled instant can lose that race and be refused; cancel with time to spare. **One message per call.** A send to many recipients, or on several channels, becomes one message per recipient × channel, each with its own id; cancel the ones you want stopped. There is no bulk cancellation. **Cancelling is free**, and nothing was charged for the hold in the first place — a scheduled message is only priced and billed at release. **A cancellation fires `message.cancelled`** on your webhook, exactly once, carrying the `scheduled_at` that was called off so a consumer can un-record the send it was expecting. Cancelling the same message again returns this same response and fires no second event. `Idempotency-Key` is honoured. To send after cancelling, send a new message. The response is the message itself, in the same shape `GET /v3/messages/{id}` returns, so the `status` you read back is the one now stored on the row, and `scheduled_at` is the time it would have gone out. `GET /v3/messages/{id}` keeps reporting both afterwards. `events` is the message lifecycle as it stood immediately before the cancellation: the CANCELLED entry is written asynchronously and lands a moment later, so read `status` for the outcome. If you need the entry itself, re-fetch the message after a few seconds — `GET /v3/messages/{id}` is cached briefly, so an immediate re-fetch can still show the pre-cancellation state.
List messages for a conversation GET
Retrieves a paginated list of the messages in a single conversation (scoped to the authenticated customer), ordered by created date (most recent first).