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 flowWhat you need to connect
- The WhatsApp Business app on the number, version 2.24.17 or newer, in regular use.
- Two-factor authentication on the personal Facebook account that authorizes the connection.
- The number not connected to another provider. If it is, disconnect it there first.
- A computer to run the connection, with your phone at hand to confirm it in the app.
You do not need a company tax ID or a verified business to connect. The full checklist.
Why the official API in n8n
- No unofficial library behind your flow. Integrations that imitate WhatsApp Web go against WhatsApp's terms and put the number at risk. ZapClaw uses Meta's Cloud API, and Meta's policies apply as they do to any business on it.
- The app stays on the phone. Through Coexistence your team keeps answering in the WhatsApp Business app while n8n works the same number.
- Plain HTTP on both sides. A Webhook node in, an HTTP Request node out, authenticated with an
X-API-Keyheader. Moving a flow from another WhatsApp API means changing the URL, the key and a few field names. - Deliveries you can check. Each event is signed with HMAC-SHA256 and gets up to 3 delivery attempts when n8n does not answer, and a failed event can be replayed from the dashboard.
- Make and Zapier too. Any tool with a webhook trigger and an HTTP module works the same way: ZapClaw posts to its URL, and it calls the send API.
Set it up in four steps
- 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.
- In ZapClaw, connect your number, paste that URL under Webhook and create an API key.
- In n8n, save the key as a Header Auth credential, with
X-API-Keyas the name, and use it in an HTTP Request node that callsPOST https://api.zapclaw.app/api/v1/send/text. - 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
- Free: 500 messages a month and 1 number, with no card and no end date. At the limit, sending pauses and new messages are held until you subscribe.
- Business: US$ 29 per month, with 20,000 messages included and unlimited numbers.
- Agency: US$ 49 per month for agencies, with 3 clients and 60,000 messages included and unlimited numbers.
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
- The official WhatsApp API with ZapClaw: what you get, the price and the requirements.
- The webhook reference, with every event and field.
- A webhook for your own AI, when people keep replying from the app.
- Leaving an unofficial WhatsApp API: what changes.
- Typebot on WhatsApp, to put a bot you built in Typebot on the same number.
- The same setup in Make, with a Custom webhook and one HTTP module.
- WhatsApp in Dify, when the answer comes from an AI app.
- Flowise on WhatsApp, when your agent is a Flowise chatflow or agentflow.
- The WhatsApp MCP server (beta): n8n works with it today, using an autonomous agent key.
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