GET /sms/conversations
List conversations (the inbox)
| Scope | messages:read |
| Role permission | Phone numbers — only lines the credential is authorized for |
| Cost | Free |
One entry per thread, newest first, with the thread's queue state attached — so a queue view needs one call, not one per conversation.
Filters combine as AND. unresolved=true&assignedToMe=true is "my
open threads", which is the message center's default view.
Omit lines and every texting number on the account is listed. A fresh
integration therefore does not need to call GET /sms/lines first, and
keeps working when the customer buys a number.
Query parameters
| Name | Type | Required | Example | Description |
|---|---|---|---|---|
lines | string | no | 12125550188,12125550199 | Comma-separated account numbers to list. Omit for all of them. |
unread | boolean | no | — | Only threads you have not read. Read state is per user, so a thread a colleague has read is still unread for you. |
unresolved | boolean | no | — | Only threads not marked handled. |
assignedToMe | boolean | no | — | Only threads assigned to the calling user. |
unassigned | boolean | no | — | Only threads nobody owns. |
limit | integer | no | — | Page size. An out-of-range value is a 400 rather than a silent clamp — a client asking for 5000 and receiving 200 with no explanation concludes the account only has 200 messages. |
offset | integer | no | — |
Responses
200
The conversations, newest first.
| Field | Type | Description |
|---|---|---|
[].line | string | Your account number the thread is on, normalized. |
[].number | string | The other party's number, normalized. |
[].groupParticipants | string[] | Every number on a group thread. Absent for a 1:1. |
[].lastMessage | string | Preview text of the newest message. |
[].lastMessageId | integer | Its id, so you can open the thread at the right place. |
[].lastMessageAt | string (RFC 3339) | |
[].direction | in | out | Direction of that newest message, so a client can render the "you" prefix without reading the thread. |
[].hasMedia | boolean | |
[].unread | boolean | Whether YOU have unread messages here. Per user — a thread a colleague read is still unread for you. |
[].unreadCount | integer | |
[].resolved | boolean | |
[].resolvedBy | integer | |
[].resolvedAt | string (RFC 3339) | |
[].assignedTo | integer | The user who owns the thread, matching id in GET /users. Absent when nobody does — which is a real state the filters use, not missing data. |
{
"data": [
{
"line": "12125550188",
"number": "13475550123",
"lastMessage": "Can we move it to Thursday?",
"lastMessageId": 90218841,
"lastMessageAt": "2026-08-19T13:41:02Z",
"direction": "in",
"unread": true,
"unreadCount": 2,
"resolved": false,
"assignedTo": 481920
}
]
}
Errors
| Status | Meaning |
|---|---|
400 | invalid_request — a missing or malformed field, an unknown enum value, or an unknown field in the body. Nothing was charged. |
401 | unauthenticated — no credential, or one that is invalid, revoked or expired. The WWW-Authenticate header names the scope the endpoint wanted. |
403 | Two different failures share this status, and the type tells them apart: |
500 | internal_error — something failed on our side. For a send, nothing was charged, guaranteed, which is what makes a retry safe. |
See Errors for the full catalog and what to do about each.
Example
curl -X GET 'https://api.account.telebroad.com/api/public/v1/sms/conversations' \
-H "Authorization: Bearer $TB_KEY"