Agent-readable docs index: /llms.txt. Full docs in one file: /llms-full.txt. Download /docs.zip to grep all markdown files locally.

Rate limits

PlanApplies toMinute limitDaily limitKeyed by
Free/api/v1/public/*400 requests / 10 seconds burst; 480 / 60 seconds sustained—Client IP at the edge
ProAuthenticated realtime API30 requests/minute20,000/dayOrganization
PremiumAuthenticated realtime API180 requests/minute150,000/dayOrganization
Paid limits are organization-wide. Every API key and authenticated session in an organization draws from the same budgets. Creating more keys does not increase throughput. The daily budget resets at 00:00 UTC.
Public requests are limited and cached at the Cloudflare edge and are not double-counted by the application limiter. An IP over the public budget receives 429 Too Many Requests. Burst overage asks to retry after 10 seconds. Sustained overage asks to retry after 60 seconds. The body message names that wait:
{ "error": "too_many_requests", "message": "Public API rate limit exceeded. Retry after 10s." }
Wait the Retry-After on the response, then retry. Do not retry immediately; that extends the block.
Realtime reads from an organization with no paid plan are refused with 403 (see No plan at all). They are not billed against a minute or daily budget, so they carry none of the headers below.

Response headers

Paid (Pro and Premium) responses carry both budgets:
HeaderMeaning
RateLimit-LimitPlan requests per minute.
RateLimit-RemainingRequests left in the current minute.
RateLimit-ResetSeconds until the minute counter resets.
RateLimit-Daily-LimitPlan requests per UTC day.
RateLimit-Daily-RemainingRequests left today.
RateLimit-Daily-ResetSeconds until 00:00 UTC.
An over-limit request returns 429 Too Many Requests. It includes the same headers, sets the exhausted remaining value to zero, and includes Retry-After for the budget that blocked the request:
{ "error": "rate_limited", "limit": "rpm", "message": "Organization rpm request limit exceeded; retry after 18s.", "upgrade_url": "https://adjacent.markets/subscribe" }
Back off for at least Retry-After seconds. upgrade_url points to the plan catalog. It is omitted when no plan is available to buy.
The live minute and daily meters are under Settings → Billing & usage.

Concurrent requests

Beyond the per-minute and daily budgets, each organization can run up to 4 requests at the same time. This capacity is dedicated to your organization, not shared with other callers. A request over the limit waits up to 2 seconds for a slot. If no slot frees up, it returns 429 Too Many Requests with Retry-After and the body above with "limit": "concurrency".
The public tier (/api/v1/public/*) shares one pool of capacity across all anonymous callers and can return 429 with Retry-After under load:
{ "error": "too_many_requests", "message": "The public API is at its concurrent request limit. Retry after 2s." }
Issue requests sequentially, or keep parallelism within the limit, and back off for Retry-After seconds on a concurrency 429.

No plan at all

A 429 means a plan's budget ran out. A request from an organization with no paid plan is refused up front instead, with 403 Forbidden:
{ "error": "Insufficient scope: a Pro or Premium API plan is required", "status": 403, "upgrade_url": "https://adjacent.markets/subscribe" }
upgrade_url carries the same meaning as on a 429 and is likewise omitted when no plan is available to buy. Unlike a 429, retrying does not help: nothing resets until the organization holds a plan.