ps_ key for the number’s real Meta system token upstream, so you never handle Meta tokens yourself.
Base URL
graph.facebook.com/<version>/. The vNN.N version segment is optional — omit it and Pilot uses the configured default (v22.0), or include it (e.g. v22.0/<phone-number-id>/messages) to pin a version.
Authentication
Send your Pilot Statusps_ key using any of the three forms below. Pilot Status swaps it for the number’s real Meta token before forwarding — the ps_ key never reaches Meta:
How it works
The Meta layer is passthrough-with-denylist: it forwards messaging, media, template, profile, group, and calling traffic and denies account / business / auth management and number (de)registration. The Graph node id — phone-number id, WABA id, media id, group id, template id — is the first path segment. Pilot Status checks that the phone-number id / WABA id in the path belongs to your API key’s number (403 otherwise).
Single-segment nodes (
GET/POST/DELETE /{id}) are resolved by id type — the same shape covers media, group, phone-number, and template ids, exactly as the Graph API does. See each operation’s description in the Playground.Supported operations
Messages
Media
Templates
Phone numbers
Business profile
Groups (OBA)
Calls (WhatsApp Business Calling)
Blocked (denied)
These are not exposed through the layer and return 403 — manage them in the Pilot Status dashboard instead:- Number lifecycle:
POST /{phone-number-id}/register,POST /{phone-number-id}/deregister - Auth / management segments anywhere in the path:
oauth,debug_token,subscribed_apps,subscriptions,system_users,assigned_users,client_whatsapp_business_accounts,owned_whatsapp_business_accounts - Deleting your own WABA or phone-number id
Sends are recorded in Logs
A message you send withPOST /{phone-number-id}/messages through the layer is recorded on the number once Meta accepts it (a 2xx response with a message id). It appears as an outbound row in the dashboard Logs, in GET /v1/messages and in GET /v1/messages/history, with:
origin: "CHATWOOT"when the number is connected to Chatwoot through a native WhatsApp Cloud inbox — every layer send on that number is then attributed to Chatwoot — andorigin: "LAYER"on every other number, including one connected to Chatwoot through an API mirror inbox;- a
statusthat follows the statuses Meta reports:SENT,DELIVERED,READorFAILED; - no
correlationIdand no send detail:GET /v1/messages/{messageId}answers404for these rows.
/messages requests with a status field), reactions, group messages, and requests Meta refuses.
What the row shows:
- Media sent by Meta media
idis re-hosted, so the row shows the media. - Media sent by
linkis recorded with its type and caption only — Pilot Status does not fetch the URL. - A template reads
Template: <name>incontent(texton the history endpoint), without its rendered body;templatestaysnull. - A location or contacts message gets a short generated text the same way (
Location: …,Contacts: …).
Example: send a text message
Try it
Every endpoint above is interactive in the Playground → Meta Cloud API — send a request with yourps_ key and see the live Graph API response.
For new integrations, consider the native Pilot Status API — one endpoint sends across Meta and non-official numbers with a simpler body.