Coming Soon

L<highlight>API OTP</highlight> pour les développeurs qui ont besoin que les codes arrivent.

SMS en priorité, fallback vocal en un seul attribut, score de fraude au démarrage, limites de débit par destinataire. Même authentification, même idempotence, mêmes webhooks que tous les autres canaux Bird — car c'est la même équipe d'ingénierie qui les a tous conçus.

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 minutes entre npm install et la première vérification

Lancez une vérification depuis le langage que vous utilisez déjà.

SDK dans chaque runtime majeur. La première vérification est envoyée au numéro de test autorisé (+15005550006), pour que vous puissiez intégrer un test CI avant même de contacter un opérateur.

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

Dix étapes entre l'appel de démarrage et l'écran suivant de l'utilisateur.

Des primitives concrètes, nommées et auditables. Pas de discours vague sur la « détection de fraude par IA ».

  1. 01

    SMS en priorité, fallback vocal en un seul attribut

    Passez fallback: "voice" au démarrage. Si le SMS n'arrive pas en N secondes, nous appelons à la place. Pas de seconde intégration.

  2. 02

    Score de fraude au démarrage

    Chaque démarrage renvoie un risk_score de 0 à 1. Bloquez les requêtes à haut risque avant de dépenser un centime en livraison.

  3. 03

    Limites de débit par destinataire

    Plafonds configurables par numéro de téléphone sur les tentatives par heure et par jour. Verrouille les attaques par force brute à vos frais.

  4. 04

    Routage adapté à l'opérateur

    Nous choisissons la route par opérateur et par pays en temps réel. T-Mobile US n'emprunte pas le même chemin que Reliance Jio.

  5. 05

    Codes générés côté serveur

    Vous ne voyez jamais le code ; nous ne l'exposons jamais sur le réseau en sortie. Une surface de fuite en moins dans votre stack.

  6. 06

    TTL configurable

    10 minutes par défaut, plage de 30 s à 1 h. TTL plus court = surface de fraude réduite ; plus long = meilleure UX mobile.

  7. 07

    Compteur de tentatives avec verrouillage

    Nombre maximum de tentatives par vérification (5 par défaut). Après verrouillage, la vérification renvoie verification_locked pour une UX claire.

  8. 08

    OTP vocal dans plus de 40 langues

    Synthétisé au moment de l'envoi, avec l'accent correct par locale. Même surface bird.verifications.start — il suffit d'utiliser channel: "voice".

  9. 09

    Webhook à chaque changement d'état

    Événements : verification.created, verification.delivered, verification.checked, verification.expired. Même enveloppe HMAC.

  10. 10

    Payez uniquement quand le code arrive

    Aucun frais pour verification.failed. Le filtre de score de fraude et le remboursement en cas de non-livraison maintiennent des dépenses honnêtes.

Why we build Verifications

Parce que les codes doivent arriver du premier coup, et on ne peut pas demander gentiment aux opérateurs.

L'OTP est le canal où chaque pourcent de livraison vous coûte une inscription. Nous gérons le SMS depuis dix ans à travers 240 connexions directes aux opérateurs, donc quand un code n'arrive pas, nous savons si c'est la route, l'opérateur, le terminal ou le filtre anti-fraude — et nous contournons le problème en temps réel. Bird Verifications, c'est cette logique de sélection de route, plus le score de fraude, plus le fallback vocal, plus le compteur de tentatives, exposés via deux endpoints avec la même authentification et le même contrat webhook que tous les autres canaux 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"

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.

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

Planning de retry : 5 s, 30 s, 5 min, 30 min, 2 h, 6 h, 12 h. Dead-letter après la dernière tentative ; chaque événement en dead-letter peut être rejoué depuis le tableau de bord ou l'API.

  • verification.createdAccepté par l'API ; sur le point d'être envoyé sur le premier canal.
  • verification.deliveredL'opérateur a confirmé la réception sur le terminal du destinataire.
  • verification.checkedLe destinataire a soumis un code ; le payload inclut approved ou denied.
  • verification.fellbackLe SMS n'est pas arrivé dans le délai ; le fallback vocal a été déclenché.
  • verification.expiredLe TTL a expiré sans vérification réussie.
  • verification.lockedNombre maximum de tentatives atteint ; les appels de vérification suivants renvoient verification_locked.
  • verification.failedÉchec permanent avant l'envoi (destinataire invalide, rejet de l'opérateur).

Si vous avez intégré le SMS, vous avez intégré Verifications.

Même authentification, même idempotence, même enveloppe d'erreur, même format de webhook. La différence : Verifications génère le code, choisit la route, exécute le filtre anti-fraude et gère le fallback — pour que vous n'ayez pas à le faire.

Verifications.

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

Un seul appel. Nous choisissons le canal, la route, générons le code, exécutons le contrôle anti-fraude, gérons le verrouillage.

SMS.

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

L'envoi brut, pour quand vous voulez gérer vous-même la génération du code et la politique de retry.

À partir de 0,04 $ par vérification, tout compris.

Tarification par vérification réussie, SMS ou voix. Aucun frais pour verification.failed. Remises sur volume appliquées automatiquement au-delà de 100 000/mois. Pas de frais de plateforme, pas de frais par utilisateur, pas de fonctionnalités verrouillées derrière un engagement annuel.

Commencez avec un seul canal.
Ajoutez les autres quand vous êtes prêt.

Une clé API de test est disponible immédiatement. L'accès production se débloque dès que vous ajoutez un moyen de paiement et vérifiez un expéditeur.

CommencerLire la docou

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

Cursor