Bird Verify

L<highlight>API di verifica</highlight> senza nulla da memorizzare.

Configura in:
Cursor

Send a one-time code over email, SMS, or WhatsApp, then check it by recipient, with no verification id to keep between the two calls. The channel order, sender, and code rules already resolve per country automatically. Same auth and idempotency as every other Bird channel, because the same team built them all. Voice is rolling out next.

verify.ts
200 · pending
import { BirdClient } from "@messagebird/sdk";

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

// Send the code, then check it by recipient.
await bird.verify.verifications.create({
  to: { phone_number: "+15551234567" },
}).safe();

const { data, error } = await bird.verify.verifications.check({
  to:   { phone_number: "+15551234567" },
  code: userInput,
}).safe();
if (error) throw error;

Due chiamate da npm install a un utente verificato

Invia un codice, poi verificalo, nel linguaggio che già utilizzi.

Create-or-retry invia il codice; check lo conferma per destinatario. Due chiamate, senza alcun id di verifica da passare tra le due.

1
2
3
4
const verification = await bird.verify.verifications.create({
  to: { phone_number: "+15551234567" },
});
console.log(verification.id, verification.status);

Dieci cose che non devi costruire quando la verifica è l'API.

Primitive concrete, con nome e configurabili. Nessuna vaghezza.

  1. 01

    Crea o riprova in una sola chiamata.

    Reinviate lo stesso destinatario e riprendiamo la sessione attiva, reinviando una volta scaduto il cooldown. Nessun endpoint di reinvio separato, nessuna verifica duplicata.

  2. 02

    Verifica per destinatario. Non memorizzare nulla.

    Inviate il destinatario e il codice; noi risolviamo la sessione dalla coppia configurazione-destinatario. Non c'è alcun id di verifica da persistere tra invio e controllo.

  3. 03

    Email, SMS e WhatsApp al lancio.

    Il destinatario che passi determina il canale: un indirizzo email verifica tramite email, un numero di telefono tramite SMS o WhatsApp. Cambiare canale significa modificare un solo campo, non una nuova integrazione. La voce è in arrivo, e il fallback automatico tra canali è in fase di sviluppo.

  4. 04

    Per-country channel order, already resolved.

    Channel order, sender, and which channels are on differ by country. Bird's per-country base decides this, so a create call already resolves to the right plan everywhere.

  5. 05

    Codici che non vedrete mai.

    Generato con una fonte crittografica casuale, memorizzato solo come HMAC, confrontato in tempo costante. Il codice in chiaro non tocca mai il vostro stack né i nostri log.

  6. 06

    Codice, TTL e tentativi configurabili.

    Six-digit default, 4–10 configurable per request; a 10-minute window; 5 attempts; a 60-second resend cooldown.

  7. 07

    Ogni codice resta valido fino al termine della sessione.

    Un messaggio in ritardo e un codice appena reinviato vengono entrambi verificati, perché non invalidiamo il codice precedente quando ne viene generato uno nuovo.

  8. 08

    Un codice errato è un 200, non un'eccezione.

    Verifica le risposte con un risultato booleano — il codice è stato verificato, sì o no — e un motivo che dettaglia quando non lo è stato: non valido, scaduto, già verificato o tentativi esauriti. La logica si basa su un campo, mai su un errore sollevato.

  9. 09

    Rate limit integrati.

    Limiti di invio per destinatario e limite di tentativi per verifica, ciascuno con un 429 e Retry-After, così il brute force si esaurisce prima di voi.

  10. 10

    Stesso contratto del resto di Bird.

    Auth Bearer, idempotency key, ID tipizzati vrf_, un unico envelope di errore. L'handler che avete scritto per l'email funziona già per la verifica.

Non memorizzate nulla tra invio e verifica.

La maggior parte delle API di verifica vi restituisce un id da persistere, cercare e usare per verificare il codice. Bird risolve la sessione dal destinatario, quindi non c'è alcuno stato per verifica dal vostro lato.

La maggior parte delle API di verifica

La creazione restituisce un id che salvate, poi cercate la verifica per confrontare il codice.

id-keyed.ts
const { id } = await api.verifications.create({
  to: "+15551234567",
});
// persist id somewhere, then later…
await api.verifications.check({ id, code });

Bird Verify

Verificate tramite destinatario. Non c'è nulla da collegare tra le due chiamate.

by-target.ts
await bird.verify.verifications.create({
  to: { phone_number: "+15551234567" },
}).safe();
// no id to store; check by the same recipient
await bird.verify.verifications.check({
  to: { phone_number: "+15551234567" }, code,
}).safe();

Routing already knows the country.

Channel order, senders, and which channels are on differ by country: WhatsApp-first in one market, SMS-only in another. Bird's per-country base decides this, so a create call already resolves to the right plan. See channel orchestration.

per-country.ts
200
// Brazil already resolves WhatsApp, then SMS.
const { data, error } = await bird.verify.verifications.create({
  to: { phone_number: "+5511998765432" },
}).safe();
if (error) throw error;

La verifica è anche una decisione di prodotto: la stessa API supporta l'autenticazione a due fattori e il login senza password. Dovete prima validare un numero? Abbinatelo a Lookup. L'autenticazione silenziosa di rete e le app TOTP authenticator sono nella roadmap.

Perché costruiamo Verify

Perché il codice che fa accedere un utente non dovrebbe aver bisogno di una propria tabella nel database.

OTP è il canale dove un codice che non arriva è una registrazione che non avviene. Bird gestisce già email e SMS su larga scala, quindi Verify è quella delivery più la generazione del codice, la sessione, il piano canali per Paese e i rate limit, dietro due endpoint che non memorizzano nulla dal vostro lato e rispondono con la stessa struttura di ogni altro canale Bird.

verify.ts
200 · pending
import { BirdClient } from "@messagebird/sdk";

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

// Send the code, then check it by recipient.
await bird.verify.verifications.create({
  to: { phone_number: "+15551234567" },
}).safe();

const { data, error } = await bird.verify.verifications.check({
  to:   { phone_number: "+15551234567" },
  code: userInput,
}).safe();
if (error) throw error;

Se avete integrato SMS, avete integrato Verify.

Stesso modello di autenticazione, stesso contratto di idempotency, stesso envelope di errore. La differenza è che Verify genera il codice, sceglie il canale e gestisce i rate limit, così non dovete farlo voi.

Verify

Una chiamata invia il codice; una chiamata lo verifica per destinatario. Noi gestiamo il codice, la sessione e i limiti.

verify.ts
await bird.verify.verifications.create({
  to: { phone_number: "+15551234567" },
});

SMS

L'invio diretto, per quando vuoi gestire in autonomia la generazione del codice e la policy di retry.

notify.ts
await bird.sms.send({
  from:     "Bird",
  to:       "+15551234567",
  text:     `Your code is ${code}.`,
  category: "authentication",
});

Scegli il mittente che vedono i tuoi utenti

I codici vengono inviati con Bird Verify per impostazione predefinita, senza che registrazioni o configurazioni di template si frappongano. Passa a Authifly su un canale e i tuoi utenti vedranno un'identità di verifica neutrale anziché un fornitore di piattaforma: l'email OTP arriva da otp@verify.authifly.com e l'SMS mostra il mittente Authifly ovunque il Paese di destinazione consenta un mittente personalizzato. Bird gestisce entrambe le identità, quindi la scelta non comporta costi aggiuntivi e puoi configurarla per canale e per Paese. Per l'email puoi andare oltre e inviare da un dominio che hai verificato personalmente. Se un destinatario riceve un codice inatteso, authifly.com lo rassicura che Authifly invia codici monouso legittimi per conto di un'azienda. Authifly è gestito da Bird B.V.

Visita authifly.com

La verifica sulla stessa piattaforma del resto della tua messaggistica.

Inizia a sviluppare oggi stesso, oppure parlaci dei canali, dei volumi e dei prezzi di cui hai bisogno.

Inizia con un canale.
Aggiungi gli altri quando sei pronto.

Una chiave API di test è subito tua. La produzione si sblocca quando aggiungi un metodo di pagamento e verifichi un mittente.

Usi Claude Code, Cursor o Codex? Copia un prompt di configurazione e il tuo agente installerà la CLI e le skill di Bird per te. Scegli il tuo:

Cursor