Messages

ToolREST endpointAnnotations
send_messagePOST /v1/messageswrite, non-destructive
send_template_messagePOST /v1/messages/templatewrite, non-destructive
list_scheduled_messagesGET /v1/messages/scheduledread-only, idempotent
get_scheduled_messageGET /v1/messages/scheduled/{messageId}read-only, idempotent
reschedule_scheduled_messagePATCH /v1/messages/scheduled/{messageId}write, non-destructive
cancel_scheduled_messageDELETE /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

FieldTypeRequiredDescription
channelIdstringyesChannel of the agent that will send the message.
conversationIdstringyesCustomer's phone number or conversation identifier.
contentstring \| objectyesPlain text, structured content for media/interactive messages, or an instruction for the agent.
type"text" \| "image" \| "video" \| "file" \| "audio" \| "interactive" \| "email" \| "instruction"noMessage type when content is an object. If content is a string, text is used.
clientobjectnoCustomer data (name, email, customFields, owners, …) used to create/enrich them.
campaignIdstringnoGroups the send under a campaign. Default "api".
delaynumber msnoSchedule with a delay (3000-86,400,000 ms; maximum 24 hours).
scheduleTimeISO 8601noSchedule 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"
    }
  }
}

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

FieldTypeRequiredDescription
channelIdstringyesSender channel (prefixedChannelId recommended; legacy phone/ID accepted).
responderAgentIdstringnoAgent that handles replies; it does not need to own the sender channel.
conversationIdstringyesDestination phone number in E.164 format.
template.namestringyesExact template name.
template.type"image" \| "video" \| "document"noIf the template has a media header.
template.filestring (URL)noPublic file URL when type is present.
template.paramsstring[]noOrdered values for the body variables.
template.buttons[]objectnoOverride of dynamic button parameters (max 3).
template.components[]objectnoAdditional components (rarely needed).
clientobjectnoCustomer data (name, email, …) used to create/enrich them.
campaignIdstringnoGroups the send under a campaign. Default "api".
delaynumber msnoSchedule with a delay (3000-86,400,000 ms; maximum 24 hours).
scheduleTimeISO 8601noSchedule 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"
    }
  }
}

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

FieldTypeDefaultDescription
workspacestring—Workspace to query. Required only for multi-workspace credentials.
statusCSV stringcreating,delayed,scheduled,processingStatuses to include: creating, delayed, scheduled, processing, sent, cancelled, failed.
kind"service" \| "template"—Filters by message kind.
campaignIdstring—Filters by campaign; it is not required to manage the result.
fromISO 8601—Start of the executeAt range.
toISO 8601—End of the executeAt range.
limit1-20050Maximum results per page.
pageTokenstring—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

FieldTypeRequiredDescription
messageIdstringyesID returned by a scheduled send tool.
workspacestringno¹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

FieldTypeRequiredDescription
messageIdstringyesPublic message ID.
scheduleTimeISO 8601yes¹New future time, no more than 30 days after the request.
delaynumber msyes¹New delay from 3000 to 86400000 ms (24 hours).
workspacestringno²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

FieldTypeRequiredDescription
messageIdstringyesPublic message ID.
workspacestringno¹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.