Bird Verify

A API de verificação sem nada para guardar.

Configure em:
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;

Duas chamadas desde a npm install até um utilizador verificado

Envie um código e depois verifique-o, na linguagem que já utiliza.

Create-or-retry envia o código; check confirma-o por destinatário. Duas chamadas, e nenhum id de verificação para encadear entre elas.

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

Dez coisas que não precisa de construir quando a verificação é a API.

Primitivas concretas, nomeadas e configuráveis. Sem ambiguidade.

  1. 01

    Crie ou reenvie numa única chamada.

    Reenvie o mesmo destinatário e retomamos a sessão ativa, reenviando quando o cooldown passar. Sem endpoint de reenvio separado, sem verificações duplicadas.

  2. 02

    Verifique por destinatário. Não guarde nada.

    Submeta o destinatário e o código; resolvemos a sessão a partir do par configuração-e-destinatário. Não há nenhum id de verificação para persistir entre envio e verificação.

  3. 03

    Email, SMS e WhatsApp no lançamento.

    O destinatário que você passa determina o canal: um endereço de e-mail verifica por e-mail, um número de telefone por SMS ou WhatsApp. Mudar de canal é alterar um único campo, não uma nova integração. Voz é o próximo a ser lançado, e o fallback automático entre canais está a caminho.

  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

    Códigos que nunca vê.

    Gerado com uma fonte criptográfica aleatória, armazenado apenas como HMAC, comparado em tempo constante. O código em texto simples nunca toca na sua stack nem nos nossos logs.

  6. 06

    Código, TTL e tentativas configuráveis.

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

  7. 07

    Cada código permanece válido até a sessão terminar.

    Uma mensagem atrasada e um código reenviado de fresco ambos verificam, porque não invalidamos o código anterior quando um novo é enviado.

  8. 08

    Um código errado é um 200, não uma exceção.

    Valide respostas com um resultado booleano — este código verificou, sim ou não — e um motivo que detalha quando não verificou: inválido, expirado, já verificado ou sem tentativas restantes. Você faz a ramificação com base em um campo, nunca em um erro lançado.

  9. 09

    Rate limits incluídos.

    Limites de envio por destinatário e limite de tentativas por verificação — cada um um 429 com Retry-After — para que a força bruta se esgote antes de si.

  10. 10

    O mesmo contrato que o resto do Bird.

    Autenticação Bearer, chave de idempotência, ids tipados vrf_, um envelope de erro. O handler que escreveu para email já serve para verificação.

Não armazene nada entre o envio e a verificação.

A maioria das APIs de verificação devolve-lhe um id para persistir, consultar e submeter o código. O Bird resolve a sessão a partir do destinatário, por isso não há estado por verificação do seu lado.

A maioria das APIs de verificação

O create devolve um id que armazena, depois consulta a verificação para validar o código.

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

Bird Verify

Verifique pelo destinatário. Não há nada para encadear entre as duas chamadas.

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;

A verificação é também uma decisão de produto: a mesma API suporta autenticação de dois fatores e login sem palavra-passe. Quer validar um número primeiro? Combine com o Lookup. Autenticação silenciosa de rede e apps autenticadoras TOTP estão no roadmap.

Porque construímos o Verify

Porque o código que permite a entrada de um utilizador não deveria precisar da sua própria tabela na base de dados.

OTP é o canal onde um código que não chega é um registo que não acontece. O Bird já opera email e SMS em escala, por isso o Verify é essa entrega mais a geração de código, a sessão, o plano de canais por país e os rate limits — atrás de dois endpoints que não armazenam nada do seu lado e respondem com o mesmo formato de qualquer outro canal 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 integrou SMS, já integrou o Verify.

Mesmo modelo de autenticação, mesmo contrato de idempotência, mesmo envelope de erros. A diferença é que o Verify gera o código, escolhe o canal e aplica os limites de taxa — para que você não precise fazer isso.

Verify

Uma chamada envia o código; outra verifica-o pelo destinatário. Nós gerimos o código, a sessão e os limites.

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

SMS

O envio direto, para quando você quer controlar a geração do código e a política de reenvio.

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

Escolha o remetente que os seus utilizadores veem

Os códigos são enviados sob Bird Verify por predefinição, sem necessidade de registo ou configuração de modelos. Mude um canal para Authifly e os seus utilizadores veem uma identidade de verificação neutra em vez de um fornecedor de plataforma: o e-mail OTP é enviado a partir de otp@verify.authifly.com e o SMS mostra o remetente Authifly sempre que o país de destino permitir um remetente com marca. Bird opera ambas as identidades, por isso a escolha não tem qualquer custo operacional para si — e pode configurá-la por canal e por país. No e-mail, pode ir mais longe e enviar a partir de um domínio que tenha verificado. Se um destinatário receber um código inesperado, authifly.com assegura-lhe que a Authifly envia códigos de utilização única legítimos em nome de uma empresa. Authifly é operada por Bird B.V.

Visite authifly.com

Verificação na mesma plataforma que o resto das suas mensagens.

Comece a construir hoje ou fale connosco sobre os canais, o volume e os preços de que precisa.

Comece com um canal.
Adicione os outros quando estiver pronto.

Uma chave API de teste é sua imediatamente. A produção é desbloqueada quando você adiciona um método de pagamento e verifica um remetente.

Usa Claude Code, Cursor ou Codex? Copie um prompt de configuração e o seu agente instala o Bird CLI e as skills por si. Escolha o seu:

Cursor