Programmeerbare spraak in JSON. Gesprekken, IVR, opname, TTS.
Voice voor ontwikkelaars — 140+ landen met spraakdekking, 1.500+ telefoonnummerprefixen, gemaskeerde gesprekken, virtuele nummers. Dezelfde API-structuur als Email en SMS — gesprekken zijn gewoon een andere resource.
import { BirdClient } from "@bird/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 "@bird/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();Ten parts of voice you'd rather not write yourself.
Carrier routing, call control, and observability primitives — named and audit-able.
- 01
Uitgaande en inkomende gesprekken
Start en ontvang gesprekken via REST of SIP — hetzelfde auth-model, hetzelfde 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
Eerste-byte audio via HTTP chunked transfer of WebSocket — gefactureerd per karakter.
- 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
Beller- en gebelde nummers worden nooit aan elkaar blootgesteld — privacy door 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 en meer — HMAC-gesigneerd, replay-beschermd.
- 10
WebRTC client SDK
Browser-naar-PSTN-bridges vanuit één npm-pakket; werkt in elke moderne runtime.
Why we build Voice
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 "@bird/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-gesigneerde payloads, replay-beschermd, idempotent. Dezelfde envelope op elk Bird-kanaal — leer er één, dan ken je ze allemaal.
{
"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.ringingDe ontvangende lijn gaat over — pre-answer status.call.answeredDe gebelde heeft opgenomen; facturering start bij dit event.call.completedHet gesprek is normaal beëindigd — duur en prijs in de 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.
Plaats een aangepast gesprek of draag de verificatie over aan de runtime. Dezelfde auth, dezelfde idempotency, dezelfde error-envelope — het channel-veld is het enige dat verandert.
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.