Skip to main content

GET /sms/conversations

List conversations (the inbox)

Scopemessages:read
Role permissionPhone numbers — only lines the credential is authorized for
CostFree

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

NameTypeRequiredExampleDescription
linesstringno12125550188,12125550199Comma-separated account numbers to list. Omit for all of them.
unreadbooleannoOnly threads you have not read. Read state is per user, so a thread a colleague has read is still unread for you.
unresolvedbooleannoOnly threads not marked handled.
assignedToMebooleannoOnly threads assigned to the calling user.
unassignedbooleannoOnly threads nobody owns.
limitintegernoPage 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.
offsetintegerno

Responses

200

The conversations, newest first.

FieldTypeDescription
[].linestringYour account number the thread is on, normalized.
[].numberstringThe other party's number, normalized.
[].groupParticipantsstring[]Every number on a group thread. Absent for a 1:1.
[].lastMessagestringPreview text of the newest message.
[].lastMessageIdintegerIts id, so you can open the thread at the right place.
[].lastMessageAtstring (RFC 3339)
[].directionin | outDirection of that newest message, so a client can render the "you" prefix without reading the thread.
[].hasMediaboolean
[].unreadbooleanWhether YOU have unread messages here. Per user — a thread a colleague read is still unread for you.
[].unreadCountinteger
[].resolvedboolean
[].resolvedByinteger
[].resolvedAtstring (RFC 3339)
[].assignedTointegerThe 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

StatusMeaning
400invalid_request — a missing or malformed field, an unknown enum value, or an unknown field in the body. Nothing was charged.
401unauthenticated — no credential, or one that is invalid, revoked or expired. The WWW-Authenticate header names the scope the endpoint wanted.
403Two different failures share this status, and the type tells them apart:
500internal_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"

Try it in the playground →