API para desenvolvedores
Venda números temporários no seu site ou aplicativo e receba os códigos por API.
Conheça o programa de revenda e venda pelo seu preço →
1. O que é e como obter acesso
A API permite revender números temporários para receber SMS no seu próprio site ou aplicativo. O cliente final não precisa visitar o Ativa SMS.
Crie uma conta e peça acesso em Revender números, no menu do perfil do dashboard. O aceite dos Termos de revenda é condição para o acesso; os Termos de uso também valem. Após a liberação, crie as chaves em Dashboard → API.
2. Endereço e formato
Base URL: https://www.ativasms.store/api/v1. Envie JSON UTF-8 com Content-Type: application/json nos corpos. As respostas são JSON e incluem Cache-Control: no-store.
Valores monetários são inteiros em centavos: moeda indica BRL ou USD conforme a conta; 83 em BRL significa R$ 0,83. No teste, a moeda é sempre BRL. Datas são ISO 8601 UTC. Telefone vem em formato internacional com +DDI, ou null enquanto a reserva está em andamento.
Os exemplos são ilustrativos, usam o formato real das rotas e, nas compras, dados fictícios do modo test. Use códigos e opções retornados pela API; os preços live variam. Os comandos curl usam uma variável de ambiente do seu servidor: ATIVA_API_KEY.
Especificação OpenAPI 3.1, para ferramentas e agentes de IA: /openapi.json.
3. Autenticação
Envie Authorization: Bearer <chave> em todas as rotas. Chaves começam com ativa_live_ (produção) ou ativa_test_ (teste). Não envie a chave em query ou corpo.
A chave aparece uma única vez ao criar. Guarde-a somente no servidor do revendedor, nunca no navegador nem no aplicativo do cliente. Há até 5 chaves ativas por conta, somando live e test. Se perder ou expor uma chave, revogue e crie outra no dashboard. Uma restrição de IP configurada também precisa ser respeitada.
Falhas de autenticação devolvem o mesmo HTTP 401, sem revelar o motivo:
{
"erro": "nao_autorizado",
"mensagem": "Chave de API ausente, inválida ou revogada."
}
4. Limites
Valores padrão, ajustáveis por revendedor; veja os limites da sua conta no dashboard:
| Limite | Padrão |
|---|---|
| Pedidos por minuto | 120 |
| Compras/trocas por minuto | 20 |
| Números aguardando SMS ao mesmo tempo | 20 |
| Tentativas sem código em 24 h por conta | 100 |
| Tentativas sem código em 24 h por cliente_ref | 15 |
Pedidos e compras somam todas as chaves da conta do mesmo modo. Teste e produção têm contagens separadas e os mesmos tetos configurados. Cancelados, trocados e expirados sem SMS consomem tentativas; cada número com código libera 5 tentativas, até o teto. Falhas de entrega não contam. Na produção, os limites de abertos/tentativas da conta também abrangem suas compras pelo site.
Ao exceder pedidos/compras por minuto, há HTTP 429 muitas_requisicoes com Retry-After: 60 (segundos). Os demais limites devolvem 429 com o código específico, sem Retry-After: aguarde liberação de números ou de tentativas, conforme o caso.
5. Idempotência e preço máximo
Idempotency-Key é obrigatório em compra e troca: 1–64 caracteres, letras, dígitos e . _ : -. Use uma chave nova para cada operação desejada e a mesma chave em retentativas. A chave pertence à conta e ao modo; compra e troca compartilham esse espaço. Não reutilize uma chave para outro cliente ou pedido.
Repetir uma chave já registrada retorna HTTP 200, o mesmo número e seu estado atual, mesmo que o corpo tenha mudado; compra nova retorna 201. A consulta live não limita a repetição a 24 h: enquanto o registro existir, a chave retorna aquele número. No teste, o histórico é retido por 30 dias. Reiniciar o saldo de teste preserva idempotência e histórico.
preco_maximo_centavos é o maior débito que você aceita na moeda da conta. Se o preço atual estiver acima, a API retorna preco_acima_do_maximo, com preco_centavos e opcoes, sem comprar. preco_centavos é o valor que sai do seu saldo; preco_site_centavos é o preço de referência no site. O preço é conferido novamente na compra.
6. Rotas e exemplos
GET /saldo
Sem parâmetros. Retorna o saldo na moeda da conta (BRL ou USD). No teste, sempre BRL e saldo fictício.
curl "https://www.ativasms.store/api/v1/saldo" \
-H "Authorization: Bearer $ATIVA_API_KEY"
HTTP 200
{
"saldo_centavos": 10000,
"moeda": "BRL"
}
GET /servicos
Sem parâmetros. Retorna a lista completa de serviços permitidos, sem duplicatas nem serviços bloqueados. O exemplo mostra um item; no teste, a lista também inclui teste_falha (Teste sem código). Os nomes e campos da API permanecem em português nos dois idiomas do site.
curl "https://www.ativasms.store/api/v1/servicos" \
-H "Authorization: Bearer $ATIVA_API_KEY"
HTTP 200
[
{
"codigo": "wa",
"nome": "WhatsApp"
}
]
GET /paises
Sem parâmetros. Retorna todos os países. Use codigo nas consultas e compras; iso é maiúsculo e ddi é o código de discagem. O exemplo mostra um item.
curl "https://www.ativasms.store/api/v1/paises" \
-H "Authorization: Bearer $ATIVA_API_KEY"
HTTP 200
[
{
"codigo": 73,
"iso": "BR",
"nome": "Brasil",
"ddi": "+55"
}
]
GET /opcoes
Query obrigatória: servico (código da lista de serviços) e pais (código numérico da lista de países). Retorna até 6 opções, ordenadas pelo preco_centavos crescente; pode retornar []. opcao é um identificador opaco no formato op_ seguido de 12 caracteres hexadecimais: use o valor devolvido, sem interpretá-lo. preco_centavos é o débito do revendedor; preco_site_centavos é a referência do site, ambos na moeda indicada. prazo_min é o prazo; taxa_sucesso pode ser null; estoque indica disponibilidade e recomendada indica a sugestão. O exemplo usa a opção fictícia do modo test.
curl "https://www.ativasms.store/api/v1/opcoes?servico=wa&pais=73" \
-H "Authorization: Bearer $ATIVA_API_KEY"
HTTP 200
[
{
"opcao": "op_000000000001",
"preco_centavos": 83,
"preco_site_centavos": 120,
"moeda": "BRL",
"prazo_min": 20,
"taxa_sucesso": null,
"estoque": 100,
"recomendada": false
}
]
POST /numeros
Corpo JSON obrigatório: servico (1–20 letras minúsculas, dígitos ou _; serviço permitido), pais (inteiro válido do catálogo), preco_maximo_centavos (inteiro positivo) e cliente_ref (identificador anônimo de 1–64 caracteres: letras, dígitos, . _ : -; nunca e-mail ou CPF). opcao é opcional ou null; sem ela, escolhe a mais barata. Envie Idempotency-Key. Compra nova: 201; repetição: 200 com o mesmo id e estado atual, sem novo débito. O exemplo é uma compra test.
curl -X POST "https://www.ativasms.store/api/v1/numeros" \
-H "Authorization: Bearer $ATIVA_API_KEY" \
-H "Idempotency-Key: compra_abc123" \
-H "Content-Type: application/json" \
-d '{"servico":"wa","pais":73,"opcao":"op_000000000001","preco_maximo_centavos":83,"cliente_ref":"cliente_abc123"}'
HTTP 201
{
"id": "5f0c0000-0000-4000-8000-000000000001",
"servico": "wa",
"servico_nome": "WhatsApp",
"pais": 73,
"telefone": "+12025550123",
"status": "aguardando_sms",
"motivo": null,
"preco_centavos": 83,
"preco_site_centavos": 120,
"moeda": "BRL",
"criado_em": "2026-10-08T12:00:00.000Z",
"cancelavel_em": "2026-10-08T12:02:00.000Z",
"expira_em": "2026-10-08T12:20:00.000Z",
"encerrado_em": null,
"substitui_id": null,
"cliente_ref": "cliente_abc123",
"sms": []
}
GET /numeros/{id}
Caminho: /numeros/{id}, com o UUID do número. Retorna apenas um número comprado pela API desta conta e deste modo; outro dono, compra pelo site ou UUID inválido resulta em nao_encontrado. Números abertos são atualizados antes da resposta, até 60 atualizações/min por chave live; acima disso, a resposta usa o último estado disponível (200, sem um novo 429 de sincronização). O exemplo mostra o código de teste recebido.
curl "https://www.ativasms.store/api/v1/numeros/5f0c0000-0000-4000-8000-000000000001" \
-H "Authorization: Bearer $ATIVA_API_KEY"
HTTP 200
{
"id": "5f0c0000-0000-4000-8000-000000000001",
"servico": "wa",
"servico_nome": "WhatsApp",
"pais": 73,
"telefone": "+12025550123",
"status": "recebido",
"motivo": null,
"preco_centavos": 83,
"preco_site_centavos": 120,
"moeda": "BRL",
"criado_em": "2026-10-08T12:00:00.000Z",
"cancelavel_em": "2026-10-08T12:02:00.000Z",
"expira_em": "2026-10-08T12:20:00.000Z",
"encerrado_em": null,
"substitui_id": null,
"cliente_ref": "cliente_abc123",
"sms": [
{
"codigo": "123456",
"texto": "Seu código de teste: 123456",
"recebido_em": "2026-10-08T12:00:20.000Z"
}
]
}
GET /numeros
Query opcional: status (um dos estados documentados), cliente_ref (mesmo formato da compra), pagina (1–1000, padrão 1). Retorna até 50 números por página, mais recentes primeiro, somente das compras pela API desta conta e modo. tem_mais indica outra página. A lista não força a atualização de números live; consulte o número individual para isso.
curl "https://www.ativasms.store/api/v1/numeros?status=aguardando_sms&cliente_ref=cliente_abc123&pagina=1" \
-H "Authorization: Bearer $ATIVA_API_KEY"
HTTP 200
{
"numeros": [
{
"id": "5f0c0000-0000-4000-8000-000000000001",
"servico": "wa",
"servico_nome": "WhatsApp",
"pais": 73,
"telefone": "+12025550123",
"status": "aguardando_sms",
"motivo": null,
"preco_centavos": 83,
"preco_site_centavos": 120,
"moeda": "BRL",
"criado_em": "2026-10-08T12:00:00.000Z",
"cancelavel_em": "2026-10-08T12:02:00.000Z",
"expira_em": "2026-10-08T12:20:00.000Z",
"encerrado_em": null,
"substitui_id": null,
"cliente_ref": "cliente_abc123",
"sms": []
}
],
"pagina": 1,
"tem_mais": false
}
POST /numeros/{id}/cancelar
Caminho: /numeros/{id}/cancelar. Corpo: motivo opcional (desistiu, banido, ja_tem_dono, pede_outra_coisa ou outro; padrão outro). Sem código e após cancelavel_em, encerra e estorna ao saldo. Antes do mínimo: 409 cedo com segundos. Se já está recebido, responde nao_cancelavel; codigo_recebido pode ocorrer se o código chegar durante o cancelamento. Resposta 200 com o número encerrado. O exemplo usa teste_falha, após dois minutos.
curl -X POST "https://www.ativasms.store/api/v1/numeros/5f0c0000-0000-4000-8000-000000000001/cancelar" \
-H "Authorization: Bearer $ATIVA_API_KEY" \
-H "Content-Type: application/json" \
-d '{"motivo":"desistiu"}'
HTTP 200
{
"id": "5f0c0000-0000-4000-8000-000000000001",
"servico": "teste_falha",
"servico_nome": "Teste sem código",
"pais": 73,
"telefone": "+12025550123",
"status": "cancelado",
"motivo": "desistiu",
"preco_centavos": 83,
"preco_site_centavos": 120,
"moeda": "BRL",
"criado_em": "2026-10-08T12:00:00.000Z",
"cancelavel_em": "2026-10-08T12:02:00.000Z",
"expira_em": "2026-10-08T12:20:00.000Z",
"encerrado_em": "2026-10-08T12:02:01.000Z",
"substitui_id": null,
"cliente_ref": "cliente_abc123",
"sms": []
}
POST /numeros/{id}/trocar
Caminho: /numeros/{id}/trocar. Corpo: preco_maximo_centavos obrigatório (inteiro positivo); opcao e motivo opcionais, nos formatos acima. Serviço, país e cliente_ref são herdados do número original. Exige Idempotency-Key e um número aguardando_sms com telefone e sem código, após o mínimo de cancelamento. Confere o preço antes de encerrar o antigo. O antigo fica trocado e estornado; o novo é comprado com 201 (repetição: 200). Se a compra nova falhar depois do estorno, o antigo permanece trocado: consulte-o e trate o erro. O exemplo troca teste_falha após dois minutos.
curl -X POST "https://www.ativasms.store/api/v1/numeros/5f0c0000-0000-4000-8000-000000000001/trocar" \
-H "Authorization: Bearer $ATIVA_API_KEY" \
-H "Idempotency-Key: troca_abc123" \
-H "Content-Type: application/json" \
-d '{"preco_maximo_centavos":83,"motivo":"banido"}'
HTTP 201
{
"id": "5f0c0000-0000-4000-8000-000000000002",
"servico": "teste_falha",
"servico_nome": "Teste sem código",
"pais": 73,
"telefone": "+12025550124",
"status": "aguardando_sms",
"motivo": null,
"preco_centavos": 83,
"preco_site_centavos": 120,
"moeda": "BRL",
"criado_em": "2026-10-08T12:02:01.000Z",
"cancelavel_em": "2026-10-08T12:04:01.000Z",
"expira_em": "2026-10-08T12:22:01.000Z",
"encerrado_em": null,
"substitui_id": "5f0c0000-0000-4000-8000-000000000001",
"cliente_ref": "cliente_abc123",
"sms": []
}
POST /numeros/{id}/concluir
Caminho: /numeros/{id}/concluir. Sem corpo. Confirma que o código foi usado e encerra um número recebido, sem estorno. Retorna 200 com o número concluido; concluir novamente ou concluir sem código devolve 409 nao_concluivel.
curl -X POST "https://www.ativasms.store/api/v1/numeros/5f0c0000-0000-4000-8000-000000000001/concluir" \
-H "Authorization: Bearer $ATIVA_API_KEY"
HTTP 200
{
"id": "5f0c0000-0000-4000-8000-000000000001",
"servico": "wa",
"servico_nome": "WhatsApp",
"pais": 73,
"telefone": "+12025550123",
"status": "concluido",
"motivo": null,
"preco_centavos": 83,
"preco_site_centavos": 120,
"moeda": "BRL",
"criado_em": "2026-10-08T12:00:00.000Z",
"cancelavel_em": "2026-10-08T12:02:00.000Z",
"expira_em": "2026-10-08T12:20:00.000Z",
"encerrado_em": "2026-10-08T12:01:00.000Z",
"substitui_id": null,
"cliente_ref": "cliente_abc123",
"sms": [
{
"codigo": "123456",
"texto": "Seu código de teste: 123456",
"recebido_em": "2026-10-08T12:00:20.000Z"
}
]
}
GET /extrato
Query opcional: pagina (1–1000, padrão 1). Retorna até 50 movimentações da conta, mais recentes primeiro (compra, estorno, recarga, ajuste), incluindo operações pelo site no modo live. valor_centavos é assinado: negativo para débito, positivo para crédito; saldo_apos_centavos é o saldo após a movimentação. numero_id é null quando não está ligado a um número; descricao pode ser null. O extrato não inclui moeda: use a moeda de GET /saldo. No teste, o extrato é separado, sempre em BRL.
curl "https://www.ativasms.store/api/v1/extrato?pagina=1" \
-H "Authorization: Bearer $ATIVA_API_KEY"
HTTP 200
{
"movimentacoes": [
{
"id": 42,
"tipo": "compra",
"valor_centavos": -83,
"saldo_apos_centavos": 9917,
"descricao": "Número WhatsApp",
"numero_id": "5f0c0000-0000-4000-8000-000000000001",
"criado_em": "2026-10-08T12:00:00.000Z"
}
],
"pagina": 1,
"tem_mais": false
}
7. Ciclo de vida do número
Depois da compra, mostre o telefone ao cliente e peça que ele solicite o código no aplicativo de destino. Comprar um número não solicita o SMS automaticamente. O modo de teste simula essa chegada.
| Status | Significado |
|---|---|
| aguardando_sms | Aguardando; telefone null pode indicar reserva em andamento. |
| recebido | Pelo menos um SMS chegou; não cancela nem troca. |
| concluido | Encerrado após receber código, manualmente ou pelo prazo. |
| cancelado | Cancelado sem código, com estorno. |
| trocado | Número anterior encerrado e estornado durante uma troca. |
| expirado | Prazo acabou sem código; estorno automático. |
| falhou | Compra/entrega falhou; valor devolvido. |
O objeto do número inclui servico_nome, motivo, moeda, preco_site_centavos (pode ser null), encerrado_em, substitui_id (id anterior na troca) e sms. Datas de cancelamento, expiração e encerramento podem ser null; cada SMS contém codigo e texto (podem ser null) e recebido_em.
Respeite cancelavel_em: algumas opções permitem cancelar imediatamente, outras após 2 min. O erro cedo informa a espera:
{
"erro": "cedo",
"mensagem": "Este número ainda não pode ser cancelado. Tente de novo após `segundos`.",
"segundos": 45
}
Sem SMS no prazo, o estorno é automático ao saldo; em produção, pode haver tolerância de 5 min para SMS atrasados antes do encerramento. Use expira_em e o estado retornado. Com código, concluir encerra sem estorno; número já recebido não cancela, e a troca também é recusada. Na troca, uma falha na nova compra pode deixar o anterior trocado e estornado.
8. Erros
Erros têm erro e mensagem (em português); trate o código, não o texto. Campos extras podem incluir campos, segundos, preco_centavos e opcoes.
| Código | HTTP | Quando ocorre |
|---|---|---|
nao_autorizado |
401 | Chave ausente, inválida, revogada, IP não permitido ou acesso suspenso; resposta genérica, sem revelar a causa. |
parametro_invalido |
400 | Campo, query ou corpo inválido; pode incluir campos com os nomes a corrigir. |
servico_bloqueado |
400 | Serviço bloqueado solicitado. |
idempotencia_obrigatoria |
400 | Idempotency-Key ausente ou fora do formato permitido, na compra ou troca. |
saldo_insuficiente |
402 | Saldo insuficiente para a compra. |
cliente_bloqueado |
403 | cliente_ref bloqueado para esta conta. |
nao_encontrado |
404 | UUID inválido ou número indisponível para esta conta e modo. |
sem_numeros |
409 | Nenhuma opção disponível para o serviço e país; nenhum débito. |
opcao_indisponivel |
409 | A opção escolhida saiu da lista; inclui opcoes atuais. |
preco_acima_do_maximo |
409 | Preço atual acima do máximo; inclui preco_centavos e opcoes, sem débito. |
preco_subiu |
409 | Preço mudou durante a compra; valor devolvido ao saldo. |
cedo |
409 | Ainda não pode cancelar/trocar; inclui segundos de espera. |
codigo_recebido |
409 | Código recebido impede a troca, ou chegou durante o cancelamento. |
nao_cancelavel |
409 | Estado não permite cancelar, inclusive um número já recebido. |
nao_trocavel |
409 | Número sem telefone, encerrado ou em estado incompatível com troca. |
nao_concluivel |
409 | Número não está recebido, inclusive uma segunda conclusão. |
muitas_requisicoes |
429 | Teto de pedidos ou compras por minuto; Retry-After: 60. |
limite_abertas |
429 | Teto de números aguardando SMS atingido; sem Retry-After. |
limite_tentativas |
429 | Tentativas sem código da conta esgotadas em 24 h; sem Retry-After. |
limite_tentativas_cliente |
429 | Tentativas sem código deste cliente_ref esgotadas em 24 h; sem Retry-After. |
erro_fornecedor |
502 | Falha na entrega do número; valor devolvido ao saldo. |
sem_confirmacao |
502 | Compra sem confirmação; consulte repetindo a mesma Idempotency-Key. Sem número em 10 min, há estorno. |
erro_interno |
500 | Falha inesperada; tente novamente com idempotência nas compras/trocas. |
9. Webhook e assinatura
Configure uma URL HTTPS pública em Dashboard → API. Não são aceitos endereços internos, credenciais ou fragmentos na URL, nem redirecionamentos. O segredo aparece uma vez ao criar ou regerar; guarde-o no servidor. Alterar apenas a URL mantém o segredo; remover apaga a configuração. Cada tentativa usa a URL e o segredo atuais.
Eventos enviados por POST JSON:
numero.codigo_recebido: um aviso por SMS novo;dados.smsé um objeto com codigo, texto e recebido_em, e não a lista de SMS. Pode haver mais de um aviso por número, inclusive SMS atrasado após encerramento.numero.encerrado: concluido, cancelado, trocado, expirado ou falhou; inclui motivo (pode ser null), encerrado_em e estornado_centavos (zero se não houve estorno), na moeda indicada.teste.ping: teste de entrega solicitado no dashboard, sem número nem cobrança.
O envelope tem id (UUID do aviso, diferente de dados.id), evento, criado_em e dados. Eventos de números incluem id, cliente_ref, servico, pais, telefone (ou null), status e moeda em dados. Eventos de números de teste incluem modo: "test" no envelope; eventos live e o ping do dashboard não incluem esse campo. Exemplos:
{
"id": "a7100000-0000-4000-8000-000000000001",
"evento": "numero.codigo_recebido",
"criado_em": "2026-10-08T12:00:20.000Z",
"modo": "test",
"dados": {
"id": "5f0c0000-0000-4000-8000-000000000001",
"cliente_ref": "cliente_abc123",
"servico": "wa",
"pais": 73,
"telefone": "+12025550123",
"status": "recebido",
"moeda": "BRL",
"sms": {
"codigo": "123456",
"texto": "Seu código de teste: 123456",
"recebido_em": "2026-10-08T12:00:20.000Z"
}
}
}
{
"id": "a7100000-0000-4000-8000-000000000002",
"evento": "numero.encerrado",
"criado_em": "2026-10-08T12:20:00.000Z",
"modo": "test",
"dados": {
"id": "5f0c0000-0000-4000-8000-000000000001",
"cliente_ref": "cliente_abc123",
"servico": "teste_falha",
"pais": 73,
"telefone": "+12025550123",
"status": "expirado",
"moeda": "BRL",
"motivo": "prazo",
"encerrado_em": "2026-10-08T12:20:00.000Z",
"estornado_centavos": 83
}
}
{
"id": "a7100000-0000-4000-8000-000000000003",
"evento": "teste.ping",
"criado_em": "2026-10-08T12:00:00.000Z",
"dados": {
"mensagem": "Teste de webhook do Ativa SMS"
}
}
Cabeçalhos:
X-Ativa-Evento: nome do evento.X-Ativa-Timestamp: timestamp Unix em segundos, atualizado a cada tentativa.X-Ativa-Assinatura: HMAC-SHA256 em hexadecimal minúsculo, calculado sobre os bytes UTF-8 detimestamp + "." + corpo, usando o segredo como texto, sem decodificá-lo de hexadecimal.
Confira o corpo bruto, antes de interpretar o JSON; serializar de novo pode mudar a assinatura. Recuse timestamps cuja diferença do horário atual exceda 5 minutos, para o passado ou futuro. Compare com crypto.timingSafeEqual, conferindo o tamanho primeiro. Exemplo Node.js, com Request/Headers e um Buffer do corpo original:
import { createHmac, timingSafeEqual } from "node:crypto";
export function verificarWebhook(headers, corpoBruto, segredo) {
const timestamp = headers.get("x-ativa-timestamp") ?? "";
const assinatura = headers.get("x-ativa-assinatura") ?? "";
if (!/^\d{1,12}$/.test(timestamp)) return false;
const agora = Math.floor(Date.now() / 1000);
if (Math.abs(agora - Number(timestamp)) > 300) return false;
if (!/^[0-9a-f]{64}$/.test(assinatura)) return false;
const esperada = createHmac("sha256", segredo)
.update(timestamp + ".", "utf8")
.update(corpoBruto)
.digest();
const recebida = Buffer.from(assinatura, "hex");
return recebida.length === esperada.length
&& timingSafeEqual(recebida, esperada);
}
export async function lerAviso(request, segredo) {
const corpoBruto = Buffer.from(await request.arrayBuffer());
if (!verificarWebhook(request.headers, corpoBruto, segredo)) {
throw new Error("assinatura_invalida");
}
return JSON.parse(corpoBruto.toString("utf8"));
}
Após verificar, deduplique pelo id do aviso em armazenamento persistente e registre o recebimento para processar depois. Responda 2xx rapidamente; duplicatas já aceitas também devem receber 2xx. O timeout de entrega é 5 s. Não há garantia de entrega exatamente uma vez: perder a resposta pode causar repetição.
Até 8 tentativas totais. Após falhas 1–7, as esperas são 1, 2, 4, 8, 16, 32 e 64 min, contadas da finalização da tentativa; a entrega é verificada a cada minuto. Só HTTP 2xx confirma entrega; 3xx, outros erros e timeout provocam retentativa. Após a oitava falha, não há reenvio automático. O id e o corpo permanecem iguais entre tentativas; apenas o timestamp e a assinatura são renovados. Se faltar um aviso, consulte GET /numeros/{id}.
10. Modo de teste
Crie uma chave ativa_test_ no dashboard e use as mesmas rotas e URL. Nada real é cobrado. O saldo fictício inicial é R$ 100,00 (10000 centavos, BRL), independente da moeda real da conta. A opção é op_000000000001: preço fictício R$ 0,83, referência do site R$ 1,20, prazo 20 min e cancelamento após 2 min.
Os telefones são fictícios da faixa +1 202 555-01xx, retornados sem espaços, como +12025550123; o país escolhido continua em pais. O código 123456 fica disponível após 20 s; consultar o número após esse instante atualiza o estado, e o aviso automático pode chegar no minuto seguinte.
Use servico=teste_falha para nunca receber código e testar cancelar, trocar (após 2 min) ou expirar (após 20 min), com estorno fictício. Sem esse serviço, o código chega antes do cancelamento mínimo. Número test com código vira concluido ao expirar.
No dashboard, reinicie o saldo em R$ 100,00: números abertos sem código são cancelados; com código, concluídos. O reinício preserva histórico, tentativas, idempotência e chaves; não reinicia os limites por minuto. Use nova Idempotency-Key na compra seguinte. Histórico test é limpo após 30 dias.
Chaves live e test não se misturam: números, saldo, extrato, contagens de uso e idempotência são separados. Os limites configurados e os bloqueios por cliente_ref valem nos dois modos. O ping do dashboard só testa a entrega; para exercitar modo: "test", compre um número com chave de teste.
11. Boas práticas
- Reutilize Idempotency-Key em retentativas de rede; não crie outra chave antes de conferir o resultado.
- Se o webhook falhar, consulte GET /numeros/{id} e respeite os limites.
- Trate preco_acima_do_maximo: mostre o preço atualizado e obtenha a decisão do cliente antes de comprar novamente.
- Não exponha ao cliente o seu preço de custo de aquisição (preco_centavos); proteja também as chaves e o segredo.
- Envie apenas cliente_ref anônimo; mantenha a relação com seu cliente no seu sistema.
Consulte os Termos de revenda. Contato: contato@ativasms.store.