Skip to main content

🇦🇴 KambaSMS Python SDK

PyPI Version Python Version License

SDK oficial e leve da KambaSMS para integração de envio de mensagens SMS em Angola. Zero dependências externas (usa urllib nativo), tipagem forte e validações rigorosas para as operadoras angolanas.

✨ Funcionalidades

  • 🚀 Zero Dependências: Utiliza urllib nativo do Python — sem requests, sem httpx.
  • 🛡️ Validação no Cliente: Deteta números inválidos, URLs ou emojis antes de fazer a chamada à API.
  • 💎 Tipagem Forte: Type hints completos para melhor experiência em IDEs.
  • 🔐 OTP como Serviço: Autenticação por SMS com rate limiting e expiração incluídos.
  • 📦 MVP Completo: Envio único, envio em massa, agendamento, OTP e gestão de saldo.

📦 Instalação

pip install kambasms

Nota: Requer Python 3.8 ou superior.

⚡ Início Rápido

1. Inicialização

from kambasms import KambaSMS

client = KambaSMS(api_key="kamba_tua_chave_aqui")

2. Enviar um SMS Único

sms = client.sms.send(
	to="+244923456789",
	text="O seu código de verificação é 1234.",
	sender_id="KAMBA"  # Opcional: usa o da API Key se omitido
)

print(f"✅ SMS Enviado! ID: {sms['message_id']}")
print(f"Saldo Restante: {sms['remaining_balance']}")

3. Envio em Massa (Bulk)

response = client.sms.send_bulk(
	name="Campanha Natal 2024",
	sender_id="PROMO",
	text="Feliz Natal! Aproveite 20% de desconto.",
	recipients=[
		"+244923456789",
		"+244933123456",
		"+244943987654"
	]
)

print(f"✅ Job criado! ID: {response['job_id']} | Total: {response['total']}")

4. Agendar um SMS

from datetime import datetime, timedelta

data_futura = datetime.utcnow() + timedelta(hours=2)

response = client.sms.schedule(
	to="+244923456789",
	text="Lembrete: A sua consulta está marcada para amanhã.",
	sender_id="CLINICA",
	scheduled_at=data_futura  # Aceita datetime ou string ISO 8601
)

print("✅ SMS agendado com sucesso!")

5. Consultar Saldo e Histórico

Verificar Saldo

balance = client.account.get_balance()
print(f"Saldo atual: {balance['balance']} SMS")

Ver Histórico (últimos 100 por padrão)

history = client.account.get_history(limit=10)
for msg in history:
	print(f"Para: {msg['to']} | Status: {msg['status']}")

🔐 OTP Service

Serviço gerido de autenticação por SMS. Rate limiting (3/hora/número), expiração (5min) e validação incluídos.

Enviar OTP

otp = client.otp.send(phone="+244912345678")

print(f"Expira em: {otp['expires_in']} segundos")
# → Expira em: 300 segundos

Verificar OTP

⚠️ O endpoint verify é público — não requer API Key. Pode ser chamado diretamente do frontend.

result = client.otp.verify(
	phone="+244912345678",
	code="123456"
)

if result["success"]:
	print("✅ Código válido!")
else:
	print("❌ Código inválido ou expirado.")

Regras do OTP

Regra Valor
Formato do código 6 dígitos numéricos
Validade 5 minutos
Rate limit (envio) 3 OTPs/hora por número
Rate limit (verificação) 20 tentativas/15min
Custo 1 crédito SMS por envio

🛡️ Regras de Validação (Específicas para Angola)

O SDK faz validações automáticas no lado do cliente. Se estas regras forem violadas, o SDK lança uma KambaValidationError sem sequer chamar a API.

  1. Formato do Número: Deve começar obrigatoriamente com +244 seguido de exatamente 9 dígitos.
  2. Sem URLs: Mensagens contendo URLs são rejeitadas (filtradas como spam pelas operadoras).
  3. Sem Emojis: Caracteres emoji não são suportados.
  4. Limite de Caracteres: Máximo de 160 caracteres por SMS.

⚠️ Tratamento de Erros

from kambasms import KambaSMS, KambaValidationError, KambaAPIError

client = KambaSMS(api_key="kamba_...")

try:
	client.sms.send(
		to="923456789",  # Erro: Falta o +244
		text="Visite www.kambasms.ao 🚀",  # Erro: Tem URL e Emoji
		sender_id="KAMBA"
	)
except KambaValidationError as e:
	# Erro de validação do SDK (dados inválidos)
	print(f"🚫 Dados inválidos: {e}")

except KambaAPIError as e:
	# Erro retornado pelo servidor (saldo insuficiente, rate limit, etc.)
	print(f"🔌 Erro da API ({e.status_code}): {e}")

except Exception as e:
	# Erro de rede ou inesperado
	print(f"💥 Erro inesperado: {e}")

📚 Documentação Completa

Para mais detalhes sobre endpoints avançados, webhooks de entrega e gestão de conta, consulta a Documentação Oficial da KambaSMS.

🆘 Suporte

Encontraste um bug ou tens uma sugestão?

📄 Licença

Este projeto está licenciado sob a Licença MIT.

Release files for kambasms 1.1.1

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for kambasms 1.1.1
File Size Uploaded
kambasms-1.1.1.tar.gz 8.8 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for kambasms 1.1.1
File Interpreter ABI Platform
kambasms-1.1.1-py3-none-any.whl Python 3 none any Details

Total release size: 17.3 kB

Release files / kambasms-1.1.1.tar.gz

Download URL kambasms-1.1.1.tar.gz
Size 8.8 kB
Tags Source
SHA-256 checksum
How to use checksums
8a69136ec0a0fb7abda45b1b4a4054ba3606a79b206abb9e120330484703f661
BLAKE2b-256 checksum
How to use checksums
428041776d6ee9f2c664a79e949097892807e0c44659be8c40f0870c08dd8c3b
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.14.6

Release files / kambasms-1.1.1-py3-none-any.whl

Download URL kambasms-1.1.1-py3-none-any.whl
Size 8.4 kB
Tags Python 3
SHA-256 checksum
How to use checksums
d0e74146f0ee3b8289c6ef4924212089f46bfe8a1d95320fc04648dee661cf9a
BLAKE2b-256 checksum
How to use checksums
bba4d5020983f9051ae20fa0de379fe93be58642996666c9d7d3fb3e8dfb1ce0
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.14.6

Release history Release notifications | RSS feed

This release

1.1.1 This release

2 release files

1.1.0

2 release files

1.0.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page