Manage WhatsApp Business accounts on 360Dialog: channels, templates, sandbox, inbox, and more.
Maintain this server? Claim it
Call this server's tools from your browser. Nothing to install.
Requests go through mcptry because browsers can't call most MCP servers directly. Header values are sent to the server for that request only and are never stored or logged.
Tool list from our last check. Connect live to refresh it.
Check whether a phone number can be onboarded for this client before handing over the onboarding link. This tool only checks 360Dialog's own database and this client's channel quota. It does not ask WhatsApp/Meta anything, so a number already active on WhatsApp elsewhere (including the personal app) can still come back eligible here.
The phone number to check
Set to true if the phone number to check is currently on the WhatsApp Business app (not to be confused with the normal, personal, WhatsApp app.) WhatsApp Business app numbers can be onboarded to the API as well using WhatsApp Coexistence
Pick your client. Values in capitals, like YOUR_TOKEN, are yours to fill in.
Run in a terminal
claude mcp add --transport http mcp https://mcp.360dialog.com/mcp
Check whether a phone number can be onboarded for this client before handing over the onboarding link. This tool only checks 360Dialog's own database and this client's channel quota. It does not ask WhatsApp/Meta anything, so a number already active on WhatsApp elsewhere (including the personal app) can still come back eligible here.
| Argument | Type | Description |
|---|---|---|
| check_coex | boolean | Set to true if the phone number to check is currently on the WhatsApp Business app (not to be confused with the normal, personal, WhatsApp app.) WhatsApp Business app numbers can be onboarded to the API as well using WhatsApp Coexistence |
| phone_number* | string | The phone number to check |
{
"type": "object",
"required": [
"phone_number"
],
"properties": {
"check_coex": {
"type": "boolean",
"default": false,
"description": "Set to true if the phone number to check is currently on the WhatsApp Business app (not to be confused with the normal, personal, WhatsApp app.) WhatsApp Business app numbers can be onboarded to the API as well using WhatsApp Coexistence"
},
"phone_number": {
"type": "string",
"format": "phone",
"description": "The phone number to check"
}
},
"additionalProperties": false
}Use this tool to create a WhatsApp message template. For this tool's 'template_json' property, pass a JSON matching this shape: { "name": string, "language": string, "category": "MARKETING" | "AUTHENTICATION" | "UTILITY", "components": Component[], } General rules: - name must be lowercase snake_case. - category must be uppercase. - language must be a WhatsApp locale code such as "en_US", "tr", "es", "pt_BR". - Only include fields supported by the component variant. - Do not include null fields. - Components should normally be ordered as: 1. header, if any 2. body 3. footer, if any 4. buttons, if any - A template can have at most one header, one body, one footer, and one buttons component. - BODY is required unless the user is clearly creating a special authentication template handled elsewhere. - HEADER and FOOTER are optional. - BUTTONS are optional. Component variants: 1. Text header without variables { "type": "HEADER", "format": "text", "text": "Your order update" } Use this when the header is plain text. 2. Text header with variables { "type": "HEADER", "format": "TEXT", "text": "Hi {{1}}", "example": { "header_text": ["Alice"] } } Rules: - Text header supports template variables. - If text contains variables, include example.header_text. - The example array must contain sample values in the same order as the variables appear. - For named parameters, the placeholder names appear in text, but the examples are still values. 3. Image header { "type": "HEADER", "format": "IMAGE", "example": { "header_handle": ["https://example.com/sample-image.jpg"] } } Use this when the template header should contain an image. The example should be a sample image handle or URL when available. 4. Video header { "type": "HEADER", "format": "VIDEO", "example": { "header_handle": ["https://example.com/sample-video.mp4"] } } Use this when the template header should contain a video. The example should be a sample video handle or URL when available. 5. Document header { "type": "HEADER", "format": "DOCUMENT", "example": { "header_handle": ["https://example.com/sample-document.pdf"] } } Use this when the template header should contain a document. The example should be a sample document handle or URL when available. 6. Location header { "type": "HEADER", "format": "LOCATION" } Use this when the template should display a location/map header. Important: - For template creation, LOCATION is only the header format. - Do not put latitude, longitude, address, or name in the template creation component. - The actual location values are supplied later when sending the approved template, not when creating the template. 7. Body without variables { "type": "BODY", "text": "Your order has shipped and is on the way." } Use this for the main message text. 8. Body with variables { "type": "BODY", "text": "Hi {{1}}, your order {{2}} has shipped.", "example": { "body_text": [ ["Alice", "ORD-12345"] ] } } Rules: - If body text contains variables, include example.body_text. - body_text is an array containing one array of sample values. - The inner array values must match the variables in order of appearance. - Use placeholders like {{1}}, {{2}}. 9. Footer { "type": "FOOTER", "text": "Reply STOP to unsubscribe." } Rules: - Footer is plain text only. - Do not use variables in footer text. 10. Buttons wrapper { "type": "BUTTONS", "buttons": [ Button ] } Rules: - Buttons must be inside a single component whose type is "BUTTONS". - Do not place button objects directly in components. - Button text should be short and action-oriented. Button variants: A. Quick reply button { "type": "QUICK_REPLY", "text": "Confirm" } Use when the user should tap a predefined reply. B. Phone number button { "type": "PHONE_NUMBER", "text": "Call us", "phone_number": "+15551234567" } Use when the user should call a business phone number. phone_number must include country code. C. Static URL button { "type": "URL", "text": "View order", "url": "https://example.com/orders" } Use when the button always opens the same URL. D. Dynamic URL button { "type": "URL", "text": "View order", "url": "https://example.com/orders/{{1}}", "example": ["ORD-12345"] } Rules: - Use this when the final URL path or query contains a variable. - The example array contains the sample value for the dynamic URL part. E. Copy code button { "type": "COPY_CODE", "example": "SAVE20" } Use for coupon or promo-code templates. The button copies the provided code when the template is sent. G. OTP button { "type": "OTP", "otp_type": "COPY_CODE", "text": "Copy code" } For one-tap OTP: { "type": "OTP", "otp_type": "ONE_TAP", "text": "Copy code", "autofill_text": "Autofill", "package_name": "com.example.app", "signature_hash": "abc123" } Rules: - Use OTP buttons only for authentication templates - category should be "AUTHENTICATION". Authentication templates can only be created for WABAs that have a 2,000 messaging limit or above. - Do not use marketing or utility wording in authentication templates. Examples: Utility order update with named parameters: { "name": "order_shipped_update", "language": "en_US", "category": "UTILITY", "components": [ { "type": "HEADER", "format": "TEXT", "text": "Order {{1}} update", "example": { "header_text": [["ORD-12345"]] } }, { "type": "BODY", "text": "Hi {{1}}, your order has shipped and should arrive by {{2}}.", "example": { "body_text": [ ["Alice", "Friday"] ] } }, { "type": "FOOTER", "text": "Thank you for shopping with us." }, { "type": "BUTTONS", "buttons": [ { "type": "URL", "text": "Track order", "url": "https://example.com/orders/{{1}}", "example": ["ORD-12345"] } ] } ] } Utility store location template: { "name": "store_location_info", "language": "en_US", "category": "UTILITY", "components": [ { "type": "HEADER", "format": "location" }, { "type": "BODY", "text": "Hi {{1}}, here is the location of our {{2}} store.", "example": { "body_text": [ ["Alice", "Downtown"] ] } } ] }
Delete a WhatsApp message template by its internal template ID.
| Argument | Type | Description |
|---|---|---|
| template_id* | string | Needs to end with 'WT'. Use 'list_templates' to find a template's ID. |
| waba_account_id* | string | Needs to end with 'WA'. |
{
"type": "object",
"required": [
"template_id",
"waba_account_id"
],
"properties": {
"template_id": {
"type": "string",
"pattern": "(?i)^.*wt$",
"maxLength": 22,
"minLength": 22,
"description": "Needs to end with 'WT'. Use 'list_templates' to find a template's ID."
},
"waba_account_id": {
"type": "string",
"pattern": "(?i)^.*wa$",
"maxLength": 8,
"minLength": 8,
"description": "Needs to end with 'WA'."
}
},
"additionalProperties": false
}Get balance for an account.
| Argument | Type | Description |
|---|---|---|
| with_usage | boolean | Include the user's usage of their balance. Balance is used when paid messages are sent on WhatsApp Business Platform. Defaults to False. |
{
"type": "object",
"required": [],
"properties": {
"with_usage": {
"type": "boolean",
"default": false,
"description": "Include the user's usage of their balance. Balance is used when paid messages are sent on WhatsApp Business Platform. Defaults to False."
}
},
"additionalProperties": false
}Get a channel's (a.k.a. phone number) WhatsApp profile.
| Argument | Type | Description |
|---|---|---|
| channel_id* | string | Needs to end with 'CH'. |
| project_id* | string | Needs to end with 'PR'. |
{
"type": "object",
"required": [
"channel_id",
"project_id"
],
"properties": {
"channel_id": {
"type": "string",
"pattern": "(?i)^.*ch$",
"maxLength": 8,
"minLength": 8,
"description": "Needs to end with 'CH'."
},
"project_id": {
"type": "string",
"pattern": "(?i)^.*pr$",
"maxLength": 8,
"minLength": 8,
"description": "Needs to end with 'PR'."
}
},
"additionalProperties": false
}Get a documentation page from the 360Dialog client documentation at https://docs.360dialog.com/docs. Fetch the full markdown content of a specific documentation page from Client Documentation. Use this when you have a page URL and want to read its content. Accepts full URLs (e.g. https://docs.360dialog.com/docs/getting-started). Since `searchDocumentation` returns partial content, use `getPage` to retrieve the complete page when you need more details. The content includes links you can follow to navigate to related pages.
| Argument | Type | Description |
|---|---|---|
| url* | string | The URL of the page to fetch |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"url"
],
"properties": {
"url": {
"type": "string",
"description": "The URL of the page to fetch"
}
},
"additionalProperties": false
}Get the user's company's details from 360Dialog.
No arguments.
{
"type": "object",
"required": [],
"properties": {},
"additionalProperties": false
}Get invoices for an account.
No arguments.
{
"type": "object",
"required": [],
"properties": {},
"additionalProperties": false
}Get a phone number's status on whether a number is live, what type of messages it can send today, and suggestions for what's next. A live number can send free-form replies inside the 24-hour customer service window immediately (meaning if someone messages the number, the user can respond to the message using the API). Template messages are separately blocked until Meta reviews a submitted template (template reviews take up to 48 hours.) Lack of business verification is not a blocker. Unverified businesses can only send 250 templates to unique users per 24 hours.
| Argument | Type | Description |
|---|---|---|
| channel_id* | any | Needs to end with 'CH'. |
| phone_number | any | The phone number of the number being onboarded |
{
"type": "object",
"required": [
"channel_id"
],
"properties": {
"channel_id": {
"anyOf": [
{
"type": "string",
"pattern": "(?i)^.*ch$",
"maxLength": 8,
"minLength": 8
},
{
"type": "null"
}
],
"description": "Needs to end with 'CH'."
},
"phone_number": {
"anyOf": [
{
"type": "string",
"format": "phone"
},
{
"type": "null"
}
],
"default": null,
"description": "The phone number of the number being onboarded"
}
},
"additionalProperties": false
}Get currently logged in user's information in 360Dialog. You will get: - user's name, - user's email address, - partner name, - user's permissions in 360Dialog Hub, - user's roles
No arguments.
{
"type": "object",
"properties": {},
"additionalProperties": false
}Get the full guide for one skill returned by 'list_skills', as markdown.
| Argument | Type | Description |
|---|---|---|
| name* | string | A skill's 'name' field, as returned by list_skills. |
{
"type": "object",
"required": [
"name"
],
"properties": {
"name": {
"type": "string",
"description": "A skill's 'name' field, as returned by list_skills."
}
},
"additionalProperties": false
}Sending messaging templates in WhatsApp API / 360Dialog API requires a JSON body in the API request. The API request can be hard to form, as the body must declare in JSON what each parameter in the JSON should be filled as. This tool creates a valid example JSON body that the user can later modify before sending the template to WhatsApp users. It is recommended that you use this tool after creating a template, or after the user asks how to send a template. Display the JSON result of this tool.
| Argument | Type | Description |
|---|---|---|
| template_id* | string | Needs to end with 'WT'. Use 'list_templates' to find a template's ID. |
| waba_account_id* | string | Needs to end with 'WA'. |
{
"type": "object",
"required": [
"template_id",
"waba_account_id"
],
"properties": {
"template_id": {
"type": "string",
"pattern": "(?i)^.*wt$",
"maxLength": 22,
"minLength": 22,
"description": "Needs to end with 'WT'. Use 'list_templates' to find a template's ID."
},
"waba_account_id": {
"type": "string",
"pattern": "(?i)^.*wa$",
"maxLength": 8,
"minLength": 8,
"description": "Needs to end with 'WA'."
}
},
"additionalProperties": false
}Get a channel's (a.k.a. phone number's) webhook URL, and check if the optional webhook headers are set. Webhook headers are optional. They can be set using the 'set_webhook' tool, which also sets the webhook URL. When webhook headers are set, 360Dialog will send webhooks to the channel's webhook URL and add the specified headers. This helps only authenticated requests pass through app firewalls, if the user has any. Example: If webhook URL is `https://foo.com/webhook`, and webhook headers are set to {"x-360dialog-webhook-security": "RANDOM-STRING"}, the webhook URL will receive POST requests like this: POST https://foo.com/webhook HEADERS x-360dialog-webhook-security: RANDOM-STRING
| Argument | Type | Description |
|---|---|---|
| channel_id* | string | Needs to end with 'CH'. |
{
"type": "object",
"required": [
"channel_id"
],
"properties": {
"channel_id": {
"type": "string",
"pattern": "(?i)^.*ch$",
"maxLength": 8,
"minLength": 8,
"description": "Needs to end with 'CH'."
}
},
"additionalProperties": false
}Send a saved (canned) response into a conversation as a text message. Subject to the same 24-hour window rule as getchat_send_message.
| Argument | Type | Description |
|---|---|---|
| channel_id* | string | The 360dialog channel ID of the inbox to operate on. |
| conversation_id* | string | The conversation's contact WhatsApp ID (phone-style like '4915112345678', or business-scoped). Take it from list_conversations or search_conversations results; do not guess it. |
| saved_response_id* | integer | Saved response ID from list_saved_responses. |
{
"type": "object",
"required": [
"channel_id",
"conversation_id",
"saved_response_id"
],
"properties": {
"channel_id": {
"type": "string",
"description": "The 360dialog channel ID of the inbox to operate on."
},
"conversation_id": {
"type": "string",
"description": "The conversation's contact WhatsApp ID (phone-style like '4915112345678', or business-scoped). Take it from list_conversations or search_conversations results; do not guess it."
},
"saved_response_id": {
"type": "integer",
"description": "Saved response ID from list_saved_responses."
}
},
"additionalProperties": false
}Assign or reassign one conversation to an agent and/or a group. Both fields are always set to exactly what you pass: calling with only `user_id` clears any group assignment and vice versa; calling with neither unassigns the conversation entirely.
| Argument | Type | Description |
|---|---|---|
| user_id | any | Agent (user) ID from list_agents to assign; omit/null to leave unassigned. |
| group_id | any | Group ID from list_groups to assign; omit/null to leave unassigned. |
| channel_id* | string | The 360dialog channel ID of the inbox to operate on. |
| conversation_id* | string | The conversation's contact WhatsApp ID (phone-style like '4915112345678', or business-scoped). Take it from list_conversations or search_conversations results; do not guess it. |
{
"type": "object",
"required": [
"channel_id",
"conversation_id"
],
"properties": {
"user_id": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"default": null,
"description": "Agent (user) ID from list_agents to assign; omit/null to leave unassigned."
},
"group_id": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"default": null,
"description": "Group ID from list_groups to assign; omit/null to leave unassigned."
},
"channel_id": {
"type": "string",
"description": "The 360dialog channel ID of the inbox to operate on."
},
"conversation_id": {
"type": "string",
"description": "The conversation's contact WhatsApp ID (phone-style like '4915112345678', or business-scoped). Take it from list_conversations or search_conversations results; do not guess it."
}
},
"additionalProperties": false
}Read one conversation: contact/assignment/tag details plus its message history. Messages are returned newest first. To page further back, call again with `before_time` set to the oldest returned message's timestamp.
| Argument | Type | Description |
|---|---|---|
| limit | integer | Maximum number of messages to return. |
| channel_id* | string | The 360dialog channel ID of the inbox to operate on. |
| since_time | any | Only messages at or after this POSIX timestamp. |
| before_time | any | Only messages strictly older than this POSIX timestamp — use for paging back through history. |
| conversation_id* | string | The conversation's contact WhatsApp ID (phone-style like '4915112345678', or business-scoped). Take it from list_conversations or search_conversations results; do not guess it. |
{
"type": "object",
"required": [
"channel_id",
"conversation_id"
],
"properties": {
"limit": {
"type": "integer",
"default": 20,
"maximum": 100,
"minimum": 1,
"description": "Maximum number of messages to return."
},
"channel_id": {
"type": "string",
"description": "The 360dialog channel ID of the inbox to operate on."
},
"since_time": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"default": null,
"description": "Only messages at or after this POSIX timestamp."
},
"before_time": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"default": null,
"description": "Only messages strictly older than this POSIX timestamp — use for paging back through history."
},
"conversation_id": {
"type": "string",
"description": "The conversation's contact WhatsApp ID (phone-style like '4915112345678', or business-scoped). Take it from list_conversations or search_conversations results; do not guess it."
}
},
"additionalProperties": false
}List the inbox's agents (users) — for assignment via getchat_assign_conversation.
| Argument | Type | Description |
|---|---|---|
| channel_id* | string | The 360dialog channel ID of the inbox to operate on. |
| is_available | any | Filter by availability; omit to list all agents. |
{
"type": "object",
"required": [
"channel_id"
],
"properties": {
"channel_id": {
"type": "string",
"description": "The 360dialog channel ID of the inbox to operate on."
},
"is_available": {
"anyOf": [
{
"type": "boolean"
},
{
"type": "null"
}
],
"default": null,
"description": "Filter by availability; omit to list all agents."
}
},
"additionalProperties": false
}List conversations of the inbox, newest activity first. Returns one entry per conversation with contact info, unread count, last message, current assignee (user and/or group), and tags.
| Argument | Type | Description |
|---|---|---|
| limit | integer | |
| offset | integer | |
| tag_id | any | Only conversations carrying this tag (see list_tags). |
| unread | boolean | Only conversations with unread incoming messages. |
| channel_id* | string | The 360dialog channel ID of the inbox to operate on. |
| assigned_to_me | boolean | Only conversations assigned to the calling user. |
{
"type": "object",
"required": [
"channel_id"
],
"properties": {
"limit": {
"type": "integer",
"default": 20,
"maximum": 100,
"minimum": 1
},
"offset": {
"type": "integer",
"default": 0,
"minimum": 0
},
"tag_id": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"default": null,
"description": "Only conversations carrying this tag (see list_tags)."
},
"unread": {
"type": "boolean",
"default": false,
"description": "Only conversations with unread incoming messages."
},
"channel_id": {
"type": "string",
"description": "The 360dialog channel ID of the inbox to operate on."
},
"assigned_to_me": {
"type": "boolean",
"default": false,
"description": "Only conversations assigned to the calling user."
}
},
"additionalProperties": false
}List the inbox's agent groups — for group assignment via getchat_assign_conversation.
| Argument | Type | Description |
|---|---|---|
| channel_id* | string | The 360dialog channel ID of the inbox to operate on. |
{
"type": "object",
"required": [
"channel_id"
],
"properties": {
"channel_id": {
"type": "string",
"description": "The 360dialog channel ID of the inbox to operate on."
}
},
"additionalProperties": false
}List the WhatsApp inboxes the calling 360dialog user can access. Call this first when you don't know which `channel_id` to pass to the other tools: each entry pairs a `channel_id` with its inbox URL and WhatsApp number (`wa_id`). Entries without a `channel_id` cannot be driven through these tools. The listing covers the caller's own client accounts, plus every inbox under a partner the caller administers. It never reaches another tenant: a client user is not shown other clients' inboxes, including ones managed by the same partner. An empty list does not mean no inbox exists; pass a known `channel_id` to the other tools directly.
No arguments.
{
"type": "object",
"properties": {},
"additionalProperties": false
}List the inbox's saved (canned) responses — for use with getchat_apply_saved_response.
| Argument | Type | Description |
|---|---|---|
| search | any | Only saved responses whose text contains this substring. |
| channel_id* | string | The 360dialog channel ID of the inbox to operate on. |
{
"type": "object",
"required": [
"channel_id"
],
"properties": {
"search": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Only saved responses whose text contains this substring."
},
"channel_id": {
"type": "string",
"description": "The 360dialog channel ID of the inbox to operate on."
}
},
"additionalProperties": false
}List the inbox's tags — for tagging via getchat_tag_conversation and filtering via getchat_list_conversations.
| Argument | Type | Description |
|---|---|---|
| channel_id* | string | The 360dialog channel ID of the inbox to operate on. |
{
"type": "object",
"required": [
"channel_id"
],
"properties": {
"channel_id": {
"type": "string",
"description": "The 360dialog channel ID of the inbox to operate on."
}
},
"additionalProperties": false
}Mark one conversation's messages as read by the calling user. Pass `up_to_timestamp` after reviewing a conversation so that messages arriving in the meantime stay unread. The read mark only moves forward: a timestamp older than the caller's current mark changes nothing. Read state is per inbox user: this clears the unread count for the caller only, not for other agents. The inbox also marks the messages as read on WhatsApp, so the contact sees read receipts. Only conversations whose messages you can read can be marked.
| Argument | Type | Description |
|---|---|---|
| channel_id* | string | The 360dialog channel ID of the inbox to operate on. |
| conversation_id* | string | The conversation's contact WhatsApp ID (phone-style like '4915112345678', or business-scoped). Take it from list_conversations or search_conversations results; do not guess it. |
| up_to_timestamp | any | Timestamp of the last message you reviewed, taken from get_conversation results; messages up to and including it are marked read, newer ones stay unread. Omit to mark everything currently in the conversation. |
{
"type": "object",
"required": [
"channel_id",
"conversation_id"
],
"properties": {
"channel_id": {
"type": "string",
"description": "The 360dialog channel ID of the inbox to operate on."
},
"conversation_id": {
"type": "string",
"description": "The conversation's contact WhatsApp ID (phone-style like '4915112345678', or business-scoped). Take it from list_conversations or search_conversations results; do not guess it."
},
"up_to_timestamp": {
"anyOf": [
{
"type": "number",
"minimum": 1
},
{
"type": "null"
}
],
"default": null,
"description": "Timestamp of the last message you reviewed, taken from get_conversation results; messages up to and including it are marked read, newer ones stay unread. Omit to mark everything currently in the conversation."
}
},
"additionalProperties": false
}Find conversations by contact name, phone number, tag name, or message content. Searches contact profiles and tags first, then message text and media captions; results from both are merged and deduplicated by conversation. Each match notes why it matched (`contact` or `message_content`).
| Argument | Type | Description |
|---|---|---|
| limit | integer | |
| query* | string | Text to search for. |
| channel_id* | string | The 360dialog channel ID of the inbox to operate on. |
{
"type": "object",
"required": [
"channel_id",
"query"
],
"properties": {
"limit": {
"type": "integer",
"default": 20,
"maximum": 100,
"minimum": 1
},
"query": {
"type": "string",
"minLength": 1,
"description": "Text to search for."
},
"channel_id": {
"type": "string",
"description": "The 360dialog channel ID of the inbox to operate on."
}
},
"additionalProperties": false
}Send a message into an existing conversation, as the business. This is inbox-scoped sending: it posts into an existing conversation with correct threading. Outside the 24-hour customer-care window, WhatsApp only permits template messages — other types are rejected with an explanation.
| Argument | Type | Description |
|---|---|---|
| type | string | WhatsApp message type of `content`. |
| content | any | The type-specific message object, following the WhatsApp Business API shape. For type=text: {"body": "..."}. For image/video: {"link": "https://...", "caption"?}. For document: {"link": "https://...", "filename"?, "caption"?}. For audio/sticker: {"link": "..."}. For template: {"name": "...", "language": {...}, "components": [...]}. For interactive/location/contacts: the corresponding WABA object. |
| channel_id* | string | The 360dialog channel ID of the inbox to operate on. |
| conversation_id* | string | The conversation's contact WhatsApp ID (phone-style like '4915112345678', or business-scoped). Take it from list_conversations or search_conversations results; do not guess it. |
{
"type": "object",
"required": [
"channel_id",
"conversation_id"
],
"properties": {
"type": {
"enum": [
"text",
"image",
"video",
"audio",
"document",
"sticker",
"template",
"interactive",
"location",
"contacts"
],
"type": "string",
"default": "text",
"description": "WhatsApp message type of `content`."
},
"content": {
"anyOf": [
{
"type": "object",
"additionalProperties": true
},
{
"type": "null"
}
],
"default": null,
"description": "The type-specific message object, following the WhatsApp Business API shape. For type=text: {\"body\": \"...\"}. For image/video: {\"link\": \"https://...\", \"caption\"?}. For document: {\"link\": \"https://...\", \"filename\"?, \"caption\"?}. For audio/sticker: {\"link\": \"...\"}. For template: {\"name\": \"...\", \"language\": {...}, \"components\": [...]}. For interactive/location/contacts: the corresponding WABA object."
},
"channel_id": {
"type": "string",
"description": "The 360dialog channel ID of the inbox to operate on."
},
"conversation_id": {
"type": "string",
"description": "The conversation's contact WhatsApp ID (phone-style like '4915112345678', or business-scoped). Take it from list_conversations or search_conversations results; do not guess it."
}
},
"additionalProperties": false
}Add or remove one tag on one conversation.
| Argument | Type | Description |
|---|---|---|
| action | string | Add the tag to or remove it from the conversation. |
| tag_id* | integer | Tag ID from list_tags. |
| channel_id* | string | The 360dialog channel ID of the inbox to operate on. |
| conversation_id* | string | The conversation's contact WhatsApp ID (phone-style like '4915112345678', or business-scoped). Take it from list_conversations or search_conversations results; do not guess it. |
{
"type": "object",
"required": [
"channel_id",
"conversation_id",
"tag_id"
],
"properties": {
"action": {
"enum": [
"add",
"remove"
],
"type": "string",
"default": "add",
"description": "Add the tag to or remove it from the conversation."
},
"tag_id": {
"type": "integer",
"description": "Tag ID from list_tags."
},
"channel_id": {
"type": "string",
"description": "The 360dialog channel ID of the inbox to operate on."
},
"conversation_id": {
"type": "string",
"description": "The conversation's contact WhatsApp ID (phone-style like '4915112345678', or business-scoped). Take it from list_conversations or search_conversations results; do not guess it."
}
},
"additionalProperties": false
}Find a channel by passing in an identifier. A channel is a phone number. By calling this tool you retrieve information about the phone number/channel in 360Dialog. Results are paginated; use the 'page' and 'size' arguments to page through results if there are more than fit in a single page. Returns: If not found, returns "Not found". If found, returns information of channels, like WABA ID, client ID, channel ID, and app ID, along with the current page, total pages, and total count.
| Argument | Type | Description |
|---|---|---|
| page | integer | Page number to retrieve, starting at 1. |
| size | integer | Number of channels to return per page. |
| filter | any | Optional filter. You can pass a phone number, client ID, or channel ID here. Defaults to None; call without this argument if you want to get all channels. |
{
"type": "object",
"required": [],
"properties": {
"page": {
"type": "integer",
"default": 1,
"description": "Page number to retrieve, starting at 1."
},
"size": {
"type": "integer",
"default": 20,
"description": "Number of channels to return per page."
},
"filter": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Optional filter. You can pass a phone number, client ID, or channel ID here. Defaults to None; call without this argument if you want to get all channels."
}
},
"additionalProperties": false
}List the 360Dialog skills available to you. A skill is a curated, up-to-date how-to guide for a 360Dialog process (e.g. drafting a compliant WhatsApp template, diagnosing a channel that stopped sending). Call this tool BEFORE answering any "how do I..." question about 360Dialog products or processes - it tells you which skills exist and when to use them. Once you find a match, call 'get_skill' with its 'name' to read the full guide.
No arguments.
{
"type": "object",
"properties": {},
"additionalProperties": false
}List templates for a WABA (WhatsApp Business Account). If you do not have a waba_account_id ending in 'WA' (case-insensitive), run the 'list_channels' tool first.
| Argument | Type | Description |
|---|---|---|
| name_filter | any | Template name to search for. If one is not provided, leave blank. |
| status_filter | any | Filter templates by status. Allowed values are 'approved', 'pending', 'paused', 'rejected'. Leave blank if not needed. |
| waba_account_id* | string | Needs to end with 'WA'. |
{
"type": "object",
"required": [
"waba_account_id"
],
"properties": {
"name_filter": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Template name to search for. If one is not provided, leave blank."
},
"status_filter": {
"anyOf": [
{
"enum": [
"approved",
"pending",
"paused",
"rejected"
],
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Filter templates by status. Allowed values are 'approved', 'pending', 'paused', 'rejected'. Leave blank if not needed."
},
"waba_account_id": {
"type": "string",
"pattern": "(?i)^.*wa$",
"maxLength": 8,
"minLength": 8,
"description": "Needs to end with 'WA'."
}
},
"additionalProperties": false
}List users for the selected account, including their roles and creation timestamps.
No arguments.
{
"type": "object",
"required": [],
"properties": {},
"additionalProperties": false
}Add one consumer phone number to the allowlist. Returns the created {id, consumer_phone_number}. The allowlist only takes effect while ai_audience is ALLOWLISTED_ONLY; under EVERYONE the agent answers all consumers regardless of this list.
| Argument | Type | Description |
|---|---|---|
| app_id* | string | The 360dialog channel's app_id. Identifies which WhatsApp number the agent belongs to. |
| consumer_phone_number* | string | Consumer's WhatsApp number in E.164 format, e.g. +15551234567. |
{
"type": "object",
"required": [
"app_id",
"consumer_phone_number"
],
"properties": {
"app_id": {
"type": "string",
"description": "The 360dialog channel's app_id. Identifies which WhatsApp number the agent belongs to."
},
"consumer_phone_number": {
"type": "string",
"description": "Consumer's WhatsApp number in E.164 format, e.g. +15551234567."
}
},
"additionalProperties": false
}Check whether this channel's WhatsApp number is eligible for a Meta Business Agent. Returns {is_eligible: boolean}. Known limitation: a 403 from this call can mean the number is simply not eligible, rather than that the business has not accepted Meta's terms - do not report an unaccepted-terms problem on a 403 alone.
| Argument | Type | Description |
|---|---|---|
| app_id* | string | The 360dialog channel's app_id. Identifies which WhatsApp number the agent belongs to. |
{
"type": "object",
"required": [
"app_id"
],
"properties": {
"app_id": {
"type": "string",
"description": "The 360dialog channel's app_id. Identifies which WhatsApp number the agent belongs to."
}
},
"additionalProperties": false
}Add a skill to the agent - an instruction text that changes how it answers. Returns the created skill with its id. Skills are the right home for behavioural instructions; facts the agent should know belong in FAQs, websites or files instead.
| Argument | Type | Description |
|---|---|---|
| skill | string | The instruction text the agent follows (max 20000 characters). |
| title | string | Short name for the skill (max 64 characters). |
| app_id* | string | The 360dialog channel's app_id. Identifies which WhatsApp number the agent belongs to. |
| agent_id | string | Optional - attach the skill to one agent. |
| description | string | What the skill is for (max 1024 characters). |
{
"type": "object",
"required": [
"app_id"
],
"properties": {
"skill": {
"type": "string",
"description": "The instruction text the agent follows (max 20000 characters)."
},
"title": {
"type": "string",
"description": "Short name for the skill (max 64 characters)."
},
"app_id": {
"type": "string",
"description": "The 360dialog channel's app_id. Identifies which WhatsApp number the agent belongs to."
},
"agent_id": {
"type": "string",
"description": "Optional - attach the skill to one agent."
},
"description": {
"type": "string",
"description": "What the skill is for (max 1024 characters)."
}
},
"additionalProperties": false
}Create a connector so the agent can call a third-party system. Returns the connector with its id and connection_status. A connector on its own does nothing - add connector tools with mba_create_connector_tool to expose individual operations to the agent.
| Argument | Type | Description |
|---|---|---|
| name* | string | Name of the connector. |
| app_id* | string | The 360dialog channel's app_id. Identifies which WhatsApp number the agent belongs to. |
| base_url* | string | Base URL every tool on this connector calls. |
| auth_type* | string | How the connected system authenticates. |
| auth_config | object | Credentials matching auth_type: `api_key` when auth_type is API_KEY, `oauth2_client_credentials` when it is OAUTH2_CLIENT_CREDENTIALS. Credentials can also be set later with upsert_connector_api_key or upsert_connector_oauth. |
| description* | string | What the connected system does. |
| requires_certificate | boolean | True when the system needs mTLS; upload the certificate with upsert_connector_certificate. |
Define one action the agent can perform through a connector - an outbound HTTP request against the connector's base_url. Returns the created tool with its id. Known limitation: path_parameters, query_parameters and headers are NAME-TO-SCHEMA OBJECTS, not arrays - write {"order_id": {"type": "string"}}, never [{"name": "order_id", ...}]. And every {brace} token in `path` must have a matching key in path_parameters, or the definition is rejected.
| Argument | Type | Description |
|---|---|---|
| name* | string | Name the agent sees for this action. |
| app_id* | string | The 360dialog channel's app_id. Identifies which WhatsApp number the agent belongs to. |
| description* | string | What the action does - the agent uses this to decide when to call it. |
| connector_id* | string | Connector id. |
| request_definition* | object | The outbound HTTP request this tool makes, relative to the connector's base_url. |
| user_auth_required* | boolean | True when the call needs a per-user token rather than the connector's own credentials. |
| user_auth_action_config | object |
Add one question-and-answer entry to the agent's knowledge. Returns the created entry with its id. FAQs are the right home for knowledge that does not fit business info's six fields.
| Argument | Type | Description |
|---|---|---|
| answer* | string | The answer the agent should give. |
| app_id* | string | The 360dialog channel's app_id. Identifies which WhatsApp number the agent belongs to. |
| metadata | object | Optional free-form metadata. |
| question* | string | The customer's question. |
{
"type": "object",
"required": [
"app_id",
"question",
"answer"
],
"properties": {
"answer": {
"type": "string",
"description": "The answer the agent should give."
},
"app_id": {
"type": "string",
"description": "The 360dialog channel's app_id. Identifies which WhatsApp number the agent belongs to."
},
"metadata": {
"type": "object",
"description": "Optional free-form metadata."
},
"question": {
"type": "string",
"description": "The customer's question."
}
},
"additionalProperties": false
}Give the agent one more rich WhatsApp component to send, and the instruction that says when to send it. Returns the created UI skill with its id. A UI skill is NOT an agent skill (mba_list_agent_skills): an agent skill is instruction text that shapes what the agent says, a UI skill lets the agent send one kind of rich WhatsApp component and tells it when to send that component. Known limitation: component_type is FIXED AT CREATION and cannot be changed afterwards. flow_id is required when component_type is `flow`, and is refused for every other type; a flow UI skill also cannot be enabled until the flow itself is published.
| Argument | Type | Description |
|---|---|---|
| title* | string | Human-readable name for the UI skill. |
| app_id* | string | The 360dialog channel's app_id. Identifies which WhatsApp number the agent belongs to. |
| status* | string | Whether the agent may send this component. Only an enabled UI skill is available to the agent. |
| flow_id | integer | The flow to send. Required when component_type is `flow`, refused otherwise. |
| instruction* | string | Tells the agent when to send this component, e.g. 'Send this when the customer asks to browse the catalog'. |
| component_type* | string | The kind of rich message this UI skill sends. Cannot be changed after creation. |
Add a website URL for the agent to crawl into its knowledge base. Returns the entry with its id and crawl status. Crawling is asynchronous - the knowledge is not available immediately; poll mba_get_website for crawl_status.
| Argument | Type | Description |
|---|---|---|
| url* | string | Website URL to crawl. |
| app_id* | string | The 360dialog channel's app_id. Identifies which WhatsApp number the agent belongs to. |
{
"type": "object",
"required": [
"app_id",
"url"
],
"properties": {
"url": {
"type": "string",
"description": "Website URL to crawl."
},
"app_id": {
"type": "string",
"description": "The 360dialog channel's app_id. Identifies which WhatsApp number the agent belongs to."
}
},
"additionalProperties": false
}Remove the Meta Business Agent from this channel's WhatsApp number. Deletes the agent configuration and, when the last agent on the account is removed, disconnects the integration entirely. Returns {deleted_agent_id}. This is irreversible: knowledge, skills and connectors configured on the agent go with it, and restoring the setup means onboarding again from scratch.
| Argument | Type | Description |
|---|---|---|
| app_id* | string | The 360dialog channel's app_id. Identifies which WhatsApp number the agent belongs to. |
{
"type": "object",
"required": [
"app_id"
],
"properties": {
"app_id": {
"type": "string",
"description": "The 360dialog channel's app_id. Identifies which WhatsApp number the agent belongs to."
}
},
"additionalProperties": false
}Delete one agent skill by its id, so the agent stops following it. Returns no content on success.
| Argument | Type | Description |
|---|---|---|
| app_id* | string | The 360dialog channel's app_id. Identifies which WhatsApp number the agent belongs to. |
| skill_id* | string | Agent skill id. |
{
"type": "object",
"required": [
"app_id",
"skill_id"
],
"properties": {
"app_id": {
"type": "string",
"description": "The 360dialog channel's app_id. Identifies which WhatsApp number the agent belongs to."
},
"skill_id": {
"type": "string",
"description": "Agent skill id."
}
},
"additionalProperties": false
}Delete one connector by its id. Its tools and stored credentials go with it. Returns no content on success.
| Argument | Type | Description |
|---|---|---|
| app_id* | string | The 360dialog channel's app_id. Identifies which WhatsApp number the agent belongs to. |
| connector_id* | string | Connector id. |
{
"type": "object",
"required": [
"app_id",
"connector_id"
],
"properties": {
"app_id": {
"type": "string",
"description": "The 360dialog channel's app_id. Identifies which WhatsApp number the agent belongs to."
},
"connector_id": {
"type": "string",
"description": "Connector id."
}
},
"additionalProperties": false
}Delete one connector tool definition by its id, so the agent can no longer perform that action. Returns no content on success.
| Argument | Type | Description |
|---|---|---|
| app_id* | string | The 360dialog channel's app_id. Identifies which WhatsApp number the agent belongs to. |
| tool_id* | string | Connector tool id. |
| connector_id* | string | Connector id. |
{
"type": "object",
"required": [
"app_id",
"connector_id",
"tool_id"
],
"properties": {
"app_id": {
"type": "string",
"description": "The 360dialog channel's app_id. Identifies which WhatsApp number the agent belongs to."
},
"tool_id": {
"type": "string",
"description": "Connector tool id."
},
"connector_id": {
"type": "string",
"description": "Connector id."
}
},
"additionalProperties": false
}Delete one FAQ entry by its id. Returns no content on success.
| Argument | Type | Description |
|---|---|---|
| app_id* | string | The 360dialog channel's app_id. Identifies which WhatsApp number the agent belongs to. |
| faq_id* | string | FAQ entry id. |
{
"type": "object",
"required": [
"app_id",
"faq_id"
],
"properties": {
"app_id": {
"type": "string",
"description": "The 360dialog channel's app_id. Identifies which WhatsApp number the agent belongs to."
},
"faq_id": {
"type": "string",
"description": "FAQ entry id."
}
},
"additionalProperties": false
}Delete one file from the agent's knowledge base by its id. Returns no content on success.
| Argument | Type | Description |
|---|---|---|
| app_id* | string | The 360dialog channel's app_id. Identifies which WhatsApp number the agent belongs to. |
| file_id* | string | Knowledge file id. |
{
"type": "object",
"required": [
"app_id",
"file_id"
],
"properties": {
"app_id": {
"type": "string",
"description": "The 360dialog channel's app_id. Identifies which WhatsApp number the agent belongs to."
},
"file_id": {
"type": "string",
"description": "Knowledge file id."
}
},
"additionalProperties": false
}Delete one UI skill by its id, so the agent stops sending that component. Returns no content on success. To stop the component temporarily, set status to `disabled` with mba_update_ui_skill instead.
| Argument | Type | Description |
|---|---|---|
| app_id* | string | The 360dialog channel's app_id. Identifies which WhatsApp number the agent belongs to. |
| instruction_id* | string | UI skill id. |
{
"type": "object",
"required": [
"app_id",
"instruction_id"
],
"properties": {
"app_id": {
"type": "string",
"description": "The 360dialog channel's app_id. Identifies which WhatsApp number the agent belongs to."
},
"instruction_id": {
"type": "string",
"description": "UI skill id."
}
},
"additionalProperties": false
}Remove one website crawl entry by its id, dropping the knowledge crawled from it. Returns no content on success.
| Argument | Type | Description |
|---|---|---|
| app_id* | string | The 360dialog channel's app_id. Identifies which WhatsApp number the agent belongs to. |
| website_id* | string | Website entry id. |
{
"type": "object",
"required": [
"app_id",
"website_id"
],
"properties": {
"app_id": {
"type": "string",
"description": "The 360dialog channel's app_id. Identifies which WhatsApp number the agent belongs to."
},
"website_id": {
"type": "string",
"description": "Website entry id."
}
},
"additionalProperties": false
}Read the usage caps in force for the agent, each with its budget_id. Returns {budgets}; an empty array means no cap is set and usage is unlimited. Known limitations: budgets are ONLY SERVED for the business that owns this number's WABA; any other business_id is refused with an error that says so. For a number whose business is not known to 360dialog yet, budgets are not available and this tool returns an error that says so. When several caps are set, whichever is reached first stops the agent until its window resets, and the agent then hands conversations to the business. Token caps apply across the WHOLE BUSINESS MANAGER, so every agent in that portfolio shares them; AI-turn caps apply per conversation. These tools set and read caps and do not report usage against them: mba_get_agent_usage_insights reports billed usage, keyed on the billable account ID and not on business_id.
| Argument | Type | Description |
|---|---|---|
| app_id* | string | The 360dialog channel's app_id. Identifies which WhatsApp number the agent belongs to. |
| business_id* | string | The Meta Business Manager ID of the business that owns this number's WABA. No other tool returns it: it is the WABA's owner business in Meta Business Suite, and the 360dialog hub shows it on the channel. |
{
"type": "object",
"required": [
"app_id",
"business_id"
],
"properties": {
"app_id": {
"type": "string",
"description": "The 360dialog channel's app_id. Identifies which WhatsApp number the agent belongs to."
},
"business_id": {
"type": "string",
"description": "The Meta Business Manager ID of the business that owns this number's WABA. No other tool returns it: it is the WABA's owner business in Meta Business Suite, and the 360dialog hub shows it on the channel."
}
},
"additionalProperties": false
}Read the processing status of an event submitted with mba_send_agent_event. Status is one of request_received, processing, sent, failed, skipped or success; failed and skipped carry error_message and skipped_reason. This is the only way to find out whether an accepted event actually reached the consumer.
| Argument | Type | Description |
|---|---|---|
| app_id* | string | The 360dialog channel's app_id. Identifies which WhatsApp number the agent belongs to. |
| agent_event_id* | string | Event id returned by send_agent_event. |
{
"type": "object",
"required": [
"app_id",
"agent_event_id"
],
"properties": {
"app_id": {
"type": "string",
"description": "The 360dialog channel's app_id. Identifies which WhatsApp number the agent belongs to."
},
"agent_event_id": {
"type": "string",
"description": "Event id returned by send_agent_event."
}
},
"additionalProperties": false
}Read what happened to the events sent to the agent (mba_send_agent_event) over a date range, one row per event type, busiest first: how many were received, how many the agent successfully processed, and the mean end-to-end latency. Successfully processed means the agent sent its message, not that the message was delivered. Figures are rolled up once a day, so the most recent day may still be incomplete. Known limitation: the dates are in PACIFIC TIME, not the business time zone, and the range may span at most 30 days, counting both ends.
| Argument | Type | Description |
|---|---|---|
| app_id* | string | The 360dialog channel's app_id. Identifies which WhatsApp number the agent belongs to. |
| end_date* | string | Last day to include, YYYY-MM-DD in Pacific Time. Inclusive. |
| event_type | string | Return only this event type, named as it was sent. Omit for every event type. |
| start_date* | string | First day to include, YYYY-MM-DD in Pacific Time. Inclusive. |
{
"type": "object",
"required": [
"app_id",
"start_date",
"end_date"
],
"properties": {
"app_id": {
"type": "string",
"description": "The 360dialog channel's app_id. Identifies which WhatsApp number the agent belongs to."
},
"end_date": {
"type": "string",
"format": "date",
"description": "Last day to include, YYYY-MM-DD in Pacific Time. Inclusive."
},
"event_type": {
"type": "string",
"description": "Return only this event type, named as it was sent. Omit for every event type."
},
"start_date": {
"type": "string",
"format": "date",
"description": "First day to include, YYYY-MM-DD in Pacific Time. Inclusive."
}
},
"additionalProperties": false
}Read the agent's current settings: rollout, handoff, followup and ai_audience. Known limitation: this returns an ARRAY with one entry per channel, not a single object. Read the entry whose `channel` you care about (usually "whatsapp") rather than treating the response as an object.
| Argument | Type | Description |
|---|---|---|
| app_id* | string | The 360dialog channel's app_id. Identifies which WhatsApp number the agent belongs to. |
| agent_id | string | Optional - restrict the read to one agent. |
{
"type": "object",
"required": [
"app_id"
],
"properties": {
"app_id": {
"type": "string",
"description": "The 360dialog channel's app_id. Identifies which WhatsApp number the agent belongs to."
},
"agent_id": {
"type": "string",
"description": "Optional - restrict the read to one agent."
}
},
"additionalProperties": false
}Read one agent skill by its id, as returned by mba_list_agent_skills or mba_create_agent_skill.
| Argument | Type | Description |
|---|---|---|
| app_id* | string | The 360dialog channel's app_id. Identifies which WhatsApp number the agent belongs to. |
| skill_id* | string | Agent skill id. |
{
"type": "object",
"required": [
"app_id",
"skill_id"
],
"properties": {
"app_id": {
"type": "string",
"description": "The 360dialog channel's app_id. Identifies which WhatsApp number the agent belongs to."
},
"skill_id": {
"type": "string",
"description": "Agent skill id."
}
},
"additionalProperties": false
}Read whether this channel has ever been onboarded and whether its agent has ever been activated, as {onboarded, activated_once}. Known limitation: this is NOT a Meta call - it reads this service's own tracking record, written when onboarding or a settings read/write goes through here. It answers 'did onboarding ever succeed' and 'was rollout ever enabled', and nothing about the agent's current configuration. For live state call mba_get_agent_settings.
| Argument | Type | Description |
|---|---|---|
| app_id* | string | The 360dialog channel's app_id. Identifies which WhatsApp number the agent belongs to. |
{
"type": "object",
"required": [
"app_id"
],
"properties": {
"app_id": {
"type": "string",
"description": "The 360dialog channel's app_id. Identifies which WhatsApp number the agent belongs to."
}
},
"additionalProperties": false
}Read the billed usage of a Meta Business Agent account over a billing date range, one entry per HOUR, DAY or MONTH bucket: billable messages, billable tokens, and cost in the account's currency. Returns {usage}; an empty array means no usage in the range. Each entry carries its bucket start and end (Unix seconds, end exclusive), plus channel and sender_id when they are in dimensions. Metrics left out of metric_types are omitted from every entry, not returned as null. Tokens are BILLED tokens, the figure on the invoice, which can be fewer than the tokens the agent consumed. Known limitations: usage insights are ONLY AVAILABLE for numbers whose stack uses its own WABA access token; for any other number this tool returns an error that says so. The range is start INCLUSIVE, end EXCLUSIVE, and dates are evaluated in the billable account's timezone, so a day bucket can be 23 or 25 hours long. MONTH needs a range of whole months: start on the 1st, end on the last day of a month.
| Argument | Type | Description |
|---|---|---|
| end* | integer | End of the range, Unix seconds. Exclusive: buckets that start before it. |
| start* | integer | Start of the range, Unix seconds. Inclusive: buckets that start at or after it. |
| app_id* | string | The 360dialog channel's app_id. Identifies which WhatsApp number the agent belongs to. |
| channels | array | Only usage on these messaging surfaces. |
| dimensions |
Read the business information the agent uses to answer customers. Returns empty or default values when none has been configured. Known limitation: business info is a CLOSED six-field schema - business_description, contact_info, delivery_and_shipping, payment_method, purchase_info, return_policy. Any other key is rejected. Knowledge that does not fit one of these six fields belongs in an FAQ (mba_create_faq), an agent skill (mba_create_agent_skill), a crawled website (mba_create_website) or an uploaded file (mba_upload_file) - not here.
| Argument | Type | Description |
|---|---|---|
| app_id* | string | The 360dialog channel's app_id. Identifies which WhatsApp number the agent belongs to. |
{
"type": "object",
"required": [
"app_id"
],
"properties": {
"app_id": {
"type": "string",
"description": "The 360dialog channel's app_id. Identifies which WhatsApp number the agent belongs to."
}
},
"additionalProperties": false
}Read one connector by its id, including its connection_status and mTLS metadata. Credentials are never returned - the private key and secrets stay at Meta.
| Argument | Type | Description |
|---|---|---|
| app_id* | string | The 360dialog channel's app_id. Identifies which WhatsApp number the agent belongs to. |
| connector_id* | string | Connector id. |
{
"type": "object",
"required": [
"app_id",
"connector_id"
],
"properties": {
"app_id": {
"type": "string",
"description": "The 360dialog channel's app_id. Identifies which WhatsApp number the agent belongs to."
},
"connector_id": {
"type": "string",
"description": "Connector id."
}
},
"additionalProperties": false
}Read the connector's third-party error logs, or aggregated failure patterns when summary_only is true. Only errors from the third-party system are included, so an empty result means no failures, not no traffic. Known limitation: the time range must not exceed 7 DAYS, and only the last 7 days are retained - start_time defaults to 24 hours ago and end_time to now. Unlike the other list tools this one does return an object: {data: [...], stats: {...}}, with stats present only when include_stats is true.
| Argument | Type | Description |
|---|---|---|
| limit | integer | Default 100. |
| top_n | integer | Default 10. |
| app_id* | string | The 360dialog channel's app_id. Identifies which WhatsApp number the agent belongs to. |
| tool_id | string | Restrict to one connector tool. |
| end_time | integer | End of the range, Unix seconds. |
| start_time | integer | Start of the range, Unix seconds. Must be within the last 7 days. |
| connector_id* | string | Connector id. |
| summary_only |
Read one connector tool definition by its id.
| Argument | Type | Description |
|---|---|---|
| app_id* | string | The 360dialog channel's app_id. Identifies which WhatsApp number the agent belongs to. |
| tool_id* | string | Connector tool id. |
| connector_id* | string | Connector id. |
{
"type": "object",
"required": [
"app_id",
"connector_id",
"tool_id"
],
"properties": {
"app_id": {
"type": "string",
"description": "The 360dialog channel's app_id. Identifies which WhatsApp number the agent belongs to."
},
"tool_id": {
"type": "string",
"description": "Connector tool id."
},
"connector_id": {
"type": "string",
"description": "Connector id."
}
},
"additionalProperties": false
}Read how many conversations the agent replied in over a date range (ai_threads), and how many are currently handed from the agent to the business and still awaiting a business reply (ai_handoffs). Counts are per conversation, not per message, and match the business's own agent summaries. Returns {data: [one row]}, each metric as {count}, present only when requested. Known limitation: ai_handoffs is a SNAPSHOT of the present moment - it ignores start_date and end_date. The range may span at most 90 days, counting both ends, and each requested metric costs a separate scan, so ask only for what you need.
| Argument | Type | Description |
|---|---|---|
| app_id* | string | The 360dialog channel's app_id. Identifies which WhatsApp number the agent belongs to. |
| metrics | array | Which metrics to return. Omit for all of them. |
| end_date* | string | Last day to include, YYYY-MM-DD in the business time zone. Inclusive. |
| start_date* | string | First day to include, YYYY-MM-DD in the business time zone. Inclusive. |
{
"type": "object",
"required": [
"app_id",
"start_date",
"end_date"
],
"properties": {
"app_id": {
"type": "string",
"description": "The 360dialog channel's app_id. Identifies which WhatsApp number the agent belongs to."
},
"metrics": {
"type": "array",
"items": {
"enum": [
"ai_handoffs",
"ai_threads"
],
"type": "string"
},
"description": "Which metrics to return. Omit for all of them.",
"uniqueItems": true
},
"end_date": {
"type": "string",
"format": "date",
"description": "Last day to include, YYYY-MM-DD in the business time zone. Inclusive."
},
"start_date": {
"type": "string",
"format": "date",
"description": "First day to include, YYYY-MM-DD in the business time zone. Inclusive."
}
},
"additionalProperties": false
}Read the ordered turns of the most recent conversation between the agent and one customer. Each turn carries its turn_id, conversation_id and the observed steps - LLM calls with a preview of the model output, and tool calls with the tool name, input and output - plus latency and status where available. Use it to see why the agent answered the way it did. Malformed records, and tool responses that cannot be matched to a tool call, may be missing. This list is CURSOR-PAGINATED: it returns {data, paging} - page with the `after` cursor from paging.cursors, and stop when paging carries no `next` link, because a page can be empty and still have more after it.
| Argument | Type | Description |
|---|---|---|
| after | string | Cursor - return the page immediately after it. |
| limit | integer | Maximum entries per page. A page can be shorter. |
| app_id* | string | The 360dialog channel's app_id. Identifies which WhatsApp number the agent belongs to. |
| before | string | Cursor - return the page immediately before it. |
| end_timestamp_ms | integer | Only turns that started at or before this Unix time in milliseconds. |
| user_phone_number* | string | The customer: a phone number in digits only with the country code (15551234567, no + or separators), a Business-Scoped User ID such as US.2788620304833812, or the conversation_id returned by test_agent. Prefer the BSUID for a customer who has ever used a WhatsApp username - their phone number may be unknown, which returns Consumer not found. |
Read per-conversation evaluation results - scores, per-turn labels, reasons and the transcript. Takes eval_ids, which is a different kind of id from the job_id that mba_get_eval_results takes. Read them from the eval_ids_by_score field of a completed job. mba_get_eval_results already adds these details when it can read that field, so call this tool when it could not.
| Argument | Type | Description |
|---|---|---|
| app_id* | string | The 360dialog channel's app_id. Identifies which WhatsApp number the agent belongs to. |
| eval_ids* | string | Comma-separated evaluation ids. |
{
"type": "object",
"required": [
"app_id",
"eval_ids"
],
"properties": {
"app_id": {
"type": "string",
"description": "The 360dialog channel's app_id. Identifies which WhatsApp number the agent belongs to."
},
"eval_ids": {
"type": "string",
"description": "Comma-separated evaluation ids."
}
},
"additionalProperties": false
}Read an evaluation job by its job_id. While the job runs this gives the status (QUEUED or RUNNING) and the progress. When the job fails it gives the error. When the job completes it gives the aggregated report: the summary text, the average conversation and turn scores, the highlights and the top failure categories. There is no separate summary call: a completed job already carries that report. For the per-conversation transcripts and per-turn labels, take the ids from `eval_ids_by_score` and call mba_get_eval_details. This tool adds a `details` key when it can read those ids for you.
| Argument | Type | Description |
|---|---|---|
| app_id* | string | The 360dialog channel's app_id. Identifies which WhatsApp number the agent belongs to. |
| job_id* | string | Job id returned by start_eval_run. |
{
"type": "object",
"required": [
"app_id",
"job_id"
],
"properties": {
"app_id": {
"type": "string",
"description": "The 360dialog channel's app_id. Identifies which WhatsApp number the agent belongs to."
},
"job_id": {
"type": "string",
"description": "Job id returned by start_eval_run."
}
},
"additionalProperties": false
}Read one FAQ entry by its id, as returned by mba_list_faqs or mba_create_faq.
| Argument | Type | Description |
|---|---|---|
| app_id* | string | The 360dialog channel's app_id. Identifies which WhatsApp number the agent belongs to. |
| faq_id* | string | FAQ entry id. |
{
"type": "object",
"required": [
"app_id",
"faq_id"
],
"properties": {
"app_id": {
"type": "string",
"description": "The 360dialog channel's app_id. Identifies which WhatsApp number the agent belongs to."
},
"faq_id": {
"type": "string",
"description": "FAQ entry id."
}
},
"additionalProperties": false
}Read one knowledge file's metadata by its id. Returns {id, file_name} - this returns metadata only, not the file's contents.
| Argument | Type | Description |
|---|---|---|
| app_id* | string | The 360dialog channel's app_id. Identifies which WhatsApp number the agent belongs to. |
| file_id* | string | Knowledge file id. |
{
"type": "object",
"required": [
"app_id",
"file_id"
],
"properties": {
"app_id": {
"type": "string",
"description": "The 360dialog channel's app_id. Identifies which WhatsApp number the agent belongs to."
},
"file_id": {
"type": "string",
"description": "Knowledge file id."
}
},
"additionalProperties": false
}Read how each of the business's own tools performed over a date range, one row per tool, busiest first: how many conversations called it, its mean latency, and its success, error and timeout rates (0 to 1; timeouts count as errors too). Only tools the business supplied are reported. thread_count counts a conversation once per day, so one that called the tool on three days counts three times. Figures are rolled up once a day, so the most recent day may still be incomplete. Known limitation: the range may span at most 30 days, counting both ends.
| Argument | Type | Description |
|---|---|---|
| app_id* | string | The 360dialog channel's app_id. Identifies which WhatsApp number the agent belongs to. |
| end_date* | string | Last day to include, YYYY-MM-DD in the business time zone. Inclusive. |
| tool_name | string | Return only this tool, named as it was registered. Omit for every tool called. |
| start_date* | string | First day to include, YYYY-MM-DD in the business time zone. Inclusive. |
{
"type": "object",
"required": [
"app_id",
"start_date",
"end_date"
],
"properties": {
"app_id": {
"type": "string",
"description": "The 360dialog channel's app_id. Identifies which WhatsApp number the agent belongs to."
},
"end_date": {
"type": "string",
"format": "date",
"description": "Last day to include, YYYY-MM-DD in the business time zone. Inclusive."
},
"tool_name": {
"type": "string",
"description": "Return only this tool, named as it was registered. Omit for every tool called."
},
"start_date": {
"type": "string",
"format": "date",
"description": "First day to include, YYYY-MM-DD in the business time zone. Inclusive."
}
},
"additionalProperties": false
}Read one UI skill by its id, as returned by mba_list_ui_skills or mba_create_ui_skill. A UI skill is NOT an agent skill (mba_list_agent_skills): an agent skill is instruction text that shapes what the agent says, a UI skill lets the agent send one kind of rich WhatsApp component and tells it when to send that component.
| Argument | Type | Description |
|---|---|---|
| app_id* | string | The 360dialog channel's app_id. Identifies which WhatsApp number the agent belongs to. |
| instruction_id* | string | UI skill id. |
{
"type": "object",
"required": [
"app_id",
"instruction_id"
],
"properties": {
"app_id": {
"type": "string",
"description": "The 360dialog channel's app_id. Identifies which WhatsApp number the agent belongs to."
},
"instruction_id": {
"type": "string",
"description": "UI skill id."
}
},
"additionalProperties": false
}Read one website crawl entry by its id, including crawl_status, pages_crawled and last_crawled_at. This is how you check whether a site added with mba_create_website has been ingested yet.
| Argument | Type | Description |
|---|---|---|
| app_id* | string | The 360dialog channel's app_id. Identifies which WhatsApp number the agent belongs to. |
| website_id* | string | Website entry id. |
{
"type": "object",
"required": [
"app_id",
"website_id"
],
"properties": {
"app_id": {
"type": "string",
"description": "The 360dialog channel's app_id. Identifies which WhatsApp number the agent belongs to."
},
"website_id": {
"type": "string",
"description": "Website entry id."
}
},
"additionalProperties": false
}List the agent's skills - the instruction texts that shape how it behaves. Known limitation: this returns a BARE ARRAY, not an object with a `data` key.
| Argument | Type | Description |
|---|---|---|
| app_id* | string | The 360dialog channel's app_id. Identifies which WhatsApp number the agent belongs to. |
| agent_id | string | Optional - restrict the list to one agent. |
{
"type": "object",
"required": [
"app_id"
],
"properties": {
"app_id": {
"type": "string",
"description": "The 360dialog channel's app_id. Identifies which WhatsApp number the agent belongs to."
},
"agent_id": {
"type": "string",
"description": "Optional - restrict the list to one agent."
}
},
"additionalProperties": false
}List the consumer phone numbers allowed to reach the agent while ai_audience is ALLOWLISTED_ONLY. Known limitation: this returns a BARE ARRAY of {id, consumer_phone_number}, not an object with a `data` key.
| Argument | Type | Description |
|---|---|---|
| app_id* | string | The 360dialog channel's app_id. Identifies which WhatsApp number the agent belongs to. |
{
"type": "object",
"required": [
"app_id"
],
"properties": {
"app_id": {
"type": "string",
"description": "The 360dialog channel's app_id. Identifies which WhatsApp number the agent belongs to."
}
},
"additionalProperties": false
}List the actions defined on one connector. Known limitation: this returns a BARE ARRAY, not an object with a `data` key.
| Argument | Type | Description |
|---|---|---|
| app_id* | string | The 360dialog channel's app_id. Identifies which WhatsApp number the agent belongs to. |
| connector_id* | string | Connector id. |
{
"type": "object",
"required": [
"app_id",
"connector_id"
],
"properties": {
"app_id": {
"type": "string",
"description": "The 360dialog channel's app_id. Identifies which WhatsApp number the agent belongs to."
},
"connector_id": {
"type": "string",
"description": "Connector id."
}
},
"additionalProperties": false
}List the agent's connectors - the third-party systems it can call. Each carries a connection_status (PENDING_OAUTH, ACTIVE, EXPIRED or ERROR) worth checking before relying on its tools. Known limitation: this returns a BARE ARRAY, not an object with a `data` key.
| Argument | Type | Description |
|---|---|---|
| app_id* | string | The 360dialog channel's app_id. Identifies which WhatsApp number the agent belongs to. |
{
"type": "object",
"required": [
"app_id"
],
"properties": {
"app_id": {
"type": "string",
"description": "The 360dialog channel's app_id. Identifies which WhatsApp number the agent belongs to."
}
},
"additionalProperties": false
}List the evaluation scenarios configured for this agent, each with its scenario text, categories, max_turns and success criteria. Their ids are what mba_start_eval_run takes.
| Argument | Type | Description |
|---|---|---|
| app_id* | string | The 360dialog channel's app_id. Identifies which WhatsApp number the agent belongs to. |
{
"type": "object",
"required": [
"app_id"
],
"properties": {
"app_id": {
"type": "string",
"description": "The 360dialog channel's app_id. Identifies which WhatsApp number the agent belongs to."
}
},
"additionalProperties": false
}List the agent's FAQ entries. Known limitation: this returns a BARE ARRAY, not an object with a `data` key.
| Argument | Type | Description |
|---|---|---|
| app_id* | string | The 360dialog channel's app_id. Identifies which WhatsApp number the agent belongs to. |
{
"type": "object",
"required": [
"app_id"
],
"properties": {
"app_id": {
"type": "string",
"description": "The 360dialog channel's app_id. Identifies which WhatsApp number the agent belongs to."
}
},
"additionalProperties": false
}List the files in the agent's knowledge base, as {id, file_name}. Known limitation: this returns a BARE ARRAY, not an object with a `data` key.
| Argument | Type | Description |
|---|---|---|
| app_id* | string | The 360dialog channel's app_id. Identifies which WhatsApp number the agent belongs to. |
{
"type": "object",
"required": [
"app_id"
],
"properties": {
"app_id": {
"type": "string",
"description": "The 360dialog channel's app_id. Identifies which WhatsApp number the agent belongs to."
}
},
"additionalProperties": false
}List the agent's UI skills - the rich WhatsApp components (carousels, CTA URLs, flows, images, interactive lists and buttons, location) the agent may send, each with the instruction that says when to send it. A UI skill is NOT an agent skill (mba_list_agent_skills): an agent skill is instruction text that shapes what the agent says, a UI skill lets the agent send one kind of rich WhatsApp component and tells it when to send that component. This list is CURSOR-PAGINATED: it returns {data, paging} - page with the `after` cursor from paging.cursors, and stop when paging carries no `next` link, because a page can be empty and still have more after it.
| Argument | Type | Description |
|---|---|---|
| after | string | Cursor - return the page immediately after it. |
| limit | integer | Maximum entries per page. A page can be shorter. |
| app_id* | string | The 360dialog channel's app_id. Identifies which WhatsApp number the agent belongs to. |
| before | string | Cursor - return the page immediately before it. |
{
"type": "object",
"required": [
"app_id"
],
"properties": {
"after": {
"type": "string",
"description": "Cursor - return the page immediately after it."
},
"limit": {
"type": "integer",
"minimum": 1,
"description": "Maximum entries per page. A page can be shorter."
},
"app_id": {
"type": "string",
"description": "The 360dialog channel's app_id. Identifies which WhatsApp number the agent belongs to."
},
"before": {
"type": "string",
"description": "Cursor - return the page immediately before it."
}
},
"additionalProperties": false
}List the websites the agent crawls for knowledge, with their crawl status. Known limitation: this returns a BARE ARRAY, not an object with a `data` key.
| Argument | Type | Description |
|---|---|---|
| app_id* | string | The 360dialog channel's app_id. Identifies which WhatsApp number the agent belongs to. |
{
"type": "object",
"required": [
"app_id"
],
"properties": {
"app_id": {
"type": "string",
"description": "The 360dialog channel's app_id. Identifies which WhatsApp number the agent belongs to."
}
},
"additionalProperties": false
}Create the Meta Business Agent for this channel on the given messaging channel. Creates the underlying entities and schedules asynchronous data-preparation jobs, so the agent is not immediately ready to answer. Returns {agent_id}. Onboarding does not switch the agent on: rollout stays disabled until mba_update_agent_settings enables it.
| Argument | Type | Description |
|---|---|---|
| app_id* | string | The 360dialog channel's app_id. Identifies which WhatsApp number the agent belongs to. |
| channel* | string | Messaging channel to onboard. |
{
"type": "object",
"required": [
"app_id",
"channel"
],
"properties": {
"app_id": {
"type": "string",
"description": "The 360dialog channel's app_id. Identifies which WhatsApp number the agent belongs to."
},
"channel": {
"enum": [
"whatsapp",
"messenger",
"instagram",
"email",
"line",
"sms",
"tiktok",
"webchat",
"unknown"
],
"type": "string",
"description": "Messaging channel to onboard."
}
},
"additionalProperties": false
}Hand a consumer conversation back to the Meta Business Agent as the automatic responder, after a human agent has taken it over. Only releasing is supported here - taking control is restricted to configured escalation partners.
| Argument | Type | Description |
|---|---|---|
| to* | string | Consumer's WhatsApp number in E.164 format. |
| app_id* | string | The 360dialog channel's app_id. Identifies which WhatsApp number the agent belongs to. |
{
"type": "object",
"required": [
"app_id",
"to"
],
"properties": {
"to": {
"type": "string",
"description": "Consumer's WhatsApp number in E.164 format."
},
"app_id": {
"type": "string",
"description": "The 360dialog channel's app_id. Identifies which WhatsApp number the agent belongs to."
}
},
"additionalProperties": false
}Remove one entry from the allowlist by its entry id, which comes from mba_list_allowlist_entries (it is not the phone number). Returns no content on success. While ai_audience is ALLOWLISTED_ONLY, removing the entry stops the agent answering that consumer.
| Argument | Type | Description |
|---|---|---|
| app_id* | string | The 360dialog channel's app_id. Identifies which WhatsApp number the agent belongs to. |
| entry_id* | string | Allowlist entry id, as returned by list_allowlist_entries. |
{
"type": "object",
"required": [
"app_id",
"entry_id"
],
"properties": {
"app_id": {
"type": "string",
"description": "The 360dialog channel's app_id. Identifies which WhatsApp number the agent belongs to."
},
"entry_id": {
"type": "string",
"description": "Allowlist entry id, as returned by list_allowlist_entries."
}
},
"additionalProperties": false
}Set the usage caps for the agent. Returns the caps in force after the write. This is a FULL REPLACEMENT of the set: send again every cap to keep, because any cap left out is removed, and an empty array clears all caps and returns the agent to unlimited. To edit an existing cap, pass back its budget_id from mba_get_agent_budgets; omit budget_id to add a new cap. Two caps with the same unit_type and time_window pair are rejected. Known limitations: budgets are ONLY SERVED for the business that owns this number's WABA; any other business_id is refused with an error that says so. For a number whose business is not known to 360dialog yet, budgets are not available and this tool returns an error that says so. When several caps are set, whichever is reached first stops the agent until its window resets, and the agent then hands conversations to the business. Token caps apply across the WHOLE BUSINESS MANAGER, so every agent in that portfolio shares them; AI-turn caps apply per conversation. These tools set and read caps and do not report usage against them: mba_get_agent_usage_insights reports billed usage, keyed on the billable account ID and not on business_id.
| Argument | Type | Description |
|---|---|---|
| app_id* | string | The 360dialog channel's app_id. Identifies which WhatsApp number the agent belongs to. |
| budgets* | array | The complete set of caps. An empty array removes every cap. |
| business_id* | string | The Meta Business Manager ID of the business that owns this number's WABA. No other tool returns it: it is the WABA's owner business in Meta Business Suite, and the 360dialog hub shows it on the channel. |
Reset the agent's business information to empty defaults and return the emptied object. Unlike most deletes this does not 404 afterwards - mba_get_business_info keeps working and returns the defaults. Known limitation: business info is a CLOSED six-field schema - business_description, contact_info, delivery_and_shipping, payment_method, purchase_info, return_policy. Any other key is rejected. Knowledge that does not fit one of these six fields belongs in an FAQ (mba_create_faq), an agent skill (mba_create_agent_skill), a crawled website (mba_create_website) or an uploaded file (mba_upload_file) - not here.
| Argument | Type | Description |
|---|---|---|
| app_id* | string | The 360dialog channel's app_id. Identifies which WhatsApp number the agent belongs to. |
{
"type": "object",
"required": [
"app_id"
],
"properties": {
"app_id": {
"type": "string",
"description": "The 360dialog channel's app_id. Identifies which WhatsApp number the agent belongs to."
}
},
"additionalProperties": false
}Execute one connector tool once, as the agent would, and return what the third-party system answered. Use it to check a definition works before relying on it. `input` is a JSON-ENCODED STRING of the arguments, not an object. Known limitation: the result is DOUBLY STRINGIFIED - the response is {output, status} where `output` is a JSON string; parse `output`, then parse its `.body` to reach the third-party system's actual response. What this call does depends entirely on the tool being run: it can create, change or delete data in the connected system.
| Argument | Type | Description |
|---|---|---|
| input | string | Arguments as a JSON-encoded string, e.g. '{"order_id":"123"}'. Defaults to an empty object. |
| app_id* | string | The 360dialog channel's app_id. Identifies which WhatsApp number the agent belongs to. |
| tool_id* | string | Connector tool id. |
| connector_id* | string | Connector id. |
{
"type": "object",
"required": [
"app_id",
"connector_id",
"tool_id"
],
"properties": {
"input": {
"type": "string",
"description": "Arguments as a JSON-encoded string, e.g. '{\"order_id\":\"123\"}'. Defaults to an empty object."
},
"app_id": {
"type": "string",
"description": "The 360dialog channel's app_id. Identifies which WhatsApp number the agent belongs to."
},
"tool_id": {
"type": "string",
"description": "Connector tool id."
},
"connector_id": {
"type": "string",
"description": "Connector id."
}
},
"additionalProperties": false
}Trigger the agent to act on a consumer conversation asynchronously - the event is queued and the call returns immediately with status "accepted" and an agent_event_id. Poll mba_get_agent_event with that id to find out what happened; a 202-style acknowledgement here does not mean the consumer was messaged. Known limitation: event.payload must be a JSON-ESCAPED STRING, not an object - pass "{\"order_id\":\"123\"}", not {"order_id": "123"}. Maximum 4096 characters.
| Argument | Type | Description |
|---|---|---|
| to* | string | Consumer's WhatsApp number in E.164 format. |
| event* | object | |
| app_id* | string | The 360dialog channel's app_id. Identifies which WhatsApp number the agent belongs to. |
{
"type": "object",
"required": [
"app_id",
"to",
"event"
],
"properties": {
"to": {
"type": "string",
"description": "Consumer's WhatsApp number in E.164 format."
},
"event": {
"type": "object",
"required": [
"type",
"description",
"payload"
],
"properties": {
"type": {
"type": "string",
"description": "Event type (max 256 characters)."
},
"payload": {
"type": "string",
"description": "Opaque JSON-ENCODED STRING passed to the agent as-is (max 4096 characters)."
},
"description": {
"type": "string",
"description": "What happened, in words the agent can act on (max 1024 characters)."
}
},
"additionalProperties": false
},
"app_id": {
"type": "string",
"description": "The 360dialog channel's app_id. Identifies which WhatsApp number the agent belongs to."
}
},
"additionalProperties": false
}Send a WhatsApp message to a consumer and release thread control back to the agent. The body is the WhatsApp Cloud API message object - set `type` and the matching payload key (text, template, interactive, image, ...). This messages a real person: it is subject to the platform's send eligibility rules, and outside a 24-hour customer service window only an approved template will be delivered.
| Argument | Type | Description |
|---|---|---|
| to* | string | Consumer's WhatsApp number in E.164 format. |
| text | object | Used when type is text, e.g. {"body": "Hello"}. |
| type* | string | Message type, e.g. text, template, interactive, image. |
| app_id* | string | The 360dialog channel's app_id. Identifies which WhatsApp number the agent belongs to. |
| template | object | Used when type is template. |
| recipient_type | string | Defaults to individual. |
{
"type": "object",
"required": [
"app_id",
"to",
"type"
],
"properties": {
"to": {
"type": "string",
"description": "Consumer's WhatsApp number in E.164 format."
},
"text": {
"type": "object",
"description": "Used when type is text, e.g. {\"body\": \"Hello\"}."
},
"type": {
"type": "string",
"description": "Message type, e.g. text, template, interactive, image."
},
"app_id": {
"type": "string",
"description": "The 360dialog channel's app_id. Identifies which WhatsApp number the agent belongs to."
},
"template": {
"type": "object",
"description": "Used when type is template."
},
"recipient_type": {
"type": "string",
"description": "Defaults to individual."
}
},
"additionalProperties": true
}Submit an evaluation job that simulates the listed cases against the agent, evaluates the conversations and optionally produces insights. Returns {job_id, status: QUEUED} - the work is asynchronous, so poll mba_get_eval_results with the job_id. Known limitation: eval_case_ids is read from the QUERY STRING, not the request body - pass it as the comma-separated argument here and this service puts it in the right place; the body is a separate object that accepts nothing else.
| Argument | Type | Description |
|---|---|---|
| app_id* | string | The 360dialog channel's app_id. Identifies which WhatsApp number the agent belongs to. |
| eval_case_ids* | string | Comma-separated eval case ids from list_eval_cases. |
{
"type": "object",
"required": [
"app_id",
"eval_case_ids"
],
"properties": {
"app_id": {
"type": "string",
"description": "The 360dialog channel's app_id. Identifies which WhatsApp number the agent belongs to."
},
"eval_case_ids": {
"type": "string",
"description": "Comma-separated eval case ids from list_eval_cases."
}
},
"additionalProperties": false
}Send a test message through the full agent pipeline and read its reply, without needing a real consumer number. Pass conversation_id from a previous reply to continue the same test conversation. Known limitation: while ai_audience is ALLOWLISTED_ONLY this returns agent_response: "" with no_response_reason: "ELIGIBILITY_CHECK_FAILED", no matter which consumer number is involved - check mba_get_agent_settings before concluding the agent is broken.
| Argument | Type | Description |
|---|---|---|
| app_id* | string | The 360dialog channel's app_id. Identifies which WhatsApp number the agent belongs to. |
| user_msg* | string | The message to send to the agent. |
| conversation_id | string | Optional - continue an existing test conversation. |
{
"type": "object",
"required": [
"app_id",
"user_msg"
],
"properties": {
"app_id": {
"type": "string",
"description": "The 360dialog channel's app_id. Identifies which WhatsApp number the agent belongs to."
},
"user_msg": {
"type": "string",
"description": "The message to send to the agent."
},
"conversation_id": {
"type": "string",
"description": "Optional - continue an existing test conversation."
}
},
"additionalProperties": false
}Replace the agent's settings and return the updated entry. Known limitation: this is a FULL REPLACEMENT, not a patch - every field you omit is reset, so read the current settings with mba_get_agent_settings first and send them back with your change applied. Note also that setting rollout.enabled to false stops the AI responding on all threads; re-enabling it makes the AI respond to new threads only, not to threads that were already open.
| Argument | Type | Description |
|---|---|---|
| app_id* | string | The 360dialog channel's app_id. Identifies which WhatsApp number the agent belongs to. |
| handoff | object | Handing the conversation to a human agent. |
| rollout | object | Whether the agent responds at all. Disabling it stops the AI answering on every thread. |
| agent_id | string | Optional - restrict the update to one agent. |
| followup | object | Following up with an inactive user. |
| ai_audience | string | ALLOWLISTED_ONLY restricts the agent to the numbers on the allowlist. |
{
"type": "object",
"required": [
"app_id"
],
"properties": {
"app_id": {
"type": "string",
"description": "The 360dialog channel's app_id. Identifies which WhatsApp number the agent belongs to."
},
"handoff": {
"type": "object",
"required": [
"enabled"
],
"properties": {
"enabled": {
"type": "boolean"
},
"message": {
"type": "string"
}
},
"description": "Handing the conversation to a human agent.",
"additionalProperties": false
},
"rollout": {
"type": "object",
"required": [
"enabled"
],
"properties": {
"enabled": {
"type": "boolean"
}
},
"description": "Whether the agent responds at all. Disabling it stops the AI answering on every thread.",
"additionalProperties": false
},
"agent_id": {
"type": "string",
"description": "Optional - restrict the update to one agent."
},
"followup": {
"type": "object",
"required": [
"enabled"
],
"properties": {
"enabled": {
"type": "boolean"
},
"message": {
"type": "string"
},
"followup_interval_in_seconds": {
"enum": [
0,
300,
900,
1800,
3600,
7200,
28800,
86400
],
"type": "integer"
}
},
"description": "Following up with an inactive user.",
"additionalProperties": false
},
"ai_audience": {
"enum": [
"ALLOWLISTED_ONLY",
"EVERYONE"
],
"type": "string",
"description": "ALLOWLISTED_ONLY restricts the agent to the numbers on the allowlist."
}
},
"additionalProperties": false
}Replace one agent skill by its id. This replaces the skill rather than patching it, so send the title, description and skill text you want it to end up with.
| Argument | Type | Description |
|---|---|---|
| skill | string | The instruction text the agent follows (max 20000 characters). |
| title | string | Short name for the skill (max 64 characters). |
| app_id* | string | The 360dialog channel's app_id. Identifies which WhatsApp number the agent belongs to. |
| skill_id* | string | Agent skill id. |
| description | string | What the skill is for (max 1024 characters). |
{
"type": "object",
"required": [
"app_id",
"skill_id"
],
"properties": {
"skill": {
"type": "string",
"description": "The instruction text the agent follows (max 20000 characters)."
},
"title": {
"type": "string",
"description": "Short name for the skill (max 64 characters)."
},
"app_id": {
"type": "string",
"description": "The 360dialog channel's app_id. Identifies which WhatsApp number the agent belongs to."
},
"skill_id": {
"type": "string",
"description": "Agent skill id."
},
"description": {
"type": "string",
"description": "What the skill is for (max 1024 characters)."
}
},
"additionalProperties": false
}Replace the agent's business information and return the stored object. Known limitation: this is a FULL REPLACEMENT - fields you omit are cleared, so read mba_get_business_info first and send the existing values back with your change applied. Known limitation: business info is a CLOSED six-field schema - business_description, contact_info, delivery_and_shipping, payment_method, purchase_info, return_policy. Any other key is rejected. Knowledge that does not fit one of these six fields belongs in an FAQ (mba_create_faq), an agent skill (mba_create_agent_skill), a crawled website (mba_create_website) or an uploaded file (mba_upload_file) - not here.
| Argument | Type | Description |
|---|---|---|
| app_id* | string | The 360dialog channel's app_id. Identifies which WhatsApp number the agent belongs to. |
| contact_info | object | Contact and location details. |
| purchase_info | string | How customers buy. |
| return_policy | string | Returns and refunds. |
| payment_method | string | Accepted payment methods. |
| business_description | string | What the business does. |
| delivery_and_shipping |
Replace one connector by its id. This replaces the connector rather than patching it, so send the full definition you want it to end up with - read mba_get_connector first.
| Argument | Type | Description |
|---|---|---|
| name* | string | Name of the connector. |
| app_id* | string | The 360dialog channel's app_id. Identifies which WhatsApp number the agent belongs to. |
| base_url* | string | Base URL every tool on this connector calls. |
| auth_type* | string | How the connected system authenticates. |
| auth_config | object | Credentials matching auth_type: `api_key` when auth_type is API_KEY, `oauth2_client_credentials` when it is OAUTH2_CLIENT_CREDENTIALS. Credentials can also be set later with upsert_connector_api_key or upsert_connector_oauth. |
| description* | string | What the connected system does. |
| connector_id* | string | Connector id. |
Replace one connector tool definition by its id. This replaces the definition rather than patching it, so send the whole request_definition you want it to end up with - read mba_get_connector_tool first. Known limitation: path_parameters, query_parameters and headers are NAME-TO-SCHEMA OBJECTS, not arrays - write {"order_id": {"type": "string"}}, never [{"name": "order_id", ...}]. And every {brace} token in `path` must have a matching key in path_parameters, or the definition is rejected.
| Argument | Type | Description |
|---|---|---|
| name* | string | Name the agent sees for this action. |
| app_id* | string | The 360dialog channel's app_id. Identifies which WhatsApp number the agent belongs to. |
| tool_id* | string | Connector tool id. |
| description* | string | What the action does - the agent uses this to decide when to call it. |
| connector_id* | string | Connector id. |
| request_definition* | object | The outbound HTTP request this tool makes, relative to the connector's base_url. |
Replace one FAQ entry by its id. Both question and answer are required: this replaces the entry rather than patching it, so send the fields you want the entry to end up with.
| Argument | Type | Description |
|---|---|---|
| answer* | string | |
| app_id* | string | The 360dialog channel's app_id. Identifies which WhatsApp number the agent belongs to. |
| faq_id* | string | FAQ entry id. |
| metadata | object | Optional free-form metadata. |
| question* | string |
{
"type": "object",
"required": [
"app_id",
"faq_id",
"question",
"answer"
],
"properties": {
"answer": {
"type": "string"
},
"app_id": {
"type": "string",
"description": "The 360dialog channel's app_id. Identifies which WhatsApp number the agent belongs to."
},
"faq_id": {
"type": "string",
"description": "FAQ entry id."
},
"metadata": {
"type": "object",
"description": "Optional free-form metadata."
},
"question": {
"type": "string"
}
},
"additionalProperties": false
}Change the title, the status or the instruction of one UI skill by its id. This is a partial update: a field you omit keeps its stored value. Use it to enable or disable a component without deleting it. A UI skill is NOT an agent skill (mba_list_agent_skills): an agent skill is instruction text that shapes what the agent says, a UI skill lets the agent send one kind of rich WhatsApp component and tells it when to send that component. Known limitation: component_type and flow_id cannot be changed - delete the UI skill and create a new one instead. A flow UI skill cannot be enabled until its flow is published.
| Argument | Type | Description |
|---|---|---|
| title | string | Human-readable name for the UI skill. |
| app_id* | string | The 360dialog channel's app_id. Identifies which WhatsApp number the agent belongs to. |
| status | string | Whether the agent may send this component. Only an enabled UI skill is available to the agent. |
| instruction | string | Tells the agent when to send this component, e.g. 'Send this when the customer asks to browse the catalog'. |
| instruction_id* | string | UI skill id. |
{
"type": "object",
"required": [
"app_id",
"instruction_id"
],
"properties": {
"title": {
"type": "string",
"description": "Human-readable name for the UI skill."
},
"app_id": {
"type": "string",
"description": "The 360dialog channel's app_id. Identifies which WhatsApp number the agent belongs to."
},
"status": {
"enum": [
"enabled",
"disabled"
],
"type": "string",
"description": "Whether the agent may send this component. Only an enabled UI skill is available to the agent."
},
"instruction": {
"type": "string",
"description": "Tells the agent when to send this component, e.g. 'Send this when the customer asks to browse the catalog'."
},
"instruction_id": {
"type": "string",
"description": "UI skill id."
}
},
"additionalProperties": false
}Replace the URL of one website crawl entry. Changing the URL restarts crawling.
| Argument | Type | Description |
|---|---|---|
| url* | string | |
| app_id* | string | The 360dialog channel's app_id. Identifies which WhatsApp number the agent belongs to. |
| website_id* | string | Website entry id. |
{
"type": "object",
"required": [
"app_id",
"website_id",
"url"
],
"properties": {
"url": {
"type": "string"
},
"app_id": {
"type": "string",
"description": "The 360dialog channel's app_id. Identifies which WhatsApp number the agent belongs to."
},
"website_id": {
"type": "string",
"description": "Website entry id."
}
},
"additionalProperties": false
}Upload a file into the agent's knowledge base. Multipart uploads cannot travel over MCP, so pass the file EITHER as `url` (a publicly reachable https URL this service downloads) OR as `content_base64` (the file's bytes, base64-encoded) - exactly one of the two, always with `file_name`. This service performs the multipart upload to Meta for you and returns the created {id, file_name}. Known limitations: Meta caps a file at 100 MB and accepts PDF, DOC, DOCX, PNG, JPG and JPEG (CSV and XLSX where enabled). Base64 content is additionally capped by this endpoint's request size limit, so prefer `url` for anything larger than a few megabytes. A `url` must be https and must resolve to a public address - private, loopback and link-local addresses are refused.
| Argument | Type | Description |
|---|---|---|
| url | string | Publicly reachable https URL to download the file from. |
| app_id* | string | The 360dialog channel's app_id. Identifies which WhatsApp number the agent belongs to. |
| file_name* | string | Name to store the file under, including its extension, e.g. 'returns-policy.pdf'. |
| content_base64 | string | The file's bytes, base64-encoded. Use `url` instead for large files. |
{
"type": "object",
"oneOf": [
{
"required": [
"url"
]
},
{
"required": [
"content_base64"
]
}
],
"required": [
"app_id",
"file_name"
],
"properties": {
"url": {
"type": "string",
"description": "Publicly reachable https URL to download the file from."
},
"app_id": {
"type": "string",
"description": "The 360dialog channel's app_id. Identifies which WhatsApp number the agent belongs to."
},
"file_name": {
"type": "string",
"description": "Name to store the file under, including its extension, e.g. 'returns-policy.pdf'."
},
"content_base64": {
"type": "string",
"description": "The file's bytes, base64-encoded. Use `url` instead for large files."
}
},
"additionalProperties": false
}Set or rotate the API key credentials for a connector. This is an upsert: if credentials already exist they are REPLACED and the connection is re-established. It cannot be used to remove credentials - the payload is required.
| Argument | Type | Description |
|---|---|---|
| app_id* | string | The 360dialog channel's app_id. Identifies which WhatsApp number the agent belongs to. |
| connector_id* | string | Connector id. |
| api_key_config* | object | Where the API key is injected. Supply at least one of headers, query_params, body_params. |
{
"type": "object",
"required": [
"app_id",
"connector_id",
"api_key_config"
],
"properties": {
"app_id": {
"type": "string",
"description": "The 360dialog channel's app_id. Identifies which WhatsApp number the agent belongs to."
},
"connector_id": {
"type": "string",
"description": "Connector id."
},
"api_key_config": {
"type": "object",
"properties": {
"headers": {
"type": "array",
"items": {
"type": "object",
"required": [
"field_name",
"value"
],
"properties": {
"value": {
"type": "string",
"description": "The credential value."
},
"prefix": {
"type": "string",
"description": "Optional prefix, e.g. 'Bearer '."
},
"field_name": {
"type": "string",
"description": "Header, query or body field name."
}
},
"additionalProperties": false
}
},
"body_params": {
"type": "array",
"items": {
"type": "object",
"required": [
"field_name",
"value"
],
"properties": {
"value": {
"type": "string",
"description": "The credential value."
},
"prefix": {
"type": "string",
"description": "Optional prefix, e.g. 'Bearer '."
},
"field_name": {
"type": "string",
"description": "Header, query or body field name."
}
},
"additionalProperties": false
}
},
"query_params": {
"type": "array",
"items": {
"type": "object",
"required": [
"field_name",
"value"
],
"properties": {
"value": {
"type": "string",
"description": "The credential value."
},
"prefix": {
"type": "string",
"description": "Optional prefix, e.g. 'Bearer '."
},
"field_name": {
"type": "string",
"description": "Header, query or body field name."
}
},
"additionalProperties": false
}
}
},
"description": "Where the API key is injected. Supply at least one of headers, query_params, body_params.",
"additionalProperties": false
}
},
"additionalProperties": false
}Upload or rotate the mTLS client certificate for a connector. This is an upsert: if credentials already exist they are REPLACED and the connection is re-established. It cannot be used to remove credentials - the payload is required. Certificates and keys are PEM-encoded; the private key is never returned by any read tool.
| Argument | Type | Description |
|---|---|---|
| app_id* | string | The 360dialog channel's app_id. Identifies which WhatsApp number the agent belongs to. |
| client_key* | string | PEM-encoded private key (PKCS8, RSA or EC). |
| connector_id* | string | Connector id. |
| ca_certificate | string | Optional PEM-encoded CA certificate. |
| client_certificate* | string | PEM-encoded client certificate. |
{
"type": "object",
"required": [
"app_id",
"connector_id",
"client_certificate",
"client_key"
],
"properties": {
"app_id": {
"type": "string",
"description": "The 360dialog channel's app_id. Identifies which WhatsApp number the agent belongs to."
},
"client_key": {
"type": "string",
"description": "PEM-encoded private key (PKCS8, RSA or EC)."
},
"connector_id": {
"type": "string",
"description": "Connector id."
},
"ca_certificate": {
"type": "string",
"description": "Optional PEM-encoded CA certificate."
},
"client_certificate": {
"type": "string",
"description": "PEM-encoded client certificate."
}
},
"additionalProperties": false
}Set or rotate the OAuth 2.0 client credentials for a connector. This is an upsert: if credentials already exist they are REPLACED and the connection is re-established. It cannot be used to remove credentials - the payload is required.
| Argument | Type | Description |
|---|---|---|
| app_id* | string | The 360dialog channel's app_id. Identifies which WhatsApp number the agent belongs to. |
| connector_id* | string | Connector id. |
| oauth_config* | object | OAuth 2.0 client credentials. |
{
"type": "object",
"required": [
"app_id",
"connector_id",
"oauth_config"
],
"properties": {
"app_id": {
"type": "string",
"description": "The 360dialog channel's app_id. Identifies which WhatsApp number the agent belongs to."
},
"connector_id": {
"type": "string",
"description": "Connector id."
},
"oauth_config": {
"type": "object",
"required": [
"token_url",
"client_id",
"client_secret",
"scopes_to_request"
],
"properties": {
"client_id": {
"type": "string"
},
"token_url": {
"type": "string"
},
"client_secret": {
"type": "string"
},
"scopes_to_request": {
"type": "array",
"items": {
"type": "string"
}
},
"token_request_content_type": {
"enum": [
"application/x-www-form-urlencoded",
"application/json"
],
"type": "string"
}
},
"description": "OAuth 2.0 client credentials.",
"additionalProperties": false
}
},
"additionalProperties": false
}Request an OTP code. Sometimes OTP is needed to complete invoking a tool. When tool invocation fails due to OTP reasons, you will be notified in the tool response, and be asked to rqeuest an OTP code. Only call after a tool call fails due to OTP.
No arguments.
{
"type": "object",
"properties": {},
"additionalProperties": false
}Complete a phone number's registration. This will get you the API key to use when sending messages from the 360Dialog sandbox phone number to the user's registered phone number.
No arguments.
{
"type": "object",
"properties": {},
"additionalProperties": false
}Set webhook for the channel on 360Dialog sandbox. Optional.
| Argument | Type | Description |
|---|---|---|
| url* | object | Webhook to set for this channel on sandbox |
| api_key* | string | Sandbox API key |
{
"type": "object",
"required": [
"url",
"api_key"
],
"properties": {
"url": {
"type": "object",
"required": [
"url"
],
"properties": {
"url": {
"type": "string"
}
},
"description": "Webhook to set for this channel on sandbox"
},
"api_key": {
"type": "string",
"description": "Sandbox API key"
}
},
"additionalProperties": false
}Get configured webhook for the channel on 360Dialog sandbox.
| Argument | Type | Description |
|---|---|---|
| api_key* | string | Sandbox API key |
{
"type": "object",
"required": [
"api_key"
],
"properties": {
"api_key": {
"type": "string",
"description": "Sandbox API key"
}
},
"additionalProperties": false
}List webhook events received. This will show received messages from the user, and status of messages sent from the sandbox account.
| Argument | Type | Description |
|---|---|---|
| page | integer | Page number. Starts from 1, defaults to 1. |
{
"type": "object",
"properties": {
"page": {
"type": "integer",
"default": 1,
"description": "Page number. Starts from 1, defaults to 1."
}
},
"additionalProperties": false
}Register the user's phone number on the 360Dialog sandbox. Upon registration, the user can send messages to this phone number from the 360Dialog sandbox account on WhatsApp. The user will be given a link to complete registration. When this link is used, they will send a verification code to 360Dialog sandbox phone number on WhatsApp. They can click the link, or alternatively scan the QR code.
| Argument | Type | Description |
|---|---|---|
| phone_number* | string |
{
"type": "object",
"required": [
"phone_number"
],
"properties": {
"phone_number": {
"type": "string",
"format": "phone"
}
},
"additionalProperties": false
}Send a message on the 360Dialog sandbox. Messages can only be sent to the user's phone number that was used during sandbox registration. The payload must be a JSON string matching the WhatsApp messages endpoint body. Interactive message example: use this only when there is an active conversation window, which lasts 24 hours since the customer's last message. { "messaging_product": "whatsapp", "to": "{{recipient_phone_number}}", "type": "text", "text": { "body": "{{message_body}}" } } Template message example: use this when there is no active conversation window, or when sending an approved template message. You can only send the 'marketing_message' template. { "messaging_product": "whatsapp", "to": "{{recipient_phone_number}}", "type": "template", "template": { "name": "marketing_message", "language": { "policy": "deterministic", "code": "en" }, "components": [ { "type": "header", "parameters": [ { "type": "image", "image": { "link": "https://placehold.co/600x315/34D399/FFFFFF/png?text=Summer+Sale!" } } ] } ] } }
| Argument | Type | Description |
|---|---|---|
| api_key* | string | Sandbox API key |
| payload* | string | JSON body of the WhatsApp message to send. Use a text payload only inside an active 24-hour customer service window; use a template payload to start or continue conversations outside that window. |
{
"type": "object",
"required": [
"payload",
"api_key"
],
"properties": {
"api_key": {
"type": "string",
"description": "Sandbox API key"
},
"payload": {
"type": "string",
"description": "JSON body of the WhatsApp message to send. Use a text payload only inside an active 24-hour customer service window; use a template payload to start or continue conversations outside that window."
}
},
"additionalProperties": false
}Search the 360Dialog client documentation at https://docs.360dialog.com/docs. Search across the documentation to find relevant information, code examples, API references, and guides. Use this tool when you need to answer questions about Client Documentation, find specific documentation, understand how features work, or locate implementation details. The search returns contextual content with titles and direct links to the documentation pages.
| Argument | Type | Description |
|---|---|---|
| query* | string |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"query"
],
"properties": {
"query": {
"type": "string"
}
},
"additionalProperties": false
}Submit a new display name for this channel (a.k.a. phone number.) Calling this tool will submit a display name request to Meta. Meta takes up to 48 hours to review the submitted display name. The display name may be rejected if it does not comply with display name guidelines. The user will receive an email when their display name review is complete. When this tool is called, the user may be prompted by 360Dialog for an OTP code delivered to their email address.
| Argument | Type | Description |
|---|---|---|
| channel_id* | string | Needs to end with 'CH'. |
| new_display_name* | string | New requested display name for this phone number. |
{
"type": "object",
"required": [
"new_display_name",
"channel_id"
],
"properties": {
"channel_id": {
"type": "string",
"pattern": "(?i)^.*ch$",
"maxLength": 8,
"minLength": 8,
"description": "Needs to end with 'CH'."
},
"new_display_name": {
"type": "string",
"description": "New requested display name for this phone number."
}
},
"additionalProperties": false
}Set a channel's (a.k.a. phone number's) webhook URL and optionally webhook headers.
| Argument | Type | Description |
|---|---|---|
| channel_id* | string | Needs to end with 'CH'. |
| webhook_setting* | object |
{
"type": "object",
"required": [
"webhook_setting",
"channel_id"
],
"properties": {
"channel_id": {
"type": "string",
"pattern": "(?i)^.*ch$",
"maxLength": 8,
"minLength": 8,
"description": "Needs to end with 'CH'."
},
"webhook_setting": {
"type": "object",
"required": [
"url"
],
"properties": {
"url": {
"type": "string",
"format": "uri",
"maxLength": 2083,
"minLength": 1
},
"headers": {
"anyOf": [
{
"type": "object",
"additionalProperties": {
"type": "string"
}
},
{
"type": "null"
}
],
"default": null
}
}
}
},
"additionalProperties": false
}Show a preview of a given template to the user.
| Argument | Type | Description |
|---|---|---|
| template_id* | string | Needs to end with 'WT'. Use 'list_templates' to find a template's ID. |
| waba_account_id* | string | Needs to end with 'WA'. |
{
"type": "object",
"required": [
"template_id",
"waba_account_id"
],
"properties": {
"template_id": {
"type": "string",
"pattern": "(?i)^.*wt$",
"maxLength": 22,
"minLength": 22,
"description": "Needs to end with 'WT'. Use 'list_templates' to find a template's ID."
},
"waba_account_id": {
"type": "string",
"pattern": "(?i)^.*wa$",
"maxLength": 8,
"minLength": 8,
"description": "Needs to end with 'WA'."
}
},
"additionalProperties": false
}Get the link that lets the user connect a WhatsApp phone number in 360Dialog, plus what to tell them beforehand. This hands over 360Dialog's own onboarding page. The user clicks through Embedded Signup themselves; this tool cannot do it for them. The user must be signed in to 360Dialog Hub already, or the link sends them to login first and loses the destination. Tell them to make sure they're signed in first. The link given by this tool may not work if the user's 360Dialog client account is under a partner-paid channel. Make them aware of this. Returns the client's current channel IDs for future reference on recognizing which phone number was newly added.
No arguments.
{
"type": "object",
"required": [],
"properties": {},
"additionalProperties": false
}Get the link that lets the user add their credit card to their account. If this client was created through assistant-led onboarding and still has no company name or country on file, the payment page is kept behind a company details form instead. In that case this tool does not return the payment link; it says to call 'update_company_details' first and try again. The user must be signed in to 360Dialog Hub, or the link sends them to login first and loses the destination. The user enters the card themselves; this tool cannot do it for them.
No arguments.
{
"type": "object",
"required": [],
"properties": {},
"additionalProperties": false
}Returns the URL where a user can create a 360Dialog account. Only relevant if the user has not created a 360Dialog account yet.
No arguments.
{
"type": "object",
"properties": {},
"additionalProperties": false
}Test if a channel's (a.k.a. phone number's) webhook URL is functional. A total of 32 test cases will be run by sending sample POST requests to the user's webhook URL. During this test, the user may see 32 requests being made to their webhook server. Returns the test's results, showing which cases failed, and which succeeded.
| Argument | Type | Description |
|---|---|---|
| channel_id* | string | Needs to end with 'CH'. |
{
"type": "object",
"required": [
"channel_id"
],
"properties": {
"channel_id": {
"type": "string",
"pattern": "(?i)^.*ch$",
"maxLength": 8,
"minLength": 8,
"description": "Needs to end with 'CH'."
}
},
"additionalProperties": false
}Update the WhatsApp profile for this channel (a.k.a. phone number.) The user may be prompted by 360Dialog for an OTP code delivered to their email address. Make them aware of the OTP requirement.
| Argument | Type | Description |
|---|---|---|
| channel_id* | string | Needs to end with 'CH'. |
| project_id* | string | Needs to end with 'PR'. |
| new_profile* | object | Changes to the business profile. This is a PATCH request, so only pass fields the user wants changed. If you want to clear a field, set it to null. If you don't want to change a field, omit it from the JSON. e.g. JSON with no changes: {} e.g. JSON that only changes about text: { "about_text": "Hello world" } |
{
"type": "object",
"required": [
"new_profile",
"channel_id",
"project_id"
],
"properties": {
"channel_id": {
"type": "string",
"pattern": "(?i)^.*ch$",
"maxLength": 8,
"minLength": 8,
"description": "Needs to end with 'CH'."
},
"project_id": {
"type": "string",
"pattern": "(?i)^.*pr$",
"maxLength": 8,
"minLength": 8,
"description": "Needs to end with 'PR'."
},
"new_profile": {
"type": "object",
"properties": {
"websites": {
"anyOf": [
{
"type": "array",
"items": {
"type": "string",
"format": "uri",
"maxLength": 2083,
"minLength": 1
},
"maxItems": 2
},
{
"type": "null"
}
],
"default": null,
"description": "Websites. Set to a list to update; set to null to clear; omit to leave unchanged."
},
"about_text": {
"anyOf": [
{
"type": "string",
"maxLength": 256
},
{
"type": "null"
}
],
"default": null,
"description": "About text. Set to a string to update; set to null to clear; omit to leave unchanged."
},
"full_address": {
"anyOf": [
{
"type": "string",
"maxLength": 256
},
{
"type": "null"
}
],
"default": null,
"description": "Full address. Set to a string to update; set to null to clear; omit to leave unchanged."
},
"contact_email": {
"anyOf": [
{
"type": "string",
"format": "email",
"maxLength": 256
},
{
"type": "null"
}
],
"default": null,
"description": "Contact email. Set to a string to update; set to null to clear; omit to leave unchanged."
},
"business_vertical": {
"anyOf": [
{
"enum": [
"ALCOHOL",
"APPAREL",
"AUTO",
"BEAUTY",
"EDU",
"ENTERTAIN",
"EVENT_PLAN",
"FINANCE",
"GOVT",
"GROCERY",
"HEALTH",
"HOTEL",
"NONPROFIT",
"ONLINE_GAMBLING",
"OTC_DRUGS",
"OTHER",
"PHYSICAL_GAMBLING",
"PROF_SERVICES",
"RESTAURANT",
"RETAIL",
"TRAVEL"
],
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Set to a vertical to update; set to null to clear; omit to leave unchanged."
},
"business_description": {
"anyOf": [
{
"type": "string",
"maxLength": 512
},
{
"type": "null"
}
],
"default": null,
"description": "Business description. Set to a string to update; set to null to clear; omit to leave unchanged."
}
},
"description": "Changes to the business profile. This is a PATCH request, so only pass fields the user wants changed. If you want to clear a field, set it to null. If you don't want to change a field, omit it from the JSON.\n \n e.g. JSON with no changes: {}\n \n e.g. JSON that only changes about text: { \"about_text\": \"Hello world\" }",
"additionalProperties": false
}
},
"additionalProperties": false
}Set the user's company's details on 360Dialog. This change does not affect Meta; only records on 360Dialog are affected by the update. Before calling this tool, make sure to: 1. Check if the `get_company_details` tool returns the correct company information already. 2. Check with the user if they want to change their company details in 360Dialog. 3. Get the user's approval/confirmation.
| Argument | Type | Description |
|---|---|---|
| tax_id* | any | Optional - the company's tax ID |
| company_name* | string | The company's name |
| billing_country* | string | ISO country code, for example 'DE' |
{
"type": "object",
"required": [
"company_name",
"billing_country",
"tax_id"
],
"properties": {
"tax_id": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "Optional - the company's tax ID"
},
"company_name": {
"type": "string",
"description": "The company's name"
},
"billing_country": {
"type": "string",
"description": "ISO country code, for example 'DE'"
}
},
"additionalProperties": false
}Verify the 6-digit OTP code from the user. Doing so will automatically replay the blocked tool call that required verification.
| Argument | Type | Description |
|---|---|---|
| code* | string | 6-digit OTP code. You must receive this from the user. |
{
"type": "object",
"required": [
"code"
],
"properties": {
"code": {
"type": "string",
"description": "6-digit OTP code. You must receive this from the user."
}
},
"additionalProperties": false
}Wait for a server-side onboarding step to finish, then report back. Embedded Signup and payment setup finish in the person's browser. This tool polls the hub every 5 seconds for up to 45 seconds and returns one of: - "done": The step finished. - "pending": Still not finished. Call this tool again to keep waiting. - "failed": There was an error. 'channel_id' and 'phone_number' are returned back once a channel is found so you can pass 'phone_number' into the next call once you have it. When 'phone_number' is omitted, 'candidates' lists the client's most recently created channels - check it if you're unsure the right number was picked (e.g. two users connecting numbers on the same 360Dialog client account). Only use this for the short waits during onboarding. This tool is NOT suitable for display name approval, WABA approval, or business verification scenarios, as they take days, not seconds.
| Argument | Type | Description |
|---|---|---|
| step* | string | Which step to wait for: 'number_connected' (a new phone number was added), 'payment_connected' (the client has a payment method), or 'channel_live' (the number is ready to send messages). |
| phone_number | any | The phone number to wait for - optional. If absent for 'number_connected' and 'channel_live', reports back with top 3 recently connected/went live phone numbers. If present, it checks the status for the specific phone number. Not relevant for 'payment_connected'. |
{
"type": "object",
"required": [
"step"
],
"properties": {
"step": {
"enum": [
"number_connected",
"payment_connected",
"channel_live"
],
"type": "string",
"description": "Which step to wait for: 'number_connected' (a new phone number was added), 'payment_connected' (the client has a payment method), or 'channel_live' (the number is ready to send messages)."
},
"phone_number": {
"anyOf": [
{
"type": "string",
"format": "phone"
},
{
"type": "null"
}
],
"default": null,
"description": "The phone number to wait for - optional. If absent for 'number_connected' and 'channel_live', reports back with top 3 recently connected/went live phone numbers. If present, it checks the status for the specific phone number. Not relevant for 'payment_connected'."
}
},
"additionalProperties": false
}We read every tool's name, description and inputs the way the model will, looking for instructions hidden from you. A clean result means no warning signs, not a guarantee. Scanned Nov 8, 2026.
Takes a password, API key or token as an argument, so the secret passes through the model's context and chat logs.
Fix: Read credentials from the server's own configuration (environment, OAuth) instead of a tool argument.
A very long tool description (over 4,000 characters) is hard to review and easy to hide instructions in.
Fix: Keep the description to what the tool does and when to use it; move reference material to resources or docs.
| Argument | Type | Description |
|---|---|---|
| template_json* | object | The template's JSON. |
| waba_account_id* | string | Needs to end with 'WA'. |
{
"type": "object",
"required": [
"template_json",
"waba_account_id"
],
"properties": {
"template_json": {
"type": "object",
"required": [
"name",
"language",
"category",
"components"
],
"properties": {
"name": {
"type": "string"
},
"category": {
"enum": [
"MARKETING",
"AUTHENTICATION",
"UTILITY"
],
"type": "string"
},
"language": {
"type": "string"
},
"components": {
"type": "array",
"items": {
"anyOf": [
{
"type": "object",
"required": [
"text"
],
"properties": {
"text": {
"type": "string"
},
"type": {
"type": "string",
"const": "HEADER",
"default": "HEADER"
},
"format": {
"type": "string",
"const": "TEXT",
"default": "TEXT"
}
},
"additionalProperties": false
},
{
"type": "object",
"required": [
"text",
"example"
],
"properties": {
"text": {
"type": "string"
},
"type": {
"type": "string",
"const": "HEADER",
"default": "HEADER"
},
"format": {
"type": "string",
"const": "TEXT",
"default": "TEXT"
},
"example": {
"type": "object",
"properties": {
"body_text": {
"anyOf": [
{
"type": "array",
"items": {
"type": "array",
"items": {
"type": "string"
}
}
},
{
"type": "null"
}
],
"default": null
},
"header_text": {
"anyOf": [
{
"type": "array",
"items": {
"type": "string"
}
},
{
"type": "null"
}
],
"default": null
},
"header_handle": {
"anyOf": [
{
"type": "array",
"items": {
"type": "string"
}
},
{
"type": "null"
}
],
"default": null
}
},
"additionalProperties": false
}
},
"additionalProperties": false
},
{
"type": "object",
"properties": {
"type": {
"type": "string",
"const": "HEADER",
"default": "HEADER"
},
"format": {
"type": "string",
"const": "IMAGE",
"default": "IMAGE"
},
"example": {
"anyOf": [
{
"type": "object",
"properties": {
"body_text": {
"anyOf": [
{
"type": "array",
"items": {
"type": "array",
"items": {
"type": "string"
}
}
},
{
"type": "null"
}
],
"default": null
},
"header_text": {
"anyOf": [
{
"type": "array",
"items": {
"type": "string"
}
},
{
"type": "null"
}
],
"default": null
},
"header_handle": {
"anyOf": [
{
"type": "array",
"items": {
"type": "string"
}
},
{
"type": "null"
}
],
"default": null
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"default": null
}
},
"additionalProperties": false
},
{
"type": "object",
"properties": {
"type": {
"type": "string",
"const": "HEADER",
"default": "HEADER"
},
"format": {
"type": "string",
"const": "VIDEO",
"default": "VIDEO"
},
"example": {
"anyOf": [
{
"type": "object",
"properties": {
"body_text": {
"anyOf": [
{
"type": "array",
"items": {
"type": "array",
"items": {
"type": "string"
}
}
},
{
"type": "null"
}
],
"default": null
},
"header_text": {
"anyOf": [
{
"type": "array",
"items": {
"type": "string"
}
},
{
"type": "null"
}
],
"default": null
},
"header_handle": {
"anyOf": [
{
"type": "array",
"items": {
"type": "string"
}
},
{
"type": "null"
}
],
"default": null
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"default": null
}
},
"additionalProperties": false
},
{
"type": "object",
"properties": {
"type": {
"type": "string",
"const": "HEADER",
"default": "HEADER"
},
"format": {
"type": "string",
"const": "DOCUMENT",
"default": "DOCUMENT"
},
"example": {
"anyOf": [
{
"type": "object",
"properties": {
"body_text": {
"anyOf": [
{
"type": "array",
"items": {
"type": "array",
"items": {
"type": "string"
}
}
},
{
"type": "null"
}
],
"default": null
},
"header_text": {
"anyOf": [
{
"type": "array",
"items": {
"type": "string"
}
},
{
"type": "null"
}
],
"default": null
},
"header_handle": {
"anyOf": [
{
"type": "array",
"items": {
"type": "string"
}
},
{
"type": "null"
}
],
"default": null
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"default": null
}
},
"additionalProperties": false
},
{
"type": "object",
"properties": {
"type": {
"type": "string",
"const": "HEADER",
"default": "HEADER"
},
"format": {
"type": "string",
"const": "LOCATION",
"default": "LOCATION"
}
},
"additionalProperties": false
},
{
"type": "object",
"required": [
"text"
],
"properties": {
"text": {
"type": "string"
},
"type": {
"type": "string",
"const": "BODY",
"default": "BODY"
}
},
"additionalProperties": false
},
{
"type": "object",
"required": [
"text",
"example"
],
"properties": {
"text": {
"type": "string"
},
"type": {
"type": "string",
"const": "BODY",
"default": "BODY"
},
"example": {
"type": "object",
"properties": {
"body_text": {
"anyOf": [
{
"type": "array",
"items": {
"type": "array",
"items": {
"type": "string"
}
}
},
{
"type": "null"
}
],
"default": null
},
"header_text": {
"anyOf": [
{
"type": "array",
"items": {
"type": "string"
}
},
{
"type": "null"
}
],
"default": null
},
"header_handle": {
"anyOf": [
{
"type": "array",
"items": {
"type": "string"
}
},
{
"type": "null"
}
],
"default": null
}
},
"additionalProperties": false
}
},
"additionalProperties": false
},
{
"type": "object",
"required": [
"text"
],
"properties": {
"text": {
"type": "string"
},
"type": {
"type": "string",
"const": "FOOTER",
"default": "FOOTER"
}
},
"additionalProperties": false
},
{
"type": "object",
"required": [
"limited_time_offer"
],
"properties": {
"type": {
"type": "string",
"const": "LIMITED_TIME_OFFER",
"default": "LIMITED_TIME_OFFER"
},
"limited_time_offer": {
"type": "object",
"required": [
"text",
"has_expiration"
],
"properties": {
"text": {
"type": "string"
},
"has_expiration": {
"type": "boolean"
}
},
"additionalProperties": false
}
},
"additionalProperties": false
},
{
"type": "object",
"required": [
"buttons"
],
"properties": {
"type": {
"type": "string",
"const": "BUTTONS",
"default": "BUTTONS"
},
"buttons": {
"type": "array",
"items": {
"anyOf": [
{
"type": "object",
"required": [
"text"
],
"properties": {
"text": {
"type": "string"
},
"type": {
"type": "string",
"const": "QUICK_REPLY",
"default": "QUICK_REPLY"
}
},
"additionalProperties": false
},
{
"type": "object",
"required": [
"text",
"phone_number"
],
"properties": {
"text": {
"type": "string"
},
"type": {
"type": "string",
"const": "PHONE_NUMBER",
"default": "PHONE_NUMBER"
},
"phone_number": {
"type": "string"
}
},
"additionalProperties": false
},
{
"type": "object",
"required": [
"text",
"url"
],
"properties": {
"url": {
"type": "string"
},
"text": {
"type": "string"
},
"type": {
"type": "string",
"const": "URL",
"default": "URL"
},
"example": {
"anyOf": [
{
"type": "array",
"items": {
"type": "string"
}
},
{
"type": "null"
}
],
"default": null
}
},
"additionalProperties": false
},
{
"type": "object",
"required": [
"example"
],
"properties": {
"type": {
"type": "string",
"const": "COPY_CODE",
"default": "COPY_CODE"
},
"example": {
"type": "string"
}
},
"additionalProperties": false
},
{
"type": "object",
"required": [
"text"
],
"properties": {
"text": {
"type": "string"
},
"type": {
"type": "string",
"const": "FLOW",
"default": "FLOW"
},
"flow_id": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null
},
"flow_json": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null
},
"flow_name": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null
},
"flow_action": {
"enum": [
"NAVIGATE",
"DATA_EXCHANGE"
],
"type": "string",
"default": "NAVIGATE"
},
"navigate_screen": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null
}
},
"additionalProperties": false
},
{
"type": "object",
"required": [
"otp_type"
],
"properties": {
"text": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null
},
"type": {
"type": "string",
"const": "OTP",
"default": "OTP"
},
"otp_type": {
"enum": [
"COPY_CODE",
"ONE_TAP",
"ZERO_TAP"
],
"type": "string"
},
"package_name": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null
},
"autofill_text": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null
},
"signature_hash": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null
}
},
"additionalProperties": false
}
]
}
}
},
"additionalProperties": false
}
]
}
},
"parameter_format": {
"anyOf": [
{
"enum": [
"NAMED",
"POSITIONAL"
],
"type": "string"
},
{
"type": "null"
}
],
"default": null
}
},
"description": "The template's JSON.",
"additionalProperties": false
},
"waba_account_id": {
"type": "string",
"pattern": "(?i)^.*wa$",
"maxLength": 8,
"minLength": 8,
"description": "Needs to end with 'WA'."
}
},
"additionalProperties": false
}| user_auth_injection_config |
| object |
| Optional configuration for injecting a per-user token into tool requests. |
{
"type": "object",
"required": [
"app_id",
"name",
"description",
"base_url",
"auth_type"
],
"properties": {
"name": {
"type": "string",
"description": "Name of the connector."
},
"app_id": {
"type": "string",
"description": "The 360dialog channel's app_id. Identifies which WhatsApp number the agent belongs to."
},
"base_url": {
"type": "string",
"description": "Base URL every tool on this connector calls."
},
"auth_type": {
"enum": [
"OAUTH2",
"OAUTH2_CLIENT_CREDENTIALS",
"API_KEY",
"BASIC",
"CUSTOM",
"NONE"
],
"type": "string",
"description": "How the connected system authenticates."
},
"auth_config": {
"type": "object",
"properties": {
"api_key": {
"type": "object",
"properties": {
"headers": {
"type": "array",
"items": {
"type": "object",
"required": [
"field_name",
"value"
],
"properties": {
"value": {
"type": "string",
"description": "The credential value."
},
"prefix": {
"type": "string",
"description": "Optional prefix, e.g. 'Bearer '."
},
"field_name": {
"type": "string",
"description": "Header, query or body field name."
}
},
"additionalProperties": false
}
},
"body_params": {
"type": "array",
"items": {
"type": "object",
"required": [
"field_name",
"value"
],
"properties": {
"value": {
"type": "string",
"description": "The credential value."
},
"prefix": {
"type": "string",
"description": "Optional prefix, e.g. 'Bearer '."
},
"field_name": {
"type": "string",
"description": "Header, query or body field name."
}
},
"additionalProperties": false
}
},
"query_params": {
"type": "array",
"items": {
"type": "object",
"required": [
"field_name",
"value"
],
"properties": {
"value": {
"type": "string",
"description": "The credential value."
},
"prefix": {
"type": "string",
"description": "Optional prefix, e.g. 'Bearer '."
},
"field_name": {
"type": "string",
"description": "Header, query or body field name."
}
},
"additionalProperties": false
}
}
},
"description": "Where the API key is injected. Supply at least one of headers, query_params, body_params.",
"additionalProperties": false
},
"oauth2_client_credentials": {
"type": "object",
"required": [
"token_url",
"client_id",
"client_secret",
"scopes_to_request"
],
"properties": {
"client_id": {
"type": "string"
},
"token_url": {
"type": "string"
},
"client_secret": {
"type": "string"
},
"scopes_to_request": {
"type": "array",
"items": {
"type": "string"
}
},
"token_request_content_type": {
"enum": [
"application/x-www-form-urlencoded",
"application/json"
],
"type": "string"
}
},
"description": "OAuth 2.0 client credentials.",
"additionalProperties": false
}
},
"description": "Credentials matching auth_type: `api_key` when auth_type is API_KEY, `oauth2_client_credentials` when it is OAUTH2_CLIENT_CREDENTIALS. Credentials can also be set later with upsert_connector_api_key or upsert_connector_oauth.",
"additionalProperties": false
},
"description": {
"type": "string",
"description": "What the connected system does."
},
"requires_certificate": {
"type": "boolean",
"description": "True when the system needs mTLS; upload the certificate with upsert_connector_certificate."
},
"user_auth_injection_config": {
"type": "object",
"description": "Optional configuration for injecting a per-user token into tool requests."
}
},
"additionalProperties": false
}| Optional login/refresh response extraction config, for user-auth actions. |
{
"type": "object",
"required": [
"app_id",
"connector_id",
"name",
"description",
"request_definition",
"user_auth_required"
],
"properties": {
"name": {
"type": "string",
"description": "Name the agent sees for this action."
},
"app_id": {
"type": "string",
"description": "The 360dialog channel's app_id. Identifies which WhatsApp number the agent belongs to."
},
"description": {
"type": "string",
"description": "What the action does - the agent uses this to decide when to call it."
},
"connector_id": {
"type": "string",
"description": "Connector id."
},
"request_definition": {
"type": "object",
"required": [
"method",
"path"
],
"properties": {
"body": {
"type": "object",
"required": [
"content_type",
"params"
],
"properties": {
"params": {
"type": "object",
"additionalProperties": {
"type": "object",
"required": [
"type"
],
"properties": {
"type": {
"enum": [
"object",
"array",
"string",
"integer",
"number",
"boolean"
],
"type": "string"
},
"items": {
"type": "string"
},
"binding": {
"type": "object",
"required": [
"kind"
],
"properties": {
"kind": {
"enum": [
"default",
"macro"
],
"type": "string"
},
"macro": {
"enum": [
"WHATSAPP_PHONE_NUMBER",
"WHATSAPP_IDENTITY_HASH",
"WHATSAPP_CURRENT_STATUS_ID"
],
"type": "string",
"description": "Used when kind is 'macro'."
},
"value": {
"type": "string",
"description": "Used when kind is 'default'."
}
},
"description": "Fixes the value instead of letting the agent supply it. Omit for agent-supplied input. Not allowed on an object or array node.",
"additionalProperties": false
},
"required": {
"type": "array",
"items": {
"type": "string"
}
},
"properties": {
"type": "object",
"additionalProperties": {
"type": "string"
}
},
"description": {
"type": "string"
}
},
"description": "Schema for one request body field or container.",
"additionalProperties": false
}
},
"required": {
"type": "array",
"items": {
"type": "string"
}
},
"content_type": {
"enum": [
"application/json"
],
"type": "string"
}
},
"description": "Omit when the request has no body.",
"additionalProperties": false
},
"path": {
"type": "string",
"description": "Path template. Every {placeholder} needs a matching key in path_parameters."
},
"method": {
"enum": [
"GET",
"POST",
"PUT",
"DELETE",
"PATCH"
],
"type": "string"
},
"headers": {
"type": "object",
"description": "Object keyed by parameter NAME, each value a parameter schema. Not an array.",
"additionalProperties": {
"type": "object",
"required": [
"type"
],
"properties": {
"type": {
"enum": [
"string",
"integer",
"number",
"boolean"
],
"type": "string"
},
"binding": {
"type": "object",
"required": [
"kind"
],
"properties": {
"kind": {
"enum": [
"default",
"macro"
],
"type": "string"
},
"macro": {
"enum": [
"WHATSAPP_PHONE_NUMBER",
"WHATSAPP_IDENTITY_HASH",
"WHATSAPP_CURRENT_STATUS_ID"
],
"type": "string",
"description": "Used when kind is 'macro'."
},
"value": {
"type": "string",
"description": "Used when kind is 'default'."
}
},
"description": "Fixes the value instead of letting the agent supply it. Omit for agent-supplied input. Not allowed on an object or array node.",
"additionalProperties": false
},
"required": {
"type": "boolean"
},
"description": {
"type": "string"
}
},
"description": "Schema for one path, query or header parameter.",
"additionalProperties": false
}
},
"path_parameters": {
"type": "object",
"description": "Object keyed by parameter NAME, each value a parameter schema. Not an array.",
"additionalProperties": {
"type": "object",
"required": [
"type"
],
"properties": {
"type": {
"enum": [
"string",
"integer",
"number",
"boolean"
],
"type": "string"
},
"binding": {
"type": "object",
"required": [
"kind"
],
"properties": {
"kind": {
"enum": [
"default",
"macro"
],
"type": "string"
},
"macro": {
"enum": [
"WHATSAPP_PHONE_NUMBER",
"WHATSAPP_IDENTITY_HASH",
"WHATSAPP_CURRENT_STATUS_ID"
],
"type": "string",
"description": "Used when kind is 'macro'."
},
"value": {
"type": "string",
"description": "Used when kind is 'default'."
}
},
"description": "Fixes the value instead of letting the agent supply it. Omit for agent-supplied input. Not allowed on an object or array node.",
"additionalProperties": false
},
"required": {
"type": "boolean"
},
"description": {
"type": "string"
}
},
"description": "Schema for one path, query or header parameter.",
"additionalProperties": false
}
},
"query_parameters": {
"type": "object",
"description": "Object keyed by parameter NAME, each value a parameter schema. Not an array.",
"additionalProperties": {
"type": "object",
"required": [
"type"
],
"properties": {
"type": {
"enum": [
"string",
"integer",
"number",
"boolean"
],
"type": "string"
},
"binding": {
"type": "object",
"required": [
"kind"
],
"properties": {
"kind": {
"enum": [
"default",
"macro"
],
"type": "string"
},
"macro": {
"enum": [
"WHATSAPP_PHONE_NUMBER",
"WHATSAPP_IDENTITY_HASH",
"WHATSAPP_CURRENT_STATUS_ID"
],
"type": "string",
"description": "Used when kind is 'macro'."
},
"value": {
"type": "string",
"description": "Used when kind is 'default'."
}
},
"description": "Fixes the value instead of letting the agent supply it. Omit for agent-supplied input. Not allowed on an object or array node.",
"additionalProperties": false
},
"required": {
"type": "boolean"
},
"description": {
"type": "string"
}
},
"description": "Schema for one path, query or header parameter.",
"additionalProperties": false
}
}
},
"description": "The outbound HTTP request this tool makes, relative to the connector's base_url.",
"additionalProperties": false
},
"user_auth_required": {
"type": "boolean",
"description": "True when the call needs a per-user token rather than the connector's own credentials."
},
"user_auth_action_config": {
"type": "object",
"description": "Optional login/refresh response extraction config, for user-auth actions."
}
},
"additionalProperties": false
}{
"type": "object",
"required": [
"app_id",
"title",
"component_type",
"status",
"instruction"
],
"properties": {
"title": {
"type": "string",
"description": "Human-readable name for the UI skill."
},
"app_id": {
"type": "string",
"description": "The 360dialog channel's app_id. Identifies which WhatsApp number the agent belongs to."
},
"status": {
"enum": [
"enabled",
"disabled"
],
"type": "string",
"description": "Whether the agent may send this component. Only an enabled UI skill is available to the agent."
},
"flow_id": {
"type": "integer",
"description": "The flow to send. Required when component_type is `flow`, refused otherwise."
},
"instruction": {
"type": "string",
"description": "Tells the agent when to send this component, e.g. 'Send this when the customer asks to browse the catalog'."
},
"component_type": {
"enum": [
"carousel_quick_reply",
"carousel_url",
"cta_url",
"flow",
"image",
"interactive_list",
"interactive_reply_buttons",
"location",
"location_request"
],
"type": "string",
"description": "The kind of rich message this UI skill sends. Cannot be changed after creation."
}
},
"additionalProperties": false
}| array |
| Split each bucket by these axes. Omit to total the whole agent per bucket. |
| sender_ids | array | Only usage attributed to these sending entities. |
| granularity* | string | Size of each bucket. |
| metric_types | array | Which metrics to return. Omit for all of them. |
| billable_account_id* | string | The billable account ID of the Meta Business Agent account. No other tool returns it: Meta Billing Hub shows it under Accounts > Meta Business Agent accounts. It is not the Business Manager ID the budget tools take. |
{
"type": "object",
"required": [
"app_id",
"billable_account_id",
"start",
"end",
"granularity"
],
"properties": {
"end": {
"type": "integer",
"description": "End of the range, Unix seconds. Exclusive: buckets that start before it."
},
"start": {
"type": "integer",
"description": "Start of the range, Unix seconds. Inclusive: buckets that start at or after it."
},
"app_id": {
"type": "string",
"description": "The 360dialog channel's app_id. Identifies which WhatsApp number the agent belongs to."
},
"channels": {
"type": "array",
"items": {
"enum": [
"whatsapp"
],
"type": "string"
},
"description": "Only usage on these messaging surfaces.",
"uniqueItems": true
},
"dimensions": {
"type": "array",
"items": {
"enum": [
"channel",
"sender_id"
],
"type": "string"
},
"description": "Split each bucket by these axes. Omit to total the whole agent per bucket.",
"uniqueItems": true
},
"sender_ids": {
"type": "array",
"items": {
"type": "string"
},
"description": "Only usage attributed to these sending entities.",
"uniqueItems": true
},
"granularity": {
"enum": [
"HOUR",
"DAY",
"MONTH"
],
"type": "string",
"description": "Size of each bucket."
},
"metric_types": {
"type": "array",
"items": {
"enum": [
"billable_messages",
"billable_tokens",
"cost"
],
"type": "string"
},
"description": "Which metrics to return. Omit for all of them.",
"uniqueItems": true
},
"billable_account_id": {
"type": "string",
"description": "The billable account ID of the Meta Business Agent account. No other tool returns it: Meta Billing Hub shows it under Accounts > Meta Business Agent accounts. It is not the Business Manager ID the budget tools take."
}
},
"additionalProperties": false
}| boolean |
| Return failure patterns instead of entries. |
| include_stats | boolean | Add aggregate statistics. |
{
"type": "object",
"required": [
"app_id",
"connector_id"
],
"properties": {
"limit": {
"type": "integer",
"maximum": 1000,
"minimum": 1,
"description": "Default 100."
},
"top_n": {
"type": "integer",
"maximum": 50,
"minimum": 1,
"description": "Default 10."
},
"app_id": {
"type": "string",
"description": "The 360dialog channel's app_id. Identifies which WhatsApp number the agent belongs to."
},
"tool_id": {
"type": "string",
"description": "Restrict to one connector tool."
},
"end_time": {
"type": "integer",
"description": "End of the range, Unix seconds."
},
"start_time": {
"type": "integer",
"description": "Start of the range, Unix seconds. Must be within the last 7 days."
},
"connector_id": {
"type": "string",
"description": "Connector id."
},
"summary_only": {
"type": "boolean",
"description": "Return failure patterns instead of entries."
},
"include_stats": {
"type": "boolean",
"description": "Add aggregate statistics."
}
},
"additionalProperties": false
}| start_timestamp_ms | integer | Only turns that started at or after this Unix time in milliseconds. |
{
"type": "object",
"required": [
"app_id",
"user_phone_number"
],
"properties": {
"after": {
"type": "string",
"description": "Cursor - return the page immediately after it."
},
"limit": {
"type": "integer",
"minimum": 1,
"description": "Maximum entries per page. A page can be shorter."
},
"app_id": {
"type": "string",
"description": "The 360dialog channel's app_id. Identifies which WhatsApp number the agent belongs to."
},
"before": {
"type": "string",
"description": "Cursor - return the page immediately before it."
},
"end_timestamp_ms": {
"type": "integer",
"description": "Only turns that started at or before this Unix time in milliseconds."
},
"user_phone_number": {
"type": "string",
"description": "The customer: a phone number in digits only with the country code (15551234567, no + or separators), a Business-Scoped User ID such as US.2788620304833812, or the conversation_id returned by test_agent. Prefer the BSUID for a customer who has ever used a WhatsApp username - their phone number may be unknown, which returns Consumer not found."
},
"start_timestamp_ms": {
"type": "integer",
"description": "Only turns that started at or after this Unix time in milliseconds."
}
},
"additionalProperties": false
}{
"type": "object",
"required": [
"app_id",
"business_id",
"budgets"
],
"properties": {
"app_id": {
"type": "string",
"description": "The 360dialog channel's app_id. Identifies which WhatsApp number the agent belongs to."
},
"budgets": {
"type": "array",
"items": {
"type": "object",
"required": [
"unit_type",
"time_window",
"max_budget"
],
"properties": {
"budget_id": {
"type": "string",
"description": "The id get_agent_budgets returned for an existing cap. Pass it to edit or keep that cap; omit it to add a new cap."
},
"unit_type": {
"enum": [
"token",
"ai_turn"
],
"type": "string",
"description": "What the cap measures: token usage or AI agent turns."
},
"max_budget": {
"type": "integer",
"minimum": 1,
"description": "The maximum usage, in unit_type, within time_window."
},
"time_window": {
"enum": [
"one_day",
"seven_days",
"fourteen_days",
"thirty_days"
],
"type": "string",
"description": "The rolling period usage is totalled over, in the timezone of the WABA."
}
},
"additionalProperties": false
},
"description": "The complete set of caps. An empty array removes every cap."
},
"business_id": {
"type": "string",
"description": "The Meta Business Manager ID of the business that owns this number's WABA. No other tool returns it: it is the WABA's owner business in Meta Business Suite, and the 360dialog hub shows it on the channel."
}
},
"additionalProperties": false
}| string |
| Delivery and shipping terms. |
{
"type": "object",
"required": [
"app_id"
],
"properties": {
"app_id": {
"type": "string",
"description": "The 360dialog channel's app_id. Identifies which WhatsApp number the agent belongs to."
},
"contact_info": {
"type": "object",
"properties": {
"email": {
"type": "string"
},
"address": {
"type": "string"
},
"hours_of_operation": {
"type": "string"
}
},
"description": "Contact and location details.",
"additionalProperties": false
},
"purchase_info": {
"type": "string",
"description": "How customers buy."
},
"return_policy": {
"type": "string",
"description": "Returns and refunds."
},
"payment_method": {
"type": "string",
"description": "Accepted payment methods."
},
"business_description": {
"type": "string",
"description": "What the business does."
},
"delivery_and_shipping": {
"type": "string",
"description": "Delivery and shipping terms."
}
},
"additionalProperties": false
}| requires_certificate |
| boolean |
| True when the system needs mTLS; upload the certificate with upsert_connector_certificate. |
| user_auth_injection_config | object | Optional configuration for injecting a per-user token into tool requests. |
{
"type": "object",
"required": [
"app_id",
"connector_id",
"name",
"description",
"base_url",
"auth_type"
],
"properties": {
"name": {
"type": "string",
"description": "Name of the connector."
},
"app_id": {
"type": "string",
"description": "The 360dialog channel's app_id. Identifies which WhatsApp number the agent belongs to."
},
"base_url": {
"type": "string",
"description": "Base URL every tool on this connector calls."
},
"auth_type": {
"enum": [
"OAUTH2",
"OAUTH2_CLIENT_CREDENTIALS",
"API_KEY",
"BASIC",
"CUSTOM",
"NONE"
],
"type": "string",
"description": "How the connected system authenticates."
},
"auth_config": {
"type": "object",
"properties": {
"api_key": {
"type": "object",
"properties": {
"headers": {
"type": "array",
"items": {
"type": "object",
"required": [
"field_name",
"value"
],
"properties": {
"value": {
"type": "string",
"description": "The credential value."
},
"prefix": {
"type": "string",
"description": "Optional prefix, e.g. 'Bearer '."
},
"field_name": {
"type": "string",
"description": "Header, query or body field name."
}
},
"additionalProperties": false
}
},
"body_params": {
"type": "array",
"items": {
"type": "object",
"required": [
"field_name",
"value"
],
"properties": {
"value": {
"type": "string",
"description": "The credential value."
},
"prefix": {
"type": "string",
"description": "Optional prefix, e.g. 'Bearer '."
},
"field_name": {
"type": "string",
"description": "Header, query or body field name."
}
},
"additionalProperties": false
}
},
"query_params": {
"type": "array",
"items": {
"type": "object",
"required": [
"field_name",
"value"
],
"properties": {
"value": {
"type": "string",
"description": "The credential value."
},
"prefix": {
"type": "string",
"description": "Optional prefix, e.g. 'Bearer '."
},
"field_name": {
"type": "string",
"description": "Header, query or body field name."
}
},
"additionalProperties": false
}
}
},
"description": "Where the API key is injected. Supply at least one of headers, query_params, body_params.",
"additionalProperties": false
},
"oauth2_client_credentials": {
"type": "object",
"required": [
"token_url",
"client_id",
"client_secret",
"scopes_to_request"
],
"properties": {
"client_id": {
"type": "string"
},
"token_url": {
"type": "string"
},
"client_secret": {
"type": "string"
},
"scopes_to_request": {
"type": "array",
"items": {
"type": "string"
}
},
"token_request_content_type": {
"enum": [
"application/x-www-form-urlencoded",
"application/json"
],
"type": "string"
}
},
"description": "OAuth 2.0 client credentials.",
"additionalProperties": false
}
},
"description": "Credentials matching auth_type: `api_key` when auth_type is API_KEY, `oauth2_client_credentials` when it is OAUTH2_CLIENT_CREDENTIALS. Credentials can also be set later with upsert_connector_api_key or upsert_connector_oauth.",
"additionalProperties": false
},
"description": {
"type": "string",
"description": "What the connected system does."
},
"connector_id": {
"type": "string",
"description": "Connector id."
},
"requires_certificate": {
"type": "boolean",
"description": "True when the system needs mTLS; upload the certificate with upsert_connector_certificate."
},
"user_auth_injection_config": {
"type": "object",
"description": "Optional configuration for injecting a per-user token into tool requests."
}
},
"additionalProperties": false
}| user_auth_required* |
| boolean |
| True when the call needs a per-user token rather than the connector's own credentials. |
| user_auth_action_config | object | Optional login/refresh response extraction config, for user-auth actions. |
{
"type": "object",
"required": [
"app_id",
"connector_id",
"tool_id",
"name",
"description",
"request_definition",
"user_auth_required"
],
"properties": {
"name": {
"type": "string",
"description": "Name the agent sees for this action."
},
"app_id": {
"type": "string",
"description": "The 360dialog channel's app_id. Identifies which WhatsApp number the agent belongs to."
},
"tool_id": {
"type": "string",
"description": "Connector tool id."
},
"description": {
"type": "string",
"description": "What the action does - the agent uses this to decide when to call it."
},
"connector_id": {
"type": "string",
"description": "Connector id."
},
"request_definition": {
"type": "object",
"required": [
"method",
"path"
],
"properties": {
"body": {
"type": "object",
"required": [
"content_type",
"params"
],
"properties": {
"params": {
"type": "object",
"additionalProperties": {
"type": "object",
"required": [
"type"
],
"properties": {
"type": {
"enum": [
"object",
"array",
"string",
"integer",
"number",
"boolean"
],
"type": "string"
},
"items": {
"type": "string"
},
"binding": {
"type": "object",
"required": [
"kind"
],
"properties": {
"kind": {
"enum": [
"default",
"macro"
],
"type": "string"
},
"macro": {
"enum": [
"WHATSAPP_PHONE_NUMBER",
"WHATSAPP_IDENTITY_HASH",
"WHATSAPP_CURRENT_STATUS_ID"
],
"type": "string",
"description": "Used when kind is 'macro'."
},
"value": {
"type": "string",
"description": "Used when kind is 'default'."
}
},
"description": "Fixes the value instead of letting the agent supply it. Omit for agent-supplied input. Not allowed on an object or array node.",
"additionalProperties": false
},
"required": {
"type": "array",
"items": {
"type": "string"
}
},
"properties": {
"type": "object",
"additionalProperties": {
"type": "string"
}
},
"description": {
"type": "string"
}
},
"description": "Schema for one request body field or container.",
"additionalProperties": false
}
},
"required": {
"type": "array",
"items": {
"type": "string"
}
},
"content_type": {
"enum": [
"application/json"
],
"type": "string"
}
},
"description": "Omit when the request has no body.",
"additionalProperties": false
},
"path": {
"type": "string",
"description": "Path template. Every {placeholder} needs a matching key in path_parameters."
},
"method": {
"enum": [
"GET",
"POST",
"PUT",
"DELETE",
"PATCH"
],
"type": "string"
},
"headers": {
"type": "object",
"description": "Object keyed by parameter NAME, each value a parameter schema. Not an array.",
"additionalProperties": {
"type": "object",
"required": [
"type"
],
"properties": {
"type": {
"enum": [
"string",
"integer",
"number",
"boolean"
],
"type": "string"
},
"binding": {
"type": "object",
"required": [
"kind"
],
"properties": {
"kind": {
"enum": [
"default",
"macro"
],
"type": "string"
},
"macro": {
"enum": [
"WHATSAPP_PHONE_NUMBER",
"WHATSAPP_IDENTITY_HASH",
"WHATSAPP_CURRENT_STATUS_ID"
],
"type": "string",
"description": "Used when kind is 'macro'."
},
"value": {
"type": "string",
"description": "Used when kind is 'default'."
}
},
"description": "Fixes the value instead of letting the agent supply it. Omit for agent-supplied input. Not allowed on an object or array node.",
"additionalProperties": false
},
"required": {
"type": "boolean"
},
"description": {
"type": "string"
}
},
"description": "Schema for one path, query or header parameter.",
"additionalProperties": false
}
},
"path_parameters": {
"type": "object",
"description": "Object keyed by parameter NAME, each value a parameter schema. Not an array.",
"additionalProperties": {
"type": "object",
"required": [
"type"
],
"properties": {
"type": {
"enum": [
"string",
"integer",
"number",
"boolean"
],
"type": "string"
},
"binding": {
"type": "object",
"required": [
"kind"
],
"properties": {
"kind": {
"enum": [
"default",
"macro"
],
"type": "string"
},
"macro": {
"enum": [
"WHATSAPP_PHONE_NUMBER",
"WHATSAPP_IDENTITY_HASH",
"WHATSAPP_CURRENT_STATUS_ID"
],
"type": "string",
"description": "Used when kind is 'macro'."
},
"value": {
"type": "string",
"description": "Used when kind is 'default'."
}
},
"description": "Fixes the value instead of letting the agent supply it. Omit for agent-supplied input. Not allowed on an object or array node.",
"additionalProperties": false
},
"required": {
"type": "boolean"
},
"description": {
"type": "string"
}
},
"description": "Schema for one path, query or header parameter.",
"additionalProperties": false
}
},
"query_parameters": {
"type": "object",
"description": "Object keyed by parameter NAME, each value a parameter schema. Not an array.",
"additionalProperties": {
"type": "object",
"required": [
"type"
],
"properties": {
"type": {
"enum": [
"string",
"integer",
"number",
"boolean"
],
"type": "string"
},
"binding": {
"type": "object",
"required": [
"kind"
],
"properties": {
"kind": {
"enum": [
"default",
"macro"
],
"type": "string"
},
"macro": {
"enum": [
"WHATSAPP_PHONE_NUMBER",
"WHATSAPP_IDENTITY_HASH",
"WHATSAPP_CURRENT_STATUS_ID"
],
"type": "string",
"description": "Used when kind is 'macro'."
},
"value": {
"type": "string",
"description": "Used when kind is 'default'."
}
},
"description": "Fixes the value instead of letting the agent supply it. Omit for agent-supplied input. Not allowed on an object or array node.",
"additionalProperties": false
},
"required": {
"type": "boolean"
},
"description": {
"type": "string"
}
},
"description": "Schema for one path, query or header parameter.",
"additionalProperties": false
}
}
},
"description": "The outbound HTTP request this tool makes, relative to the connector's base_url.",
"additionalProperties": false
},
"user_auth_required": {
"type": "boolean",
"description": "True when the call needs a per-user token rather than the connector's own credentials."
},
"user_auth_action_config": {
"type": "object",
"description": "Optional login/refresh response extraction config, for user-auth actions."
}
},
"additionalProperties": false
}