- List WhatsApp conversations —
GET /api/v2/public/whatsapp/conversations - List messages in a WhatsApp conversation —
GET /api/v2/public/whatsapp/conversations/{session_id}/messages
Concepts
- A conversation (a session) is one bounded WhatsApp conversation window with a single customer phone number. A customer accumulates several conversations over time as windows open and close.
- Each conversation belongs to a client (when the number is matched to a contact) and contains an ordered list of messages.
- Conversations carry a status (
new,ai_handling,human_handling,resolved,expired), a direction (inbound/outbound), an optional disposition tag and an optional sentiment.
Who sent what
Three fields answer three different questions — do not confuse them:
A single conversation routinely mixes several people and one or more AI agents (a bot handles
the opening, a person takes over, another person closes it), which is why
participants
exists separately from assigned_users.
participants is always complete — it covers the whole conversation even when you request
include_messages=false or the transcript is truncated. Only identified senders appear;
messages synced from the WhatsApp Business app carry no attributable sender and contribute
to no entry.
Common requests
- Metadata-only browse
- Full transcripts, newest first
- Filter by client and disposition
- Messages per team member
The fastest way to see what exists.
participants is still fully populated.Incremental sync
Do not re-download everything on each run:1
Store the newest updated_at you have seen
Every conversation carries
updated_at, which moves whenever a message arrives or the
status, disposition or summary changes.2
Ask only for what changed
On the next run pass that timestamp as
updated_after and sort with sort_by=updated_at
for predictable ordering:3
Page through the result
Keep the same filters and increase
offset by limit until you have read count items.Long conversations
Each conversation embeds at mostmax_messages_per_session messages (default 500, oldest
first). A longer transcript is truncated and flagged with has_more_messages: true — fetch the
rest with the messages endpoint, paging with limit / offset:
participants roster, so you never
need a second call to the list endpoint just for that.
Sample conversation
Notes and limits
- Read-only. These endpoints never modify conversations.
- Media files are not downloadable — only
kind,mime,filenameandcaptionare returned. - Internal fields (model, tokens, cost, storage keys) are never exposed.
- Additive changes. New fields may be added (
senderandparticipantsarrived this way, next to an unchangedsender_type). Ignore fields you do not recognise. - No rate limit is enforced today; page with
limit≤ 50 rather than looping on maximal payloads.