WhatsApp Voice and Video Calls in UnifyPort: Private Beta
A customer has explained a problem in WhatsApp, but another paragraph will not make it clearer. Your agent needs to talk through a delivery detail or see the issue on camera. UnifyPort’s private beta adds a way to prepare a one-to-one WhatsApp voice or video call from your business application, let the agent start it in a browser, and receive call-state events in your backend.
The current scope is outbound, human-operated WhatsApp calling. Access is enabled per workspace through technical support. Creating an API key alone does not enable calling, and incoming calls are not open in this beta.
What the calling beta adds
The calling API reference now documents three operations:
POST /v1/callsprepares a voice or video call and returns a short-lived, single-usejoin_url.GET /v1/calls/activeretrieves the current call managed by UnifyPort for the selected account.POST /v1/calls/{call_id}/hangupends the selected call.
Two webhook events help your application follow the conversation: call.answered reports connection, and call.ended reports the end with a reason and connected duration. This gives developers the pieces to add a human calling step to an existing support workflow.
The API request prepares the call. The agent opens the returned link and clicks Start call to dial. Keep this action visible in your interface so an agent can review the selected customer before starting.
When a chat needs a conversation
Consider these hypothetical support scenarios:
- Order confirmation: an agent and customer talk through a delivery arrangement that has become difficult to explain in short messages.
- Troubleshooting: the agent guides the customer through a sequence of checks by voice.
- Visual assistance: a video call helps the customer show a product or installation issue.
These are possible application flows, not reported customer results. Your team still chooses when to call and records the next action in its own support system.
An inbox can offer a calling action alongside the selected WhatsApp chat. Use that chat’s conversation_id from the connected messaging account; the call API does not accept an arbitrary phone-number string. Keep assignment and resolution in your application, as described in the WhatsApp shared-inbox guide.
Prepare the call, then let the agent start it
First, request beta access for your workspace and connect an authorized WhatsApp messaging account. If you are still setting up account access, the QR and Passkey authentication guide explains that separate onboarding step.
Send the creation request from your backend with the workspace’s X-Api-Key. The following JSON illustrates the documented body; replace acc_example and <conversation_id> with the selected account and its actual conversation identifier before sending it to POST /v1/calls:
{
"account_id": "acc_example",
"to": {
"id": "<conversation_id>",
"type": "user"
},
"media_type": "video"
}
Use voice for a voice call or video for a call that supports video. Keep the API key on the server and pass the returned join_url privately to the intended agent.
Creation returns 201 Created with call_id, state: preparing, join_url, and expires_at. It does not establish that the customer has been dialed or answered.
The preparation period defaults to two minutes from creation. Use the returned expires_at as the actual deadline, because the server can adjust it. The agent must open the link and click Start call before that deadline. This preparation deadline does not limit the duration of a connected call.
The browser requires microphone permission; camera access is optional. Treat the link as private and single-use: do not publish it or log the full URL.
Bring call state back into your workflow
Record the returned call_id against the selected account, conversation, and support task in your own system. The current-call endpoint can retrieve a managed call when needed, including when its identifier was lost. It returns data: {} if no managed call exists. It cannot determine whether either person is busy in the WhatsApp mobile app.
Subscribe to call.answered and call.ended to update your application’s call record. A specific subscribed_events list needs those event names. For beta workspaces, *, an empty list, or an omitted list includes the permitted call events. Ordinary workspaces do not receive them through wildcard subscriptions.
The ended event includes data.call.id, reason, and duration_seconds. Duration measures connected time rounded down to whole seconds, so a value of 0 alone does not prove the call was unanswered. Track the answered event as well. A synchronous creation failure may have no ended callback; handle the HTTP error separately.
Follow the webhook delivery reference for signature verification and event-ID deduplication. Your application can use these observations to support follow-up work; a call ending does not automatically resolve the customer’s issue.
The current private-beta boundaries
This beta supports WhatsApp one-to-one voice and video calls initiated through the browser flow. Group calls, channel calls, calls on other messaging platforms, and incoming-call handling are outside the current scope. The documented call.incoming event is a reserved contract; its presence in the event catalog does not enable receiving calls.
Recording, transcription, SIP/PBX integration, and AI-operated voice agents are not capabilities offered by this beta. UnifyPort provides an unofficial interface; this article describes UnifyPort’s own calling contract and does not identify it as Meta’s official WhatsApp Business Calling API.
The workspace flag is_beta is read-only and disabled by default. Technical support must enable eligibility. A workspace without access receives 403 beta_feature_not_enabled with numeric code 41002 when using the calling APIs. Setting metadata or sending a workspace PATCH cannot enable access.
Questions before you try it
Can I start a call using only a phone number?
No. Use the actual conversation_id under the selected WhatsApp messaging account, with to.type: user.
Does the API dial immediately?
No. It prepares the call link. A human opens the link and clicks Start call before expires_at to dial.
Are calls limited to two minutes?
No. Two minutes is the default preparation period from creation. It is not a duration limit for a connected call.
Does beta access let my team answer incoming calls?
No. Incoming calling is not open in the current beta, including for workspaces with is_beta: true.
Request access for your team
Contact technical support to request calling-beta access for your workspace. To help explain your intended use, include your workspace ID, the WhatsApp support scenario, and whether your team needs voice or video. These are useful request details, not an automatic enrollment process. Keep API keys and private call links out of the request.
Once access is enabled, use the create-call reference to connect one intentionally selected test conversation to your agent’s browser flow. Start with the workflow you want to improve, and use the beta to evaluate how a human call fits your support application.
Turn messaging integration into a stable product pipeline.
Start by sending through one API, then bring every inbound message back into your business system with standard events.