Skip to main content

API Limits & Best Practices

Trackly SMS is built for high-volume sending. Throughput scales with bulk requests, since one request can carry up to 1,000 messages — batch aggressively to reach high send rates.

Rate Limits

The core sending endpoints (/v2/send, /v2/send/bulk, and related SMS/email endpoints) do not enforce a fixed per-IP request-rate cap. In practice, throughput is bound by request latency and payload size, so bulk endpoints are how you scale: a single POST /v2/send/bulk carries up to 1,000 messages. Some specialized endpoints (for example OTP and phone validation) enforce their own limits, and an API key can carry a daily send cap (dailySendCap, see Who Am I) that bounds its live sends per UTC day. When one is exceeded, the response is 429 Too Many Requests with a rate_limited code, or daily_cap_exceeded for a send cap:
429 - Too Many Requests
When you receive a 429, pause and retry with exponential backoff after the window resets. Prefer bulk requests over many single requests for efficiency and reliability. The per-key daily cap applies to the four SMS send endpoints. Capped keys cannot create or edit schedules because scheduled execution does not carry the key’s cap accounting. Those requests return 403 schedule_not_allowed_for_capped_key; exact status-only off or archive updates remain subject to normal execution locks. Sandbox and OTP requests do not consume this counter.

Payload Limits

Batch Limits

Bulk endpoints accept up to 1,000 records per request. Each record is processed individually — partial success is possible. 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.

Handle Transient Errors

Use exponential backoff with jitter for failed read requests. A send timeout or publication error can occur after submission, so check message status before deciding whether to send again. Such publication attempts retain daily quota. Known construction or storage failures before publication attempt to refund a confirmed reservation. If that refund fails or cannot be confirmed, allowance may remain used for the original UTC day even though the message was not published; check Who Am I for current usage before retrying a capped send. If the quota reservation itself cannot be confirmed, the send is refused but the reservation may remain charged. Live sends recheck the key’s current policy before admission, including keys without a daily cap. A policy change during a request or an unavailable policy check can return 503 send_cap_unavailable; retry with backoff so the next request uses the current limits.

Handle Partial Failures

Bulk responses include per-record errors. Retry corrected items only when their error establishes that submission did not occur. Publication errors and timeouts require reconciliation using the message ID when available; do not automatically resend those items or the entire batch.

Parallelize Across Batches

You can send multiple bulk requests concurrently. Split large sends into 1,000-message batches and dispatch them in parallel; very high concurrency is bound by request latency, so batch aggressively with bulk endpoints.

Next Steps

Error Codes

Handle errors in your integration

Send Bulk

Send up to 1,000 messages per request