Verification is being upgraded

OTP API untuk developer yang butuh kode sampai ke tujuan.

SMS utama, fallback suara dalam satu atribut, skor fraud saat waktu mulai, rate limit per penerima. Auth sama, idempotensi sama, webhook sama seperti setiap channel Bird lainnya — karena tim engineering yang sama membangun semuanya.

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 menit dari npm install ke verifikasi pertama

Mulai verifikasi dari bahasa pemrograman yang sudah Anda gunakan.

SDK di setiap runtime utama. Verifikasi pertama dikirim ke nomor uji coba yang disetujui (+15005550006), sehingga Anda bisa mengirimkan CI check sebelum berbicara dengan operator.

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

Sepuluh hal antara panggilan start dan layar berikutnya pengguna.

Primitif konkret, bernama dan bisa diaudit. Tanpa omong kosong "deteksi fraud bertenaga AI".

  1. 01

    SMS utama, fallback suara dalam satu atribut

    Tambahkan fallback: "voice" saat start. Jika SMS tidak sampai dalam N detik, kami telepon sebagai gantinya. Tanpa integrasi kedua.

  2. 02

    Skor fraud saat waktu mulai

    Setiap start mengembalikan risk_score 0-1. Blokir yang berisiko tinggi sebelum Anda mengeluarkan sepeser pun untuk pengiriman.

  3. 03

    Rate limit per penerima

    Batas per nomor telepon yang dapat dikonfigurasi untuk percobaan per jam, per hari. Mengunci brute-force atas biaya Anda.

  4. 04

    Routing berbasis operator

    Kami memilih rute per operator per negara secara real time. T-Mobile US bukan jalur yang sama dengan Reliance Jio.

  5. 05

    Kode dibuat di sisi server

    Anda tidak pernah melihat kodenya; kami tidak pernah mengeksposnya di jalur saat keluar. Satu permukaan kebocoran lebih sedikit di stack Anda.

  6. 06

    TTL yang dapat dikonfigurasi

    Default 10 menit, rentang 30d-1j. TTL lebih pendek = permukaan fraud lebih kecil; lebih panjang = UX mobile lebih baik.

  7. 07

    Penghitung percobaan dengan lockout

    Maksimal percobaan per verifikasi (default 5). Setelah lockout, check mengembalikan verification_locked untuk UX yang jelas.

  8. 08

    Voice OTP dalam 40+ bahasa

    Disintesis saat pengiriman, aksen tepat per lokal. Surface bird.verifications.start yang sama — cukup channel: "voice".

  9. 09

    Webhook di setiap perubahan status

    Event: verification.created, verification.delivered, verification.checked, verification.expired. Envelope HMAC yang sama.

  10. 10

    Bayar hanya saat kode sampai

    Tidak ada biaya untuk verification.failed. Filter skor fraud dan refund tanpa-pengiriman menjaga pengeluaran tetap jujur.

Why we build Verifications

Karena kode harus sampai di percobaan pertama, dan kami tidak bisa meminta operator dengan baik-baik.

OTP adalah channel di mana setiap persen pengiriman merugikan Anda satu pendaftaran. Kami telah menjalankan SMS selama sepuluh tahun melalui 240 koneksi langsung ke operator, jadi ketika kode tidak sampai kami tahu apakah itu rutenya, operatornya, perangkatnya, atau filter fraud — dan kami mengarahkan ulang secara real time. Bird Verifications adalah logika pemilihan rute itu, plus skor fraud, plus fallback suara, plus penghitung percobaan, diekspos sebagai dua endpoint dengan auth dan kontrak webhook yang sama seperti setiap channel Bird lainnya.

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"

Setiap perubahan status adalah webhook.

Payload ditandatangani HMAC, dilindungi dari replay, idempoten. Envelope yang sama di setiap channel Bird — pelajari satu, Anda sudah mempelajari semuanya.

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

Jadwal retry: 5d, 30d, 5m, 30m, 2j, 6j, 12j. Dead-letter setelah percobaan terakhir; setiap event dead-letter dapat di-replay dari dashboard atau API.

  • verification.createdDiterima oleh API; akan segera dikirim melalui channel pertama.
  • verification.deliveredOperator mengonfirmasi penerimaan di perangkat penerima.
  • verification.checkedPenerima mengirimkan kode; payload mencakup approved atau denied.
  • verification.fellbackSMS tidak sampai dalam jendela waktu; fallback suara telah dikirim.
  • verification.expiredTTL habis tanpa check yang berhasil.
  • verification.lockedMaksimal percobaan tercapai; panggilan check selanjutnya mengembalikan verification_locked.
  • verification.failedKegagalan permanen sebelum pengiriman (penerima tidak valid, penolakan operator).

Jika Anda sudah mengintegrasikan SMS, Anda sudah mengintegrasikan Verifications.

Auth sama, idempotensi sama, envelope error sama, bentuk webhook sama. Bedanya, Verifications menghasilkan kode, memilih rute, menjalankan filter fraud, dan menangani fallback — sehingga Anda tidak perlu.

Verifications.

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

Satu panggilan. Kami memilih channel, rute, menghasilkan kode, menjalankan pemeriksaan fraud, menangani lockout.

SMS.

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

Pengiriman mentah, untuk saat Anda ingin mengelola sendiri pembuatan kode dan kebijakan retry.

Mulai dari $0,04 per verifikasi, sudah termasuk semuanya.

Dihitung per verifikasi berhasil, SMS atau suara. Tidak ada biaya untuk verification.failed. Diskon volume berlaku otomatis di atas 100K/bulan. Tanpa biaya platform, tanpa biaya per seat, tanpa fitur tier yang dikunci di balik komitmen tahunan.

Mulai dengan satu channel.
Tambahkan yang lain saat Anda siap.

API key uji coba langsung tersedia untuk Anda. Akses produksi terbuka setelah Anda menambahkan metode pembayaran dan memverifikasi pengirim.

Mulai sekarangBaca dokumentasiatau

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

Cursor