Sobre esta API
Envie códigos de verificação (OTP) e avisos transacionais por SMS, sem contrato com operadora.
Envie um JSON com to em formato internacional (+5511999999999) e message, até 1600 caracteres. A cobrança é por unidade de mensagem: 160 caracteres por unidade, ou 70 quando o texto tem acento fora do alfabeto GSM ou emoji, e mensagem com link soma 1 unidade. O bloco billing mostra a conta.
Mensagem não entregue não é cobrada.
Provedores parceiros · Atualização: tempo real
Requisição
POST /api/v1/messenger/smsAutenticação HTTP Basic: public_key:secret_key em Base64. Guarde a chave secreta no servidor.
| Cabeçalho | Descrição |
|---|---|
AuthorizationObrigatório | Chave de API em Basic: public_key:secret_key em Base64. |
X-Project-IdOpcional | Projeto que recebe a chamada. Sem ele, vale o projeto padrão da conta. |
Idempotency-KeyOpcional | Repetir a mesma chave em até 24 horas devolve a resposta anterior, sem executar nem cobrar de novo. |
Parâmetros
| Campo | Tipo e local | Descrição |
|---|---|---|
toObrigatório | stringbody | Destinatário em E.164, com DDI. A pontuação é ignorada. Exemplo: |
messageObrigatório | stringbody | Texto da mensagem, até 1600 caracteres. Exemplo: |
curl --request POST 'https://api.apifordevs.com/api/v1/messenger/sms' \
--user "afd_live_pk_...:$AFD_SECRET_KEY" \
--header "X-Project-Id: $AFD_PROJECT_ID" \
--header 'Content-Type: application/json' \
--data '{"to":"+5511999999999","message":"Seu código de verificação é 123456."}'
import os
import requests
response = requests.request(
"POST",
"https://api.apifordevs.com/api/v1/messenger/sms",
auth=("afd_live_pk_...", os.environ["AFD_SECRET_KEY"]),
headers={"X-Project-Id": os.environ["AFD_PROJECT_ID"]},
json={"to": "+5511999999999", "message": "Seu código de verificação é 123456."},
timeout=30,
)
response.raise_for_status()
print(response.json())
const response = await fetch("https://api.apifordevs.com/api/v1/messenger/sms", {
method: "POST",
headers: {
Authorization: "Basic " + Buffer.from(
"afd_live_pk_...:" + process.env.AFD_SECRET_KEY
).toString("base64"),
"X-Project-Id": process.env.AFD_PROJECT_ID,
"Content-Type": "application/json",
},
body: JSON.stringify({"to":"+5511999999999","message":"Seu código de verificação é 123456."}),
signal: AbortSignal.timeout(30000),
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
console.log(await response.json());
Campos de resposta
Campos e tipos publicados no catálogo desta API.
- Status
statusstring - Detalhe
detailstring - Destinatário (mascarado)
tostring - Destinatário mascarado — o número não volta inteiro.
- ID da mensagem
message_idstring - Composição da cobrança
billingobject - Caracteres
billing.charactersinteger - Tamanho do texto enviado.
- Alfabeto
billing.encodingstring gsm-7cabe 160 caracteres por unidade;ucs-2(acento, emoji), 70.- Caracteres por unidade
billing.characters_per_unitinteger - Unidades do texto
billing.segmentsinteger - Unidades que o texto consome.
- Unidades por link
billing.link_surcharge_unitsinteger - Unidades somadas por conter URL. Zero quando não há link.
- Unidades cobradas
billing.billable_unitsinteger segments + link_surcharge_units. É otokens_in.
Exemplo de resposta
{
"success": true,
"code": 200,
"code_message": "A requisição foi processada com sucesso.",
"errors": [],
"header": null,
"data_count": 1,
"data": [
{
"status": "success",
"detail": "Mensagem enviada.",
"to": "+55119****4321",
"message_id": "9182736",
"billing": {
"characters": 38,
"encoding": "gsm-7",
"characters_per_unit": 160,
"segments": 1,
"link_surcharge_units": 0,
"billable_units": 1
}
}
]
}
Respostas e cobrança
| HTTP | Descrição | Cobrança |
|---|---|---|
200 | Sucesso. | Sujeita à cobrança |
400
| Arquivo ou parâmetro que a rota não consegue processar, projeto inválido, ou dev_mode=true com chave de produção. | Sem cobrança |
401
| Credencial ausente, inválida ou revogada. | Sem cobrança |
402
| Saldo insuficiente ou limite de gasto diário atingido. | Sem cobrança |
403
| E-mail da conta não verificado, chave sem escopo para o serviço, IP fora da allowlist do projeto ou chave de teste sem dev_mode=true. | Sem cobrança |
409
| Requisição com a mesma Idempotency-Key ainda em andamento. | Sem cobrança |
422
| Parâmetro obrigatório ausente ou fora do formato, ou Idempotency-Key repetida com outro conteúdo. | Sem cobrança |
429
| Limite de requisições por minuto da chave atingido. | Sem cobrança |
500
| Falha interna. | Sem cobrança |
503
| Serviço desativado (service_unavailable), ou a mensagem não pôde ser entregue agora (upstream_error). Não é cobrada; com upstream_error, pode ser repetida. | Sem cobrança |
Casos de uso
Código de verificação
Enviar o código de login ou de confirmação de uma operação por SMS.
Aviso transacional
Confirmar pedido, entrega ou cobrança sem manter contrato com operadora.
Notas de integração
- O número do destinatário nunca volta inteiro na resposta.
tokens_inno blocoheaderé o número de unidades de SMS: é por elas que a mensagem é cobrada.