Enterprise-ready Python SDK for Beem Africa (SMS + OTP)
Project description
Beem Africa Python SDK
Enterprise-ready Python SDK for Beem Africa APIs with focus on SMS and OTP functionality.
Features
- ✅ Connection Pooling - Reuse connections for better performance
- ✅ Health Check -
is_healthy()method for monitoring - ✅ Exponential Backoff - Automatic retry with smart backoff
- ✅ Comprehensive Error Handling - Detailed exception hierarchy
- ✅ Full Type Hints - Complete mypy compliance
- ✅ Configurable Logging - Built-in logging support
- ✅ Context Manager Support - Use with
withstatements - ✅ Phone Number Validation - Automatic Tanzanian number formatting
Installation
pip install beem-africa-python-sdk
Quick Start
Initialize Client
from beem_africa_sdk import CompleteBeemClient
# For separate SMS and OTP credentials (recommended)
client = CompleteBeemClient(
api_key="your_sms_api_key", # SMS API key
secret_key="your_sms_secret_key", # SMS secret key
otp_api_key="your_otp_api_key", # OTP API key (separate)
otp_secret_key="your_otp_secret_key" # OTP secret key (separate)
)
# For same credentials (if your account uses same keys for both)
client = CompleteBeemClient(
api_key="your_api_key",
secret_key="your_secret_key"
# otp_api_key and otp_secret_key will default to api_key/secret_key
)
# Check API health
if client.is_healthy():
print("✅ Beem API is accessible")
else:
print("❌ Beem API is unreachable")
Manage Sender IDs
# Set approved sender IDs for your account
client.set_approved_senders(["INFO", "COMPANY", "ALERTS"])
# Add individual sender IDs
client.add_approved_sender("PROMO")
# Get list of approved senders
approved = client.get_approved_senders()
print(f"Approved senders: {approved}")
# Validate if a sender ID is approved (sends test SMS)
is_valid = client.validate_sender_id("INFO")
print(f"INFO is approved: {is_valid}")
Send SMS
# Configure approved sender IDs
client.set_approved_senders(["INFO", "COMPANY"])
# Send SMS using default approved sender (INFO)
response = client.send_sms(
message="Your voucher code: ABC123XYZ",
recipients="255712345678"
)
# Send SMS with specific sender
response = client.send_sms(
message="Hello valued customers!",
recipients=["255712345678", "255798765432"],
source_addr="COMPANY"
)
print(f"Valid: {response['valid']}, Invalid: {response['invalid']}")
Send OTP
Note: OTP functionality uses separate API credentials from SMS. Beem provides different API keys for SMS and OTP services. Use your OTP-specific credentials:
# Send OTP (using separate OTP credentials)
otp_data = client.send_otp("255712345678", app_id="your_app_id")
pin_id = otp_data['data']['pinId']
print(f"📱 OTP sent! Pin ID: {pin_id}")
# Send OTP with custom sender ID
otp_data = client.send_otp(
phone="255712345678",
app_id="your_app_id",
sender_id="INFO"
)
pin_id = otp_data['data']['pinId']
print(f"📱 OTP sent! Pin ID: {pin_id}")
# Later, verify OTP (user enters code)
user_code = input("Enter OTP code: ")
is_valid = client.verify_otp(pin_id, user_code)
if is_valid:
print("✅ OTP verified successfully!")
else:
print("❌ Invalid OTP code")
Get Balance & Delivery Reports
# Check SMS balance
balance = client.get_balance()
print(f"Current balance: {balance} SMS credits")
# Get delivery report (call after 5+ minutes)
reports = client.get_delivery_report(
dest_addr="255712345678",
request_id="your_request_id"
)
for report in reports:
print(f"Status: {report['status']}, Timestamp: {report['timestamp']}")
Context Manager Usage
# Automatic resource cleanup
with CompleteBeemClient("api_key", "secret_key") as client:
client.send_sms("SENDER", "Hello!", ["255712345678"])
# Client automatically closed here
Error Handling
The SDK provides comprehensive error handling with specific exception types:
from beem_africa_sdk import CompleteBeemClient
from beem_africa_sdk.exceptions import (
BeemAuthenticationError,
BeemValidationError,
BeemInsufficientBalanceError,
BeemConnectionError
)
client = CompleteBeemClient("api_key", "secret_key")
try:
client.send_sms("SENDER", "Hello!", ["invalid_phone"])
except BeemValidationError as e:
print(f"Validation error: {e}")
except BeemAuthenticationError as e:
print(f"Authentication failed: {e}")
except BeemInsufficientBalanceError as e:
print(f"Insufficient balance: {e}")
except BeemConnectionError as e:
print(f"Connection error: {e}")
API Reference
CompleteBeemClient
Main client class with all functionality.
Constructor
CompleteBeemClient(
api_key: str,
secret_key: str,
timeout: int = 30,
max_retries: int = 3,
pool_connections: int = 10,
pool_maxsize: int = 100,
logger: Optional[logging.Logger] = None
)
Methods
is_healthy() -> bool- Check API accessibilitysend_sms(...) -> Dict[str, Any]- Send SMS messagesget_balance() -> float- Get SMS credit balanceget_delivery_report(...) -> List[Dict]- Get delivery statussend_otp(...) -> Dict[str, Any]- Send OTPverify_otp(...) -> bool- Verify OTP codeclose()- Close HTTP connections
Phone Number Format
The SDK automatically validates and formats Tanzanian phone numbers:
- Input formats accepted:
0712345678,255712345678,+255712345678 - Output format:
255712345678(12 digits, no spaces or special chars)
Configuration
Environment Variables
Set credentials via environment variables:
export BEEM_API_KEY="your_api_key"
export BEEM_SECRET_KEY="your_secret_key"
Logging
Configure logging for debugging:
import logging
logging.basicConfig(level=logging.DEBUG)
client = CompleteBeemClient("api_key", "secret_key")
# All HTTP requests will be logged
API Limitations
SMS Restrictions
- Unicode Characters: Beem API does not support Unicode characters, emojis, or special symbols in SMS messages. Messages containing these will be rejected with an error.
- Plain Text Only: Use ASCII characters only for reliable delivery.
- Sender ID: Maximum 11 characters, alphanumeric only. Must be pre-approved by Beem.
OTP Service
- Account Dependent: OTP functionality requires separate activation in your Beem account.
- Setup Required: Visit Beem dashboard → OTP menu → API Setup to generate API keys and configure applications.
- Application ID: Each OTP request requires an
app_idthat corresponds to your Beem application. - Error Codes:
100: SMS sent successfully101: Failed to send SMS117: Valid PIN (verification successful)114: Incorrect PIN115: PIN timeout116: Attempts exceeded
Delivery Reports
- Timing: Delivery reports should be requested at least 5 minutes after sending SMS.
- Separate Endpoint: Uses different API endpoint (
dlrapi.beem.africa) than main SMS API.
Development
Setup
git clone https://github.com/JAXPARROW/beem-africa-python-sdk.git
cd beem-africa-python-sdk
pip install -e ".[dev]"
Testing
pytest
Building
python -m build
Contributors
- Jackson Linus - Creator and maintainer
License
MIT License - see LICENSE file for details.
Contributing
- Fork the repository
- Create a feature branch
- Make your changes
- Add tests
- Submit a pull request
Support
- 📖 Documentation
- 🐛 Issues
- 💬 Discussions
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file beem_africa_python_sdk-0.2.2.tar.gz.
File metadata
- Download URL: beem_africa_python_sdk-0.2.2.tar.gz
- Upload date:
- Size: 15.1 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.5
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
99b90a4be1de2ba8bac2617e311a2e6a8406188941e696a5da76b1e50e98e3e1
|
|
| MD5 |
4bcd1ccab5581b070f4649319906d596
|
|
| BLAKE2b-256 |
805d497180e42e1e6131c39affd5a43237127c709df7e1f0cd50c6b1e1816314
|
File details
Details for the file beem_africa_python_sdk-0.2.2-py3-none-any.whl.
File metadata
- Download URL: beem_africa_python_sdk-0.2.2-py3-none-any.whl
- Upload date:
- Size: 15.6 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.5
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
44bb4c2c0b0c81d06447236e903a8658c8005546c964682ce1056113bac7b553
|
|
| MD5 |
6dd7313919e81fac0b6e709014405077
|
|
| BLAKE2b-256 |
5236c923a47c7e86ebb5defd61cadb7fcee3547660a0e72c22e506f8f66ba10c
|