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/*50 requests / 10 secondsClient 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:
{ "error": "too_many_requests", "message": "Public API rate limit exceeded. Retry after 10s." }
Wait 10 seconds, 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.