Bird Verify

La API de verificación sin nada que almacenar.

Envíe un código de un solo uso por email, SMS o WhatsApp y luego verifíquelo por destinatario, sin necesidad de conservar un id de verificación entre las dos llamadas. El orden de canales, el remitente y las reglas del código ya se resuelven automáticamente por país. La misma autenticación e idempotencia que en cualquier otro canal de Bird, porque el mismo equipo los construyó todos. La voz se está implementando próximamente.

Cursor
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;
Verification flow

Your account

Confirm it’s you.

Enter the code sent to

+1 ••• ••• 4567

Example verification code

482691
Code verified
Send a code. Confirm the recipient.

Equipos que crean software de primer nivel confían en nosotros cada día

Leer más historias de clientes

Dos llamadas desde npm install hasta un usuario verificado

Envía un código y compruébalo, en el lenguaje que ya usas.

Create-or-retry envía el código; check lo confirma por destinatario. Dos llamadas, sin id de verificación que pasar entre ellas.

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

Diez cosas que no construyes cuando la verificación es la API.

Primitivas concretas, nombradas y configurables. Sin ambigüedades.

  1. 01

    Crea o reintenta en una sola llamada.

    Vuelve a enviar el mismo destinatario y retomamos la sesión activa, reenviando cuando pase el cooldown. Sin endpoint de reenvío separado, sin verificaciones duplicadas.

  2. 02

    Comprueba por destinatario. No almacenes nada.

    Envía el destinatario y el código; resolvemos la sesión a partir del par configuración-destinatario. No hay id de verificación que persistir entre el envío y la comprobación.

  3. 03

    Email, SMS y WhatsApp en el lanzamiento.

    The recipient you pass picks the channel: an email address verifies by email, a phone number by SMS or WhatsApp. Switching channels is a one-field change, not a new integration. Delivery failure can advance the verification to the next available channel. Voice is rolling out next.

  4. 04

    Orden de canales por país, ya resuelto.

    El orden de canales, el remitente y qué canales están activos varían según el país. La configuración por país de Bird lo decide, de modo que una llamada de creación ya se resuelve con el plan correcto en todas partes.

  5. 05

    Códigos que nunca ves.

    Generado con una fuente criptográfica aleatoria, almacenado solo como HMAC, comparado en tiempo constante. El código en texto plano nunca toca tu stack ni nuestros logs.

  6. 06

    Código, TTL e intentos configurables.

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

  7. 07

    Cada código permanece válido hasta que la sesión termina.

    Un mensaje retrasado y un código recién reenviado verifican ambos, porque no invalidamos el código anterior cuando se envía uno nuevo.

  8. 08

    Un código incorrecto es un 200, no una excepción.

    Comprueba las respuestas con un resultado booleano —¿este código se verificó, sí o no?— y un motivo que detalla cuándo falló: inválido, expirado, ya verificado o sin intentos restantes. Bifurcas según un campo, nunca según un error lanzado.

  9. 09

    Límites de tasa integrados.

    Límites de envío por destinatario y un límite de intentos por verificación, cada uno con un 429 y Retry-After, para que la fuerza bruta se agote antes que tú.

  10. 10

    El mismo contrato que el resto de Bird.

    Autenticación Bearer, una clave de idempotencia, ids tipados vrf_, un único sobre de error. El handler que escribiste para email ya sirve para verificación.

No almacenes nada entre el envío y la verificación.

La mayoría de las API de verificación te devuelven un id que debes persistir, consultar y enviar el código contra él. Bird resuelve la sesión a partir del destinatario, así que no hay estado por verificación de tu lado.

La mayoría de las API de verificación

Create devuelve un id que almacenas, luego consultas la verificación para comprobar el código contra ella.

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

Bird Verify

Verifica por destinatario. No hay nada que hilar entre las dos llamadas.

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

El enrutamiento ya conoce el país.

El orden de canales, los remitentes y qué canales están activos varían según el país: WhatsApp primero en un mercado, solo SMS en otro. La configuración por país de Bird lo decide, de modo que una llamada de creación ya se resuelve con el plan correcto. Consulte orquestación de canales.

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 verificación también es una decisión de producto: la misma API impulsa la autenticación de dos factores y el inicio de sesión sin contraseña. ¿Validar un número primero? Combínalo con Lookup. La autenticación silenciosa de red y las apps de autenticación TOTP están en la hoja de ruta.

Por qué construimos Verify

Porque el código que permite entrar a un usuario no debería necesitar su propia tabla en la base de datos.

OTP es el canal donde un código que no llega es un registro que no sucede. Bird ya ejecuta email y SMS a escala, así que Verify es esa entrega más la generación del código, la sesión, el plan de canales por país y los límites de tasa, detrás de dos endpoints que no almacenan nada de tu lado y responden con la misma estructura que cualquier otro canal de 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;

Si ya integraste SMS, ya integraste Verify.

Mismo modelo de autenticación, mismo contrato de idempotencia, mismo formato de errores. La diferencia es que Verify genera el código, elige el canal y gestiona los límites de frecuencia, para que tú no tengas que hacerlo.

Verify

Una llamada envía el código; otra lo verifica por destinatario. Nosotros gestionamos el código, la sesión y los límites.

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

SMS

El envío directo, para cuando quiere controlar usted mismo la generación del código y la política de reintentos.

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

Elige el remitente que ven tus usuarios

Los códigos se envían bajo Bird Verify de forma predeterminada, sin que el registro ni la configuración de plantillas se interpongan. Cambia un canal a Authifly y tus usuarios verán una identidad de verificación neutral en lugar de un proveedor de plataforma: el correo de OTP llega desde otp@verify.authifly.com y el SMS muestra el remitente Authifly en los países donde se permite uno con marca. Bird opera ambas identidades, así que la elección no tiene coste operativo y se configura por canal y por país. En el correo electrónico puedes ir más allá y enviar desde un dominio que hayas verificado tú mismo. Si un destinatario recibe un código inesperado, authifly.com le confirma que Authifly envía códigos de un solo uso legítimos en nombre de una empresa. Authifly es operado por Bird B.V.

Visite authifly.com

Envía tu primera solicitud antes de escribir una sola línea de código.

Toda la API pública es una colección de Postman, convertida a partir de la misma especificación OpenAPI de la que se generan los SDK, con una solicitud y respuesta de ejemplo en cada endpoint. Haz un fork en tu propio espacio de trabajo, configura una clave API y envía una solicitud en vivo.

Verificación en la misma plataforma que el resto de su mensajería.

Empieza a construir hoy o habla con nosotros sobre los canales, el volumen y los precios que necesitas.

Tus datos

Todos los campos de contacto son obligatorios.

Para que nuestro equipo pueda contactarte sobre tu demo.

Productos de interés

Opcional

Te contactaremos para coordinar tu demo.
Política de privacidad

Empieza con un canal.
Añade los demás cuando estés listo.

Una clave API de prueba es tuya de inmediato. El acceso a producción se desbloquea cuando añades un método de pago y verificas un remitente.

¿Usas Claude Code, Cursor o Codex? Copia un prompt de configuración y tu agente instalará el Bird CLI y las habilidades por ti. Elige el tuyo:

Cursor