Messages
| Tool | REST endpoint | Annotations |
|---|---|---|
send_message | POST /v1/messages | write, non-destructive |
send_template_message | POST /v1/messages/template | write, non-destructive |
list_scheduled_messages | GET /v1/messages/scheduled | read-only, idempotent |
get_scheduled_message | GET /v1/messages/scheduled/{messageId} | read-only, idempotent |
reschedule_scheduled_message | PATCH /v1/messages/scheduled/{messageId} | write, non-destructive |
cancel_scheduled_message | DELETE /v1/messages/scheduled/{messageId} | write, destructive, idempotent |
REST failures are returned as execution errors; see MCP Errors .
send_message
Sends a personalized message inside an existing conversation. The tool resolves the conversation via conversationId and channelId; if there are several conversations for the same phone number, it uses the most recent one that matches the channel. canSendDirectMessage can only be false on WhatsApp, Instagram, and Messenger/Facebook and is calculated from the latest user message.
Arguments
| Field | Type | Required | Description |
|---|---|---|---|
channelId | string | yes | Channel of the agent that will send the message. |
conversationId | string | yes | Customer's phone number or conversation identifier. |
content | string \| object | yes | Plain text, structured content for media/interactive messages, or an instruction for the agent. |
type | "text" \| "image" \| "video" \| "file" \| "audio" \| "interactive" \| "email" \| "instruction" | no | Message type when content is an object. If content is a string, text is used. |
client | object | no | Customer data (name, email, customFields, owners, …) used to create/enrich them. |
campaignId | string | no | Groups the send under a campaign. Default "api". |
delay | number ms | no | Schedule with a delay (3000-86,400,000 ms; maximum 24 hours). |
scheduleTime | ISO 8601 | no | Schedule at an exact future time, no more than 30 days after the request. Mutually exclusive with delay. |
Invocation example
{
"name": "send_message",
"arguments": {
"channelId": "wb-12345",
"conversationId": "+521234567890",
"content": "Hola, te escribo desde Platica API",
"client": {
"name": "Ana López",
"customFields": {
"placas": "ABC123"
}
}
}
} Media example
{
"name": "send_message",
"arguments": {
"channelId": "wb-12345",
"conversationId": "+521234567890",
"type": "image",
"content": {
"image": {
"url": "https://cdn.assets.com/foto.jpg",
"caption": "Aquí está la foto"
}
}
}
} Agent instruction example
An instruction does not reach the customer: it is applied to the agent operating the conversation. Use mode: "wait" to have the agent wait for the next customer message with the instruction recorded as context, or mode: "resume" to resume the agent so it continues the flow.
{
"name": "send_message",
"arguments": {
"channelId": "wb-12345",
"conversationId": "+521234567890",
"type": "instruction",
"content": {
"text": "Continúa con el flujo de venta y ofrece un descuento del 10%.",
"mode": "resume"
}
}
} If canSendDirectMessage is false on WhatsApp, use send_template_message. On Instagram and
Messenger/Facebook, follow the channel policy. It is always true on internal platica chats: use a workspace-{workspaceId}-agent-{agentId} channelId and the chat_* conversationId. They support
text, image, video, file, audio, and wait/resume instructions; interactive, email, and
templates are not supported.
send_template_message
Sends a message based on an approved WhatsApp template to the customer identified by conversationId (international phone number). Creates the conversation and/or the customer if they don't exist. It can be sent immediately, with delay (from 3000 ms to 24 hours), or with scheduleTime (ISO 8601, no more than 30 days after the request; Mexico time if no zone is included).
Arguments
| Field | Type | Required | Description |
|---|---|---|---|
channelId | string | yes | Sender channel (prefixedChannelId recommended; legacy phone/ID accepted). |
responderAgentId | string | no | Agent that handles replies; it does not need to own the sender channel. |
conversationId | string | yes | Destination phone number in E.164 format. |
template.name | string | yes | Exact template name. |
template.type | "image" \| "video" \| "document" | no | If the template has a media header. |
template.file | string (URL) | no | Public file URL when type is present. |
template.params | string[] | no | Ordered values for the body variables. |
template.buttons[] | object | no | Override of dynamic button parameters (max 3). |
template.components[] | object | no | Additional components (rarely needed). |
client | object | no | Customer data (name, email, …) used to create/enrich them. |
campaignId | string | no | Groups the send under a campaign. Default "api". |
delay | number ms | no | Schedule with a delay (3000-86,400,000 ms; maximum 24 hours). |
scheduleTime | ISO 8601 | no | Schedule at an exact future time, no more than 30 days after the request. Mutually exclusive with delay. |
Invocation example
{
"name": "send_template_message",
"arguments": {
"channelId": "wb-12345",
"conversationId": "+521234567890",
"template": {
"name": "bienvenida_v1",
"params": ["Ana", "10%"]
},
"client": {
"name": "Ana López",
"email": "ana@example.com"
}
}
} Use list_templates or get_template before invoking send_template_message to discover the exact shape of params, buttons, and components. The get_template response includes an api_example field with the payload ready to paste as arguments.
When responderAgentId is omitted with a canonical channel, the new
conversation starts initiated and unassigned. The channel default is not
inherited. A legacy agent-phone identifier still preserves that agent. A
contact with status: "blocked" receives CONTACT_BLOCKED and no message is
sent.
When send_message or send_template_message receives delay or scheduleTime, its HTTP 202 result includes messageId, kind, status, UTC executeAt, timestamp, and either delayMs or scheduledTime. That messageId is enough to use the next four tools; you do not need campaignId, runId, or an internal task ID.
list_scheduled_messages
Lists scheduled service messages and templates. Without status, it returns active messages: creating, delayed, scheduled, and processing.
Arguments
| Field | Type | Default | Description |
|---|---|---|---|
workspace | string | — | Workspace to query. Required only for multi-workspace credentials. |
status | CSV string | creating,delayed,scheduled,processing | Statuses to include: creating, delayed, scheduled, processing, sent, cancelled, failed. |
kind | "service" \| "template" | — | Filters by message kind. |
campaignId | string | — | Filters by campaign; it is not required to manage the result. |
from | ISO 8601 | — | Start of the executeAt range. |
to | ISO 8601 | — | End of the executeAt range. |
limit | 1-200 | 50 | Maximum results per page. |
pageToken | string | — | Opaque token returned by the previous page. |
Invocation example
{
"name": "list_scheduled_messages",
"arguments": {
"status": "scheduled,processing",
"kind": "template",
"from": "2026-10-01T00:00:00Z",
"to": "2026-11-01T00:00:00Z",
"limit": 50
}
} Result
{
"messages": [
{
"messageId": "msg_01JQ91AB7C4D8E2F6G0H",
"kind": "template",
"status": "scheduled",
"channelId": "wb-12345",
"conversationId": "5215512345678",
"campaignId": "api",
"messageType": null,
"templateName": "appointment_reminder",
"preview": "Hi Ana, this is a reminder for your appointment...",
"phoneNumber": "5215512345678",
"name": "Ana López",
"executeAt": "2026-10-15T15:45:00.000Z",
"createdAt": "2026-09-20T20:00:00.000Z",
"updatedAt": "2026-09-20T20:00:00.000Z",
"cancelledAt": null,
"sentAt": null,
"failedAt": null,
"error": null,
"reschedulable": true
}
],
"count": 1,
"nextPageToken": "eyJleGVjdXRlQXQiOiIyMDI2LTEwLTE1VDE1OjQ1OjAwLjAwMFoifQ"
} To continue, keep the same filters and pass nextPageToken as pageToken. When it is absent, there
are no more pages.
get_scheduled_message
Retrieves a scheduled message by its public identifier.
Arguments
| Field | Type | Required | Description |
|---|---|---|---|
messageId | string | yes | ID returned by a scheduled send tool. |
workspace | string | no¹ | Message workspace. |
¹ Required when the credential can access multiple workspaces.
Invocation example
{
"name": "get_scheduled_message",
"arguments": {
"messageId": "msg_01JQ91AB7C4D8E2F6G0H"
}
} The result is one resource with the same public fields as an item from list_scheduled_messages. conversationId, campaignId, messageType, templateName, preview, phoneNumber, name, cancelledAt, sentAt, failedAt, and error can be null. It never includes the full payload or taskId.
reschedule_scheduled_message
Changes the execution time of a message that still has reschedulable: true. Send exactly one of scheduleTime or delay.
Arguments
| Field | Type | Required | Description |
|---|---|---|---|
messageId | string | yes | Public message ID. |
scheduleTime | ISO 8601 | yes¹ | New future time, no more than 30 days after the request. |
delay | number ms | yes¹ | New delay from 3000 to 86400000 ms (24 hours). |
workspace | string | no² | Message workspace. |
¹ Send exactly one. ² Required for multi-workspace credentials.
Invocation example
{
"name": "reschedule_scheduled_message",
"arguments": {
"messageId": "msg_01JQ91AB7C4D8E2F6G0H",
"scheduleTime": "2026-10-16T10:30:00-06:00"
}
} The result is the updated resource. With scheduleTime, status becomes scheduled; with delay, delayed. Public dates, including executeAt, are always normalized to UTC. A message in processing, sent, cancelled, or failed can no longer be rescheduled; the REST 409 is
returned as an MCP execution error.
cancel_scheduled_message
Cancels a message before it starts processing.
Arguments
| Field | Type | Required | Description |
|---|---|---|---|
messageId | string | yes | Public message ID. |
workspace | string | no¹ | Message workspace. |
¹ Required for multi-workspace credentials.
Invocation example
{
"name": "cancel_scheduled_message",
"arguments": {
"messageId": "msg_01JQ91AB7C4D8E2F6G0H"
}
} The tool returns the resource with status: "cancelled", cancelledAt, and reschedulable: false. It is idempotent: repeating it returns the same cancelled resource. processing, sent, and failed states produce 409.
See Scheduled Messages for the complete contract, states, and fields.
send_chat_message uses scheduleAt to schedule a client turn with an agent. That flow is separate
and is not managed with the scheduled-message tools.