Builders Program

Build with us for a whole month. Unlimited usage and add-ons, weekly calls and your own Slack channel.

Learn more
Polymorfa

Command Palette

Search for a command to run...

Calls

WhatsApp calls, answered by your code

Answer and place WhatsApp voice and video calls in a browser, in server code, over SIP or with your own voice agent.

No recordings

Raw PCM audio for your code
16 kHz
Max call participants
32
Concurrent calls per SIP trunk
500

Answer anywhere

Four places a call can land.

Claim a call for one participant, or share it so a person and a bot hear the same caller. Unanswered calls end as missed. Polymorfa never declines for you.

In a browser. React components or the <pmfa-call> element, with ringing, video, devices and a dial pad. Browsers use short-lived client tokens.
In server code. The SDK reads and writes the call's audio as raw PCM, and each participant's video as H.264.
Over SIP. WhatsApp calls ring your PBX, and your PBX calls WhatsApp users through the number. TLS with SRTP, and PCMU, PCMA or Opus.
With your AI agent. Connect ElevenLabs Agents or OpenAI Realtime with your own key, or stream the audio to an agent you run. Polymorfa carries the call and adds no AI charge.

On both routes

One call API for both kinds of number.

The same SDK and webhooks work for Linked Devices and Meta Cloud API numbers. Each call reports what it supports, and the components hide the rest.

Linked Devices
  • Voice and video
  • Group calls, invites and call links
  • Separate video per participant
Meta Cloud API
  • One-to-one voice calls
  • The person grants call permission first
  • Inbound hosting is a setting you turn on

In the call

Everything a WhatsApp call can do.

Group calls, call links, reactions and raised hands on Linked Devices numbers, from the API or the SDK.

Group calls. Ring up to 31 people or a whole WhatsApp group. Invite more, ring again anyone who missed it, react and raise a hand.
Call links. Create a reusable WhatsApp voice or video link from a number and share it anywhere.
Several calls on one number. Let one number hold many calls at once. It stays off until your team accepts the ban risk, because WhatsApp's own apps never do this.

In your code

A voice agent in a dozen lines.

Bring your own speech recognition, model and voice. Polymorfa carries the call and runs no model for you.

calls.tsx
import { createBrowserCalls, createClientTokenProvider } from "@polymorfa/browser";
import { CallSurface, DialPad, PolymorfaProvider } from "@polymorfa/react";

const calls = createBrowserCalls({
  session: "my-number",
  getClientToken: createClientTokenProvider(),
});
await calls.connect();

<PolymorfaProvider>
  <CallSurface controller={calls.controller} exclusive={false} />
  <DialPad controller={calls.controller} />
</PolymorfaProvider>;

Voice library

Audio for every call.

Upload recordings or generate speech from text with your ElevenLabs or OpenAI key. Every clip converts to one format, so call campaigns play it the same way.

Text to speech. Choose ElevenLabs or OpenAI, a voice and a model. Each clip keeps the text and voice that produced it.
Your provider key. Keys are checked with the provider, encrypted and never shown again. Share one key with every project.
A library of clips. Upload MP3, WAV, OGG or M4A, up to 10 minutes each. The voice.asset_ready event tells you when a clip can play.

Call history

Every call on the record. No recordings.

Read stats, list call records or export them. Polymorfa never records audio or video and never stores the other party's number.

Stats by hour of the week. Volume, outcomes, answer rate and talk time, by day, hour, number or outcome in your time zone.
Exports for your warehouse. Up to 1,000 records per page as CSV or NDJSON, with a cursor for the next page.
A pseudonym, not a phone number. Each record names the other party by a pseudonym unique to your team. Keep call data for 7 days or up to 2,555.

Plans

Calls included with every number.

Allowances reset each month. Extra outbound calls on a Standard number use 20 credits each.

Monthly call allowances per number
NumberInbound calls a monthOutbound calls a month
Free55
StandardUnlimited50
ProUnlimitedUnlimited

API surface

The Calls API.

Control live calls through the Messaging API. Set up trunks, audio and history through the Platform API.

Calls

  • POST/messaging/voip/callsCall a person, a group of people or a WhatsApp group
  • POST/messaging/voip/calls/{id}/acceptAnswer or join
  • POST/messaging/voip/calls/{id}/participantsInvite another person
  • DELETE/messaging/voip/calls/{id}End for everyone

In the call

  • POST/messaging/voip/calls/{id}/participants/ringRing a participant again
  • POST/messaging/voip/calls/{id}/reactionSend or clear a reaction
  • POST/messaging/voip/calls/{id}/handRaise or lower a hand
  • POST/messaging/voip/call-linksCreate a call link

Setup and history

  • PUT/platform/sessions/{session}/call-settingsCalling, conference mode and simultaneous calls
  • POST/platform/sip-trunksConnect a PBX
  • POST/platform/voice/audio/ttsGenerate speech
  • GET/platform/calls/exportExport call records

Webhook events

  • Eventcall.receivedA call is ringing
  • Eventcall.acceptedSomeone answered
  • Eventcall.participant_joinedA person joined the call
  • Eventcall.endedThe call finished, with its duration

Start with a free number

Your first real number is free. Add more numbers on Pay-As-You-Go.