Documentação da API
Integra o envio de SMS no teu site, aplicação ou ERP. Todos os pedidos usam HTTPS e JSON, e os valores monetários estão em Kwanzas (Kz).
Introdução
URL base:
https://sms-ao-a4yn.vercel.app/api/v1Os números de telefone usam o formato internacional E.164 (por exemplo, +244923000000). Números angolanos sem indicativo (923000000) são aceites e convertidos automaticamente. As datas são devolvidas em ISO 8601 (UTC).
Autenticação
Cria uma chave em Painel → API. A chave só é mostrada uma vez: guarda-a num local seguro, como uma variável de ambiente, e nunca a uses no código do browser ou de aplicações móveis. Envia-a no cabeçalho Authorization:
Authorization: Bearer smsao_live_xxxxxxxxxxxxxxxxPodes revogar uma chave a qualquer momento. Os pedidos com uma chave revogada recebem 401.
Enviar SMS
| Campo | Tipo | Obrig. | Descrição |
|---|---|---|---|
| to | string | sim | Número do destinatário (E.164 ou nacional angolano). |
| from | string | não | Remetente aprovado na tua conta. Por defeito usa o remetente da plataforma. |
| message | string | sim | Texto da mensagem (máximo 10 segmentos). Os segmentos são calculados automaticamente (GSM-7/Unicode). |
| reference | string | não | A tua referência interna, devolvida nas consultas e nos webhooks. |
Envia o cabeçalho opcional Idempotency-Key para garantir que um pedido repetido (por exemplo, depois de um timeout) não gera uma segunda SMS nem uma segunda cobrança.
curl -X POST https://sms-ao-a4yn.vercel.app/api/v1/sms/send \
-H "Authorization: Bearer smsao_live_xxxxxxxxxxxxxxxx" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: pedido-4821" \
-d '{
"to": "+244923000000",
"from": "MINHAEMPRESA",
"message": "A sua encomenda #4821 saiu para entrega.",
"reference": "encomenda-4821"
}'Resposta:
HTTP/1.1 202 Accepted
{
"data": {
"id": "8d3f0a52-6c1e-4b8e-9b0e-0f6a3f8c2d11",
"to": "+244923000000",
"from": "MINHAEMPRESA",
"status": "queued",
"segments": 1,
"encoding": "GSM7",
"price_kz": 20,
"demo": false,
"client_reference": "encomenda-4821",
"created_at": "2026-11-13T14:05:12.000Z"
}
}Consultar mensagem
Devolve o estado atual de uma mensagem enviada pela tua conta.
curl https://sms-ao-a4yn.vercel.app/api/v1/sms/8d3f0a52-... \
-H "Authorization: Bearer $SMSAO_API_KEY"Histórico
| Campo | Tipo | Obrig. | Descrição |
|---|---|---|---|
| status | string | não | Filtra por estado (queued, sending, sent, delivered, failed, undelivered, rejected). |
| from / to | data | não | Intervalo de datas (AAAA-MM-DD). |
| limit | número | não | 1 a 100 (por defeito 50). |
| page | número | não | Página (começa em 1). |
{
"data": [ { "id": "…", "to": "+244923000000", "status": "delivered", … } ],
"pagination": { "page": 1, "limit": 50, "total": 1284 }
}Consultar saldo
{
"data": {
"credits": 9225,
"reserved_credits": 60,
"available_credits": 9165,
"currency": "AOA",
"balance_kz": 184500,
"reserved_kz": 1200,
"available_kz": 183300,
"price_per_segment_kz": { "+244": 20 },
"estimated_sms_available": 9165
}
}Remetentes
Lista os remetentes aprovados que podes usar no campo from.
Estados de entrega
Webhooks
Configura um URL HTTPS em Painel → API → Webhooks para receberes eventos message.sent, message.delivered, message.undelivered, message.failed e message.rejected. Cada pedido inclui o cabeçalho X-SMSAO-Signature: sha256=…, que é o HMAC-SHA256 do corpo com o segredo do webhook.
$body = file_get_contents("php://input");
$expected = "sha256=" . hash_hmac("sha256", $body, getenv("SMSAO_WEBHOOK_SECRET"));
if (!hash_equals($expected, $_SERVER["HTTP_X_SMSAO_SIGNATURE"] ?? "")) {
http_response_code(401); exit;
}
$event = json_decode($body, true);
// $event["event"] === "message.delivered"
http_response_code(200);Erros
Os erros devolvem um código HTTP adequado e um corpo com error.code e error.message em português.
Limites
Cada chave tem um limite de pedidos por minuto (60 por defeito, ajustável). As respostas incluem os cabeçalhos X-RateLimit-Limit, X-RateLimit-Remaining e X-RateLimit-Reset. A conta tem ainda um limite diário de SMS, definido pela equipa SMS Angola.
Pronto para integrar?
Cria a conta e gera a primeira chave API em menos de 2 minutos.