List conversation messages
Retrieves a paginated list of the authenticated customer's messages across all conversations, ordered by created date (most recent first).
Response Body
application/json
application/json
application/json
curl -X GET "https://example.com/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-10-23T15:17:52.4841508+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-10-23T15:22:52.4841522+00:00",
"version": "v3"
}
}{
"success": false,
"data": null,
"error": {
"code": "VALIDATION_005",
"message": "Page must be greater than 0",
"details": null,
"doc_url": "https://docs.sent.dm/reference/api/error-catalog"
},
"meta": {
"request_id": "req_7X9zKp2jDw",
"timestamp": "2026-10-23T15:22:52.4841539+00:00",
"version": "v3"
}
}{
"success": false,
"data": null,
"error": {
"code": "INTERNAL_001",
"message": "An unexpected error occurred. Please contact support with request ID: req_7X9zKp2jDw",
"details": null,
"doc_url": "https://docs.sent.dm/reference/api/error-catalog"
},
"meta": {
"request_id": "req_7X9zKp2jDw",
"timestamp": "2026-10-23T15:22:52.4841542+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. A cancelled message cannot be resent — send a new one. 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).