Skip to content
API PlatformDevelopers
GET/v1/conversations/{conversation_id}beta

Get a conversation and its 24-hour window

Needs
Read your data (mcp:read)
Plan
Any plan with API access
Limits
300 a minute per key
Undo
Nothing to undo: this only reads.

Returns one conversation with its contact, assignee, tags, the reply window and the latest messages. Reading it does not mark anything as read.

window is the source of truth for replying: applies is true on WhatsApp, Instagram, Messenger and TikTok (false on web chat, where open is always true); open says whether a free-form reply can be sent now, decided exactly as the reply itself is; closes_at (UTC) is when an open window closes, or null when that is not known; a closed window has a reason: expired (it closed at closed_at) or never_opened (the customer has not written on this channel). To check the window alone, ask with last_messages=0.

Try it

Path

The conversation id.

Query (1)

How many recent messages to include (0–20).

This only reads. It uses your real data and changes nothing.

Code and response

curl -X GET 'https://mcp.wa-api.cloud/v1/conversations/77410' \
  -H "Authorization: Bearer $API_KEY"

The code reads your key from $API_KEY.

Parameters

Parameters
FieldTypeWhat it is
conversation_idrequiredstring · pathThe conversation id.pattern ^\d{1,19}$Signed in? Pick one from your data with “My data”.
last_messagesinteger · queryHow many recent messages to include (0–20).0–20 · default 5

Headers

Headers
FieldTypeWhat it is
AuthorizationrequiredheaderBearer $API_KEY — your API key.
Api-VersionheaderThe API version to use, e.g. 2026-10-01. Default: the version your key is pinned to.one of: 2026-10-01 · pattern ^\d{4}-\d{2}-\d{2}$

Response 200

The conversation.

Response fields
FieldTypeWhat it is
conversationrequiredobject
idrequiredstring
staterequiredstringopen | closed
contactrequiredobject or nullnull when the contact was deleted.
idrequiredstring
namerequiredstring
phonerequiredstring or null
dnd_enabledrequiredboolean
groupsrequiredarray of string
channelrequiredobject
idrequiredstring
namerequiredstring or null
typerequiredstring or null
assigneerequiredobject or null
staff_idrequiredstring
namerequiredstring or null
team_idrequiredstring or null
assigned_atrequiredstring or null
tagsrequiredarray of object
idrequiredstring
namerequiredstring
starredrequiredboolean
unread_countrequirednumber
reply_statusrequiredstring or nullincoming_no_reply = customer is waiting; outgoing_no_response = waiting on the customer.
slarequiredobject or null
statusrequiredstring
next_due_atrequiredstring or null
next_due_metricrequiredstring or null
policyrequiredstring or null
reminder_atrequiredstring or null
whatsapp_window_expires_atrequiredstring or nullRaw window end as stored, kept for compatibility. Use window to decide whether a free-form reply can be sent.
windowrequiredobjectThe reply window, decided exactly as a send decides it. The source of truth for "can I reply free-form now".
appliesrequiredbooleantrue on channels with a reply window (WhatsApp, Instagram, Messenger, TikTok); false on web chat and custom channels.
openrequiredbooleantrue = a free-form reply can be sent now (always true when the window does not apply). false = only an approved template reaches the customer.
kindrequiredstring or nullservice (24 h), free_entry (72 h after an ad), standard, tiktok (48 h), web.
closes_atrequiredstring or nullOpen window: when it closes (UTC ISO-8601); null when unknown or when no window applies.
closed_atrequiredstring or nullClosed window: when it closed (UTC); null when the customer never opened one.
reasonrequiredstring or nullWhy: no_window (the channel has none), expired (it closed at closedAt), never_opened (no customer message on this channel yet); null while open.one of: no_window, expired, never_opened
bot_activerequiredboolean
last_messagerequiredobject or null
idrequiredstring
conversation_idrequiredstring or null
typerequiredstringTEXT, IMAGE, VIDEO, AUDIO, DOCUMENT, STICKER, LOCATION, TEMPLATE, INTERACTIVE, ORDER, CONTACTS, SYSTEM
directionrequiredstringone of: inbound, outbound, system
statusrequiredstringreceived (inbound) | pending | sent | delivered | read | failed | system
textrequiredstring or nullMessage text, or the caption for media. Media files/URLs are never included.
text_truncatedrequiredboolean
has_mediarequiredboolean
fromrequiredobject or nullWho sent an outbound message (staff or bot); null for inbound.
reply_to_idrequiredstring or null
errorrequiredstring or null
created_atrequiredstring or null
created_atrequiredstring or null
updated_atrequiredstring or null
episode_titlerequiredstring or null
permissionsrequiredobjectWhat the connected staff member may do on this conversation (assign, close, …).
last_messagesrequiredarray of objectNewest first.
idrequiredstring
conversation_idrequiredstring or null
typerequiredstringTEXT, IMAGE, VIDEO, AUDIO, DOCUMENT, STICKER, LOCATION, TEMPLATE, INTERACTIVE, ORDER, CONTACTS, SYSTEM
directionrequiredstringone of: inbound, outbound, system
statusrequiredstringreceived (inbound) | pending | sent | delivered | read | failed | system
textrequiredstring or nullMessage text, or the caption for media. Media files/URLs are never included.
text_truncatedrequiredboolean
has_mediarequiredboolean
fromrequiredobject or nullWho sent an outbound message (staff or bot); null for inbound.
staff_idrequiredstring or null
staff_namerequiredstring or null
botrequiredboolean
reply_to_idrequiredstring or null
errorrequiredstring or null
created_atrequiredstring or null

Errors

Errors are application/problem+json. Branch on code.

StatusCodeWhen
400invalid_input

A field is missing or has the wrong format. errors[] points at each field.

401unauthenticated

The Authorization header is missing, the key is unknown, expired or revoked.

403entitlement_required

The workspace's plan does not include API access (api_access).

403insufficient_scope

The key does not have the permission this operation needs.

404not_found

No conversation with this id, or your key cannot see it.

429rate_limited

The key or workspace went over its rate limit. Wait for Retry-After seconds.

503upstream_unavailable

A service behind the API is briefly unavailable. Safe to retry with backoff.

Examples

Read a conversation

Response 200

{
  "conversation": {
    "id": "77410",
    "state": "open",
    "contact": {
      "id": "48213",
      "name": "Jane Doe",
      "phone": "+15555550123",
      "dnd_enabled": false,
      "groups": []
    },
    "channel": {
      "id": "301",
      "name": "Main WhatsApp",
      "type": "whatsapp"
    },
    "assignee": null,
    "team_id": null,
    "tags": [
      {
        "id": "4",
        "name": "new-lead"
      }
    ],
    "unread_count": 2,
    "reply_status": "incoming_no_reply",
    "whatsapp_window_expires_at": "2026-09-25T09:12:00Z",
    "window": {
      "applies": true,
      "open": true,
      "kind": "service",
      "closes_at": "2026-09-25T09:12:00.000Z",
      "closed_at": null,
      "reason": null
    },
    "last_message": {
      "id": "5501234",
      "type": "TEXT",
      "direction": "inbound",
      "status": "received",
      "text": "Hi, is the blue one in stock?",
      "created_at": "2026-09-24T09:12:00Z",
      "conversation_id": null,
      "text_truncated": false,
      "has_media": false,
      "from": null,
      "reply_to_id": null,
      "error": null
    },
    "created_at": "2026-09-24T09:11:40Z",
    "updated_at": "2026-09-24T09:12:00Z",
    "assigned_at": null,
    "starred": false,
    "sla": null,
    "reminder_at": null,
    "bot_active": false
  },
  "last_messages": [
    {
      "id": "5501234",
      "type": "TEXT",
      "direction": "inbound",
      "status": "received",
      "text": "Hi, is the blue one in stock?",
      "created_at": "2026-09-24T09:12:00Z",
      "conversation_id": null,
      "text_truncated": false,
      "has_media": false,
      "from": null,
      "reply_to_id": null,
      "error": null
    }
  ],
  "episode_title": null,
  "permissions": {}
}
Check if the 24-hour reply window (customer service window, WhatsApp session) is open before replying

Response 200

{
  "conversation": {
    "id": "77410",
    "state": "open",
    "contact": {
      "id": "48213",
      "name": "Jane Doe",
      "phone": "+15555550123",
      "dnd_enabled": false,
      "groups": []
    },
    "channel": {
      "id": "301",
      "name": "Main WhatsApp",
      "type": "whatsapp"
    },
    "assignee": null,
    "team_id": null,
    "tags": [
      {
        "id": "4",
        "name": "new-lead"
      }
    ],
    "unread_count": 2,
    "reply_status": "incoming_no_reply",
    "whatsapp_window_expires_at": "2026-09-25T09:12:00Z",
    "window": {
      "applies": true,
      "open": false,
      "kind": "service",
      "closes_at": null,
      "closed_at": "2026-09-25T09:12:00.000Z",
      "reason": "expired"
    },
    "last_message": {
      "id": "5501234",
      "type": "TEXT",
      "direction": "inbound",
      "status": "received",
      "text": "Hi, is the blue one in stock?",
      "created_at": "2026-09-24T09:12:00Z",
      "conversation_id": null,
      "text_truncated": false,
      "has_media": false,
      "from": null,
      "reply_to_id": null,
      "error": null
    },
    "created_at": "2026-09-24T09:11:40Z",
    "updated_at": "2026-09-24T09:12:00Z",
    "assigned_at": null,
    "starred": false,
    "sla": null,
    "reminder_at": null,
    "bot_active": false
  },
  "last_messages": [],
  "episode_title": null,
  "permissions": {}
}

Operation path

The same operation is also at POST /v1/ops/inbox_get_conversation, with every field in the JSON body.