O código é um segredo. E nós tratamos como um.

Um código de uso único é tão seguro quanto a forma como é gerado, armazenado e limitado. Bird Verify gera códigos com uma fonte criptográfica, armazena apenas um hash, compara em tempo constante e limita tanto envios quanto tentativas, de modo que um log vazado ou um ataque de força bruta não leva o invasor a lugar nenhum. Pontuação de fraude será construída sobre essa base em seguida.

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;
Fluxo de verificação

Sua conta

Confirme que é você.

Digite o código enviado para

+1 ••• ••• 4567

Exemplo de código de verificação

482691
Código verificado
Envie um código. Confirme o destinatário.

Segurança ativa por padrão, não um complemento.

Toda verificação na Bird Verify API carrega as mesmas proteções: o código é gerado no servidor, nunca retornado, e armazenado apenas como hash; as verificações rodam em tempo constante e contra um orçamento limitado de tentativas; e os envios são limitados por destinatário e por espaço de trabalho. Você não precisa ativar ou configurar nada disso: é assim que a API funciona, seja como login com dois fatores ou acesso sem senha.

Cinco proteções em cada verificação.

Sem etapa de configuração, sem complemento avulso.

  1. 01

    Geração criptográfica.

    Os códigos são gerados a partir de uma fonte aleatória criptográfica, uniformemente distribuídos no espaço de códigos, não um contador ou timestamp previsível.

  2. 02

    Hash em repouso, nunca exposto na resposta.

    Apenas um HMAC-SHA256 de cada código é armazenado; o texto puro nunca é retornado pela API e nunca é gravado na sua stack ou nos nossos logs.

  3. 03

    Comparação em tempo constante.

    Os códigos enviados são comparados em tempo constante, de modo que um invasor não aprende nada pelo tempo que uma verificação leva.

  4. 04

    Bloqueio por tentativas.

    Cada sessão tem um número limitado de verificações (5 por padrão). Quando se esgotam, a sessão falha, então tentativas de adivinhação não podem continuar indefinidamente.

  5. 05

    Limites de envio.

    Um limite de envio por destinatário e um intervalo mínimo entre reenvios controlam o gasto e a superfície de abuso, cada um retornando um 429 com Retry-After.

As tentativas acabam antes dos seus usuários.

Um código errado retorna com as tentativas restantes, e a sessão falha quando o orçamento se esgota, de modo que um ataque de força bruta bate em um muro muito antes de encontrar o código.

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

// wrong code, attempts left → { success: false, reason: "incorrect_code", attempts_remaining: 2 }
// budget spent, session done → { success: false, reason: "attempts_exhausted", attempts_remaining: null }
Em breve

Em breve: sinais de fraude e proteção contra bombeamento de SMS.

O histórico por envio que o Verify registra hoje é a base para uma camada de fraude que estamos construindo agora. Ela usa as mesmas chamadas de criação e verificação, então adotá-la depois é uma mudança de configuração, não uma reintegração.

Sinais de risco na criação. Passe contexto de dispositivo, IP e solicitação em uma verificação, e tentativas de alto risco recebem um resultado bloqueado antes que qualquer código seja enviado, assim você não paga para enviar mensagem a um invasor.

Proteção contra bombeamento de SMS e AIT. Limites de envio por país e por prefixo, somados a um teto de gasto por espaço de trabalho, bloqueiam o ataque de tráfego artificialmente inflado que direciona OTPs para faixas de números premium para compartilhamento de receita com operadoras.

Construído sobre o que já existe. A decisão de risco lê o histórico de tentativas que o Verify mantém desde o primeiro dia, e o resultado bloqueado já faz parte do modelo de status, então a camada de fraude entra sem alterar sua integração.

Escale sem
perder o controle.

Organize equipes em espaços de trabalho, controle o acesso à API e rastreie alterações nos logs de auditoria.

BirdHarborOrganização
Espaços de trabalhoProduçãoSandbox

Agente de envio

Chave de API · Equipe de operações do cliente
Ativo
PermissõesAcesso
EmailLeitura e escrita
SMSLeitura e escrita
ALAlex Lee AdministradorPermissões atualizadas

Registo de auditoria

Produção
Espaço de trabalho
Produção
Recurso
Agente de envio
WhatsApp
Acesso de leituraLeitura e escrita
Concluído com sucesso

Comece com Verify.
Construa em vários canais com a Bird.

Sua próxima ideia. Pronta para conectar.