Tickerdevelopers

Rate Limits & Quotas

The Ticker API enforces two independent limits per API key:

  • A per-second rate limit with a short burst allowance, applied to each request as it arrives.
  • A weekly quota, capping the total number of successful requests over a rolling week.

Hitting either limit returns 429 Too Many Requests.

Per-tier limits

PlanRate (req/s)BurstWeekly quota
Free12350
Lite5101,500
Advanced15303,500
Ultimate30605,000

Higher limits are available on the professional plans (Startup, Business, Issuer, Enterprise). Contact us for details.

How requests are counted

  • Per request, not per result. A single response containing 200 items counts as one request. Larger pageSize is the cheapest way to consume your quota.
  • All authenticated requests count, including 4xx client errors that reached the API. Network-level failures and unauthenticated requests do not.

Throttling: rate + burst

Throttling uses a token bucket. The bucket refills at Rate tokens per second up to a maximum size of Burst. Each request consumes one token; requests arriving with an empty bucket are rejected with 429.

In practice:

  • Steady traffic at or below your Rate never sees a 429.
  • Short spikes up to Burst are absorbed.
  • Sustained traffic above Rate drains the bucket and starts returning 429.

Weekly quota

The quota resets weekly. Once exhausted, every request returns 429 until the reset.

The quota is plan-wide, not per-endpoint. Reads against /v2/disclosures/..., /v2/references/..., and any other endpoint all draw from the same bucket.

Handling 429

Both limit types use the same status code. Distinguish them by retry behaviour:

  • Throttle (429 under load): a short backoff is enough. Sleep 1–2 seconds and retry. Use exponential backoff if it persists.
  • Quota (429 that does not clear): no retry will help until the quota resets. Stop polling, log the condition, and resume next week or upgrade the plan.

A simple loop:

import time, requests

def get_with_backoff(url, headers, max_attempts=5):
    delay = 1
    for _ in range(max_attempts):
        r = requests.get(url, headers=headers, timeout=30)
        if r.status_code != 429:
            return r
        time.sleep(delay)
        delay = min(delay * 2, 30)
    return r

Sizing your usage

A few rules of thumb:

  • Polling for new items? Use sinceCursor (see Pagination). Empty polls cost one request each. A 1-minute polling interval is ~10,000 requests/week, which fits comfortably inside the Advanced quota.
  • Backfilling history? Use the largest pageSize your plan supports (Free/Lite 50, Advanced 100, Ultimate 200). Pulling a year of RNS in 200-item pages is a few hundred requests, not thousands.
  • Need more headroom? Upgrade or contact us.