> **Building with AI coding agents?** Install the authstack plugin with one command. This equips your agent with accurate Scalekit implementation patterns.
>
> **Recommended** (the `-y` flags skip prompts, so the command runs without an interactive terminal):
> ```bash
> npx -y @scalekit-inc/cli setup -y
> ```
>
> Global:
> ```bash
> npm install -g @scalekit-inc/cli
> scalekit setup -y
> ```
>
> Supports Claude Code, Cursor, GitHub Copilot, Codex + skills for other Agent Skills-compatible agents in `~/.agents/skills`.
> Skills: integrate-agentkit, implement-saaskit, add-mcp-oauth, implement-sso, implement-scim.
> [Full setup guide](https://docs.scalekit.com/dev-kit/build-with-ai/)

---

# Connect AI agents to WhatsApp

The WhatsApp connector lets your AI agent act in each user's WhatsApp account. Each user connects their own WhatsApp access token once, and Scalekit sends it with every call, so your agent never handles credentials. It comes with 36 tools.

**Authentication:** Bearer Token
**Categories:** Communication
**Tools:** 36: 13 read, 18 write, 5 destructive
**Users sign in with:** Access token
**Built by:** Scalekit connector
**Try it:** [Playground in the Scalekit dashboard](https://app.scalekit.com/ws/signup?sk_intent=playground&provider=WHATSAPP)

## Setup

1. ### Install the SDK

   **Node.js**

   ```bash
   npm install @scalekit-sdk/node dotenv
   ```

   **Python**

   ```bash
   pip install scalekit-sdk-python python-dotenv
   ```

2. ### Set your credentials

   Add your Scalekit credentials to your `.env` file. Find values in **[app.scalekit.com](https://app.scalekit.com)** > **Developers** > **API Credentials**.

   ```sh title=".env"
   SCALEKIT_ENVIRONMENT_URL=<your-environment-url>
   SCALEKIT_CLIENT_ID=<your-client-id>
   SCALEKIT_CLIENT_SECRET=<your-client-secret>
   ```

3. ### Create the WhatsApp connection

   In **AgentKit > Connections**, create a WhatsApp connection. The name you give it is the `connection_name` your code passes. See [Configure connections](/agentkit/connections/).

   **Console steps with screenshots:**

   Generate a permanent access token for a Meta system user so Scalekit can call the WhatsApp Business Cloud API on your behalf. System user tokens don't expire on their own like standard user tokens, which makes them the right fit for a server-to-server connection.

   1. ### Open System users in Meta Business Settings

      - Go to [Meta Business Settings](https://business.facebook.com/settings) for the business portfolio that owns your WhatsApp Business Account.
      - Under **Users**, click **System users**.

   2. ### Create a system user

      - Click **Add**, then **Create system user**.
      - Give it a name (for example, `Scalekit`) and set the **System user role** to **Employee**.
      - Click **Create system user**.

        > Image: Create system user dialog with a system username and Employee role selected

   3. ### Assign your WhatsApp Business Account to the system user

      - Select the system user you just created from the list.
      - Click **Assign assets**, choose **WhatsApp accounts**, and select the WhatsApp Business Account you want Scalekit to access.
      - Grant **Full control** so the system user can send and receive messages, and manage templates and phone numbers.

        > Image: System user detail panel showing the Assigned assets tab with no assets assigned yet

   4. ### Generate the access token

      - With the system user still selected, click **Generate token**.
      - Select your WhatsApp app, set an expiration (choose **Never** for a long-lived server-to-server connection), and select the `whatsapp_business_messaging` and `whatsapp_business_management` permissions.
      - Click **Generate token** and copy the token immediately.

        > caution: Copy the token now
        >
        > Meta shows the full token only once. If you navigate away before copying it, you must generate a new one.

   5. ### Add the token in Scalekit

      - In the [Scalekit dashboard](https://app.scalekit.com), go to **AgentKit** > **Connections** > **Create Connection**. Find **WhatsApp** and click **Create**.
      - Paste the system user access token you copied and click **Save**.

4. ### Authorize a user and make your first call

   **Node.js** (`quickstart.mts`)

   ```typescript
   import { ScalekitClient } from '@scalekit-sdk/node'
   import 'dotenv/config'
   import { createInterface } from 'node:readline/promises'

   const scalekit = new ScalekitClient(
     process.env.SCALEKIT_ENVIRONMENT_URL,
     process.env.SCALEKIT_CLIENT_ID,
     process.env.SCALEKIT_CLIENT_SECRET,
   )
   const actions = scalekit.actions

   const connector = 'whatsapp'
   const identifier = 'user_123'

   // Generate an authorization link for the user
   const { link } = await actions.getAuthorizationLink({ connectionName: connector, identifier })
   console.log('Authorize WhatsApp:', link)
   const rl = createInterface({ input: process.stdin, output: process.stdout })
   await rl.question('Press Enter after authorizing...')
   rl.close()

   // Make your first call
   const result = await actions.executeTool({
     connector,
     identifier,
     toolName: 'whatsapp_businesses_list',
     toolInput: {},
   })
   console.log(result)
   ```

   ```bash
   npx tsx quickstart.mts
   ```

   **Python** (`quickstart.py`)

   ```python
   import os
   from scalekit import ScalekitClient
   from dotenv import load_dotenv
   load_dotenv()

   scalekit_client = ScalekitClient(
       env_url=os.getenv("SCALEKIT_ENVIRONMENT_URL"),
       client_id=os.getenv("SCALEKIT_CLIENT_ID"),
       client_secret=os.getenv("SCALEKIT_CLIENT_SECRET"),
   )
   actions = scalekit_client.actions

   connection_name = "whatsapp"
   identifier = "user_123"

   # Generate an authorization link for the user
   link_response = actions.get_authorization_link(
       connection_name=connection_name,
       identifier=identifier,
   )
   print("Authorize WhatsApp:", link_response.link)
   input("Press Enter after authorizing...")

   # Make your first call
   result = actions.execute_tool(
       tool_input={},
       tool_name="whatsapp_businesses_list",
       connection_name=connection_name,
       identifier=identifier,
   )
   print(result)
   ```

   ```bash
   python quickstart.py
   ```

   Each user opens the link once and enters their WhatsApp credentials there. If your app already has a user's credentials, add the account from your backend instead, as the console steps above show. See [Authorize a user](/agentkit/tools/authorize/) for the full flow and statuses.

## Tools

Pass the exact name to `execute_tool`, with an input like each tool's example. To ask for a tool that's missing, use the [request form](https://scalekitsupport.portal.usepylon.com/forms/request-a-connector-tool).

**Node.js**

```typescript
const result = await actions.executeTool({
  toolName: 'whatsapp_business_account_get',
  toolInput: {
    waba_id: '<waba_id>',
  },
  connector: 'whatsapp',
  identifier: 'user_123',
})
```

**Python**

```python
result = actions.execute_tool(
    tool_name="whatsapp_business_account_get",
    tool_input={
        "waba_id": "<waba_id>",
    },
    connection_name="whatsapp",
    identifier="user_123",
)
```

`result.data` is the app's response as JSON, and `result.execution_id` (`executionId` in Node.js) is the ID of the call.

### `whatsapp_business_account_get`

Get Business Account · Read-only

Get details for a WhatsApp Business Account, such as its name, currency, timezone, and message template namespace.
Returns the requested fields as a JSON object.
Use whatsapp_phone_numbers_list to see the phone numbers under this account.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `waba_id` (`string`, required): The WhatsApp Business Account ID.
- `fields` (`string`, optional): Comma-separated list of fields to return.

Example input: `{"waba_id":"<waba_id>"}`

### `whatsapp_business_profile_get`

Get Business Profile · Read-only

Get the WhatsApp Business Profile (about, address, description, email, vertical, websites, profile picture) for a phone number.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `phone_number_id` (`string`, required): The WhatsApp Business phone number ID.
- `fields` (`string`, optional): Comma-separated list of fields to return.

Example input: `{"phone_number_id":"<phone_number_id>"}`

### `whatsapp_businesses_list`

List Accessible Businesses · Read-only

List the Meta Business Manager accounts the connected access token can act on.
Returns each business's id and name.
Start here to discover a business_id, then use whatsapp_owned_wabas_list or whatsapp_client_wabas_list to find WhatsApp Business Account ids under it.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `fields` (`string`, optional): Comma-separated list of fields to return per business.
- `limit` (`integer`, optional): Max number of businesses to return per page.

Example input: `{}`

### `whatsapp_client_wabas_list`

List Client WhatsApp Business Accounts · Read-only

List the WhatsApp Business Accounts (WABAs) shared with a Business Manager account through Embedded Signup, but not owned by it.
Returns each WABA's id, name, message template namespace, and timezone.
Use whatsapp_businesses_list first to find the business_id. Use whatsapp_owned_wabas_list instead for WABAs this business owns directly.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `business_id` (`string`, required): The Meta Business Manager account ID.
- `fields` (`string`, optional): Comma-separated list of fields to return per WABA.
- `limit` (`integer`, optional): Max number of WABAs to return per page.

Example input: `{"business_id":"<business_id>"}`

### `whatsapp_media_get_url`

Get Media URL · Read-only

Retrieve the temporary download URL and metadata for an uploaded or received WhatsApp media item. The URL expires after 5 minutes.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `media_id` (`string`, required): The WhatsApp media ID.

Example input: `{"media_id":"<media_id>"}`

### `whatsapp_message_template_get`

Get Message Template · Read-only

Get a single message template's details by exact name, including approval status and components.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `name` (`string`, required): Exact template name to look up.
- `waba_id` (`string`, required): The WhatsApp Business Account ID.
- `fields` (`string`, optional): Comma-separated list of fields to return.

Example input: `{"name":"<name>","waba_id":"<waba_id>"}`

### `whatsapp_message_templates_list`

List Message Templates · Read-only

List message templates configured on the WhatsApp Business Account, with optional filters.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `waba_id` (`string`, required): The WhatsApp Business Account ID.
- `fields` (`string`, optional): Comma-separated list of fields to return per template.
- `limit` (`integer`, optional): Max number of templates to return per page.
- `status` (`string`, optional): Filter templates by status.

Example input: `{"waba_id":"<waba_id>"}`

### `whatsapp_owned_wabas_list`

List Owned WhatsApp Business Accounts · Read-only

List the WhatsApp Business Accounts (WABAs) that a Business Manager account owns.
Returns each WABA's id, name, message template namespace, and timezone.
Use whatsapp_businesses_list first to find the business_id. Use whatsapp_client_wabas_list instead for WABAs shared with this business rather than owned by it.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `business_id` (`string`, required): The Meta Business Manager account ID.
- `fields` (`string`, optional): Comma-separated list of fields to return per WABA.
- `limit` (`integer`, optional): Max number of WABAs to return per page.

Example input: `{"business_id":"<business_id>"}`

### `whatsapp_phone_number_get`

Get Phone Number Info · Read-only

Get metadata for a WhatsApp Business phone number (verification status, quality rating, display number).

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `phone_number_id` (`string`, required): The WhatsApp Business phone number ID.
- `fields` (`string`, optional): Comma-separated list of fields to return.

Example input: `{"phone_number_id":"<phone_number_id>"}`

### `whatsapp_phone_numbers_list`

List Phone Numbers · Read-only

List the phone numbers registered under a WhatsApp Business Account.
Returns each number's id, display number, verified name, and quality rating.
Use whatsapp_phone_number_get for a single phone number's full details.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `waba_id` (`string`, required): The WhatsApp Business Account ID.
- `fields` (`string`, optional): Comma-separated list of fields to return per phone number.
- `limit` (`integer`, optional): Max number of phone numbers to return per page.

Example input: `{"waba_id":"<waba_id>"}`

### `whatsapp_qr_code_get`

Get QR Code · Read-only

Get a single WhatsApp QR code or short link by its code id.
Returns the prefilled message and deep link URL.
Use whatsapp_qr_codes_list to find the code id first.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `phone_number_id` (`string`, required): The WhatsApp Business phone number ID.
- `qr_code_id` (`string`, required): The QR code's id.

Example input: `{"phone_number_id":"<phone_number_id>","qr_code_id":"<qr_code_id>"}`

### `whatsapp_qr_codes_list`

List QR Codes · Read-only

List all WhatsApp QR codes and short links created for a phone number.
Returns each code's id, prefilled message, and deep link URL.
Use whatsapp_qr_code_get for a single code's full details.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `phone_number_id` (`string`, required): The WhatsApp Business phone number ID.

Example input: `{"phone_number_id":"<phone_number_id>"}`

### `whatsapp_subscribed_apps_list`

List Subscribed Apps · Read-only

List the apps currently subscribed to webhook events for a WhatsApp Business Account.
Returns each subscribed app's id, name, and any override callback URI.
Use whatsapp_subscribed_apps_subscribe to add this app to the list.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `waba_id` (`string`, required): The WhatsApp Business Account ID.

Example input: `{"waba_id":"<waba_id>"}`

### `whatsapp_business_profile_update`

Update Business Profile · Write

Update the WhatsApp Business Profile fields for a phone number.

Read only: no. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `phone_number_id` (`string`, required): The WhatsApp Business phone number ID.
- `about` (`string`, optional): Short business description (max 139 characters).
- `address` (`string`, optional): Business address.
- `description` (`string`, optional): Business description.
- `email` (`string`, optional): Business contact email.
- `vertical` (`string`, optional): Industry vertical.
- `websites` (`array`, optional): Up to 2 business website URLs.

Example input: `{"phone_number_id":"<phone_number_id>"}`

### `whatsapp_mark_message_read`

Mark Message Read · Write

Mark an inbound WhatsApp message as read (shows blue ticks to the sender).

Read only: no. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `message_id` (`string`, required): The WhatsApp message ID (wamid) of the inbound message to mark as read.
- `phone_number_id` (`string`, required): The WhatsApp Business phone number ID that received the message.

Example input: `{"message_id":"<message_id>","phone_number_id":"<phone_number_id>"}`

### `whatsapp_message_template_create`

Create Message Template · Write

Create a new WhatsApp message template and submit it for Meta review. Must be approved before it can be used to send messages.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `category` (`string`, required): Template category.
- `components` (`array`, required): Array of component objects (header/body/footer/button) defining the template's content and variable placeholders.
- `language` (`string`, required): Language code for the template.
- `name` (`string`, required): Template name — lowercase alphanumeric and underscores only.
- `waba_id` (`string`, required): The WhatsApp Business Account ID to create the template under.

Example input: `{"category":"<category>","components":[],"language":"<language>","name":"<name>","waba_id":"<waba_id>"}`

### `whatsapp_message_template_update`

Update Message Template · Write

Edit an existing message template's category and/or components.
Returns the template's updated status, which resets to pending Meta review.
Use whatsapp_message_template_get or whatsapp_message_templates_list first to find the template's numeric id.

Read only: no. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `template_id` (`string`, required): Numeric id of the template to update (not its name).
- `category` (`string`, optional): New template category.
- `components` (`array`, optional): Replacement array of component objects (header/body/footer/button) defining the template's content.

Example input: `{"template_id":"<template_id>"}`

### `whatsapp_phone_number_register`

Register Phone Number · Write

Complete Cloud API registration for a phone number after its ownership is verified, setting its two-step verification PIN.
Returns a success confirmation.
Use after whatsapp_phone_number_verify_code. Use whatsapp_phone_number_deregister to reverse this.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `phone_number_id` (`string`, required): The WhatsApp Business phone number ID to register.
- `pin` (`string`, required): A 6-digit PIN used for two-step verification on this phone number.

Example input: `{"phone_number_id":"<phone_number_id>","pin":"<pin>"}`

### `whatsapp_phone_number_request_code`

Request Verification Code · Write

Request an SMS or voice verification code to confirm ownership of a phone number before registering it with the Cloud API.
Returns a success confirmation.
Run this before whatsapp_phone_number_verify_code and whatsapp_phone_number_register when adding a new number.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `code_method` (`string`, required): How to deliver the verification code.
- `language` (`string`, required): Locale for the verification message.
- `phone_number_id` (`string`, required): The WhatsApp Business phone number ID to verify.

Example input: `{"code_method":"<code_method>","language":"<language>","phone_number_id":"<phone_number_id>"}`

### `whatsapp_phone_number_set_pin`

Set Two-Step Verification PIN · Write

Set or update the two-step verification PIN for a WhatsApp Business phone number.
Returns a success confirmation.
Another user re-registering this phone number will need this PIN. There is no API to disable two-step verification once set.

Read only: no. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `phone_number_id` (`string`, required): The WhatsApp Business phone number ID.
- `pin` (`string`, required): New 6-digit two-step verification PIN.

Example input: `{"phone_number_id":"<phone_number_id>","pin":"<pin>"}`

### `whatsapp_phone_number_verify_code`

Verify Code · Write

Submit the verification code received via SMS or voice call to confirm ownership of a phone number.
Returns a success confirmation.
Use after whatsapp_phone_number_request_code. Follow with whatsapp_phone_number_register to complete registration.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `code` (`string`, required): The verification code received via SMS or voice call.
- `phone_number_id` (`string`, required): The WhatsApp Business phone number ID being verified.

Example input: `{"code":"<code>","phone_number_id":"<phone_number_id>"}`

### `whatsapp_qr_code_create`

Create QR Code · Write

Create a WhatsApp QR code or short link pre-filled with a message, for customers to start a chat.
Returns the code id, prefilled message, deep link URL, and optionally a QR image URL.
Use whatsapp_qr_code_update to change an existing code's message instead of creating a duplicate.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `phone_number_id` (`string`, required): The WhatsApp Business phone number ID the code should message.
- `prefilled_message` (`string`, required): Message text pre-filled when a customer opens the chat (max 140 characters).
- `generate_qr_image` (`string`, optional): Image format for a generated QR code image.

Example input: `{"phone_number_id":"<phone_number_id>","prefilled_message":"<prefilled_message>"}`

### `whatsapp_qr_code_update`

Update QR Code · Write

Update the pre-filled message on an existing WhatsApp QR code or short link.
Returns the code id, updated prefilled message, and deep link URL.
Use whatsapp_qr_codes_list or whatsapp_qr_code_get to find the code id first.

Read only: no. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `phone_number_id` (`string`, required): The WhatsApp Business phone number ID.
- `prefilled_message` (`string`, required): New pre-filled message text (max 140 characters).
- `qr_code_id` (`string`, required): The QR code's id to update.

Example input: `{"phone_number_id":"<phone_number_id>","prefilled_message":"<prefilled_message>","qr_code_id":"<qr_code_id>"}`

### `whatsapp_send_contacts_message`

Send Contacts Message · Write

Send one or more WhatsApp contact cards to a recipient.
Returns the message id once accepted by Meta.
Use whatsapp_send_text_message for plain text instead. Only deliverable within the 24-hour customer service window; use whatsapp_send_template_message to start a new conversation.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `contacts` (`array`, required): Array of contact card objects (name, phones, emails, org, etc.) following WhatsApp's contact schema.
- `phone_number_id` (`string`, required): The WhatsApp Business phone number ID sending the message.
- `to` (`string`, required): Recipient's WhatsApp ID or phone number in E.164 format.

Example input: `{"contacts":[],"phone_number_id":"<phone_number_id>","to":"<to>"}`

### `whatsapp_send_interactive_message`

Send Interactive Message · Write

Send an interactive WhatsApp message — reply buttons, a list menu, or a call-to-action URL button.
Returns the message id once accepted by Meta.
Use whatsapp_send_text_message for plain text. Only deliverable within the 24-hour customer service window; use whatsapp_send_template_message to start a new conversation.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `interactive` (`object`, required): The full interactive object: type (button, list, or cta_url), optional header/footer, body, and action.
- `phone_number_id` (`string`, required): The WhatsApp Business phone number ID sending the message.
- `to` (`string`, required): Recipient's WhatsApp ID or phone number in E.164 format.

Example input: `{"interactive":{},"phone_number_id":"<phone_number_id>","to":"<to>"}`

### `whatsapp_send_location_message`

Send Location Message · Write

Send a WhatsApp message containing a map pin for a specific location.
Returns the message id once accepted by Meta.
Only deliverable within the 24-hour customer service window; use whatsapp_send_template_message to start a new conversation.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `latitude` (`number`, required): Location latitude.
- `longitude` (`number`, required): Location longitude.
- `phone_number_id` (`string`, required): The WhatsApp Business phone number ID sending the message.
- `to` (`string`, required): Recipient's WhatsApp ID or phone number in E.164 format.
- `address` (`string`, optional): Address of the location.
- `name` (`string`, optional): Name of the location.

Example input: `{"latitude":1,"longitude":1,"phone_number_id":"<phone_number_id>","to":"<to>"}`

### `whatsapp_send_media_message`

Send Media Message · Write

Send an image, video, document, or audio WhatsApp message, referencing media either by an uploaded media_id or a public link.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `media_type` (`string`, required): Type of media being sent.
- `phone_number_id` (`string`, required): The WhatsApp Business phone number ID sending the message.
- `to` (`string`, required): Recipient's WhatsApp ID or phone number in E.164 format.
- `caption` (`string`, optional): Caption text. Supported for image, video, and document — not audio.
- `filename` (`string`, optional): Filename to display. Only used for document media.
- `media_id` (`string`, optional): ID of a previously uploaded media file. Provide this or media_link, not both.
- `media_link` (`string`, optional): Publicly accessible URL of the media file. Provide this or media_id, not both.

Example input: `{"media_type":"<media_type>","phone_number_id":"<phone_number_id>","to":"<to>"}`

### `whatsapp_send_reaction_message`

Send Reaction · Write

Send an emoji reaction to a previously received WhatsApp message, or remove a reaction with an empty emoji.
Returns the message id once accepted by Meta.
Use whatsapp_mark_message_read to acknowledge a message without reacting to it.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `emoji` (`string`, required): A single emoji to react with. Pass an empty string to remove a previous reaction.
- `message_id` (`string`, required): The WhatsApp message ID (wamid) being reacted to.
- `phone_number_id` (`string`, required): The WhatsApp Business phone number ID sending the reaction.
- `to` (`string`, required): Recipient's WhatsApp ID or phone number in E.164 format.

Example input: `{"emoji":"<emoji>","message_id":"<message_id>","phone_number_id":"<phone_number_id>","to":"<to>"}`

### `whatsapp_send_template_message`

Send Template Message · Write

Send a pre-approved WhatsApp message template. Required to initiate contact with a recipient outside the 24-hour customer service window.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `language_code` (`string`, required): Language code the template was approved in.
- `phone_number_id` (`string`, required): The WhatsApp Business phone number ID sending the message.
- `template_name` (`string`, required): Name of the approved message template.
- `to` (`string`, required): Recipient's WhatsApp ID or phone number in E.164 format.
- `components` (`array`, optional): Array of template component objects (header/body/button parameters) matching the template's variable placeholders.

Example input: `{"language_code":"<language_code>","phone_number_id":"<phone_number_id>","template_name":"<template_name>","to":"<to>"}`

### `whatsapp_send_text_message`

Send Text Message · Write

Send a plain text WhatsApp message to a recipient.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `body` (`string`, required): The message text (max 4096 characters).
- `phone_number_id` (`string`, required): The WhatsApp Business phone number ID sending the message.
- `to` (`string`, required): Recipient's WhatsApp ID or phone number in E.164 format.
- `preview_url` (`boolean`, optional): Whether to render a link preview if the text contains a URL.

Example input: `{"body":"<body>","phone_number_id":"<phone_number_id>","to":"<to>"}`

### `whatsapp_subscribed_apps_subscribe`

Subscribe App to Webhooks · Write

Subscribe this app to receive webhook events (messages, status updates) for a WhatsApp Business Account, optionally overriding the callback URL for just this WABA.
Returns the subscription record, including the app id and any override callback URI.
Use whatsapp_subscribed_apps_list to see current subscriptions, or whatsapp_subscribed_apps_unsubscribe to remove one.

Read only: no. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `waba_id` (`string`, required): The WhatsApp Business Account ID.
- `override_callback_uri` (`string`, optional): A callback URL to use for this WABA instead of the app's default webhook URL.
- `verify_token` (`string`, optional): Verification token Meta will echo back when validating the override callback URI.

Example input: `{"waba_id":"<waba_id>"}`

### `whatsapp_media_delete`

Delete Media · Destructive

Delete a previously uploaded WhatsApp media item.

Read only: no. Destructive: yes. Idempotent (safe to retry): yes.

Inputs:

- `media_id` (`string`, required): The WhatsApp media ID to delete.

Example input: `{"media_id":"<media_id>"}`

### `whatsapp_message_template_delete`

Delete Message Template · Destructive

Delete a message template by name, optionally scoped to a single language version.
Returns a success confirmation.
Use whatsapp_message_templates_list first to find the exact name. Provide template_id together with name to remove only that language; name alone removes every language.

Read only: no. Destructive: yes. Idempotent (safe to retry): yes.

Inputs:

- `name` (`string`, required): Exact template name to delete.
- `waba_id` (`string`, required): The WhatsApp Business Account ID.
- `template_id` (`string`, optional): Numeric id of one specific language version to delete. Omit to delete all languages of this template name.

Example input: `{"name":"<name>","waba_id":"<waba_id>"}`

### `whatsapp_phone_number_deregister`

Deregister Phone Number · Destructive

Deregister a phone number from the Cloud API, stopping it from sending or receiving messages until re-registered.
Returns a success confirmation.
Use whatsapp_phone_number_register to re-register the number afterward.

Read only: no. Destructive: yes. Idempotent (safe to retry): yes.

Inputs:

- `phone_number_id` (`string`, required): The WhatsApp Business phone number ID to deregister.

Example input: `{"phone_number_id":"<phone_number_id>"}`

### `whatsapp_qr_code_delete`

Delete QR Code · Destructive

Delete a WhatsApp QR code or short link.
Returns a success confirmation.
Use whatsapp_qr_codes_list to find the code id first.

Read only: no. Destructive: yes. Idempotent (safe to retry): yes.

Inputs:

- `phone_number_id` (`string`, required): The WhatsApp Business phone number ID.
- `qr_code_id` (`string`, required): The QR code's id to delete.

Example input: `{"phone_number_id":"<phone_number_id>","qr_code_id":"<qr_code_id>"}`

### `whatsapp_subscribed_apps_unsubscribe`

Unsubscribe App from Webhooks · Destructive

Unsubscribe this app from webhook events for a WhatsApp Business Account, stopping delivery of messages and status updates.
Returns a success confirmation.
Use whatsapp_subscribed_apps_list to confirm current subscriptions first.

Read only: no. Destructive: yes. Idempotent (safe to retry): yes.

Inputs:

- `waba_id` (`string`, required): The WhatsApp Business Account ID.

Example input: `{"waba_id":"<waba_id>"}`

## Related

Other Communication connectors ([all 57](/agentkit/connectors/?category=communication)):

- [Gmail](/agentkit/connectors/gmail/): Scalekit connector, OAuth, 48 tools
- [Google Calendar](/agentkit/connectors/googlecalendar/): Scalekit connector, OAuth, 30 tools
- [Slack](/agentkit/connectors/slack/): Scalekit connector, OAuth, 96 tools


---

## More Scalekit documentation

| Resource | What it contains | When to use it |
|----------|-----------------|----------------|
| [/llms.txt](/llms.txt) | Structured index with routing hints per product area | Start here — find which documentation set covers your topic before loading full content |
| [/llms-full.txt](/llms-full.txt) | Complete documentation for all Scalekit products in one file | Use when you need exhaustive context across multiple products or when the topic spans several areas |
| [sitemap-0.xml](https://docs.scalekit.com/sitemap-0.xml) | Full URL list of every documentation page | Use to discover specific page URLs you can fetch for targeted, page-level answers |
