WhatsApp Business Cloud
Canonical tools, triggers, auth, schemas, and mock behavior for WhatsApp Business Cloud.
Run a valid whatsapp-business.get_message call through the same SDK surface used by every toolkit.
Minimal tool call
import { Eyeball } from "@eyeball/sdk";
const eyeball = new Eyeball({
apiKey: process.env.EYEBALL_API_KEY!,
baseUrl: process.env.EYEBALL_EXECUTOR_URL!,
});
const output = await eyeball.tools.run(
"whatsapp-business.get_message",
{
"conversationId": "example_conversationId",
"messageId": "example_messageId"
},
{ userId: "demo_user" },
);
console.log(output);The model receives canonical output. Your application retains the execution envelope through tools.execute or the execution APIs when it needs IDs, status, versions, and latency.
Supported canonical tools
| Tool | Purpose | Execution | Effect | Version |
|---|---|---|---|---|
whatsapp-business.get_message | Retrieve one message and its normalized sender, content, thread, attachment, and reaction metadata. Use this after obtaining both the conversation and message identifiers. | sync or async | read | 1.0.0 |
whatsapp-business.send_message | Send a new message to a channel, room, group, chat, or direct conversation. Use reply_to_message when preserving a specific thread or reply relationship matters; verify the destination and content before sending. | sync or async | mutation | 1.0.0 |
Only the rows above are implemented. A capability tool omitted by this manifest returns not_supported; eyeball never synthesizes provider parity.
Supported canonical triggers
This manifest does not implement a canonical trigger.
Input and output schemas
whatsapp-business.get_message
Input schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "urn:eyeball:messaging_chat:get_message:1.0.0:whatsapp-business",
"type": "object",
"description": "Conversation and message identifiers for one provider message.",
"additionalProperties": false,
"required": [
"conversationId",
"messageId"
],
"properties": {
"conversationId": {
"type": "string",
"description": "Provider identifier of the conversation containing the message.",
"minLength": 1
},
"messageId": {
"type": "string",
"description": "Provider identifier of the message to retrieve.",
"minLength": 1
}
}
}Output schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "urn:eyeball:messaging_chat:get_message:output:1.0.0:whatsapp-business",
"type": "object",
"description": "Normalized content and metadata for one conversation message.",
"additionalProperties": false,
"required": [
"messageId",
"conversationId",
"sender",
"text",
"sentAt"
],
"properties": {
"messageId": {
"type": "string",
"description": "Provider identifier of the message.",
"minLength": 1
},
"conversationId": {
"type": "string",
"description": "Provider identifier of the containing conversation.",
"minLength": 1
},
"sender": {
"type": "object",
"description": "Normalized identity of the member or bot that sent the message.",
"additionalProperties": false,
"required": [
"memberId",
"displayName"
],
"properties": {
"memberId": {
"type": "string",
"description": "Provider identifier of the sender.",
"minLength": 1
},
"displayName": {
"type": "string",
"description": "Human-readable sender name at retrieval time.",
"minLength": 1
},
"handle": {
"type": "string",
"description": "Provider handle or username when available.",
"minLength": 1
},
"isBot": {
"type": "boolean",
"description": "Whether the sender is represented as a bot or application account."
}
}
},
"text": {
"type": "string",
"description": "Normalized plain-text representation of the message content."
},
"rawMarkup": {
"type": "string",
"description": "Original provider markup when it differs materially from normalized text."
},
"sentAt": {
"type": "string",
"format": "date-time",
"description": "RFC 3339 timestamp when the message was sent."
},
"editedAt": {
"type": "string",
"format": "date-time",
"description": "RFC 3339 timestamp of the latest edit when the message was edited."
},
"threadId": {
"type": "string",
"description": "Provider identifier of the containing thread when applicable.",
"minLength": 1
},
"replyToMessageId": {
"type": "string",
"description": "Provider identifier of the directly referenced parent message.",
"minLength": 1
},
"attachments": {
"type": "array",
"description": "Metadata for files attached to the message.",
"items": {
"type": "object",
"description": "Metadata identifying one message attachment.",
"additionalProperties": false,
"required": [
"attachmentId",
"fileName"
],
"properties": {
"attachmentId": {
"type": "string",
"description": "Provider-stable identifier for the attachment.",
"minLength": 1
},
"fileName": {
"type": "string",
"description": "Attachment file name shown in the conversation.",
"minLength": 1
},
"contentType": {
"type": "string",
"description": "MIME content type reported for the attachment.",
"minLength": 1
},
"url": {
"type": "string",
"format": "uri",
"description": "Provider URL for the attachment when the connection can access it."
}
}
}
},
"reactions": {
"type": "array",
"description": "Aggregated reactions currently attached to the message.",
"items": {
"type": "object",
"description": "One reaction value and its current aggregate count.",
"additionalProperties": false,
"required": [
"reaction",
"count"
],
"properties": {
"reaction": {
"type": "string",
"description": "Provider-supported emoji, shortcode, or reaction identifier.",
"minLength": 1
},
"count": {
"type": "integer",
"description": "Number of members who applied this reaction.",
"minimum": 0
},
"reactedByConnection": {
"type": "boolean",
"description": "Whether the connected bot or account applied this reaction."
}
}
}
}
}
}whatsapp-business.send_message
Input schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "urn:eyeball:messaging_chat:send_message:1.0.0:whatsapp-business",
"type": "object",
"description": "Destination conversation, message content, and optional staged attachments.",
"additionalProperties": false,
"required": [
"conversationId",
"text"
],
"properties": {
"conversationId": {
"type": "string",
"description": "Provider identifier of the destination channel, room, group, chat, or direct conversation.",
"minLength": 1
},
"text": {
"type": "string",
"description": "Complete message text in the provider's supported plain-text or markup syntax.",
"minLength": 1
},
"replyToMessageId": {
"type": "string",
"description": "Optional parent message identifier when sending into a thread without strict reply semantics.",
"minLength": 1
},
"attachments": {
"type": "array",
"description": "Previously staged Eyeball files to attach to the message.",
"maxItems": 10,
"items": {
"type": "object",
"description": "A staged file reference that the provider can attach.",
"additionalProperties": false,
"required": [
"fileId",
"fileName"
],
"properties": {
"fileId": {
"type": "string",
"description": "Eyeball identifier of the previously staged file.",
"minLength": 1
},
"fileName": {
"type": "string",
"description": "File name conversation members should see.",
"minLength": 1
},
"contentType": {
"type": "string",
"description": "MIME content type of the staged file when known.",
"minLength": 1
}
}
}
}
}
}Output schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "urn:eyeball:messaging_chat:send_message:output:1.0.0:whatsapp-business",
"type": "object",
"description": "Provider identifiers and send timestamp for the newly created message.",
"additionalProperties": false,
"required": [
"messageId",
"conversationId",
"sentAt"
],
"properties": {
"messageId": {
"type": "string",
"description": "Provider identifier of the created message.",
"minLength": 1
},
"conversationId": {
"type": "string",
"description": "Provider identifier of the destination conversation.",
"minLength": 1
},
"sentAt": {
"type": "string",
"format": "date-time",
"description": "RFC 3339 timestamp when the provider accepted or sent the message."
}
}
}Authentication
| Property | Value |
|---|---|
| Auth class | api_key |
| Required scopes | None |
| Optional scopes | None |
| Credential fields | apiKey, phoneNumberId |
Credentials are resolved inside the executor by CredentialProvider. They never belong in tool input, x_provider, model context, logs, or execution output.
Provider-specific extensions
This manifest declares no provider-specific schema extensions. Use only canonical fields.
Provider differences may appear only under x_provider.whatsapp-business and only when the schema above declares them.
Sync and async behavior
All tools are synchronous by nature, but callers may choose mode: "async" to queue them.
Mutations require a stable Idempotency-Key. The TypeScript SDK accepts it as idempotencyKey; it is never part of the JSON request body.
REST example
curl "$EYEBALL_EXECUTOR_URL/v1/execute" \
-H "Authorization: Bearer $EYEBALL_API_KEY" \
-H 'Content-Type: application/json' \
--data '{"tool":"whatsapp-business.get_message","userId":"demo_user","input":{"conversationId":"example_conversationId","messageId":"example_messageId"},"mode":"sync"}'Mock support
Point EYEBALL_EXECUTOR_URL at a mock-configured executor to run through the real catalog, validation, credential seam, adapter, normalized errors, and execution records with no WhatsApp Business Cloud account. Mock selection changes the executor endpoint and trusted provider base-URL configuration, never the execute request.
Limitations
- This page describes the manifest's explicit P0 subset, not every operation offered by the provider.
- Provider account policy, consent UI, quota details, and current wire compatibility still require a real-provider certification pass.
- Fields outside the canonical schemas and declared
x_providerextensions are rejected.
Versions
| Contract | Version |
|---|---|
| Runtime catalog | 1.1 |
| Manifest catalog | 1.0 |
| Manifest schema | 1.0 |
| Source | activepieces-bridge |
| Tier | P0 |
| Capabilities | messaging_chat |
Next
Use Testing with mocks to exercise this toolkit before connecting a live provider account.