WhatsApp in n8n on the official API, with ZapClaw

In short: ZapClaw delivers your WhatsApp messages to an n8n Webhook node, and your flow replies with one HTTP Request. Messages go through Meta's official Cloud API, and the number keeps working in the WhatsApp Business app on your phone. No community node to install and no Meta app of your own: paste the flow below into n8n.

Connect your number in minutes and plug it into the n8n you already run, cloud or self-hosted.

Business plan: US$ 29 per month, with unlimited numbers

Start for free See the flow

What you need to connect

You do not need a company tax ID or a verified business to connect. The full checklist.

Why the official API in n8n

Set it up in four steps

  1. In n8n, start a workflow with a Webhook node set to POST and copy its production URL. ZapClaw delivers only to a public HTTPS address: n8n Cloud gives you one, and a self-hosted n8n has one behind your own domain.
  2. In ZapClaw, connect your number, paste that URL under Webhook and create an API key.
  3. In n8n, save the key as a Header Auth credential, with X-API-Key as the name, and use it in an HTTP Request node that calls POST https://api.zapclaw.app/api/v1/send/text.
  4. Activate the workflow and press Send test event in ZapClaw. Then send a WhatsApp message to your number from another phone: the flow receives it and replies.

The flow, ready to import

Copy the JSON below, open an empty workflow in n8n and paste it with Ctrl+V (Cmd+V on a Mac). It brings three nodes: the Webhook, a Filter that lets only incoming text messages through, and the HTTP Request that replies. Pick your Header Auth credential in the last node and activate the workflow.

{
  "name": "ZapClaw: answer WhatsApp messages",
  "nodes": [
    {
      "parameters": {
        "httpMethod": "POST",
        "path": "zapclaw-whatsapp",
        "options": {}
      },
      "id": "5f0c7e2a-1b3d-4c8e-9a61-2d4b8f0e7a11",
      "name": "ZapClaw webhook",
      "type": "n8n-nodes-base.webhook",
      "typeVersion": 2,
      "position": [0, 0],
      "webhookId": "9d3b6f1e-2c4a-4e7b-8a05-6f1c2d9e4b77"
    },
    {
      "parameters": {
        "conditions": {
          "options": { "caseSensitive": true, "leftValue": "", "typeValidation": "strict" },
          "conditions": [
            {
              "id": "8a2f4c61-7d1e-4b39-a5c2-0e6f9b3d1c22",
              "leftValue": "={{ $json.body.event }}",
              "rightValue": "message.received",
              "operator": { "type": "string", "operation": "equals" }
            },
            {
              "id": "3c9e1b74-6a2d-4f08-b7e5-9d1a4c2f6b33",
              "leftValue": "={{ $json.body.data.type }}",
              "rightValue": "text",
              "operator": { "type": "string", "operation": "equals" }
            }
          ],
          "combinator": "and"
        },
        "options": {}
      },
      "id": "b7d2e9f1-4c6a-4e3b-8f05-1a7c3e9d2b44",
      "name": "Incoming text only",
      "type": "n8n-nodes-base.filter",
      "typeVersion": 2,
      "position": [240, 0]
    },
    {
      "parameters": {
        "method": "POST",
        "url": "https://api.zapclaw.app/api/v1/send/text",
        "authentication": "genericCredentialType",
        "genericAuthType": "httpHeaderAuth",
        "sendBody": true,
        "bodyParameters": {
          "parameters": [
            { "name": "from", "value": "={{ $json.body.account.display_phone_number || $json.body.account.phone_number_id }}" },
            { "name": "to", "value": "={{ $json.body.data.from || $json.body.data.user_id }}" },
            { "name": "text", "value": "={{ $json.body.data.text.body }}" }
          ]
        },
        "options": {}
      },
      "id": "e4a1c8d3-2f7b-4a9e-b6d0-5c3e8f1a7d55",
      "name": "Reply through ZapClaw",
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4.2,
      "position": [480, 0]
    }
  ],
  "connections": {
    "ZapClaw webhook": {
      "main": [[{ "node": "Incoming text only", "type": "main", "index": 0 }]]
    },
    "Incoming text only": {
      "main": [[{ "node": "Reply through ZapClaw", "type": "main", "index": 0 }]]
    }
  }
}

The example answers with the text it received, to prove the round trip. Replace the text field with your logic: an AI Agent node, a lookup in your CRM or a fixed answer.

Free text works within 24 hours of the customer's last message. Outside that window Meta accepts only an approved template: call POST /api/v1/send/template instead.

The HTTP Request call

The same call as a curl command. Paste it into Import cURL in an HTTP Request node and n8n fills in the fields; then move the key into your Header Auth credential.

curl -X POST https://api.zapclaw.app/api/v1/send/text \
  -H "X-API-Key: zc_live_..." \
  -H "Content-Type: application/json" \
  -d '{ "from": "15551617409", "to": "15555550100", "text": "Hello from n8n" }'

from is your connected number, which the webhook brings in account.display_phone_number. to is the customer, in data.from, or data.user_id for a contact who shows only a username. A sent message answers 201.

What reaches the Webhook node

Each message comes as a message.received event. In n8n the payload sits under body: the text in body.data.text.body, the sender in body.data.from, the contact's name in body.data.contact_name and your number in body.account.display_phone_number. A media message carries a media_url you download with your API key.

To check that a request came from ZapClaw, compare its X-ZapClaw-Signature header with an HMAC-SHA256 of the raw body, keyed with your signing secret: how to verify it.

What it costs

Meta bills its WhatsApp message fees to you directly, with no ZapClaw markup. Every plan and price.

Who it is for

n8n users who automate WhatsApp for their own business or for clients: AI agents, lead capture, order updates, support triage. Agencies connect their clients' numbers on the Agency plan, each client isolated from the others. It does not fit bulk broadcasting.

Go further

Put your n8n flows on the official API today

Start on the free plan: one number, no card. Move to the Business plan when you need more numbers or more messages.

Start for free Read the webhook docs