Skip to main content

API Limits & Best Practices

Trackly SMS does not impose API rate limits. The platform is built for high-volume sending and supports up to 50 million messages per minute across its infrastructure. Send as fast as your integration can push.

Payload Limits

LimitValueResponse
Maximum request payload5 MB413 Payload Too Large
Individual contact payload4,000 bytes413 payload_too_large

Batch Limits

Bulk endpoints accept up to 1,000 records per request. Each record is processed individually — partial success is possible.
OperationSingle EndpointBulk EndpointMax per Request
Send messagesPOST /v2/sendPOST /v2/send/bulk1,000
Create contactsPOST /v2/contactsPOST /v2/contacts/bulk1,000
Record revenuePOST /v2/revenuePOST /v2/revenue/bulk1,000
Import historyPOST /v2/history/import1,000
To process more than 1,000 items, split your data into batches and send multiple requests.

Best Practices

Use Bulk Endpoints

Buffer messages locally and send in bulk batches. Sending 1,000 messages in a single bulk request is more efficient than 1,000 individual requests — fewer round trips, lower latency, and less overhead on both sides.
import requests

# Send up to 1,000 messages in one request
messages = [
    {"to": f"+1415555{i:04d}", "body": "Flash sale! 50% off today."}
    for i in range(1000)
]

response = requests.post(
    "https://app.tracklysms.com/api/v2/send/bulk",
    headers={"X-Api-Key": "trk_your_api_key_here"},
    json={"list_number": "+18005551234", "messages": messages}
)

data = response.json()
print(f"Queued: {data['queued_count']}, Errors: {data['error_count']}")

Handle Transient Errors

Use exponential backoff with jitter when you receive 5xx errors. These are transient and resolve on retry.
import time
import random
import requests

def send_with_retry(url, headers, payload, max_retries=5):
    for attempt in range(max_retries):
        response = requests.post(url, headers=headers, json=payload)

        if response.status_code < 500:
            return response

        wait = (2 ** attempt) + random.uniform(0, 1)
        time.sleep(wait)

    raise Exception("Max retries exceeded")

Handle Partial Failures

Bulk responses include per-record errors. Parse the errors array to identify and retry failed items without re-sending the entire batch.
{
  "queued_count": 998,
  "error_count": 2,
  "errors": [
    {"index": 42, "to": "+1invalid", "code": "invalid_phone", "error": "Invalid recipient phone number format"},
    {"index": 501, "to": "+10000000000", "code": "not_sendable", "error": "VOIP numbers not allowed"}
  ]
}

Parallelize Across Batches

Since there are no rate limits, you can send multiple bulk requests concurrently. Split large sends into 1,000-message batches and dispatch them in parallel for maximum throughput.

Next Steps

Error Codes

Handle errors in your integration

Send Bulk

Send up to 1,000 messages per request