List messages in a conversation
GET/v1/threads/{id}/messages
scope messages.read
Newest first. body is the text as STORED — when chat protection masked contact details, this is the masked version, which is what the buyer sees too.
Query parameters#
| Name | Example | |
|---|---|---|
limit | 50 | Max 100 |
cursor | — | next_cursor |
Response#
| Field | Type | Description |
|---|---|---|
count | integer | How many messages in this page. |
next_cursor | string|null | Pass back as ?cursor=; null on the last page. |
data | array | The messages, oldest first. |
data[]. | integer | The message id. |
data[]. | string | Which side wrote it. Accepts |
data[]. | object|null | Who wrote it. |
data[]. | integer | Their user id. |
data[]. | string | Their display name. |
data[]. | string|null | The text. Already MASKED where chat protection removed a phone number or email — you see what the buyer sees, not the original. |
data[]. | boolean | Whether a file came with it. The file itself is not exposed over this API. |
data[]. | string | text is an ordinary message. video and buy_request are messages our own features generate, and a buy_request is the buyer asking to unblock a stale listing — answer it in the dashboard, not here.Accepts |
data[]. | string | ISO-8601 UTC. |
Example
{
"count": 1,
"next_cursor": null,
"data": [
{
"id": 174420,
"from": "buyer",
"author": {
"id": 9000002,
"name": "Jane Doe"
},
"body": "Is this still available?",
"has_attachment": false,
"type": "text",
"created_at": "2026-09-10T06:15:18Z"
}
]
}