Voce programmabile in JSON. Chiamate, IVR, registrazione, TTS.
Voice per sviluppatori — oltre 140 paesi con copertura vocale, oltre 1.500 prefissi telefonici, chiamate mascherate, numeri virtuali. Stessa interfaccia API di Email e SMS — le chiamate sono semplicemente un'altra risorsa.
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 minuti dall'installazione alla prima chiamata
Effettua una chiamata dal linguaggio che già utilizzi.
SDK per ogni runtime principale. La prima chiamata va a un numero di test autorizzato (+15005550010) così puoi integrare un controllo CI prima di configurare un numero reale.
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
Chiamate in uscita e in entrata
Effettua e ricevi chiamate tramite REST o SIP — stesso modello di autenticazione, stesso contratto di idempotenza.
- 02
Flussi di chiamata dichiarativi in JSON
Componi say, play, gather, record, transfer e dial come un array JSON piatto.
- 03
Registrazione con trascrizione
Registrazione opzionale su qualsiasi tratta; trascrizioni generate automaticamente in oltre 40 lingue.
- 04
TTS in streaming, sotto i 250 ms
Audio first-byte tramite HTTP chunked transfer o WebSocket — fatturato per carattere.
- 05
OTP vocale tramite verifiche
Stessa risorsa bird.verifications dell'OTP via SMS; cambia il campo channel.
- 06
Numeri virtuali in oltre 100 paesi
Configura numeri long code dalla dashboard o dall'API numbers in pochi secondi.
- 07
Chiamate mascherate
I numeri di chiamante e destinatario non vengono mai esposti l'uno all'altro — privacy by routing.
- 08
SmartRouting per chiamata
Operatore a costo minimo selezionato in tempo reale per ogni tratta, con riselezione del percorso in caso di errore.
- 09
Eventi webhook per chiamata
call.ringing, call.answered, call.completed e altri — firmati con HMAC, protetti da replay.
- 10
SDK client WebRTC
Bridge browser-PSTN da un singolo pacchetto npm; funziona in qualsiasi runtime moderno.
Why we build Voice
La voce è il canale che tutti trattano come un ripensamento. Noi no.
La voce è complessa — latenza sotto il secondo, routing reale su operatore, conformità delle registrazioni — ed è per questo che la maggior parte dei fornitori le assegna un'autenticazione propria, un SDK proprio, un contratto webhook proprio. Noi ci siamo presi il tempo di modellarla come ogni altro endpoint Bird: stessa autenticazione, stessa idempotenza, stesso formato errori. Il controllo chiamate è solo 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..."Ogni cambio di stato è un webhook.
Payload firmati con HMAC, protetti da replay, idempotenti. Lo stesso formato su ogni canale Bird — imparane uno, li hai imparati tutti.
{
"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" }
}
}Pianificazione dei tentativi: 5s, 30s, 5m, 30m, 2h, 6h, 12h. Dead-letter dopo l'ultimo tentativo; ogni evento in dead-letter è riproducibile dalla dashboard o dall'API.
call.queuedAccettata dall'API e accodata per la chiamata in uscita.call.ringingLa linea del destinatario sta squillando — stato pre-risposta.call.answeredIl destinatario ha risposto; la fatturazione inizia con questo evento.call.completedLa chiamata è terminata normalmente — durata e prezzo nel payload.call.failedErrore permanente (occupato, nessuna risposta, rifiuto operatore) con motivazione tipizzata.call.recording.readyLa registrazione è codificata e disponibile all'URL firmato nel payload.call.transcript.readyTrascrizione completata; il payload include lingua e segmenti.
L'OTP vocale è la stessa risorsa dell'OTP via SMS.
Effettua una chiamata personalizzata o affida la verifica al runtime. Stessa autenticazione, stessa idempotenza, stesso formato errori — il campo channel è l'unica cosa che cambia.
Chiamata personalizzata.
await bird.voice.calls.create({
to: "+15005550010",
flow: [
{ say: `Your code is ${code}.` },
],
});Componi qualsiasi flusso — say, gather, transfer — per i casi in cui vuoi lo script nel tuo codice.
Verifiche.
await bird.verifications.start({
to: "+15005550010",
channel: "voice",
});Una riga. Bird sceglie il percorso, esegue il controllo antifrode, invia il prompt audio. Stesso codice su ogni canale.