Guides
Rate Limits

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.

EndpointLimitNotes
POST /v1/sms/send/300 requests / minute~5 per second — single SMS sends
POST /v1/sms/send-bulk/60 requests / minute1 per second — bulk dispatch calls
All other endpoints300 requests / minuteGeneral 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.

Approach1,000 messagesRate limit impact
/v1/sms/send/ in a loop1,000 requestsHits 300/min limit in ~1 min
/v1/sms/send-bulk/1 requestNo 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

ActionLimit
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:

📧 support@talkntalk.africa

Include:

  • Your organisation name
  • Which limit you need increased
  • Your expected message volume per minute/hour
  • A brief description of your use case