Rate Limits
The Txtly API implements rate limiting to ensure fair use and maintain service stability. Rate limits vary depending on your plan.
Email Rate Limits
Each plan has a daily email limit, a per-second send rate, an API request rate, and a maximum batch size:
| Plan | Daily emails | Emails / sec | API req / min | Batch size |
|---|---|---|---|---|
| Free | 100 | 1 | 60 | 10 |
| Pro | 5,000 | 50 | 600 | 100 |
| Scale | 20,000 | 200 | 2,000 | 100 |
| Enterprise | 100,000 | 1,000 | 10,000 | 100 |
SMS Rate Limits
SMS sending has separate daily message limits and spend caps:
| Plan | Daily SMS | Batch size | Daily spend cap |
|---|---|---|---|
| Free | 0 | — | — |
| Pro | 10,000 | 100 | $100.00 |
| Scale | 100,000 | 100 | $1,000.00 |
| Enterprise | 500,000 | 100 | $10,000.00 |
Per-team overrides are available for custom limits. Contact support for details. Batch SMS requests are pre-checked against the daily spend cap: the projected cost of the whole batch is compared to your remaining budget, and the request is rejected with a 429 before anything is sent if it would exceed the cap.
Get Rate Limits
/v1/rate-limitsRetrieve your plan tier, effective limits (including any per-team overrides), and today's email and SMS usage.
Example response
{
"tier": {
"plan": "Pro",
"hasOverride": false
},
"limits": {
"dailyEmailLimit": 5000,
"emailsPerSecond": 50,
"apiRequestsPerMinute": 600,
"batchSize": 100,
"dailySmsLimit": 10000,
"smsBatchSize": 100,
"dailySmsSpendLimit": 100.00
},
"usage": {
"emailsSentToday": 1240,
"dailyEmailLimit": 5000,
"dailyUsagePercent": 24.8,
"resetsAt": "2026-04-13T00:00:00Z",
"smsSentToday": 320,
"dailySmsLimit": 10000,
"dailySmsUsagePercent": 3.2,
"smsSpendToday": 25.60,
"dailySmsSpendLimit": 100.00
}
}smsSpendToday is the billable SMS spend accumulated since midnight UTC, and resetsAt is when all daily counters reset. Usage percentages are 0 when the corresponding limit is 0 (e.g. SMS on the Free plan).
Rate Limit Headers
Every API response includes headers that show your current rate limit status:
| Parameter | Type | Description |
|---|---|---|
X-RateLimit-Limit | string | Your plan's rate limit (requests per second). |
X-RateLimit-Remaining | string | Number of requests remaining in the current window. |
X-RateLimit-Reset | string | Unix timestamp when the rate limit window resets. |
Rate Limit Exceeded
When a send would exceed your daily email or SMS limit, the API returns a 429 with the limit and what's remaining:
{
"error": "Daily email limit exceeded. Limit: 5000, sent today: 5000, requested: 1",
"limit": 5000,
"remaining": 0
}When an SMS send (or batch) would exceed your daily SMS spend cap, the 429 body reports spend in dollars:
{
"error": "This batch would exceed the daily SMS spend limit. Limit: $100.00, spent today: $99.85, batch cost up to: $0.80",
"spent_today": 99.85,
"limit": 100.00
}Requests rejected by the per-key API request limiter return 429 with a Retry-After header indicating how many seconds to wait before retrying.
Best Practices
To avoid hitting rate limits:
- •Implement exponential backoff: When you receive a 429 response, wait and retry with increasing delays (1s, 2s, 4s, etc.)
- •Batch requests: Use batch endpoints when available to send multiple items in a single request
- •Cache results: Cache API responses when appropriate to reduce unnecessary requests
- •Monitor rate limit headers: Check remaining requests and adjust your request rate accordingly