Developers

Mumble API Reference

Manage customers, send WhatsApp messages, create templates and control chatbots from your own systems. The API is organized around REST: every endpoint accepts and returns JSON.

Base URL https://app.mumble.co.il

Authentication

Every request must include your API key in the Mumble-Api-Key header. You can generate and manage keys from your Mumble account settings.

Mumble-Api-Key: your-api-key-here
Content-Type: application/json

A missing or unknown key is rejected with an error such as Authorization is required. or API key does not exist. Keys never expire.

Rate limits & quotas

Every endpoint is protected by two rate-limit buckets. Whichever trips first returns 429 Too Many Requests:

  • Per API key: counted for each authenticated key.
  • Per IP: a separate bucket for the calling IP address.

The sending endpoints send-text-message, send-template and send-template-text-variable have an additional limit of 5 requests per second, 100 per minute, and 2,000 per hour per API key.

Plan quotas. Each successful call counts toward your plan's API usage, and each template sent counts toward your monthly message quota. When a quota runs out, calls fail with API key usage limit reached or Maximum messages limit reached.

If you need higher limits for production workloads, contact support@mumble.co.il.

Errors & conventions

All responses are JSON. Errors include "error": true and a "message" field. Most successful responses include "success": true; the list endpoints get-labels, get-bots and get-templates return only the list.

Common status codes:

CodeMeaning
200Request succeeded. A few business rejections (customer on the Black List) also come back as 200 with "error": true, so always check the body.
400Bad request: missing or invalid parameters
401Unauthorized: invalid or missing API key, or WhatsApp is not connected on the account
404Resource not found (customer, label, template, agent, team, bot, or message), or an empty list
409Conflict, e.g. a label with that name already exists
429Rate limit hit
500Unexpected server error; retry with backoff

Phone numbers should be sent as international digits without +, spaces, or dashes (e.g. 972501234567). Most endpoints strip + ( ) - and spaces, but get-conversation, is-active-conv and remove-customer-from-label match the number exactly, so send digits only everywhere.

GET endpoints read their parameters from a JSON body. get-customer, get-all-customers and get-conversation also accept query-string parameters (e.g. ?customer_phone=972501234567), which is safer because many HTTP clients drop the body on GET.

Customers are created automatically by every send endpoint. If the phone number is new, the customer is created and tagged with the labels in source (or "New Leads" when source is empty).

Customers

POST /mumbleapi/add-new-customer Create a customer, or update labels and bot on an existing one.

Create a new customer. Marketing attribution fields (UTMs, click IDs, device info) and custom fields can be attached at creation. If the phone number already exists, the call does not fail: labels from source are added, the bot setting is applied and attribution fields are updated, but name and email are left unchanged (use edit-customer for those).

Bot setting. If you omit bot_token, chatbots are turned off for this customer, including an existing customer who had a bot. Always send bot_token if the customer should stay with a bot.
Request fields
customer_phonestringrequired
International digits, e.g. 972501234567.
namestringoptional
Display name (max 50 characters). Defaults to the phone number.
emailstringoptional
Customer email (max 50 characters).
sourcestringoptional
Comma-separated label names. Labels that don't exist yet are created. If empty, the customer is added to "New Leads".
bot_tokenstringoptional
A flow chatbot's ID (from get-bots or the chatbot's settings), "AI" for Dolores AI, or "turn_off". "AI" only takes effect if Dolores is enabled on the account; otherwise bots are turned off.
*tracking fields*stringoptional
*custom fields*anyoptional
Any other key is stored as a custom field on the customer (max 50 custom fields per account).
Example requestJSON
{
  "customer_phone": "972501234567",
  "name": "John Doe",
  "email": "john@example.com",
  "source": "web,summer_sale",
  "bot_token": "AI",
  "utm_source": "google",
  "utm_campaign": "summer_sale",
  "lead_score": "85"
}
Example success responseJSON
{
  "success": true,
  "message": "Added successfully with 1 custom field(s)",
  "custom_fields_processed": ["lead_score"]
}
Responses
200Added successfully
400Phone number is required.
400Failed to add customer due to invalid input
400Cannot add more than 50 custom fields. ...
401Unauthorized
500An unexpected error occurred
POST /mumbleapi/edit-customer Update an existing customer.

Update an existing customer. Fields not sent are unchanged, and empty values are ignored (a field can't be cleared through the API). Any key that isn't a standard field becomes a custom field on the customer (max 50 per account).

Labels and bots are not edited here. source and bot_token are not standard fields on this endpoint, so they would be saved as custom fields. Use add-customer-to-label and assign-bot instead.
Request fields
customer_phonestringrequired
Identifies the customer. It can't be changed.
namestringoptional
emailstringoptional
*tracking fields*stringoptional
*custom fields*anyoptional
Any additional keys are stored as custom fields (max 50 per account).
Example requestJSON
{
  "customer_phone": "972501234567",
  "name": "Jane Doe",
  "email": "jane@example.com",
  "company_size": "50-100",
  "lead_score": "85"
}
Example success responseJSON
{
  "success": true,
  "message": "Customer updated successfully with 2 custom field(s)",
  "custom_fields_processed": [
    "company_size",
    "lead_score"
  ]
}
Responses
200Customer updated successfully
400Phone number is required.
400Failed to update customer due to invalid input
400Cannot add more than 50 custom fields. ...
401Unauthorized
404Customer not found
500An unexpected error occurred
DELETE /mumbleapi/delete-customer Permanently delete a customer.

Permanently delete a customer and their related data. This can't be undone.

Request fields
customer_phonestringrequired
Example requestJSON
{
  "customer_phone": "972501234567"
}
Example success responseJSON
{
  "success": true,
  "message": "Customer deleted successfully"
}
Responses
200Customer deleted successfully
400Phone number is required.
401Unauthorized
404Customer not found
GET /mumbleapi/get-customer Get a single customer with attribution, custom fields and labels.

Get a single customer record: contact details, conversation status, all attribution fields, the customer's labels, and custom fields. For customers who came from a Click-to-WhatsApp ad, ctwa_clid holds the ad click ID (useful for sending conversions back to Meta); it is null otherwise. Custom fields are returned as top-level keys inside customer, by their field name.

Request fields
customer_phonestringrequired
JSON body or query string: ?customer_phone=972501234567.
Example requestJSON
{
  "customer_phone": "972501234567"
}
Example success responseJSON
{
  "success": true,
  "customer": {
    "id": "uuid",
    "name": "John Doe",
    "phone": "972501234567",
    "email": "john@example.com",
    "country": "IL",
    "conversation_status": "new",
    "last_interaction": "Mon, 29 Jun 2026 10:15:00 GMT",
    "mumclid": "...",
    "ctwa_clid": "ARAkLkA8rmlFeiCktEJQ-QTwRiyYHAFDLMNDBH0CD3qpjd0HR4irJ6LEkR7JwFF4XvnO2E4Nx0-eM-GABDLOPaOdRMv-_zfUQ2a",
    "bsuid": null,
    "utm_source": "google",
    "utm_campaign": "summer_sale",
    "gclid": "...",
    "...": "all other attribution fields",
    "lead_score": "85",
    "labels": [
      { "id": "label-uuid", "name": "New Leads" }
    ]
  }
}
Responses
200OK
401Unauthorized
401Customer not found (customer_phone missing)
404Customer not found
GET /mumbleapi/get-all-customers Paginated list of all customers (250 per page).

Paginated list of all customers, 250 per page. Each item has name, phone and email; use get-customer for the full record. Parameters can be sent in the JSON body or the query string (?page=2&sort_by=date_created).

Request fields
pageintoptional
Page number (default 1).
sort_bystringoptional
One of name (default), phone, email, date_created, last_interaction, conversation_status, country. Ascending.
Example requestJSON
{
  "page": 1,
  "sort_by": "date_created"
}
Example success responseJSON
{
  "success": true,
  "customers": [
    { "name": "John Doe", "phone": "972501234567", "email": "john@example.com" }
  ],
  "total": 412,
  "current_page": 1,
  "per_page": 250,
  "total_pages": 2
}
Responses
200OK
401Unauthorized
500An unexpected error occurred
POST /mumbleapi/edit-customer-conv-status Update a customer's conversation status.

Update a customer's conversation status. The change is applied in the background right after the response, and triggers any automations set on status changes.

Request fields
customer_phonestringrequired
statusstringrequired
One of the conversation status values (English key only). conversation_status is accepted as an alias.
Example requestJSON
{
  "customer_phone": "972501234567",
  "status": "in_progress"
}
Example success responseJSON
{
  "success": true,
  "message": "Customer conversation status updated successfully"
}
Responses
200Customer conversation status updated successfully
400Phone number is required.
400Invalid conversation status please choose from the following ...
401Unauthorized
404Customer not found
POST /mumbleapi/assign-customer-to-agent Route a customer's conversations to a specific agent.

Route a customer's conversations to a specific agent, by ID or by name. Send "agent_id": "-1" to unassign the customer.

Request fields
customer_phonestringrequired
agent_idstringone of
Agent UUID from get-agents, or "-1" to unassign.
agent_namestringone of
Exact agent name. Used when agent_id is not sent.
Example requestJSON
{
  "customer_phone": "972501234567",
  "agent_id": "agent-uuid"
}
Example success responseJSON
{
  "success": true,
  "message": "Customer updated successfully"
}
Responses
200Customer updated successfully
400Phone number is required.
400agent_id or agent_name is required.
401Unauthorized
404Customer not found
404Agent with ID ... not found
POST /mumbleapi/assign-customer-to-team Route a customer's conversations to a team.

Route a customer's conversations to a team, by ID or by name.

Request fields
customer_phonestringrequired
team_idstringone of
Team UUID from get-teams.
team_namestringone of
Exact team name. Used when team_id is not sent.
Example requestJSON
{
  "customer_phone": "972501234567",
  "team_name": "Sales"
}
Example success responseJSON
{
  "success": true,
  "message": "Customer updated successfully"
}
Responses
200Customer updated successfully
400Phone number is required.
400team_id or team_name is required.
401Unauthorized
404Customer not found
404Team with ID ... not found

Labels

POST /mumbleapi/add-customer-to-label Tag a customer with an existing label.

Tag a customer with a label. The label must already exist; create it first with add-new-label. Label automations run after the response. Adding a customer to the Black List label blocks all template sends to them.

Request fields
customer_phonestringrequired
label_namestringrequired
Exact label name (case-sensitive).
Example requestJSON
{
  "customer_phone": "972501234567",
  "label_name": "VIP customers"
}
Example success responseJSON
{
  "success": true,
  "message": "Added successfully"
}
Responses
200Added successfully
400Label name and customer phone are required.
401Unauthorized
404Label '...' not found.
404Customer with phone '...' not found.
DELETE /mumbleapi/remove-customer-from-label Remove a label from a customer.

Remove a label from a customer. Customers can't be removed from the Black List label through the API; do that in the Mumble app.

Request fields
customer_phonestringrequired
Digits only, exact match (no + or spaces).
label_namestringrequired
Example requestJSON
{
  "customer_phone": "972501234567",
  "label_name": "VIP customers"
}
Example success responseJSON
{
  "success": true,
  "message": "Customer 972501234567 removed from label VIP customers"
}
Responses
200Customer ... removed from label ...
200Cannot remove customer from Black List (error: true)
400Label name and customer phone are required.
401Unauthorized
404Label '...' not found.
404Customer with phone '...' not found.
POST /mumbleapi/add-new-label Create a new label (list) in your account.

Create a new label (list) in your account. A random color is assigned.

Request fields
label_namestringrequired
Example requestJSON
{
  "label_name": "VIP customers"
}
Example success responseJSON
{
  "success": true,
  "message": "Label 'VIP customers' created successfully"
}
Responses
200Label '...' created successfully
400Label name is required.
401Unauthorized
409Label '...' already exists.
DELETE /mumbleapi/delete-label Delete a label.

Delete a label. Customers in it are not deleted; they just lose the label.

Request fields
label_namestringrequired
Example requestJSON
{
  "label_name": "VIP customers"
}
Example success responseJSON
{
  "success": true,
  "message": "Label 'VIP customers' deleted successfully"
}
Responses
200Label '...' deleted successfully
400Label name is required for deletion.
401Unauthorized
404Label '...' not found.
GET /mumbleapi/get-labels List the names of all labels in your account.

List all labels in your account, as an array of label names.

Example requestJSON
(no body)
Example success responseJSON
{
  "labels": ["New Leads", "VIP customers", "Black List"]
}
Responses
200OK
401Unauthorized
404No labels found

Messaging

All send endpoints create the customer if the phone number is new, and accept source, bot_token, name and email (same meaning as in add-new-customer). Sending source or bot_token for an existing customer re-applies the bot setting the same way, so leaving bot_token empty while sending source turns that customer's bot off.

POST /mumbleapi/send-text-message Send a free-form text message.

Send a free-form text message. Requires an open 24-hour conversation window (see is-active-conv); outside it, send a template. Rate limited to 5/sec, 100/min, 2,000/hour per API key.

Request fields
customer_phonestringrequired
textstringrequired
sourcestringoptional
Comma-separated labels to add.
bot_tokenstringoptional
Assign a bot alongside the message.
namestringoptional
Used only when the customer is created.
emailstringoptional
Used only when the customer is created.
Example requestJSON
{
  "customer_phone": "972501234567",
  "text": "Hello!"
}
Example success responseJSON
{
  "success": true,
  "id": 1,
  "message_wa_id": "wamid.abc123"
}
Responses
200Sent
400Missing required parameters.
400Conversation is closed ("is_active": false)
400Failed to send text message.
401Unauthorized
401The user is not authorized to send text messages.
429Rate limit hit
POST /mumbleapi/send-media-message Send a media message (image, video, audio, document).

Send a media message (image, video, audio, document). Supports two modes: (A) file upload via multipart/form-data, or (B) public URL via JSON with media_url. Requires an open 24-hour window. The file type is taken from the file name's extension. Supported: jpg, jpeg, png, webp, mp4, mov, mp3, ogg, m4a, wav, opus, pdf, doc, docx, xls, xlsx, ppt, pptx, txt.

Request fields
filefileone of
Binary file (Mode A). Send the other fields as form fields in the same request.
media_urlstringone of
Public URL (Mode B).
customer_phonestringrequired
captionstringoptional
filenamestringoptional
Override display filename. Required for media_url if the URL has no file extension.
sourcestringoptional
bot_tokenstringoptional
namestringoptional
emailstringoptional
Mode A: file upload
curl -X POST https://app.mumble.co.il/mumbleapi/send-media-message \
  -H "Mumble-Api-Key: your-api-key-here" \
  -F "file=@./brochure.pdf" \
  -F "customer_phone=972501234567" \
  -F "caption=Our brochure"
Example request (Mode B)JSON
{
  "customer_phone": "972501234567",
  "media_url": "https://example.com/photo.jpg",
  "caption": "Check this out!",
  "filename": "photo.jpg"
}
Example success responseJSON
{
  "success": true,
  "id": 1,
  "message_wa_id": "wamid.abc123"
}
Responses
200Sent
400Either file upload or media_url is required.
400Missing required parameter: customer_phone
400Cannot determine file type. Provide a filename parameter with an extension.
400Unsupported file type: .xyz
400Conversation is closed ("is_active": false)
400Failed to send media message.
401Unauthorized
401The user is not authorized to send media messages.
500Failed to upload media file.
POST /mumbleapi/send-template Send an approved template that has no variables.

Send an approved message template that has no body variables. Use this to start a conversation outside the 24-hour window. Templates with {{1}}-style variables are rejected here; use send-template-text-variable. Rate limited to 5/sec, 100/min, 2,000/hour per API key.

This endpoint does not take button values. To fill a dynamic URL button, use send-template-text-variable.
Request fields
customer_phonestringrequired
template_idstringrequired
ID of an approved template, from get-templates.
media_linkstringoptional
Public URL that replaces the template's media header. Applies only to templates with an IMAGE, VIDEO or DOCUMENT header.
push_to_chatbooleanoptional
Default true. Set false to send silently: the message is delivered and stored, but it doesn't appear in the inbox in real time and doesn't move the customer to the top of the conversation list.
sourcestringoptional
bot_tokenstringoptional
namestringoptional
emailstringoptional
Example requestJSON
{
  "customer_phone": "972501234567",
  "template_id": "template-id",
  "media_link": "https://example.com/banner.jpg",
  "push_to_chat": true
}
Example success responseJSON
{
  "success": true,
  "id": 1,
  "message_wa_id": "wamid.abc123"
}
Responses
200Sent
200Customer is in the black list (error: true, not sent)
400Missing required parameters.
400Template is not approved
400This template contains variables. Please use this endpoint: .../send-template-text-variable
400Media link is not valid
400Maximum messages limit reached.
400Failed to send template message: ...
401Unauthorized
404Template not found
429Rate limit hit
POST /mumbleapi/send-template-text-variable Send an approved template that has body variables ({{1}}, {{2}}, …).

Send an approved template that has body variables ({{1}}, {{2}}, …). Pass the values in order. Templates without variables are rejected here; use send-template. For AUTHENTICATION (OTP) templates, the first value in variable is the code. Rate limited to 5/sec, 100/min, 2,000/hour per API key.

Request fields
customer_phonestringrequired
template_idstringrequired
variablearray of stringsrequired
Body variable values, in order: the first value fills {{1}}. Send numbers as strings ("99.90", not 99.9).
button_variablearrayoptional
Values for dynamic buttons. The field name is singular, button_variable. See Button values below.
media_linkstringoptional
Public URL that replaces the template's IMAGE, VIDEO or DOCUMENT header.
push_to_chatbooleanoptional
Default true. false sends silently (see send-template).
sourcestringoptional
bot_tokenstringoptional
namestringoptional
emailstringoptional
Button values

Each item in button_variable fills one button. A plain string fills a URL button's {{1}} suffix, and its position in the array is used as the button index. Buttons are counted from 0 in the order they appear on the template, including quick-reply and phone buttons. If the URL button isn't the first button, send an object with an explicit index:

"button_variable": [
  { "index": 1, "text": "order-12345" }
]

Other button types use an object with sub_type:

{ "sub_type": "copy_code", "index": 0, "code": "SAVE20" }
{ "sub_type": "quick_reply", "index": 0, "payload": "confirm" }
Example requestJSON
{
  "customer_phone": "972501234567",
  "template_id": "template-id",
  "variable": [
    "John Doe",
    "#12345"
  ],
  "button_variable": [
    "order-12345"
  ]
}
Example success responseJSON
{
  "success": true,
  "id": 1,
  "message_wa_id": "wamid.abc123"
}
Responses
200Sent
200Customer is in the black list (error: true, not sent)
400Missing required parameters.
400Template is not approved
400This template does not contain variables. Please use this endpoint: .../send-template
400Media link is not valid
400Maximum messages limit reached.
400Failed to send template with variables: ...
400Failed to send template
401Unauthorized
404Template not found.
429Rate limit hit
GET /mumbleapi/get-message Fetch a single message and its delivery status by WhatsApp ID.

Fetch a single message by its WhatsApp ID (the message_wa_id returned when sending). The response contains the full stored message record; use status to track delivery.

Request fields
message_wa_idstringrequired
Example requestJSON
{
  "message_wa_id": "wamid.abc123"
}
Example success responseJSON
{
  "success": true,
  "message": {
    "id": 1,
    "message_wa_id": "wamid.abc123",
    "text": "Hello",
    "status": "delivered",
    "...": "other message fields"
  }
}
Responses
200OK
401Unauthorized
404Message not found

Conversations

GET /mumbleapi/get-conversation Paginated conversation history for a customer.

Conversation history for a customer, oldest first, 250 messages per page. An unknown number returns an empty list. Parameters can be sent in the JSON body or the query string.

Request fields
customer_phonestringrequired
Digits only, exact match (no + or spaces).
pageintoptional
Page number (default 1).
Example requestJSON
{
  "customer_phone": "972501234567",
  "page": 1
}
Example success responseJSON
{
  "success": true,
  "messages": [
    {
      "id": 1,
      "from": "972501234567",
      "to": "972501111111",
      "text": "Hello",
      "is_img": false,
      "is_video": false,
      "is_audio": false,
      "is_pdf": false,
      "is_sticker": false,
      "is_geo_location": false,
      "media_url": null,
      "timestamp": 1751200000
    }
  ],
  "total": 1,
  "pages": 1,
  "current_page": 1
}
Responses
200OK
401Unauthorized
401Customer not found (customer_phone missing)
GET /mumbleapi/is-active-conv Check whether a customer's 24-hour conversation window is currently open.

Check whether a customer's 24-hour conversation window is currently open. If is_active is false, you can only reach them with an approved template.

Request fields
customer_phonestringrequired
Digits only, exact match (no + or spaces).
Example requestJSON
{
  "customer_phone": "972501234567"
}
Example success responseJSON
{
  "success": true,
  "is_active": true
}
Responses
200OK
401Unauthorized
404Customer not found

Agents & Teams

GET /mumbleapi/get-agents List all agents (sub-users) in your account.

List all agents (sub-users) in your account. Note that the list key contains a space: "agent list". An account with no agents returns 404.

Example requestJSON
(no body)
Example success responseJSON
{
  "success": true,
  "agent list": [
    {
      "name": "Agent Name",
      "id": "uuid"
    }
  ]
}
Responses
200OK
401Unauthorized
404No agents on the account
GET /mumbleapi/get-teams List all teams in your account.

List all teams in your account. Note that the list key contains a space: "team list". An account with no teams returns 404.

Example requestJSON
(no body)
Example success responseJSON
{
  "success": true,
  "team list": [
    {
      "name": "Team Name",
      "id": "uuid"
    }
  ]
}
Responses
200OK
401Unauthorized
404No teams on the account

Bots

GET /mumbleapi/get-bots List all chatbots in your account.

List the flow chatbots in your account. Each id is the value to pass as bot_token. When Dolores AI is enabled, it's included as {"name": "Dolores AI", "id": "AI"}. Accounts with no flow chatbots get a 404.

Example requestJSON
(no body)
Example success responseJSON
{
  "bots": [
    { "name": "Welcome flow", "id": "bot-id" },
    { "name": "Dolores AI", "id": "AI" }
  ]
}
Responses
200OK
401Unauthorized
404No bots found
POST /mumbleapi/assign-bot Assign a chatbot to a customer.

Assign a chatbot to an existing customer. Pass a flow chatbot's ID (from get-bots), "AI" for Dolores AI, or "turn_off" to disable bots for the customer. A flow chatbot starts from its first step.

Request fields
customer_phonestringrequired
bot_tokenstringrequired
A flow chatbot's ID, "AI" for Dolores AI, or "turn_off".
Example requestJSON
{
  "customer_phone": "972501234567",
  "bot_token": "AI"
}
Example success responseJSON
{
  "success": true,
  "message": "Bot assignment updated successfully."
}
Responses
200Bot assignment updated successfully.
400Phone number is required.
400Bot token is required.
400Dolores AI is not active for this account.
401Unauthorized
404Bot not found.

Templates

GET /mumbleapi/get-templates List your approved WhatsApp message templates.

List the approved WhatsApp message templates in your account. Pending and rejected templates are not returned. Use id as template_id when sending.

Example requestJSON
(no body)
Example success responseJSON
{
  "templates": [
    {
      "name": "order_update",
      "id": "template-id",
      "category": "UTILITY",
      "body": "Hi {{1}}! Your order {{2}} will arrive on {{3}}.",
      "status": "APPROVED"
    }
  ]
}
Responses
200OK
401Unauthorized
404No templates found
POST /mumbleapi/create-template Create a new WhatsApp message template.

Create a new WhatsApp message template. Templates must be approved by Meta before they can be used (they show up in get-templates once approved). Supports body variables ({{1}}, {{2}}, …), a static TEXT header or a media header (IMAGE, VIDEO, DOCUMENT), and buttons (URL, QUICK_REPLY, PHONE_NUMBER). Does not support header variables, MPM, Carousels, or Catalogs.

Request fields
namestringrequired
Template name (lowercase, snake_case, no spaces). Must be unique in your account.
bodystringrequired
Body text with optional {{1}}, {{2}}, … variables.
languagestringoptional
Language code, e.g. he, en_US. Default en_US.
categorystringoptional
MARKETING (default), UTILITY, or AUTHENTICATION.
allow_category_changebooleanoptional
Let Meta re-categorize the template (e.g. UTILITY to MARKETING) instead of rejecting it.
template_typestringoptional
Default custom (standard templates).
body_examplesarrayoptional
One example value per body variable, in order. Meta needs these to review templates that have variables.
headerobjectoptional
{"format": "IMAGE" | "VIDEO" | "DOCUMENT"} together with media_url, or {"format": "TEXT", "text": "Order update"}.
media_urlstringoptional
Public URL of sample media for a media header. Required when header.format is IMAGE, VIDEO or DOCUMENT.
footerstringoptional
buttonsarrayoptional
Array of button objects. See recipes.
Recipes

Simple text. Basic template with body text only, no variables

{
  "name": "welcome_message",
  "language": "en_US",
  "category": "MARKETING",
  "body": "Welcome to our store! We're glad to have you."
}

Body variables. Template with body variables {{1}}, {{2}}, {{3}}

{
  "name": "order_update",
  "language": "en_US",
  "category": "UTILITY",
  "body": "Hi {{1}}! Your order {{2}} will arrive on {{3}}.",
  "body_examples": ["John", "#12345", "Jan 30"]
}

Image header. Template with image header (no header variables supported)

{
  "name": "summer_sale",
  "language": "en_US",
  "category": "MARKETING",
  "header": {"format": "IMAGE"},
  "body": "Summer Sale! Get {{1}} off.",
  "body_examples": ["25%"],
  "media_url": "https://example.com/banner.jpg"
}

PDF document. Template with PDF document header

{
  "name": "invoice",
  "language": "en_US",
  "category": "UTILITY",
  "header": {"format": "DOCUMENT"},
  "body": "Hi {{1}}, your invoice {{2}} is attached.",
  "body_examples": ["Customer", "INV-001"],
  "media_url": "https://example.com/invoice.pdf"
}

Quick reply buttons. Template with two quick reply buttons

{
  "name": "order_received",
  "language": "en_US",
  "category": "UTILITY",
  "body": "We received your order {{1}}. Confirm?",
  "body_examples": ["#12345"],
  "buttons": [
    {"type": "QUICK_REPLY", "text": "Yes, Confirmed"},
    {"type": "QUICK_REPLY", "text": "No, Cancel"}
  ]
}

Dynamic URL button. The {{1}} at the end of the URL is filled at send time with button_variable in send-template-text-variable. example is required for Meta review.

{
  "name": "track_order",
  "language": "en_US",
  "category": "UTILITY",
  "body": "Hi {{1}}, your order has shipped.",
  "body_examples": ["John"],
  "buttons": [
    {"type": "URL", "text": "Track Order", "url": "https://example.com/track/{{1}}", "example": "order-12345"}
  ]
}

Call button. Template with phone number button (CTA)

{
  "name": "customer_support",
  "language": "en_US",
  "category": "UTILITY",
  "body": "Need help with order {{1}}? Call us!",
  "body_examples": ["#12345"],
  "buttons": [
    {"type": "PHONE_NUMBER", "text": "Call Support", "phone_number": "+972501234567"}
  ]
}

Complete example. Image header + body variables + footer + button

{
  "name": "order_complete",
  "language": "en_US",
  "category": "UTILITY",
  "header": {"format": "IMAGE"},
  "body": "Hi {{1}}! Order {{2}} confirmed. Total: {{3}}. Delivery: {{4}}.",
  "body_examples": ["John", "#12345", "$99.99", "Jan 30"],
  "footer": "Thank you for your purchase!",
  "buttons": [{"type": "QUICK_REPLY", "text": "Contact Support"}],
  "media_url": "https://example.com/order-banner.jpg"
}
Example requestJSON
{
  "name": "order_confirmation",
  "language": "en_US",
  "category": "MARKETING",
  "header": {
    "format": "IMAGE"
  },
  "body": "Hi {{1}}! Your order {{2}} has been confirmed. Total: {{3}}.",
  "body_examples": [
    "John Doe",
    "#12345",
    "$99.99"
  ],
  "footer": "Thank you for shopping!",
  "buttons": [
    {
      "type": "URL",
      "text": "Track Order",
      "url": "https://example.com/track/{{1}}",
      "example": "order-12345"
    }
  ],
  "media_url": "https://example.com/banner.jpg"
}
Example success responseJSON
{
  "error": false,
  "message": "Template created successfully",
  "data": {
    "id": "1234567890",
    "status": "PENDING",
    "category": "MARKETING"
  }
}
Responses
200Template created successfully (PENDING approval by Meta)
400Template name is required
400Template name already exists
400Invalid template configuration
400Media link is not valid
400WhatsApp Business Account not configured
4xxFailed to create template (Meta's reason in "details")
401Unauthorized
500Body text is required

Conversation status values

Used by POST /mumbleapi/edit-customer-conv-status and returned as conversation_status by get-customer. The API accepts only the English key (left column). Localized display strings are used only in the Mumble UI.

Status key (API)Display
newNew (freshly created)
openOpen
closedClosed
waitingWaiting
waiting_for_agentWaiting for Agent
reopenedReopened
solvedSolved
in_progressIn Progress
in_processIn Process
spamSpam
being_handledBeing Handled
not_relevantNot Relevant
appointment_scheduledAppointment Scheduled
pending_customerPending Customer
escalatedEscalated
follow_upFollow Up
duplicateDuplicate
require_reviewRequire Review

Marketing attribution fields

The following optional fields are recognised on add-new-customer and edit-customer and returned by get-customer. Send any of them to record where the customer came from: UTMs, ad platform click IDs, device, and page context. Values longer than the column size are truncated.

FieldPurpose
utm_sourceUTM source
utm_mediumUTM medium
utm_campaignUTM campaign
utm_contentUTM content
utm_termUTM term
utm_adUTM ad
placementAd placement
campaign_idAd campaign ID
adset_idMeta ad set ID
keyword_idGoogle Ads keyword ID
matchtypeAd match type
networkAd network
ga_session_idGA session ID
gclidGoogle Ads click ID
wbraidGoogle Ads web click ID (iOS 14+)
gbraidGoogle Ads app click ID (iOS 14+)
fbclidMeta / Facebook click ID
fbcMeta CAPI browser cookie
fbpMeta pixel cookie
msclkidMicrosoft Ads click ID (the older spelling msclickid is also accepted)
ttcidTikTok click ID
yclidYandex click ID
obcidOutbrain click ID
li_fat_idLinkedIn first-party ad tracking
tblciTaboola click ID
twclidX / Twitter click ID
cidGeneric client ID
current_urlLanding page URL (URL-encoded values are decoded)
user_agentUser-agent string
ipOrigin IP address
devicedesktop / mobile / tablet
layerCustom layer / segment label
formForm ID

Read-only fields returned by get-customer that Mumble fills automatically: mumclid (Mumble click ID), ctwa_clid (Click-to-WhatsApp ad click ID), ad_id, and bsuid (WhatsApp business-scoped user ID). Sending them on create or edit has no effect.

Support

Questions or need higher rate limits? Email support@mumble.co.il.