Programmierbare Sprachtelefonie in JSON. Anrufe, IVR, Aufzeichnung, TTS.
Voice für Entwickler — über 140 Länder mit Sprachabdeckung, mehr als 1.500 Telefonnummern-Präfixe, maskierte Anrufe, virtuelle Nummern. Dieselbe API-Oberfläche wie bei E-Mail und SMS — Anrufe sind einfach eine weitere Ressource.
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 von der Installation bis zum ersten Anruf
Starten Sie einen Anruf in der Sprache, die Sie bereits verwenden.
SDKs für jede gängige Laufzeitumgebung. Der erste Anruf geht an eine freigegebene Testnummer (+15005550010), sodass Sie einen CI-Check ausliefern können, bevor Sie eine echte Nummer einrichten.
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
Ausgehende und eingehende Anrufe
Tätigen und empfangen Sie Anrufe über REST oder SIP — gleiches Auth-Modell, gleicher Idempotenz-Vertrag.
- 02
Deklarative Anrufabläufe in JSON
Kombinieren Sie say, play, gather, record, transfer und dial als flaches JSON-Array.
- 03
Aufzeichnung mit Transkription
Optionale Aufzeichnung für jede Verbindung; Transkripte werden automatisch in über 40 Sprachen generiert.
- 04
Streaming-TTS, unter 250 ms
Erstes Audio-Byte über HTTP Chunked Transfer oder WebSocket — Abrechnung pro Zeichen.
- 05
Sprach-OTP über Verifikationen
Dieselbe bird.verifications-Ressource wie bei SMS OTP; einfach das channel-Feld ändern.
- 06
Virtuelle Nummern in über 100 Ländern
Stellen Sie Langwahlnummern über das Dashboard oder die Numbers-API in Sekunden bereit.
- 07
Maskierte Anrufe
Anrufer- und Empfängernummern werden niemals gegenseitig offengelegt — Datenschutz durch Routing.
- 08
SmartRouting pro Anruf
Günstigster Carrier wird in Echtzeit für jede Verbindung ausgewählt, mit automatischer Routenumleitung bei Fehlern.
- 09
Webhook-Events pro Anruf
call.ringing, call.answered, call.completed und weitere — HMAC-signiert, Replay-geschützt.
- 10
WebRTC-Client-SDK
Browser-zu-PSTN-Bridges aus einem einzigen npm-Paket; funktioniert in jeder modernen Laufzeitumgebung.
Why we build Voice
Voice ist der Kanal, den alle als Nebensache behandeln. Wir nicht.
Voice ist anspruchsvoll — Sub-Sekunden-Latenz, echtes Carrier-Routing, Aufzeichnungs-Compliance — und genau deshalb geben die meisten Anbieter dem Kanal eine eigene Auth, ein eigenes SDK, einen eigenen Webhook-Vertrag. Wir haben uns die Zeit genommen, ihn wie jeden anderen Bird-Endpunkt aufzubauen: gleiche Auth, gleiche Idempotenz, gleicher Fehler-Envelope. Anrufsteuerung ist einfach 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..."Jede Statusänderung ist ein Webhook.
HMAC-signierte Payloads, Replay-geschützt, idempotent. Derselbe Envelope auf jedem Bird-Kanal — einen lernen, alle beherrschen.
{
"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-Zeitplan: 5s, 30s, 5m, 30m, 2h, 6h, 12h. Dead-Letter nach dem letzten Versuch; jedes Dead-Letter-Event kann über das Dashboard oder die API erneut abgespielt werden.
call.queuedVon der API akzeptiert und für den Verbindungsaufbau in die Warteschlange gestellt.call.ringingDie Gegenstelle klingelt — Status vor der Annahme.call.answeredDer Angerufene hat abgenommen; die Abrechnung beginnt mit diesem Event.call.completedDer Anruf wurde normal beendet — Dauer und Preis im Payload.call.failedPermanenter Fehler (besetzt, keine Antwort, Carrier-Ablehnung) mit typisiertem Grund.call.recording.readyAufzeichnung ist kodiert und unter der signierten URL im Payload verfügbar.call.transcript.readyTranskription abgeschlossen; Payload enthält Sprache und Segmente.
Sprach-OTP ist dieselbe Ressource wie SMS OTP.
Starten Sie einen benutzerdefinierten Anruf oder übergeben Sie die Verifizierung an die Laufzeitumgebung. Gleiche Auth, gleiche Idempotenz, gleicher Fehler-Envelope — nur das channel-Feld ändert sich.
Benutzerdefinierter Anruf.
await bird.voice.calls.create({
to: "+15005550010",
flow: [
{ say: `Your code is ${code}.` },
],
});Erstellen Sie beliebige Abläufe — say, gather, transfer — für die Fälle, in denen Sie das Skript in Ihrem Code haben möchten.
Verifikationen.
await bird.verifications.start({
to: "+15005550010",
channel: "voice",
});Eine Zeile. Bird wählt die Route, führt die Betrugsprüfung durch und sendet den Audio-Prompt. Derselbe Code auf jedem Kanal.