Developer docs

Headers & limits

How calls, rate, concurrency and traffic quotas are counted, and how to read them from response headers.

X-Cache shows HIT or MISS (options ticks show BYPASS). X-Plan, X-Plan-Tier and X-Plan-Expires show your plan ID, tier (starter/advanced) and expiry (ISO 8601).

X-Quota-Used / X-Quota-Limit are your daily calls:

  • Every HTTP request counts once, cache hits included, regardless of how many rows it returns.
  • The quota resets at 00:00 UTC; see X-Quota-Reset.
  • Once it's used up, requests return 429 for the rest of the day — no throttled trickle. Wait for the reset or upgrade.

Rate limit (QPS): Starter 10 (monthly) or 20 (yearly); Advanced 20 or 40; Options 20 or 40. Stocks and options are limited separately. Only cache misses count; over-limit requests get 429 — wait for Retry-After seconds and retry. Cache misses also carry X-RateLimit-Limit / X-RateLimit-Remaining and X-Response-Time.

Concurrency: each key can have a limited number of upstream requests in flight (Starter 3, Advanced 5); cache hits don't count. Extra requests queue automatically. If the queue grows beyond 4× the limit or a request waits more than 15 seconds, you get a 429 with Retry-After and X-Concurrency-Limit. Keeping bulk jobs within the limit is also the fastest way to download.

Monthly traffic: REST responses also have a monthly traffic cap (Starter 60 GB, Advanced 120 GB) with no daily cap. See X-Traffic-Used-Month / X-Traffic-Limit-Month (bytes):

  • Counted on uncompressed response size, cache hits included.
  • Resets on the 1st of each month at 00:00 UTC.
  • Once it's used up, requests return 429 until the reset (X-Traffic-Reset).
  • Traffic packs (Starter 60 GB, Advanced 120 GB) can be bought in the console. They kick in after the monthly allowance is used, stack, are consumed earliest-expiring first, and stay valid for 90 days. See X-Traffic-Pack-Remaining. Flat Files and WebSocket have their own limits and don't count here.
  • For large historical pulls of daily or minute bars, Flat Files are far cheaper than REST.

WebSocket uses separate connection and symbol limits, independent of REST quotas — see WebSocket streaming.