Rate Limits
TalkNTalk enforces rate limits at multiple layers to ensure fair usage, platform stability, and reliable delivery to downstream SMS providers. Understanding these limits will help you design your integration correctly.
API Rate Limits
These limits apply to your API key when calling TalkNTalk's HTTP endpoints. They are enforced per organisation using a sliding-window counter in Redis.
| Endpoint | Limit | Notes |
|---|---|---|
POST /v1/sms/send/ | 300 requests / minute | ~5 per second — single SMS sends |
POST /v1/sms/send-bulk/ | 60 requests / minute | 1 per second — bulk dispatch calls |
| All other endpoints | 300 requests / minute | General API access |
When you exceed a limit the API responds with:
HTTP/1.1 429 Too Many Requests
Retry-After: 60
{
"detail": "Request was throttled. Expected available in 60 seconds."
}Always check for 429 responses and implement a backoff strategy before retrying.
Handling 429 Errors
Exponential backoff (recommended)
// Node.js example
async function sendWithRetry(payload, maxRetries = 3) {
for (let attempt = 0; attempt <= maxRetries; attempt++) {
const res = await fetch('https://api.talkntalk.africa/v1/sms/send/', {
method: 'POST',
headers: { 'Authorization': 'Bearer tk_live_xxxx', 'Content-Type': 'application/json' },
body: JSON.stringify(payload),
});
if (res.status !== 429) return res.json();
if (attempt === maxRetries) throw new Error('Rate limit exceeded after retries');
const retryAfter = parseInt(res.headers.get('Retry-After') ?? '60', 10);
const delay = retryAfter * 1000 * Math.pow(2, attempt); // exponential
await new Promise(r => setTimeout(r, delay));
}
}# Python example
import time, requests
def send_with_retry(payload, max_retries=3):
for attempt in range(max_retries + 1):
r = requests.post(
'https://api.talkntalk.africa/v1/sms/send/',
headers={'Authorization': 'Bearer tk_live_xxxx'},
json=payload,
)
if r.status_code != 429:
return r.json()
if attempt == max_retries:
raise Exception('Rate limit exceeded after retries')
retry_after = int(r.headers.get('Retry-After', 60))
time.sleep(retry_after * (2 ** attempt))Bulk Sending Strategy
For high-volume campaigns, use POST /v1/sms/send-bulk/ instead of calling /v1/sms/send/ in a loop. A single bulk call handles up to 10,000 recipients and counts as 1 request against your rate limit.
| Approach | 1,000 messages | Rate limit impact |
|---|---|---|
/v1/sms/send/ in a loop | 1,000 requests | Hits 300/min limit in ~1 min |
/v1/sms/send-bulk/ | 1 request | No risk of throttling |
Delivery Throughput
TalkNTalk processes bulk campaigns asynchronously. A campaign of 10,000 messages typically completes within 5–8 minutes depending on network conditions and message volume across the platform. You do not need to manage queuing or retries — TalkNTalk handles this automatically.
OTP & Auth Limits
| Action | Limit |
|---|---|
| OTP resend (email verification / password reset) | 3 attempts per 10 minutes |
Exceeding this returns HTTP 429 with a retry_after field indicating how many seconds to wait.
Limit Increases
Need higher limits for your use case? Contact us:
Include:
- Your organisation name
- Which limit you need increased
- Your expected message volume per minute/hour
- A brief description of your use case