Verification is being upgraded

Die OTP API für Entwickler, bei denen Codes ankommen müssen.

SMS-first, Voice-Fallback in einem Attribut, Fraud-Scoring beim Start, Ratelimits pro Empfänger. Gleiche Authentifizierung, gleiche Idempotenz, gleiche Webhooks wie bei jedem anderen Bird-Kanal – denn dasselbe Engineering-Team hat sie alle gebaut.

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 Minuten von npm install bis zur ersten Verifizierung

Starten Sie eine Verifizierung in der Sprache, die Sie bereits verwenden.

SDKs für jede gängige Runtime. Die erste Verifizierung geht an die freigegebene Testnummer (+15005550006), sodass Sie einen CI-Check ausliefern können, bevor Sie mit einem Carrier sprechen.

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();

Zehn Schritte zwischen dem Start-Call und dem nächsten Bildschirm des Nutzers.

Konkrete Primitives, benannt und auditierbar. Kein Herumwedeln mit „KI-gestützter Betrugserkennung".

  1. 01

    SMS-first, Voice-Fallback in einem Attribut

    Übergeben Sie fallback: "voice" beim Start. Wenn SMS nicht innerhalb von N Sekunden zugestellt wird, rufen wir stattdessen an. Keine zweite Integration.

  2. 02

    Fraud-Scoring beim Start

    Jeder Start liefert einen risk_score von 0–1. Blockieren Sie die hochriskanten Anfragen, bevor Sie einen Cent für die Zustellung ausgeben.

  3. 03

    Ratelimits pro Empfänger

    Konfigurierbare Obergrenzen pro Telefonnummer für Versuche pro Stunde und Tag. Sperrt Brute-Force auf Ihre Kosten aus.

  4. 04

    Carrier-bewusstes Routing

    Wir wählen die Route pro Carrier und Land in Echtzeit. T-Mobile US ist nicht dieselbe Leitung wie Reliance Jio.

  5. 05

    Serverseitig generierte Codes

    Sie sehen den Code nie; wir legen ihn nie auf der Leitung offen. Eine Angriffsfläche weniger in Ihrem Stack.

  6. 06

    Konfigurierbarer TTL

    Standard 10 Minuten, Bereich 30 s–1 h. Kürzerer TTL = geringere Angriffsfläche; länger = bessere mobile UX.

  7. 07

    Versuchszähler mit Sperrung

    Maximale Versuche pro Verifizierung (Standard 5). Nach der Sperrung gibt check verification_locked zurück – für eine klare UX.

  8. 08

    Voice-OTP in über 40 Sprachen

    Zum Sendezeitpunkt synthetisiert, akzentgenau pro Locale. Dieselbe bird.verifications.start-Oberfläche – einfach channel: "voice".

  9. 09

    Webhook bei jeder Statusänderung

    Events: verification.created, verification.delivered, verification.checked, verification.expired. Derselbe HMAC-Envelope.

  10. 10

    Zahlen Sie nur, wenn der Code ankommt

    Keine Kosten bei verification.failed. Der Fraud-Score-Filter und die Erstattung bei Nichtzustellung halten die Ausgaben ehrlich.

Why we build Verifications

Weil Codes beim ersten Versuch ankommen müssen – und wir Carrier nicht einfach nett bitten können.

OTP ist der Kanal, bei dem jedes Prozent Zustellrate Sie eine Registrierung kostet. Wir betreiben SMS seit zehn Jahren über 240 direkte Carrier-Verbindungen – wenn ein Code nicht ankommt, wissen wir, ob es an der Route, dem Carrier, dem Endgerät oder dem Fraud-Filter liegt, und routen in Echtzeit um. Bird Verifications ist diese Routenwahl-Logik, plus der Fraud-Score, plus der Voice-Fallback, plus der Versuchszähler – bereitgestellt als zwei Endpoints mit derselben Auth- und Webhook-Struktur wie jeder andere Bird-Kanal.

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"

Jede Statusänderung ist ein Webhook.

HMAC-signierte Payloads, Replay-geschützt, idempotent. Derselbe Envelope bei jedem Bird-Kanal – einen lernen, alle verstehen.

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
  }
}

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.

  • verification.createdVon der API akzeptiert; Versand über den ersten Kanal steht bevor.
  • verification.deliveredCarrier hat den Empfang auf dem Endgerät des Empfängers bestätigt.
  • verification.checkedDer Empfänger hat einen Code eingegeben; Payload enthält approved oder denied.
  • verification.fellbackSMS wurde im Zeitfenster nicht zugestellt; der Voice-Fallback wurde ausgelöst.
  • verification.expiredTTL abgelaufen ohne erfolgreiche Prüfung.
  • verification.lockedMaximale Versuche erreicht; weitere Check-Aufrufe geben verification_locked zurück.
  • verification.failedPermanenter Fehler vor dem Versand (ungültiger Empfänger, Carrier-Ablehnung).

Wenn Sie SMS integriert haben, haben Sie Verifications integriert.

Gleiche Authentifizierung, gleiche Idempotenz, gleicher Error-Envelope, gleiches Webhook-Format. Der Unterschied: Verifications generiert den Code, wählt die Route, führt den Fraud-Filter aus und übernimmt den Fallback – damit Sie es nicht müssen.

Verifications.

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

Ein Aufruf. Wir wählen den Kanal, die Route, generieren den Code, führen die Fraud-Prüfung durch und übernehmen die Sperrung.

SMS.

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

Der reine Versand – für den Fall, dass Sie die Code-Generierung und die Retry-Logik selbst steuern möchten.

Ab 0,04 $ pro Verifizierung, alles inklusive.

Abrechnung pro erfolgreiche Verifizierung, SMS oder Voice. Keine Kosten bei verification.failed. Mengenrabatte greifen automatisch ab 100K/Monat. Keine Plattformgebühr, keine Lizenzgebühr, keine Funktionen hinter Jahresverträgen gesperrt.

Starten Sie mit einem Kanal.
Fügen Sie die anderen hinzu, wenn Sie bereit sind.

Ein Test-API-Key steht Ihnen sofort zur Verfügung. Der Produktivzugang wird freigeschaltet, sobald Sie eine Zahlungsmethode hinzufügen und einen Absender verifizieren.

Jetzt startenDokumentation lesenoder

Using Claude Code, Cursor, or Codex? Point it at our MCP server — tools for every channel we expose, with scoped agent keys.

Cursor