WhatsApp (Cloud API)
Two-way WhatsApp with your own WhatsApp Business number (Meta Cloud API). Send text, approved templates and files (e.g. a quote PDF from your private files, no public link) and receive replies, photos and delivery statuses through a signed webhook. Stored per project for you and your admin pages (office inbox): conversations, unread counts, the 24-hour window, your own reference per message. Automatic webhook setup with your app id. Tokens stay in your vault.
setup_integration or the Dashboard Vault — they're encrypted
with AES-256-GCM and never exposed.
- In Meta for Developers create or open a Business app with the WhatsApp product; add your number in WhatsApp Manager.
- Store a System User token (whatsapp_business_messaging + whatsapp_business_management) in the vault as whatsapp_access_token.
- Store the app secret (App settings > Basic) in the vault as whatsapp_app_secret.
- Call whatsapp configure with phone_number_id, waba_id and app_id: number checked, app subscribed, webhook registered.
- Send a message to the number and call list-messages.
Required Credentials
Get your API key at developers.facebook.com →
Try it with your AI assistant
Once WebsitePublisher is connected to your AI assistant, paste one of these into the chat. Replace the parts in [brackets] with your own details.
@WebsitePublisher connect my WhatsApp Business number so customer replies show up in my office admin page@WebsitePublisher send the quote PDF for job [reference] to [customer number] on WhatsApp@WebsitePublisher show me the unread WhatsApp conversations and which ones I can still answer without a templateWith WebsitePublisher, connect my WhatsApp Business number so customer replies show up in my office admin pageWith WebsitePublisher, send the quote PDF for job [reference] to [customer number] on WhatsAppWith WebsitePublisher, show me the unread WhatsApp conversations and which ones I can still answer without a templateWith WebsitePublisher, connect my WhatsApp Business number so customer replies show up in my office admin pageWith WebsitePublisher, send the quote PDF for job [reference] to [customer number] on WhatsAppWith WebsitePublisher, show me the unread WhatsApp conversations and which ones I can still answer without a templateEndpoints (15)
Connect, update or disable one number. Checks token and phone_number_id with Meta first. waba_id subscribes the app to the WhatsApp Business Account (webhooks, list-templates); app_id + app secret in the vault registers the webhook automatically. Returns webhook.url and webhook.verify_token. Paid plans, max 5 numbers.
| Field | Type | Required | Description |
|---|---|---|---|
phone_number_id |
string|integer | ✓ Yes | Numeric "Phone number ID" from Meta (WhatsApp > API Setup), not the phone number. |
waba_id |
string|integer | No | WhatsApp Business Account id (recommended). null clears. |
app_id |
string|integer | No | Meta App id: automatic webhook registration. null clears. |
token_ref |
string | No | Vault key NAME of the token (default whatsapp_access_token). |
app_secret_ref |
string | No | Vault key NAME of the app secret (default whatsapp_app_secret). |
status |
string | No | active (default) or disabled. |
settings |
object | No | Keys given replace those keys; null resets. admin_send (true): admin pages may send. auto_mark_read (false). retention_days (null = keep, 1..3650). |
rotate_verify_token |
boolean | No | New verify token. |
The numbers: display number, verified name, quality, status, settings, last webhook, last signature failure; for the owner also vault keys, webhook_url, verify_token. Start here when messages do not arrive.
No input parameters required.
Remove a number. Messages kept unless keep_messages false; secrets stay.
| Field | Type | Required | Description |
|---|---|---|---|
phone_number_id |
string|integer | No | Required with more than one number. |
keep_messages |
boolean | No | Default true. |
Free-form text to one recipient, only inside the 24-hour window (check-window); otherwise send-template. reference (job or quote number) is stored with the message. Paid plans.
| Field | Type | Required | Description |
|---|---|---|---|
to |
string|integer | ✓ Yes | International format, e.g. +31612345678. |
text |
string | ✓ Yes | Message text. |
preview_url |
boolean | No | Link preview for the first URL. |
reply_to |
string | No | wamid to reply to. |
reference |
string | No | Your own reference. |
phone_number_id |
string|integer | No | Required with more than one number. |
Approved template to one recipient: the only type allowed outside the 24-hour window. body_params: list for {{1}}.. or object for named placeholders. header: {type: document|image|video, private_asset|link|media_id, filename} or {type: text, text}; private_asset sends a private file without public URL. buttons: [{index, sub_type: url|quick_reply|copy_code, value}]. components: raw Cloud API components instead. Paid plans.
| Field | Type | Required | Description |
|---|---|---|---|
to |
string|integer | ✓ Yes | International format, e.g. +31612345678. |
template_name |
string | ✓ Yes | APPROVED template (list-templates). |
language |
string | ✓ Yes | Language code as in list-templates, e.g. en_GB. |
body_params |
array | No | Placeholder values (list or object). |
header |
object | No | Media or text header. |
buttons |
array | No | Dynamic button values. |
components |
array | No | Raw components (advanced). |
reference |
string | No | Your own reference. |
phone_number_id |
string|integer | No | Required with more than one number. |
One file to one recipient inside the 24-hour window. Exactly one source: private_asset (uploaded server-side, never public), media_id or link (public https). Document any type; image jpeg/png 5 MB; video mp4/3gpp and audio 16 MB; private_asset max 25 MB. Paid plans.
| Field | Type | Required | Description |
|---|---|---|---|
to |
string|integer | ✓ Yes | International format. |
kind |
string | ✓ Yes | document, image, video or audio. |
private_asset |
string | No | Private asset path, e.g. "quotes/Q-1042.pdf". |
media_id |
string|integer | No | Media uploaded to WhatsApp before. |
link |
string | No | Public https URL. |
filename |
string | No | File name shown (documents). |
caption |
string | No | Caption (not audio). |
reply_to |
string | No | wamid to reply to. |
reference |
string | No | Your own reference. |
phone_number_id |
string|integer | No | Required with more than one number. |
Mark incoming messages read, in WhatsApp and here: wamid = one, wa_id = all unread from that contact.
| Field | Type | Required | Description |
|---|---|---|---|
wamid |
string | No | One incoming message. |
wa_id |
string|integer | No | A contact. |
phone_number_id |
string|integer | No | Required with more than one number. |
Message templates of the WhatsApp Business Account (needs waba_id): name, language, status (only APPROVED can be sent), category, components.
| Field | Type | Required | Description |
|---|---|---|---|
status |
string | No | e.g. APPROVED. |
name |
string | No | Name filter. |
limit |
integer | No | 1..100, default 50. |
after |
string | No | Paging cursor. |
phone_number_id |
string|integer | No | Required with more than one number. |
Stored messages, newest first, in and out: type, text, media, status (received/read in; accepted/sent/delivered/read/failed out), error, reference, sent_by.
| Field | Type | Required | Description |
|---|---|---|---|
wa_id |
string|integer | No | One contact. |
reference |
string | No | Your reference. |
wamid |
string | No | One message. |
direction |
string | No | in or out. |
type |
string | No | text, image, document, template, ... |
status |
string | No | e.g. received, failed. |
unread_only |
boolean | No | Incoming, not marked read. |
since |
string | No | From date/time. |
before |
string | No | Before date/time. |
phone_number_id |
string|integer | No | One number. |
limit |
integer | No | 1..200, default 50. |
offset |
integer | No | Paging offset. |
One row per contact, most recent first: name, message and unread count, last message, 24-hour window open. The office inbox view.
| Field | Type | Required | Description |
|---|---|---|---|
unread_only |
boolean | No | Only contacts with unread messages. |
phone_number_id |
string|integer | No | One number. |
limit |
integer | No | 1..200, default 50. |
offset |
integer | No | Paging offset. |
Is the 24-hour window open for this contact, and until when? Closed: only send-template works.
| Field | Type | Required | Description |
|---|---|---|---|
to |
string|integer | ✓ Yes | The contact. |
phone_number_id |
string|integer | No | Required with more than one number. |
Save the photo, document, voice note or video of an incoming message as a private asset (never public), e.g. whatsapp/31612345678/20261111-123.jpg. WhatsApp keeps media 30 days. Plan limits apply. Paid plans.
| Field | Type | Required | Description |
|---|---|---|---|
wamid |
string | ✓ Yes | Incoming message with media. |
Webhook audit (30 days): verified, verify_failed, processed, signature_failed, invalid, unknown_number.
| Field | Type | Required | Description |
|---|---|---|---|
status |
string | No | Status filter. |
limit |
integer | No | 1..200, default 50. |
offset |
integer | No | Paging offset. |
Test without Meta: a synthetic incoming text via the real parser and store, marked is_test. Nothing is sent.
| Field | Type | Required | Description |
|---|---|---|---|
from |
string|integer | ✓ Yes | Test sender, international format. |
text |
string | ✓ Yes | Message text. |
contact_name |
string | No | Profile name. |
reply_to |
string | No | wamid it replies to. |
phone_number_id |
string|integer | No | Required with more than one number. |
Delete stored messages: everything with one contact (wa_id, e.g. erasure) or a list of wamids. Saved private assets are listed, not deleted.
| Field | Type | Required | Description |
|---|---|---|---|
wa_id |
string|integer | No | A contact. |
wamids |
array | No | Message ids. |
phone_number_id |
string|integer | No | One number. |
MCP Tool Names
When using this integration through an AI assistant (Claude, ChatGPT, Cursor, etc.), the endpoints are available as MCP tools:
| Endpoint | MCP Tool Name |
|---|---|
| configure | whatsapp_configure |
| connection-status | whatsapp_connection_status |
| remove-number | whatsapp_remove_number |
| send-text | whatsapp_send_text |
| send-template | whatsapp_send_template |
| send-media | whatsapp_send_media |
| mark-read | whatsapp_mark_read |
| list-templates | whatsapp_list_templates |
| list-messages | whatsapp_list_messages |
| list-conversations | whatsapp_list_conversations |
| check-window | whatsapp_check_window |
| download-media | whatsapp_download_media |
| list-events | whatsapp_list_events |
| simulate-inbound | whatsapp_simulate_inbound |
| delete-messages | whatsapp_delete_messages |
Website