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:

PlanDaily emailsEmails / secAPI req / minBatch size
Free10016010
Pro5,00050600100
Scale20,0002002,000100
Enterprise100,0001,00010,000100

SMS Rate Limits

SMS sending has separate daily message limits and spend caps:

PlanDaily SMSBatch sizeDaily spend cap
Free0
Pro10,000100$100.00
Scale100,000100$1,000.00
Enterprise500,000100$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

GET
/v1/rate-limits

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

ParameterTypeDescription
X-RateLimit-LimitstringYour plan's rate limit (requests per second).
X-RateLimit-RemainingstringNumber of requests remaining in the current window.
X-RateLimit-ResetstringUnix 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