Developers / Referência
Documentação
Referência completa da API KambaSMS, exemplos por linguagem e respostas esperadas.
Encontrar na documentação
Pesquisa por serviço ou navega diretamente para uma secção.
Sandbox
Simula resultados previsíveis, não envia mensagens reais e não consome créditos SMS nem volume de email.
kamba_test_ · sem cobrança
Produção
Contacta os providers reais. SMS, OTP, Verify e Notify usam créditos; Kamba Email usa volume mensal próprio.
kamba_live_ · consumo real
// quick start
X-API-Key: SUA_KEYPOST /messages/sendX-Request-Id. Guarda este valor quando ocorrer um erro eGuarda este valor quando ocorrer um erro e envia-o ao suporte; ele permite localizar o pedido sem partilhar a API key, o token ou o conteúdo da mensagem. Também podes enviar o teu próprio identificador com 8-100 caracteres seguros.Os exemplos usam valores ilustrativos. Para enviar, cria uma conta e uma chave API e aguarda a aprovação do Sender ID.
$ Gerar ChaveAutenticação
Inclui o header X-API-Key: SUA_API_KEY em todos os pedidos autenticados. O endpoint /otp/verify é público e não requer chave.
Permissões
Limita cada chave aos produtos necessários. Uma tentativa fora do scope responde 403 API_KEY_SCOPE_DENIED.
Expiração
Pode ser indefinida ou definida para 30, 90, 180 ou 365 dias. Uma chave expirada responde 401 API_KEY_EXPIRED.
Rotação
A chave anterior continua válida durante 24 horas para permitir atualizar a integração sem interrupção.
Ecossistema
SDKs oficiais, coleção Postman e integrações futuras.
Sandbox e Webhook Inspector
Usa a página Sandbox para gerar chaves kamba_test_, simular OTP/SMS e inspecionar eventos assinados. O Inspector não envia dados para URLs externas: apresenta o corpo, X-Kamba-Event, X-Kamba-Delivery e X-Kamba-Signature para validação local.
header: X-Kamba-Signature: sha256=<hex>
OTP Service
API ServiceServiço gerido de autenticação por SMS. Rate limiting, expiração e validação incluídos.
Envia um código OTP de 6 dígitos por SMS. Autenticado via API Key. Debita 1 crédito.
Parâmetros
Número angolano no formato +244XXXXXXXXX
Rate limit: máximo 3 OTPs por hora por número. Código válido por 5 minutos.
curl -X POST https://api.kambasms.ao/otp/send \
-H "Content-Type: application/json" \
-H "X-API-Key: SUA_API_KEY" \
-d '{
"phone": "+244912345678"
}'Resposta 200
{
"success": true,
"message": "OTP enviado com sucesso.",
"expires_in": 300
}Valida um código OTP. Endpoint PÚBLICO — não requer API Key.
Parâmetros
Mesmo número usado no envio
Código de 6 dígitos recebido por SMS
Este endpoint é público. A segurança está no rate limiter global (20 tentativas/15min) e na expiração do código (5min).
curl -X POST https://api.kambasms.ao/otp/verify \
-H "Content-Type: application/json" \
-d '{
"phone": "+244912345678",
"code": "123456"
}'Sucesso 200
{
"success": true,
"message": "Código verificado com sucesso."
}Erro 400
{
"error": "Código inválido ou expirado."
}Mensagens
Envia um SMS para um número angolano.
Idempotency-Key com uma chave única por operação. A mesma chave e o mesmo JSON devolvem a resposta guardada durante pelo menos 24 horas. Se o conteúdo mudar, a API responde 409. A proteção também funciona em OTP Send, Verify Start/Resend, Notify, Bulk e Agendamentos.Parâmetros
Número de destino no formato +244XXXXXXXXX
Conteúdo da mensagem. Máximo 160 caracteres. Sem links ou URLs.
O Sender ID é definido automaticamente a partir da tua chave API.
curl -X POST https://api.kambasms.ao/messages/send \
-H "Content-Type: application/json" \
-H "X-API-Key: SUA_API_KEY" \
-d '{
"to": "+244912345678",
"text": "Ola! Mensagem de teste."
}'Resposta 201
{
"success": true,
"message_id": "SMxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
"status": "queued",
"to": "+244912345678",
"sender_id": "SEU_SENDER_ID",
"remaining_balance": 99,
"segments": 1,
"timestamp": "2025-01-01T12:00:00.000Z"
}Lista o histórico de mensagens enviadas.
Retorna as últimas 100 mensagens ordenadas por data.
curl https://api.kambasms.ao/messages \
-H "X-API-Key: SUA_API_KEY"Verificação
Kamba Verify
Fluxo completo de verificação em duas chamadas. A API gera, envia, limita, expira e confirma o código.
Inicia a verificação e envia o código. Debita 1 crédito em produção.
Número no formato +244XXXXXXXXX
Usa o Sender ID associado à chave quando omitido
curl -X POST https://api.kambasms.ao/verify/start \
-H "X-API-Key: SUA_API_KEY" -H "Content-Type: application/json" \
-d '{"phone":"+244912345678"}'Confirma o código introduzido pelo utilizador.
Identificador devolvido por /verify/start
Código de 6 dígitos
curl -X POST https://api.kambasms.ao/verify/check \
-H "X-API-Key: SUA_API_KEY" -H "Content-Type: application/json" \
-d '{"verification_id":"UUID","code":"123456"}'Gestão: POST /verify/resend, GET /verify, GET /verify/stats?days=30, GET /verify/events e GET /verify/:id.
Dados
Kamba Lookup
Valida e normaliza números angolanos. A operadora indicada corresponde à atribuição provável do prefixo, sem consulta em tempo real nem identificação do titular.
Consulta individual sem consumir créditos.
Número nacional ou internacional
curl -X POST https://api.kambasms.ao/lookup \
-H "X-API-Key: SUA_API_KEY" -H "Content-Type: application/json" \
-d '{"phone":"+244923000000"}'Analisa até 500 números e assinala inválidos e duplicados.
Lista com até 500 números
curl -X POST https://api.kambasms.ao/lookup/bulk \
-H "X-API-Key: SUA_API_KEY" -H "Content-Type: application/json" \
-d '{"phones":["+244923000000","+244953000000"]}'Interação
Kamba Links
Cria links curtos para destinos públicos e acompanha cliques. Endereços locais e redes privadas são rejeitados.
Cria um link com slug automático ou personalizado.
Destino público HTTP ou HTTPS
4-40 letras minúsculas, números ou hífen
Data ISO futura
curl -X POST https://api.kambasms.ao/links \
-H "X-API-Key: SUA_API_KEY" -H "Content-Type: application/json" \
-d '{"url":"https://kambasms.ao","title":"KambaSMS"}'Gestão: GET /links, GET /links/:id/stats e DELETE /links/:id. OO redirecionamento público usa GET /l/:slug.
Mensagens transacionais
Kamba Email
Envia emails transacionais pela API com domínio próprio, histórico, supressões automáticas e volume mensal separado dos créditos SMS.
Envia um email em produção. Exige domínio verificado e volume mensal disponível.
Domínio verificado na conta
Parte antes de @, por exemplo notificacoes
Nome apresentado ao destinatário
Um destinatário por pedido
Assunto até 200 caracteres
Conteúdo HTML; usa html ou text
Conteúdo em texto simples; usa html ou text
curl -X POST https://api.kambasms.ao/email/send \
-H "X-API-Key: SUA_API_KEY" -H "Content-Type: application/json" \
-H "Idempotency-Key: pedido-123-email" \
-d '{"domain_id":"UUID_DO_DOMINIO","from_local":"notificacoes","from_name":"Minha Loja","to":"cliente@exemplo.ao","subject":"Pedido confirmado","html":"<h1>Pedido confirmado</h1>"}'Simula estados previsíveis sem contactar o fornecedor e sem consumir volume.
Usa delivered, bounced, complained, opened, clicked ou failed antes de @kambasms.test
Assunto do teste
curl -X POST https://api.kambasms.ao/email/sandbox/send \
-H "X-API-Key: SUA_API_KEY" -H "Content-Type: application/json" \
-d '{"to":"delivered@kambasms.test","subject":"Teste Kamba Email"}'Cria um template reutilizável com variáveis no formato {{nome}}.
Chave única, por exemplo pedido_confirmado
Nome visível no dashboard
Assunto, com variáveis opcionais
HTML do email
Alternativa em texto simples
curl -X POST https://api.kambasms.ao/email/templates \
+ -H "X-API-Key: SUA_API_KEY" -H "Content-Type: application/json" \
+ -d '{"key":"pedido_confirmado","name":"Pedido confirmado","subject":"Pedido {{pedido}} confirmado","text":"Olá {{nome}}, o pedido {{pedido}} foi confirmado."}'Coloca até 500 destinatários numa fila processada em segundo plano. Cada destinatário enviado consome uma unidade do volume mensal.
Domínio verificado
Template ativo
Objetos com email e variables
curl -X POST https://api.kambasms.ao/email/bulk \
+ -H "X-API-Key: SUA_API_KEY" -H "Content-Type: application/json" \
+ -H "Idempotency-Key: campanha-setembro-01" \
+ -d '{"name":"Confirmações","domain_id":"UUID_DO_DOMINIO","template_id":"UUID_DO_TEMPLATE","from_local":"notificacoes","recipients":[{"email":"ana@exemplo.ao","variables":{"nome":"Ana","pedido":"123"}}]}'Gestão: domínios por GET /email/overview, POST /email/domains e POST /email/domains/:id/verify; templates por PATCH/DELETE /email/templates/:id e POST /email/templates/:id/render; bulk por GET /email/bulk/:id e POST /email/bulk/:id/cancel. Usa Usa Idempotency-Key nos envios para repetir pedidos em segurança. Bounces e complaints entram automaticamente nas supressões.
Mensagens
Kamba Notify
Modelos transacionais com variáveis. Nesta fase, o canal disponível é SMS.
Cria um modelo reutilizável.
Identificador único, por exemplo pedido_confirmado
Nome visível no dashboard
Mensagem com variáveis como {{nome}}
curl -X POST https://api.kambasms.ao/notify/templates \
-H "X-API-Key: SUA_API_KEY" -H "Content-Type: application/json" \
-d '{"key":"pedido_confirmado","name":"Pedido confirmado","body":"Olá {{nome}}, o pedido {{pedido}} foi confirmado."}'Renderiza o modelo e envia por SMS. Debita 1 crédito em produção.
Chave do modelo ativo
Destino +244XXXXXXXXX
Valores para todas as variáveis do modelo
curl -X POST https://api.kambasms.ao/notify/send \
-H "X-API-Key: SUA_API_KEY" -H "Content-Type: application/json" \
-d '{"template_key":"pedido_confirmado","to":"+244912345678","variables":{"nome":"Ana","pedido":"1234"}}'Gestão: GET /notify/templates, DELETE /notify/templates/:id, POST /notify/render e GET /notify/deliveries.
Orquestração
Kamba Automations
Liga eventos de SMS, Verify, Links e Chat a um endpoint Webhook ou modelo Kamba Notify. Regras nascem pausadas e podem ser simuladas sem consumir créditos.
Cria uma regra pausada.
Nome interno
Evento que inicia a regra
webhook ou notify
endpoint_id ou template_key e to
curl -X POST https://api.kambasms.ao/automations \
+ -H "X-API-Key: SUA_API_KEY" -H "Content-Type: application/json" \
+ -d '{"name":"Verify concluído","trigger_event":"verify.completed","action_type":"webhook","action_config":{"endpoint_id":"UUID_DO_ENDPOINT"}}'confirm_paid_action: true. Cada regra aceita até 50 execuções por hora.Gestão: GET /automations, PATCH/DELETE /automations/:id, POST /automations/:id/simulate e GET /automation-runs.
Developers / Eventos
Webhooks de produção
Entrega eventos para URLs HTTPS públicas. Cada pedido inclui identificador, tipo, data e dados sem conteúdo sensível. Falhas são repetidas até seis vezes.
Cria um endpoint. O segredo whsec_ é devolvido apenas nesta resposta.
Nome interno do endpoint
URL HTTPS pública
Tipos desejados; omite para receber todos
curl -X POST https://api.kambasms.ao/webhook-endpoints \
-H "X-API-Key: SUA_API_KEY" -H "Content-Type: application/json" \
-d '{"name":"Produção","url":"https://api.exemplo.ao/webhooks/kambasms","events":["verify.completed","message.status"]}'timestamp.raw_body. Lê x-kambasms-timestamp e compara x-kambasms-signature em tempo constante. Rejeita pedidos com mais de cinco minutos.Eventos:
message.status, verify.started, verify.completed, verify.failed, link.clicked, chat.conversation.created, chat.message.created, notify.sent e email.sent/delivered/bounced/complained/opened/clicked/failed.Gestão: GET /webhook-endpoints, PATCH/DELETE /webhook-endpoints/:id, POST /webhook-endpoints/:id/test, GET /webhook-deliveries e POST /webhook-deliveries/:id/retry.
Atendimento
KambaChat
O dashboard gere o widget e a caixa de entrada. O browser do visitante usa um token temporário próprio e nunca recebe a chave API da conta.
Cria ou devolve o primeiro widget da conta.
Nome apresentado no cabeçalho do widget
curl -X POST https://api.kambasms.ao/chat/widgets \
-H "X-API-Key: SUA_API_KEY" -H "Content-Type: application/json" \
-d '{"name":"Atendimento"}'Conta autenticada: GET/PATCH /chat/widgets, GET /chat/conversations, GET/POST /chat/conversations/:id/messages e PATCH /chat/conversations/:id.
Instalação pública: GET /chat/widget.js?key=.... Os endpoints /chat/public são utilizados internamente pelo widget.
Créditos
Retorna o saldo atual de SMS disponíveis.
curl https://api.kambasms.ao/credits/balance \
-H "X-API-Key: SUA_API_KEY"Resposta 200
{ "balance": 99 }Agendamentos
Agenda um SMS para envio futuro. Requer primeira recarga SMS aprovada, saldo e Sender ID aprovado.
Parâmetros
Número +244XXXXXXXXX
Mensagem (máx 160 chars, sem URLs)
3–11 caracteres alfanuméricos
ISO 8601. Deve ser no futuro.
curl -X POST https://api.kambasms.ao/messages/schedule \
-H "Content-Type: application/json" \
-H "X-API-Key: SUA_API_KEY" \
-d '{
"to": "+244912345678",
"text": "Lembrete: consulta amanha as 10h.",
"sender_id": "SEU_SENDER_ID",
"scheduled_at": "2025-06-01T09:00:00.000Z"
}'Resposta 201
{
"success": true,
"scheduled": {
"id": "uuid",
"sms_to": "+244912345678",
"scheduled_at": "2025-06-01T09:00:00.000Z",
"status": "pending"
}
}Envio em Massa
Envio para múltiplos destinatários. Máx 1000. Processado em background.
Opt-out obrigatório para campanhas
Inclui forma de cancelamento: Responda PARAR para cancelar.
Parâmetros
Nome da campanha
3–11 caracteres alfanuméricos
Mensagem (máx 160 chars, sem URLs)
Array de números +244. Máx 1000.
curl -X POST https://api.kambasms.ao/messages/bulk \
-H "Content-Type: application/json" \
-H "X-API-Key: SUA_API_KEY" \
-d '{
"name": "Confirmacoes de consultas",
"sender_id": "SEU_SENDER_ID",
"text": "A sua consulta foi confirmada. Consulte os detalhes na sua conta.",
"recipients": ["+244912345678", "+244923456789"]
}'Resposta 201
{
"success": true,
"job_id": "uuid",
"total": 2
}Boas Práticas e Limitações
Limite de 160 caracteres
Cada SMS suporta no máximo 160 caracteres. As operadoras angolanas podem fragmentar ou rejeitar SMS concatenados.
Links e URLs não são permitidos
Mensagens com links (https://, www., domínios) são bloqueadas automaticamente pelas operadoras angolanas como spam.
Limites de envio
Códigos de erro
VALIDATION_ERROR
Pedido inválido
Parâmetros inválidos ou em falta. Revê corpo, formato e conteúdo.
Consumo
Não
Repetir
Depois de corrigir
UNAUTHORIZED
Não autenticado
API Key inválida, revogada ou em falta. Confirma a chave e o header.
Consumo
Não
Repetir
Sim
INSUFFICIENT_BALANCE
Saldo insuficiente
A conta não tem créditos SMS suficientes. Recarrega SMS e OTP.
Consumo
Não
Repetir
Depois da recarga
EMAIL_QUOTA_EXHAUSTED
Volume de email esgotado
O ciclo do Kamba Email não tem volume disponível. Ativa outro pacote de email.
Consumo
Não
Repetir
Depois da recarga
NOT_FOUND
Não encontrado
O recurso não existe ou não pertence à conta. Confirma o identificador.
Consumo
Não
Repetir
Não
EMAIL_SUPPRESSED
Destinatário suprimido
Bounce permanente ou reclamação bloqueou o endereço. Não forces um novo envio.
Consumo
Não
Repetir
Não
RATE_LIMITED
Limite atingido
A proteção de frequência recusou temporariamente o pedido. Respeita Retry-After quando existir.
Consumo
Não
Repetir
Após o intervalo
INTERNAL_ERROR
Erro interno
A plataforma não concluiu a operação. Guarda X-Request-Id e contacta o suporte.
Consumo
Confirmar histórico
Repetir
Com idempotência