List conversation messages

Retrieves a paginated list of the authenticated customer's messages across all conversations, ordered by created date (most recent first).

GET
/v3/conversations

Query Parameters

page*integer
Formatint32
page_size*integer
Formatint32

Header Parameters

x-profile-id?string

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.

Formatuuid

Response Body

Messages retrieved successfully

application/json
  1. response

Standard API response envelope for all v3 endpoints

success?boolean

Indicates whether the request was successful

data?|null

The response data (null if error)

error?|null

Error details (null if successful)

meta?

Metadata about the request and response

Example Request
curl -X GET 'https://api.sent.dm/v3/conversations?page=1&page_size=20'
Example Response
{  "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).