Programowalny głos w JSON. Połączenia, IVR, nagrywanie, TTS.
Głos dla programistów — ponad 140 krajów z zasięgiem głosowym, ponad 1500 prefiksów numerów telefonicznych, połączenia maskowane, numery wirtualne. Ta sama powierzchnia API co Email i SMS — połączenia to po prostu kolejny zasób.
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 minut od instalacji do pierwszego połączenia
Wykonaj połączenie w języku, którego już używasz.
SDK w każdym głównym środowisku uruchomieniowym. Pierwsze połączenie trafia na autoryzowany numer testowy (+15005550010), więc możesz uruchomić test CI, zanim udostępnisz prawdziwy numer.
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
Połączenia wychodzące i przychodzące
Wykonuj i odbieraj połączenia przez REST lub SIP — ten sam model uwierzytelniania, ten sam kontrakt idempotentności.
- 02
Deklaratywne przepływy połączeń w JSON
Komponuj say, play, gather, record, transfer i dial jako płaską tablicę JSON.
- 03
Nagrywanie z transkrypcją
Opcjonalne nagrywanie na dowolnym odcinku; transkrypcje generowane automatycznie w ponad 40 językach.
- 04
Strumieniowe TTS, poniżej 250 ms
Pierwszy bajt audio przez HTTP chunked transfer lub WebSocket — rozliczanie za znak.
- 05
Głosowe OTP przez weryfikacje
Ten sam zasób bird.verifications co SMS OTP; wystarczy zmienić pole channel.
- 06
Numery wirtualne w ponad 100 krajach
Udostępniaj numery stacjonarne z panelu lub przez API numerów w kilka sekund.
- 07
Połączenia maskowane
Numery dzwoniącego i odbierającego nigdy nie są sobie nawzajem ujawniane — prywatność przez routing.
- 08
SmartRouting na połączenie
Najtańszy operator wybierany w czasie rzeczywistym dla każdego odcinka, z automatycznym przełączaniem trasy w przypadku awarii.
- 09
Zdarzenia webhook na połączenie
call.ringing, call.answered, call.completed i inne — podpisane HMAC, zabezpieczone przed powtórzeniem.
- 10
SDK klienta WebRTC
Mosty przeglądarka-PSTN z jednego pakietu npm; działa w każdym nowoczesnym środowisku uruchomieniowym.
Dlaczego tworzymy Voice
Głos to kanał, który wszyscy traktują po macoszemu. My tego nie zrobiliśmy.
Głos jest trudny — opóźnienie poniżej sekundy, prawdziwy routing operatorski, zgodność nagrywania — i dlatego większość dostawców daje mu osobne uwierzytelnianie, osobne SDK, osobny kontrakt webhooków. Poświęciliśmy czas, aby uczynić go takim samym jak każdy inny endpoint Bird: to samo uwierzytelnianie, ta sama idempotentność, ta sama koperta błędów. Sterowanie połączeniami to po prostu 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..."Każda zmiana stanu to webhook.
Ładunki podpisane HMAC, zabezpieczone przed powtórzeniem, idempotentne. Ta sama koperta na każdym kanale Bird — naucz się jednego, znasz je wszystkie.
{
"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" }
}
}Harmonogram ponowień: 5s, 30s, 5m, 30m, 2h, 6h, 12h. Dead-letter po ostatniej próbie; każde zdarzenie dead-letter można odtworzyć z panelu lub API.
call.queuedZaakceptowane przez API i umieszczone w kolejce do wydzwonienia.call.ringingLinia odbierającego dzwoni — stan przed odebraniem.call.answeredRozmówca odebrał; naliczanie zaczyna się od tego zdarzenia.call.completedPołączenie zakończyło się normalnie — czas trwania i cena w ładunku.call.failedTrwała awaria (zajęte, brak odpowiedzi, odrzucenie operatora) z typowanym powodem.call.recording.readyNagranie jest zakodowane i dostępne pod podpisanym URL w ładunku.call.transcript.readyTranskrypcja zakończona; ładunek zawiera język i segmenty.
Głosowe OTP to ten sam zasób co SMS OTP.
Wykonaj niestandardowe połączenie lub przekaż weryfikację do środowiska uruchomieniowego. To samo uwierzytelnianie, ta sama idempotentność, ta sama koperta błędów — pole channel to jedyna rzecz, która się zmienia.
Niestandardowe połączenie.
await bird.voice.calls.create({
to: "+15005550010",
flow: [
{ say: `Your code is ${code}.` },
],
});Komponuj dowolny przepływ — say, gather, transfer — w przypadkach, gdy chcesz mieć skrypt w swoim kodzie.
Weryfikacje.
await bird.verifications.start({
to: "+15005550010",
channel: "voice",
});Jedna linia. Bird wybiera trasę, przeprowadza kontrolę oszustw, wysyła komunikat audio. Ten sam kod na każdym kanale.