Programmeerbare spraak in JSON. Gesprekken, IVR, opname, TTS.
Voice for developers: 140+ countries with voice coverage, 1,500+ phone-number prefixes, masked calls, virtual numbers. Same API surface as Email and SMS: calls are just another resource.
import { BirdClient } from "@messagebird/sdk";
const bird = new BirdClient({ apiKey: process.env.BIRD_API_KEY! });
const { data, error } = await bird.voice.calls.create({
to: "+15005550010",
from: "+14155550199",
flow: [
{ say: "Your verification code is..." },
{ say: "4. 2. 9. 1. 7." },
{ gather: { digits: 1, timeout: 5 } },
{ record: { transcribe: true } },
],
}).safe();
if (error) throw error;
console.log(data.id);
// → "call_7tQ04Lp2n..."
5 minuten van installatie tot eerste gesprek
Start een gesprek vanuit de taal die je al gebruikt.
SDK's in elke gangbare runtime. Het eerste gesprek gaat naar een goedgekeurd testnummer (+15005550010), zodat je een CI-check kunt uitvoeren voordat je een echt nummer inricht.
import { BirdClient } from "@messagebird/sdk";
const bird = new BirdClient({ apiKey: process.env.BIRD_API_KEY! });
const { data, error } = await bird.voice.calls.create({
to: "+15005550010",
from: "+14155550199",
flow: [{ say: "Hello from Node." }],
}).safe();Tien onderdelen van voice die u liever niet zelf schrijft.
Carrier routing, call control, and observability primitives, named and audit-able.
- 01
Uitgaande en inkomende gesprekken
Place and receive calls over REST or SIP: same auth model, same idempotency contract.
- 02
Declaratieve gespreksflows in JSON
Combineer say, play, gather, record, transfer en dial als een platte JSON-array.
- 03
Opname met transcriptie
Optionele opname op elk gespreksonderdeel; transcripties worden automatisch gegenereerd in 40+ talen.
- 04
Streaming TTS, sub-250ms
First-byte audio over HTTP chunked transfer or WebSocket, billed by character.
- 05
Voice OTP via verificaties
Dezelfde bird.verifications-resource als SMS OTP; wissel het channel-veld.
- 06
Virtuele nummers in 100+ landen
Richt long codes in vanuit het dashboard of de numbers API in seconden.
- 07
Gemaskeerde gesprekken
Caller and callee numbers are never exposed to each other: privacy by routing.
- 08
SmartRouting per gesprek
Goedkoopste carrier in real time geselecteerd voor elk onderdeel, met route-herselectie bij falen.
- 09
Webhook-events per gesprek
call.ringing, call.answered, call.completed and friends: HMAC-signed, replay-protected.
- 10
WebRTC client SDK
Browser-naar-PSTN-bridges vanuit één npm-pakket; werkt in elke moderne runtime.
Waarom we Voice bouwen
Voice is het kanaal dat iedereen als bijzaak behandelt. Wij niet.
Voice is lastig — sub-seconde latentie, echte carrier-routing, opname-compliance — en daarom geven de meeste aanbieders het een eigen auth, eigen SDK, eigen webhook-contract. Wij hebben de tijd genomen om het dezelfde vorm te geven als elk ander Bird-endpoint: dezelfde auth, dezelfde idempotency, dezelfde error-envelope. Gespreksbesturing is gewoon JSON.
import { BirdClient } from "@messagebird/sdk";
const bird = new BirdClient({ apiKey: process.env.BIRD_API_KEY! });
const { data, error } = await bird.voice.calls.create({
to: "+15005550010",
from: "+14155550199",
flow: [
{ say: "Your verification code is..." },
{ say: "4. 2. 9. 1. 7." },
{ gather: { digits: 1, timeout: 5 } },
{ record: { transcribe: true } },
],
}).safe();
if (error) throw error;
console.log(data.id);
// → "call_7tQ04Lp2n..."
Elke statuswijziging is een webhook.
HMAC-signed payloads, replay-protected, idempotent. The same envelope on every Bird channel: learn one, you've learned them all.
{
"type": "call.completed",
"id": "evt_8qC42v...",
"created_at": "2026-05-19T15:42:01.221Z",
"data": {
"call_id": "call_7tQ04Lp2n",
"from": "+14155550199",
"to": "+15005550010",
"direction": "outbound",
"status": "completed",
"duration_s": 42,
"answered_at": "2026-05-19T15:41:18.402Z",
"ended_at": "2026-05-19T15:42:00.117Z",
"price": { "amount": 0.014, "currency": "USD" }
}
}
Retry-schema: 5s, 30s, 5m, 30m, 2u, 6u, 12u. Dead-letter na de laatste poging; elk dead-lettered event is opnieuw afspeelbaar vanuit het dashboard of de API.
call.queuedGeaccepteerd door de API en in de wachtrij voor uitbellen.call.ringingThe receiving line is ringing: pre-answer state.call.answeredDe gebelde heeft opgenomen; facturering start bij dit event.call.completedThe call ended normally: duration and price in the payload.call.failedPermanente fout (bezet, geen antwoord, carrier-weigering) met een getypeerde reden.call.recording.readyOpname is gecodeerd en beschikbaar via de gesigneerde URL in de payload.call.transcript.readyTranscriptie voltooid; payload bevat taal en segmenten.
Voice OTP is dezelfde resource als SMS OTP.
Place a custom call or hand the verification off to the runtime. Same auth, same idempotency, same error envelope: the channel field is the only thing that moves.
Aangepast gesprek.
await bird.voice.calls.create({
to: "+15005550010",
flow: [
{ say: `Your code is ${code}.` },
],
});
Stel elke flow samen — say, gather, transfer — voor de gevallen waarin je het script in je code wilt.
Verificaties.
await bird.verifications.start({
to: "+15005550010",
channel: "voice",
});
Eén regel. Bird kiest de route, voert de fraudecontrole uit en verstuurt de audioprompt. Dezelfde code op elk kanaal.