Voix programmable en JSON. Appels, IVR, enregistrement, TTS.
Voice pour les développeurs — plus de 140 pays couverts, plus de 1 500 préfixes de numéros de téléphone, appels masqués, numéros virtuels. Même surface API qu'Email et SMS — les appels sont simplement une ressource de plus.
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 minutes entre l'installation et le premier appel
Passez un appel depuis le langage que vous utilisez déjà.
SDK dans chaque runtime majeur. Le premier appel est dirigé vers un numéro de test autorisé (+15005550010) pour que vous puissiez intégrer un check CI avant de provisionner un vrai numéro.
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
Appels sortants et entrants
Passez et recevez des appels via REST ou SIP — même modèle d'authentification, même contrat d'idempotence.
- 02
Flux d'appels déclaratifs en JSON
Composez say, play, gather, record, transfer et dial sous forme de tableau JSON plat.
- 03
Enregistrement avec transcription
Enregistrement optionnel sur chaque segment ; transcriptions générées automatiquement dans plus de 40 langues.
- 04
TTS en streaming, moins de 250 ms
Premier octet audio via HTTP chunked transfer ou WebSocket — facturation au caractère.
- 05
OTP vocal via les vérifications
Même ressource bird.verifications que pour l'OTP par SMS ; changez simplement le champ channel.
- 06
Numéros virtuels dans plus de 100 pays
Provisionnez des numéros longs depuis le tableau de bord ou l'API numbers en quelques secondes.
- 07
Appels masqués
Les numéros de l'appelant et de l'appelé ne sont jamais exposés l'un à l'autre — confidentialité par routage.
- 08
SmartRouting par appel
Opérateur au moindre coût sélectionné en temps réel pour chaque segment, avec re-sélection de route en cas d'échec.
- 09
Événements webhook par appel
call.ringing, call.answered, call.completed et associés — signés HMAC, protégés contre le rejeu.
- 10
SDK client WebRTC
Ponts navigateur-PSTN depuis un seul package npm ; fonctionne dans tout runtime moderne.
Why we build Voice
La voix est le canal que tout le monde traite comme secondaire. Pas nous.
La voix est complexe — latence inférieure à la seconde, routage opérateur réel, conformité des enregistrements — et c'est pourquoi la plupart des fournisseurs lui attribuent sa propre authentification, son propre SDK, son propre contrat webhook. Nous avons pris le temps de lui donner la même forme que tout autre endpoint Bird : même authentification, même idempotence, même enveloppe d'erreur. Le contrôle d'appel n'est que du 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..."Chaque changement d'état est un webhook.
Payloads signés HMAC, protégés contre le rejeu, idempotents. La même enveloppe sur chaque canal Bird — apprenez-en un, vous les connaissez tous.
{
"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" }
}
}Calendrier de retry : 5s, 30s, 5m, 30m, 2h, 6h, 12h. Dead-letter après la dernière tentative ; chaque événement dead-lettered est rejouable depuis le tableau de bord ou l'API.
call.queuedAccepté par l'API et mis en file d'attente pour l'appel sortant.call.ringingLa ligne destinataire sonne — état pré-réponse.call.answeredL'appelé a décroché ; la facturation commence à cet événement.call.completedL'appel s'est terminé normalement — durée et prix dans le payload.call.failedÉchec permanent (occupé, sans réponse, rejet opérateur) avec un motif typé.call.recording.readyL'enregistrement est encodé et disponible à l'URL signée dans le payload.call.transcript.readyTranscription terminée ; le payload inclut la langue et les segments.
L'OTP vocal est la même ressource que l'OTP par SMS.
Passez un appel personnalisé ou confiez la vérification au runtime. Même authentification, même idempotence, même enveloppe d'erreur — le champ channel est la seule chose qui change.
Appel personnalisé.
await bird.voice.calls.create({
to: "+15005550010",
flow: [
{ say: `Your code is ${code}.` },
],
});Composez n'importe quel flux — say, gather, transfer — pour les cas où vous souhaitez le script dans votre code.
Vérifications.
await bird.verifications.start({
to: "+15005550010",
channel: "voice",
});Une ligne. Bird choisit la route, effectue le contrôle anti-fraude, envoie le message audio. Même code sur chaque canal.