Conversations API
The inbox: assignment, turn state, notes and resolution. 19 ops: list_conversations, get_inbox_counts, get_conversation, reply_to_conversation, assign_conversation, claim_conversation, add_conversation_note, tag_conversation, update_conversation, set_turn_state, escalate_conversation, resolve_conver
The inbox: assignment, turn state, notes and resolution.
List conversations · POST /api/v1/list_conversations · scope conversations:read or GET …?input=
The inbox: conversations in one queue view, with the contact and the last message. Views: all (Every open or pending conversation.); needs_first_response (A customer is waiting and nobody has answered them substantively yet.); needs_reply (A customer turn is waiting for a substantive answer (customer_waiting, acknowledged or escalated).); unassigned (Open conversations without an assignee.); mine (Open conversations assigned to the caller.); ai (Handled by an AI agent, with no human takeover.); human (Handled by a person.); escalated (Handed to a human by an AI agent or a rule.); high_priority (Priority high or urgent.); sla_at_risk (Waiting for a reply and due within 30 minutes or overdue.); window_expiring (The 24-hour service window closes within the warning threshold (default 2 hours).); waiting_on_customer (Answered, or waiting for information from the customer.); resolved (Resolved conversations, newest first.). Filter by assignee ("me" or a user id), team, tag, priority, contact or sender, or search q (contact name, phone, email, or a tag). Returns conversations (turn_state, waiting_since, window_expires_at, sla_due_at…), total and the next offset. Use get_inbox_counts for every view's count.
curl -X POST https://getwabi.dev/api/v1/list_conversations \ -H "Authorization: Bearer wabi_…"npx @meterapp/wabi list_conversations{
"type": "object",
"properties": {
"view": {
"default": "all",
"type": "string",
"enum": [
"all",
"needs_first_response",
"needs_reply",
"unassigned",
"mine",
"ai",
"human",
"escalated",
"high_priority",
"sla_at_risk",
"window_expiring",
"waiting_on_customer",
"resolved"
]
},
"q": {
"description": "Search: contact name, phone digits, email, or an exact tag.",
"type": "string",
"maxLength": 100
},
"assignee": {
"description": "\"me\" or a user id.",
"type": "string"
},
"team": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
},
"tag": {
"type": "string",
"minLength": 1,
"maxLength": 50
},
"priority": {
"type": "string",
"enum": [
"low",
"normal",
"high",
"urgent"
]
},
"contact": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Contact id."
},
"phone_number_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Connected sender id (whatsapp_phone_numbers.id, not Meta's phone_number_id)."
},
"limit": {
"default": 50,
"description": "Page size, at most 200.",
"type": "integer",
"minimum": 1,
"maximum": 200
},
"offset": {
"default": 0,
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
}
}
}get_inbox_counts
readGet inbox counts · POST /api/v1/get_inbox_counts · scope conversations:read or GET …?input=
How many conversations each inbox view holds now (needs_reply, unassigned, mine, escalated, window_expiring, sla_at_risk…). Use it for a quick operational picture before list_conversations.
curl -X POST https://getwabi.dev/api/v1/get_inbox_counts \ -H "Authorization: Bearer wabi_…"npx @meterapp/wabi get_inbox_counts{
"type": "object",
"properties": {}
}get_conversation
readGet a conversation · POST /api/v1/get_conversation · scope conversations:read or GET …?input=
One conversation with its full timeline: every message (direction, type, text, media, location, template, sender, delivery and read receipts, errors, and whether it counted as an answer), internal notes and assignment/escalation history; plus the contact's profile and their separate messaging, consent, engagement, support and campaign states. Use before replying or handing off.
curl -X POST https://getwabi.dev/api/v1/get_conversation \ -H "Authorization: Bearer wabi_…" \ -H "Content-Type: application/json" \ -d '{"conversation":"6f1c2e0a-4b7d-4c2e-9a51-0d3b8e7f9a10"}'npx @meterapp/wabi get_conversation --json '{"conversation":"6f1c2e0a-4b7d-4c2e-9a51-0d3b8e7f9a10"}'{
"type": "object",
"properties": {
"conversation": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Conversation id."
},
"messages_limit": {
"default": 200,
"type": "integer",
"minimum": 1,
"maximum": 500
}
},
"required": [
"conversation"
]
}Reply in a conversation · POST /api/v1/reply_to_conversation · scope conversations:write
Sends a reply to the conversation's customer through the messaging engine (send_message, with all its safeguards). Free-form text (or a saved reply, filled with variables) while the 24-hour service window is open; when it has closed, pass template { name, language, components } and that is sent instead; text alone after the window is a 422 window_closed. A person replying from the dashboard takes the conversation over from its AI agent. Returns the mode used (free_form or template) and the message id.
curl -X POST https://getwabi.dev/api/v1/reply_to_conversation \ -H "Authorization: Bearer wabi_…" \ -H "Content-Type: application/json" \ -d '{"conversation":"6f1c2e0a-4b7d-4c2e-9a51-0d3b8e7f9a10"}'npx @meterapp/wabi reply_to_conversation --json '{"conversation":"6f1c2e0a-4b7d-4c2e-9a51-0d3b8e7f9a10"}'{
"type": "object",
"properties": {
"conversation": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Conversation id."
},
"text": {
"description": "Free-form text (window open).",
"type": "string",
"minLength": 1,
"maxLength": 4096
},
"saved_reply": {
"description": "A saved reply's id or shortcut, filled with the contact's details and variables.",
"type": "string",
"minLength": 1,
"maxLength": 64
},
"variables": {
"description": "Values for the saved reply's {{variables}}.",
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {
"type": "string",
"maxLength": 1000
}
},
"template": {
"description": "Sent when the window is closed (or when no text is given).",
"type": "object",
"properties": {
"name": {
"type": "string",
"pattern": "^[a-z0-9_]{1,512}$",
"description": "Approved template name."
},
"language": {
"type": "string",
"minLength": 2,
"maxLength": 15,
"description": "Template language code, e.g. en_US."
},
"components": {
"description": "Variable values in Meta's components format.",
"maxItems": 20,
"type": "array",
"items": {
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {}
}
}
},
"required": [
"name",
"language"
]
},
"reply_to": {
"description": "Message id or wamid to quote.",
"type": "string",
"maxLength": 200
},
"idempotency_key": {
"type": "string",
"minLength": 1,
"maxLength": 200
}
},
"required": [
"conversation"
]
}assign_conversation
writeAssign a conversation · POST /api/v1/assign_conversation · scope conversations:write
Assigns a conversation to a member ("me", a user id, or null to unassign) and/or a team, or picks one automatically with strategy least_loaded (fewest open conversations) or round_robin (among the team, or every non-viewer member). An optional note is kept as an internal note. Emits conversation.assigned. Returns the conversation.
curl -X POST https://getwabi.dev/api/v1/assign_conversation \ -H "Authorization: Bearer wabi_…"npx @meterapp/wabi assign_conversation{
"type": "object",
"properties": {
"conversation": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Conversation id."
},
"conversation_id": {
"description": "Same as conversation.",
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
},
"assignee": {
"description": "\"me\", a user id, or null to unassign.",
"type": [
"string",
"null"
]
},
"team": {
"description": "Team id, or null for none.",
"anyOf": [
{
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
},
{
"type": "null"
}
]
},
"team_id": {
"description": "Same as team.",
"anyOf": [
{
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
},
{
"type": "null"
}
]
},
"strategy": {
"description": "Pick the assignee automatically.",
"type": "string",
"enum": [
"least_loaded",
"round_robin"
]
},
"note": {
"description": "Why, for the person taking it (an internal note).",
"type": "string",
"minLength": 1,
"maxLength": 5000
}
}
}claim_conversation
writeClaim a conversation · POST /api/v1/claim_conversation · scope conversations:write
Assigns an unassigned conversation to the caller (a person). Someone else's conversation is a 409; use assign_conversation to take it over. Returns the conversation.
curl -X POST https://getwabi.dev/api/v1/claim_conversation \ -H "Authorization: Bearer wabi_…" \ -H "Content-Type: application/json" \ -d '{"conversation":"6f1c2e0a-4b7d-4c2e-9a51-0d3b8e7f9a10"}'npx @meterapp/wabi claim_conversation --json '{"conversation":"6f1c2e0a-4b7d-4c2e-9a51-0d3b8e7f9a10"}'{
"type": "object",
"properties": {
"conversation": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Conversation id."
}
},
"required": [
"conversation"
]
}Add an internal note · POST /api/v1/add_conversation_note · scope conversations:write
Adds an internal note to a conversation (never sent to the customer), optionally mentioning members by user id. Returns the note.
curl -X POST https://getwabi.dev/api/v1/add_conversation_note \ -H "Authorization: Bearer wabi_…" \ -H "Content-Type: application/json" \ -d '{"conversation":"6f1c2e0a-4b7d-4c2e-9a51-0d3b8e7f9a10","body":"It would save us a trip to Meta Business Manager."}'npx @meterapp/wabi add_conversation_note --json '{"conversation":"6f1c2e0a-4b7d-4c2e-9a51-0d3b8e7f9a10","body":"It would save us a trip to Meta Business Manager."}'{
"type": "object",
"properties": {
"conversation": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Conversation id."
},
"body": {
"type": "string",
"minLength": 1,
"maxLength": 10000
},
"mentions": {
"default": [],
"maxItems": 20,
"type": "array",
"items": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
}
}
},
"required": [
"conversation",
"body"
]
}tag_conversation
writeTag a conversation · POST /api/v1/tag_conversation · scope conversations:write
Adds and removes conversation tags (lowercased). Returns the conversation.
curl -X POST https://getwabi.dev/api/v1/tag_conversation \ -H "Authorization: Bearer wabi_…" \ -H "Content-Type: application/json" \ -d '{"conversation":"6f1c2e0a-4b7d-4c2e-9a51-0d3b8e7f9a10"}'npx @meterapp/wabi tag_conversation --json '{"conversation":"6f1c2e0a-4b7d-4c2e-9a51-0d3b8e7f9a10"}'{
"type": "object",
"properties": {
"conversation": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Conversation id."
},
"add": {
"default": [],
"maxItems": 20,
"type": "array",
"items": {
"type": "string",
"minLength": 1,
"maxLength": 50
}
},
"remove": {
"default": [],
"maxItems": 20,
"type": "array",
"items": {
"type": "string",
"minLength": 1,
"maxLength": 50
}
}
},
"required": [
"conversation"
]
}update_conversation
writeUpdate a conversation · POST /api/v1/update_conversation · scope conversations:write
Sets a conversation's priority (low, normal, high, urgent: the SLA target follows), category or language. Returns the conversation.
curl -X POST https://getwabi.dev/api/v1/update_conversation \ -H "Authorization: Bearer wabi_…" \ -H "Content-Type: application/json" \ -d '{"conversation":"6f1c2e0a-4b7d-4c2e-9a51-0d3b8e7f9a10"}'npx @meterapp/wabi update_conversation --json '{"conversation":"6f1c2e0a-4b7d-4c2e-9a51-0d3b8e7f9a10"}'{
"type": "object",
"properties": {
"conversation": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Conversation id."
},
"priority": {
"type": "string",
"enum": [
"low",
"normal",
"high",
"urgent"
]
},
"category": {
"anyOf": [
{
"type": "string",
"minLength": 1,
"maxLength": 100
},
{
"type": "null"
}
]
},
"language": {
"anyOf": [
{
"type": "string",
"minLength": 2,
"maxLength": 35
},
{
"type": "null"
}
]
}
},
"required": [
"conversation"
]
}set_turn_state
writeSet the customer-turn state · POST /api/v1/set_turn_state · scope conversations:write
Records an explicit disposition of the customer's turn when no message says it: answered (handled elsewhere, e.g. by phone), needs_info, awaiting_customer, acknowledged or customer_waiting (still owed an answer). Automatic messages never answer a turn, so use this for answers given outside WhatsApp. Returns the conversation.
curl -X POST https://getwabi.dev/api/v1/set_turn_state \ -H "Authorization: Bearer wabi_…" \ -H "Content-Type: application/json" \ -d '{"conversation":"6f1c2e0a-4b7d-4c2e-9a51-0d3b8e7f9a10","state":"customer_waiting"}'npx @meterapp/wabi set_turn_state --json '{"conversation":"6f1c2e0a-4b7d-4c2e-9a51-0d3b8e7f9a10","state":"customer_waiting"}'{
"type": "object",
"properties": {
"conversation": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Conversation id."
},
"state": {
"type": "string",
"enum": [
"customer_waiting",
"acknowledged",
"answered",
"needs_info",
"awaiting_customer"
]
}
},
"required": [
"conversation",
"state"
]
}Escalate a conversation · POST /api/v1/escalate_conversation · scope conversations:write
Hands a conversation to a human: turn_state escalated, human takeover on (AI agents stop answering), priority raised to at least high, optionally to a team or person. AI agents call it with the reason, a summary (or note) for the person and their hand-off packet (handoff: question, summary, sources, attempted actions, recommended next step, agent_id, session_id, confidence). Emits conversation.escalated (a customer webhook event) once per agent session. Returns the conversation.
curl -X POST https://getwabi.dev/api/v1/escalate_conversation \ -H "Authorization: Bearer wabi_…" \ -H "Content-Type: application/json" \ -d '{"reason":"reason"}'npx @meterapp/wabi escalate_conversation --json '{"reason":"reason"}'{
"type": "object",
"properties": {
"conversation": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Conversation id."
},
"conversation_id": {
"description": "Same as conversation.",
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
},
"reason": {
"type": "string",
"minLength": 1,
"maxLength": 500
},
"summary": {
"description": "What the customer needs and what was tried; kept as an internal note.",
"type": "string",
"maxLength": 5000
},
"note": {
"description": "Same as summary.",
"type": "string",
"maxLength": 5000
},
"team": {
"anyOf": [
{
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
},
{
"type": "null"
}
]
},
"team_id": {
"description": "Same as team.",
"anyOf": [
{
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
},
{
"type": "null"
}
]
},
"assignee": {
"type": [
"string",
"null"
]
},
"handoff": {
"description": "An AI agent's hand-off packet; carried on the conversation.escalated event.",
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {}
}
},
"required": [
"reason"
]
}resolve_conversation
writeResolve a conversation · POST /api/v1/resolve_conversation · scope conversations:write
Marks a conversation resolved, with an optional internal note. A later customer message opens a new conversation. Emits conversation.resolved. Returns the conversation.
curl -X POST https://getwabi.dev/api/v1/resolve_conversation \ -H "Authorization: Bearer wabi_…" \ -H "Content-Type: application/json" \ -d '{"conversation":"6f1c2e0a-4b7d-4c2e-9a51-0d3b8e7f9a10"}'npx @meterapp/wabi resolve_conversation --json '{"conversation":"6f1c2e0a-4b7d-4c2e-9a51-0d3b8e7f9a10"}'{
"type": "object",
"properties": {
"conversation": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Conversation id."
},
"note": {
"type": "string",
"maxLength": 5000
}
},
"required": [
"conversation"
]
}reopen_conversation
writeReopen a conversation · POST /api/v1/reopen_conversation · scope conversations:write
Reopens a resolved conversation as waiting for a reply (counted in the reopen rate). A 409 when the customer already has a newer open conversation on the same number. Returns the conversation.
curl -X POST https://getwabi.dev/api/v1/reopen_conversation \ -H "Authorization: Bearer wabi_…" \ -H "Content-Type: application/json" \ -d '{"conversation":"6f1c2e0a-4b7d-4c2e-9a51-0d3b8e7f9a10"}'npx @meterapp/wabi reopen_conversation --json '{"conversation":"6f1c2e0a-4b7d-4c2e-9a51-0d3b8e7f9a10"}'{
"type": "object",
"properties": {
"conversation": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Conversation id."
}
},
"required": [
"conversation"
]
}set_human_takeover
writeTake over from the AI agent · POST /api/v1/set_human_takeover · scope conversations:write
on: a person takes the conversation over and AI agents stop answering it (they read human_takeover); off: hands it back to the agent. Returns the conversation.
curl -X POST https://getwabi.dev/api/v1/set_human_takeover \ -H "Authorization: Bearer wabi_…" \ -H "Content-Type: application/json" \ -d '{"conversation":"6f1c2e0a-4b7d-4c2e-9a51-0d3b8e7f9a10","on":false}'npx @meterapp/wabi set_human_takeover --json '{"conversation":"6f1c2e0a-4b7d-4c2e-9a51-0d3b8e7f9a10","on":false}'{
"type": "object",
"properties": {
"conversation": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Conversation id."
},
"on": {
"type": "boolean"
}
},
"required": [
"conversation",
"on"
]
}List saved replies · POST /api/v1/list_saved_replies · scope conversations:read or GET …?input=
The organization's saved (canned) replies with their {{variables}}. Send one with reply_to_conversation { saved_reply: <shortcut> }.
curl -X POST https://getwabi.dev/api/v1/list_saved_replies \ -H "Authorization: Bearer wabi_…"npx @meterapp/wabi list_saved_replies{
"type": "object",
"properties": {}
}save_saved_reply
writeSave a saved reply · POST /api/v1/save_saved_reply · scope conversations:write
Creates or updates (by shortcut) a saved reply. The body may use {{contact.name}}, {{contact.first_name}}, {{contact.phone}}, {{contact.email}}, {{contact.<attribute>}} and your own {{variables}}. Returns it.
curl -X POST https://getwabi.dev/api/v1/save_saved_reply \ -H "Authorization: Bearer wabi_…" \ -H "Content-Type: application/json" \ -d '{"shortcut":"shortcut","name":"Support","body":"It would save us a trip to Meta Business Manager."}'npx @meterapp/wabi save_saved_reply --json '{"shortcut":"shortcut","name":"Support","body":"It would save us a trip to Meta Business Manager."}'{
"type": "object",
"properties": {
"shortcut": {
"type": "string",
"pattern": "^[a-z0-9][a-z0-9_-]{0,39}$",
"description": "Lowercase key, e.g. refund-policy."
},
"name": {
"type": "string",
"minLength": 1,
"maxLength": 100
},
"body": {
"type": "string",
"minLength": 1,
"maxLength": 4096
}
},
"required": [
"shortcut",
"name",
"body"
]
}delete_saved_reply
writeDelete a saved reply · POST /api/v1/delete_saved_reply · scope conversations:write
Deletes a saved reply by shortcut.
curl -X POST https://getwabi.dev/api/v1/delete_saved_reply \ -H "Authorization: Bearer wabi_…" \ -H "Content-Type: application/json" \ -d '{"shortcut":"shortcut"}'npx @meterapp/wabi delete_saved_reply --json '{"shortcut":"shortcut"}'{
"type": "object",
"properties": {
"shortcut": {
"type": "string",
"minLength": 1,
"maxLength": 40
}
},
"required": [
"shortcut"
]
}Get inbox settings · POST /api/v1/get_inbox_settings · scope conversations:read or GET …?input=
First-response SLA targets by priority (minutes), when window.expiring fires (minutes before a window closes) and when conversation.needs_reply fires (minutes a turn waited).
curl -X POST https://getwabi.dev/api/v1/get_inbox_settings \ -H "Authorization: Bearer wabi_…"npx @meterapp/wabi get_inbox_settings{
"type": "object",
"properties": {}
}Update inbox settings · POST /api/v1/update_inbox_settings · scope conversations:write
Changes the SLA targets, the window warning threshold or the needs-reply delay. Admins only. Returns the settings.
curl -X POST https://getwabi.dev/api/v1/update_inbox_settings \ -H "Authorization: Bearer wabi_…"npx @meterapp/wabi update_inbox_settings{
"type": "object",
"properties": {
"sla_minutes": {
"type": "object",
"properties": {
"low": {
"type": "integer",
"minimum": 1,
"maximum": 10080
},
"normal": {
"type": "integer",
"minimum": 1,
"maximum": 10080
},
"high": {
"type": "integer",
"minimum": 1,
"maximum": 10080
},
"urgent": {
"type": "integer",
"minimum": 1,
"maximum": 10080
}
}
},
"window_warning_minutes": {
"type": "integer",
"minimum": 5,
"maximum": 1380
},
"needs_reply_after_minutes": {
"type": "integer",
"minimum": 0,
"maximum": 1440
}
}
}