Uma API para seus códigos 2FA
Você envia o código. A gente entrega.
Faça uma chamada de API com um telefone ou um e-mail. A aut2fa entrega o código por WhatsApp, SMS, Telegram ou e-mail, e o seu extrato mostra qual número enviou e quando ele foi enviado, entregue e lido.
Sua aplicação
POST /v1/send
- Telegram
- SMS
Código entregue
+55 31 9••••-9999
Código de verificação
482 913
- Uma integração, quatro canais
- Chaves de teste grátis
- Pague só pelo que foi entregue
Do primeiro POST ao código verificado
curl https://api.aut2fa.com/v1/send \
-H "Authorization: Bearer ak_live_…" \
-H "Content-Type: application/json" \
-d '{"to": "+5531999999999"}'
# O usuário digitou 482913
curl https://api.aut2fa.com/v1/send/snd_8Kq2wR7tXz/verify \
-H "Authorization: Bearer ak_live_…" \
-H "Content-Type: application/json" \
-d '{"code": "482913"}'import { Aut2fa } from "@aut2fa/node";
const aut2fa = new Aut2fa(process.env.AUT2FA_API_KEY);
const send = await aut2fa.send({ to: "+5531999999999" });
// O usuário digitou 482913
const result = await aut2fa.verify(send.id, { code: "482913" });
console.log(result.valid); // trueuse Aut2fa\Aut2fa;
$aut2fa = new Aut2fa(getenv('AUT2FA_API_KEY'));
$send = $aut2fa->send(['to' => '+5531999999999']);
// O usuário digitou 482913
$result = $aut2fa->verify($send->id, ['code' => '482913']);
var_dump($result->valid); // trueimport "github.com/jhowbhz/aut2fa-go"
client, err := aut2fa.New(os.Getenv("AUT2FA_API_KEY"))
if err != nil {
return err
}
send, err := client.Send(ctx, aut2fa.SendParams{To: "+5531999999999"})
if err != nil {
return err
}
// O usuário digitou 482913
result, err := client.Verify(ctx, send.ID, "482913")
if err != nil {
return err
}
fmt.Println(result.Valid) // trueimport os
from aut2fa import Aut2fa
client = Aut2fa(os.environ["AUT2FA_API_KEY"])
send = client.send(to="+5531999999999")
# O usuário digitou 482913
result = client.verify(send.id, code="482913")
print(result.valid) # TrueCopie o prompt e cole no Cursor, Claude Code, Codex ou no seu agente de código.
Integre a aut2fa neste projeto para enviar e verificar códigos OTP/2FA. Primeiro inspecione a stack, a autenticação e as convenções existentes.
Read https://doc.aut2fa.com and https://aut2fa.com/llms.txt before coding. Confirm the current API contract in the official documentation. If documentation is unavailable, report what is missing rather than inventing endpoints, SDK methods or package names. Use the existing HTTP client when no published SDK is confirmed.
Implementation:
1. Keep AUT2FA_API_KEY in a server-only environment variable. Never expose it to the browser, commit it, or log keys, codes or recipient data. Provide an .env.example with a placeholder.
2. Send with POST https://api.aut2fa.com/v1/send, Authorization: Bearer <key>, Content-Type: application/json, and {"to":"<recipient>"}. Validate and normalize phone numbers to E.164. Confirm supported recipients and optional fields in the docs.
3. Generate an Idempotency-Key per logical send and reuse it for retries of that same request. Store the returned send ID server-side, tied to the current user/session and verification purpose. Never trust an arbitrary send ID from the client.
4. Verify with POST /v1/send/{id}/verify and {"code":"<user input>"}. Read GET /v1/send/{id}/status when needed. Treat delivery and successful verification as separate states. Only accept the documented successful verification response.
5. Build accessible recipient and code forms with loading, pending, success, invalid/expired code, rate-limit and unavailable-service states. Preserve existing UI conventions. Add resend cooldown and server-side attempt limits. Respect Retry-After; avoid blind retries and duplicate sends.
6. Use test keys first. Codes generated by aut2fa in test mode are 000000; do not assume this for client-supplied codes or live keys. Never bypass verification in production.
7. Add meaningful tests for send, verify, errors, idempotent retries, session binding and secret isolation. Mock external requests; do not send real messages in tests.
Deliver working code, setup instructions, required environment variables and a list of changed files. Run the project's tests, lint and typecheck. Report actual results and any documentation assumptions. Do not replace unrelated architecture or publish/deploy automatically.
Responda e escreva os textos da interface em português do Brasil, seguindo as convenções de código do projeto.Status do envio
202 Accepted
snd_8Kq2wR7tXz
- queued
- sending
channel: whatsapp
- sent
from: +55 11 9••••-0142
- delivered
- read
- verified
Da requisição ao código verificado em três passos
Duas chamadas do seu backend. Tudo o que acontece no meio fica com a aut2fa.
Envie
Faça um POST com o telefone ou o e-mail. O ID do envio volta na hora. A aut2fa gera o código, a menos que você mande o seu.
POST /v1/send
A aut2fa entrega
A aut2fa escolhe o canal e o número de envio, entrega o código e registra cada status com data e hora.
GET /v1/send/{id}/status
Verifique
Quando o usuário digitar o código, faça um POST em /verify. A resposta diz se ele é válido e quantas tentativas restam.
POST /v1/send/{id}/verify
Você nunca escolhe o canal
Envie um telefone ou um e-mail. A aut2fa decide como chegar até ele, e o status do envio diz qual canal e qual número foram usados. Uma integração cobre os quatro canais.
- +5531999999999
- WhatsAppTelegramSMS
- [email protected]
Saiba o que aconteceu com cada código
O extrato lista cada envio com o canal, o número que enviou e quando ele foi enviado, entregue e lido.
| Enviado às | Para | Canal | De | Status |
|---|---|---|---|---|
| 18:05:00 | +55 31 9••••-9999 | +55 11 9••••-0142 | Lido às 18:05:04 | |
| 18:04:12 | +55 21 9••••-4410 | SMS | +55 11 9••••-7731 | Entregue às 18:04:15 |
| 18:02:30 | +55 41 9••••-2087 | +55 11 9••••-0388 | Lido às 18:02:41 | |
| 18:01:58 | +55 85 9••••-6120 | SMS | +55 11 9••••-7731 | Falhou, sem cobrança |
Roteamento automático
Para cada código, a aut2fa escolhe o canal mais barato entre os que você permitiu e o número que envia. Você não precisa administrar contas em provedores.
Confirmação de entrega
Acompanhe cada código em sent, delivered e read, com o horário de cada etapa que o canal informa.
Rate limit contra SMS pumping
Toda conta tem um teto de envios por minuto. Além dele, ative limites por aplicação, por minuto e por destinatário por hora, para barrar SMS pumping.
Chaves de teste grátis
Chaves
ak_test_são grátis, e os códigos que a aut2fa gera no modo teste são sempre000000: seus testes rodam o fluxo real.Chaves de idempotência
Envie o header
Idempotency-Keye uma requisição repetida devolve o envio original, sem mandar um segundo código.Pague só pelo que foi entregue
Cada envio custa o preço do canal que entregou. Se nenhum canal entregar, o envio não custa nada.
Envios disponíveis e preços
Compare os canais disponíveis hoje e confira o custo das quantidades sugeridas. Você só paga pelos códigos entregues.
Chaves de teste grátis para validar a integração.
SDKs para Node, PHP, Go e Python
Gratuitas e de código aberto no GitHub. As quatro cobrem os mesmos três endpoints.
Node.js
npm i @aut2fa/nodePHP
composer require aut2fa/aut2fa-phpGo
go get github.com/jhowbhz/aut2fa-goPython
pip install aut2fa
Perguntas frequentes
Por qual canal o usuário vai receber o código?
Um telefone pode receber o código por WhatsApp, Telegram ou SMS; um e-mail recebe por e-mail. Entre os canais que você permitiu, a aut2fa escolhe o mais barato. O status do envio e o seu extrato mostram o canal e o número que enviou.
Como funcionam as chaves de teste?
Chaves que começam com ak_test_ são grátis, e os códigos que a aut2fa gera no modo teste são sempre 000000. Seus testes automatizados rodam o fluxo inteiro sem mexer no saldo.
Quanto custa um código?
Cada canal tem seu preço por código, informado na página de preços. A aut2fa escolhe o canal mais barato entre os que você permitiu e cobra só o canal que entregou.
E se o código não for entregue?
Nada. O envio fica marcado como falho, o saldo não muda e o extrato mostra a falha.
Como eu pago?
Recarregue qualquer valor no painel, com Pix ou cartão. O pagamento passa pelo Mercado Pago e é cobrado em reais. Não há assinatura.
Como vocês evitam SMS pumping?
Toda conta tem um teto de envios por minuto. Você também pode ativar limites por aplicação: envios por minuto e envios por destinatário por hora. Requisições acima do limite recebem 429 com o header Retry-After, antes de qualquer envio.
Posso repetir uma requisição com segurança?
Sim, com o header Idempotency-Key. Repetir a requisição com a mesma chave devolve o envio original, sem mandar um segundo código.
Posso enviar meu próprio código?
Sim. Mande o código no campo code, ou deixe o campo de fora e a aut2fa gera um. Defina locale como en ou pt-BR para escolher o idioma da mensagem.
Envie o primeiro código com uma chave de teste grátis
Crie uma conta, copie sua chave ak_test_ e rode a requisição lá de cima.