How it works
When someone calls your WhatsApp Business number, Meta sends a call event to Fish Audio’s webhook. The platform accepts the call, connects its audio to a session, and hands it to the agent bound to the number, which greets the caller within a few seconds. From there it behaves like an inbound call: the session shows up in Conversation history withsource: "whatsapp", the inbound call webhook runs before the first reply, and post-call webhooks and analysis follow as usual. Either side can hang up; the session ends with user_hangup or agent_hangup.
Compared with phone calls, a WhatsApp call has no telephone-network leg, so:
Prerequisites
- A Meta app with the WhatsApp product added, and access to its App Dashboard. You need the app’s App ID and App secret.
- A WhatsApp Business Account (WABA) with a phone number registered for the Cloud API: the WhatsApp Business Account ID and the number’s Phone number ID.
- A System User access token for that app with the
whatsapp_business_managementandwhatsapp_business_messagingpermissions. - Calling enabled on the number. The import turns it on for you; Meta grants it once the business has completed Business Verification. A number Meta declines still connects, with calling off and Meta’s reason kept on the number (shown on its status badge, and as
status_detailover the API). - Team owner or admin role in the console.
Connect the number
1
Open the import form
On the workspace Phone numbers page, choose Add number → Import
third party (or Import number when the list is empty), and set
Provider to WhatsApp Business.
2
Enter your Meta credentials
Fill in the App ID, App secret, Phone number ID, WhatsApp Business Account
ID, and System User access token. The Phone number field is only a
cross-check: the number Meta reports for the Phone number ID is the one
that gets connected, and the form warns you if it differs. Optionally add
a label, bind an agent right away, and, if the number is not yet
registered for the Cloud API, its six-digit two-step verification PIN.
3
Import
The platform validates the token against your app, reads the number at
Meta, subscribes your app to the account’s webhooks, and enables calling.
The number then appears in the list with provider WhatsApp, and the
webhook setup panel opens.
4
Point your Meta app at Fish Audio
Copy the two values from the panel into your Meta app, as described in
the next section. Until then, calls do not reach the agent.
422 means Meta refused the credentials: a wrong App secret, a token that belongs to another app, or a token without the required permissions. The error carries Meta’s own message, never your token. A 409 means the number is already connected on the platform, or the WhatsApp Business Account is connected to another workspace.
The App secret and the access token are stored encrypted and never shown
again. The secret verifies the signature of every webhook Meta sends; the
token answers and ends calls on your behalf.
Point your Meta app at Fish Audio
Meta delivers call events to a callback URL that you configure once per app. The panel that opens after the import shows both values, and you can reopen it any time from the number’s row menu as Verify configuration:Callback URL
1
Open the webhook settings
In the Meta App Dashboard open your app → WhatsApp → Configuration
→ Webhook, and click Edit.
2
Save the callback
Paste the callback URL and the verify token, then click Verify and
save. Meta verifies the URL immediately.
3
Subscribe to calls
Under Webhook fields, subscribe to
calls.Answer calls
Bind an agent to the number from its row menu, the same way as for any phone number. The agent must be published. A call is declined, and no session is created, when the number has no agent, the agent is unpublished, calling is off on the number, the number is not active, or the team has no credit left. Callers see the call ring and get answered within a few seconds. The session’scaller_number is the caller’s WhatsApp number in E.164 format and dialed_number is your business number, so dynamic variables, the inbound call webhook, and your own records all line up.
Manage the number
- Bind, unbind, label: as for any number, from the row menu or with
PATCH /v1/agent/phone-numbers/{phone_number_id}. - A second number on the same account: import it the same way; it joins the account already holding the WhatsApp Business Account. One WhatsApp Business Account connects to one workspace.
- Release: from the row menu or with
DELETE /v1/agent/phone-numbers/{phone_number_id}. The number stays yours at Meta. Releasing the account’s last number also disconnects the account and unsubscribes your app from its webhooks. If the same workspace connects the number again later, it keeps the same verify token, so nothing changes in your Meta app.
Billing
WhatsApp calls bill at the agent conversation rate only: no phone surcharge, no transfer fees, and no rental for the number; see Pricing. Whatever Meta charges for WhatsApp Business calling is between you and Meta.API
The public API has no endpoint for connecting a WhatsApp number; the connection happens in the console. Once connected, the number is a regular entry of/v1/agent/phone-numbers with provider: "whatsapp", and its calls are sessions with source: "whatsapp" on GET /v1/agent/sessions.
Troubleshooting
Going further
Inbound calls
What happens when someone calls a bound number.
Phone numbers
The shared lifecycle: list, bind, label, release.
Webhooks
The inbound call webhook and post-call events.
Conversation history
Review WhatsApp sessions, transcripts, and recordings.

