Verification is being upgraded

OTP API dla programistów, którym kody muszą dotrzeć.

Najpierw SMS, fallback głosowy w jednym atrybucie, ocena ryzyka oszustwa przy starcie, limity częstotliwości per odbiorca. Ten sam auth, ta sama idempotentność, te same webhooki co każdy inny kanał Bird — bo ten sam zespół inżynierów je wszystkie zbudował.

verify.ts
200 · 1.4s
import { BirdClient } from "@bird/sdk";

const bird = new BirdClient({ apiKey: process.env.BIRD_API_KEY! });

// 1. Start the verification.
const { data: start, error: startErr } = await bird.verifications.start({
  to:       "+15005550006",
  channel:  "sms",
  fallback: "voice",
  expires:  "10m",
}).safe();

if (startErr) throw startErr;
// → { id: "ver_8sQ91pZ4...", risk_score: 0.04, status: "pending" }

// 2. Check the code the user typed.
const { data: check, error: checkErr } = await bird.verifications.check({
  id:   start.id,
  code: "482917",
}).safe();

if (checkErr) throw checkErr;
console.log(check.status);
// → "approved"

5 minut od npm install do pierwszej weryfikacji

Rozpocznij weryfikację w języku, którego już używasz.

SDK w każdym głównym środowisku uruchomieniowym. Pierwsza weryfikacja trafia na zatwierdzony numer testowy (+15005550006), więc możesz dodać test CI, zanim porozmawiasz z operatorem.

1
2
3
4
5
6
7
8
9
10
import { BirdClient } from "@bird/sdk";

const bird = new BirdClient({ apiKey: process.env.BIRD_API_KEY! });

const { data, error } = await bird.verifications.start({
  to:       "+15005550006",
  channel:  "sms",
  fallback: "voice",
  expires:  "10m",
}).safe();

Dziesięć kroków między wywołaniem start a kolejnym ekranem użytkownika.

Konkretne elementy, nazwane i audytowalne. Żadnego ogólnikowego "wykrywania oszustw opartego na AI".

  1. 01

    Najpierw SMS, fallback głosowy w jednym atrybucie

    Przekaż fallback: "voice" przy starcie. Jeśli SMS nie dotrze w ciągu N sekund, dzwonimy. Bez drugiej integracji.

  2. 02

    Ocena ryzyka oszustwa przy starcie

    Każde wywołanie start zwraca risk_score 0-1. Zablokuj te z wysokim ryzykiem, zanim wydasz grosz na dostarczenie.

  3. 03

    Limity częstotliwości per odbiorca

    Konfigurowalne limity prób na numer telefonu — na godzinę i na dzień. Blokuje brute-force na Twój koszt.

  4. 04

    Routing uwzględniający operatora

    Wybieramy trasę per operator, per kraj w czasie rzeczywistym. T-Mobile US to nie ta sama linia co Reliance Jio.

  5. 05

    Kody generowane po stronie serwera

    Nigdy nie widzisz kodu; my nigdy nie ujawniamy go na łączu przy wysyłce. O jedną powierzchnię wycieku mniej w Twoim stacku.

  6. 06

    Konfigurowalny TTL

    Domyślnie 10 minut, zakres 30s-1h. Krótszy TTL = mniejsza powierzchnia oszustw; dłuższy = lepszy UX mobilny.

  7. 07

    Licznik prób z blokadą

    Maksymalna liczba prób na weryfikację (domyślnie 5). Po blokadzie check zwraca verification_locked — jasny komunikat dla UX.

  8. 08

    Głosowe OTP w 40+ językach

    Syntezowane w momencie wysyłki, z poprawnym akcentem dla danego locale. Ta sama powierzchnia bird.verifications.start — wystarczy channel: "voice".

  9. 09

    Webhook przy każdej zmianie stanu

    Zdarzenia: verification.created, verification.delivered, verification.checked, verification.expired. Ta sama koperta HMAC.

  10. 10

    Płacisz tylko, gdy kod dotrze

    Brak opłat za verification.failed. Filtr fraud-score i zwrot za niedostarczenie utrzymują wydatki w ryzach.

Dlaczego stworzyliśmy Verifications

Bo kody muszą dotrzeć za pierwszym razem, a operatorów nie da się grzecznie poprosić.

OTP to kanał, w którym każdy procent dostarczalności kosztuje Cię rejestrację. Wysyłamy SMS od dziesięciu lat przez 240 bezpośrednich połączeń z operatorami, więc gdy kod nie dociera, wiemy, czy to trasa, operator, telefon czy filtr oszustw — i trasujemy to w czasie rzeczywistym. Bird Verifications to właśnie ta logika wyboru trasy, plus ocena ryzyka oszustwa, plus fallback głosowy, plus licznik prób, udostępnione jako dwa endpointy z tym samym auth i kontraktem webhooków co każdy inny kanał Bird.

verify.ts
200 · 1.4s
import { BirdClient } from "@bird/sdk";

const bird = new BirdClient({ apiKey: process.env.BIRD_API_KEY! });

// 1. Start the verification.
const { data: start, error: startErr } = await bird.verifications.start({
  to:       "+15005550006",
  channel:  "sms",
  fallback: "voice",
  expires:  "10m",
}).safe();

if (startErr) throw startErr;
// → { id: "ver_8sQ91pZ4...", risk_score: 0.04, status: "pending" }

// 2. Check the code the user typed.
const { data: check, error: checkErr } = await bird.verifications.check({
  id:   start.id,
  code: "482917",
}).safe();

if (checkErr) throw checkErr;
console.log(check.status);
// → "approved"

Każda zmiana stanu to webhook.

Payloady podpisane HMAC, zabezpieczone przed powtórzeniem, idempotentne. Ta sama koperta w każdym kanale Bird — naucz się jednego, znasz wszystkie.

POST /webhooks/bird
signed
{
  "type": "verification.delivered",
  "id":   "evt_5kQ81y...",
  "created_at": "2026-05-19T15:42:01.221Z",
  "data": {
    "verification_id": "ver_8sQ91pZ4",
    "to":              "+15005550006",
    "channel":         "sms",
    "carrier":         "T-Mobile USA",
    "risk_score":      0.04,
    "latency_ms":      1421
  }
}

Harmonogram ponowień: 5s, 30s, 5m, 30m, 2h, 6h, 12h. Dead-letter po ostatniej próbie; każde zdarzenie dead-letter można odtworzyć z dashboardu lub API.

  • verification.createdPrzyjęte przez API; zaraz nastąpi wysyłka pierwszym kanałem.
  • verification.deliveredOperator potwierdził odbiór na urządzeniu odbiorcy.
  • verification.checkedOdbiorca przesłał kod; payload zawiera approved lub denied.
  • verification.fellbackSMS nie dotarł w oknie czasowym; wysłano fallback głosowy.
  • verification.expiredTTL upłynął bez pomyślnej weryfikacji.
  • verification.lockedOsiągnięto maksymalną liczbę prób; kolejne wywołania check zwracają verification_locked.
  • verification.failedTrwały błąd przed wysyłką (nieprawidłowy odbiorca, odrzucenie przez operatora).

Jeśli zintegrowałeś SMS, zintegrowałeś Verifications.

Ten sam auth, ta sama idempotentność, ta sama koperta błędów, ten sam kształt webhooków. Różnica polega na tym, że Verifications generuje kod, wybiera trasę, uruchamia filtr oszustw i obsługuje fallback — więc Ty nie musisz.

Verifications.

verifications
await bird.verifications.start({
  to:       "+15005550006",
  channel:  "sms",
  fallback: "voice",
});

Jedno wywołanie. My wybieramy kanał, trasę, generujemy kod, uruchamiamy sprawdzenie oszustw, obsługujemy blokadę.

SMS.

sms
await bird.sms.send({
  from: "Bird",
  to:   "+15005550006",
  text: `Your code is ${code}.`,
});

Surowa wysyłka — gdy chcesz samodzielnie zarządzać generowaniem kodów i polityką ponawiania.

Od 0,04 USD za weryfikację, wszystko wliczone.

Opłata za pomyślną weryfikację, SMS lub głosową. Brak opłat za verification.failed. Rabaty ilościowe włączają się automatycznie powyżej 100 tys./mies. Bez opłaty za platformę, bez opłaty za stanowisko, bez funkcji ukrytych za rocznymi zobowiązaniami.

Zacznij od jednego kanału.
Dodaj kolejne, gdy będziesz gotowy.

Testowy klucz API otrzymasz od razu. Dostęp produkcyjny odblokujesz po dodaniu metody płatności i weryfikacji nadawcy.

RozpocznijPrzeczytaj dokumentacjęlub

Using Claude Code, Cursor, or Codex? Point it at our hosted MCP server: curated Bird tools, a browser sign-in, and no API key. Or install the bird-ai plugin.

Cursor