Skip to main content

Documentation Index

Fetch the complete documentation index at: https://docs.sirius.menu/llms.txt

Use this file to discover all available pages before exploring further.

Every request is rate-limited to keep the API fast and fair. Limits are applied per API key when you send one, otherwise per IP address. Adding a key raises every limit below.

Budgets

There are two windows — a per-minute burst limit and a per-day quota. Search and raw-source endpoints have their own (lower) per-minute limits because they’re heavier.
AnonymousFree keyPartner
Requests / minute1206003,000
Requests / day10,000200,0005,000,000
Search / minute30120600
Raw source / minute30120600
Max max (page size)20100100
The cheapest way to raise your effective throughput isn’t a bigger key — it’s caching. Responses are served from the edge and carry ETags, so well-behaved clients rarely touch the rate limiter at all.

Headers

Every response includes your current standing on the per-minute window:
X-RateLimit-Limit: 120
X-RateLimit-Remaining: 117
X-RateLimit-Reset: 60
X-RateLimit-Tier: anon
HeaderMeaning
X-RateLimit-LimitRequests allowed in the current minute window
X-RateLimit-RemainingRequests left in this window
X-RateLimit-ResetSeconds until the window resets
X-RateLimit-Tieranon, free, or partner
Requests served from the edge cache don’t count against your budget — only requests that reach the origin do. A cache HIT (see the X-Cache header) is effectively free.

Handling 429

When you exceed a limit you get a 429 with a Retry-After header (in seconds) and the standard error envelope:
{
  "error": {
    "code": "rate_limited",
    "message": "Rate limit exceeded. Slow down or use an API key for higher limits."
  }
}
Back off and retry after the indicated delay. A simple, correct pattern:
async function call(url, opts) {
  for (let attempt = 0; attempt < 5; attempt++) {
    const res = await fetch(url, opts);
    if (res.status !== 429) return res;
    const wait = Number(res.headers.get("retry-after") ?? 2) * 1000;
    await new Promise((r) => setTimeout(r, wait));
  }
  throw new Error("rate limited after retries");
}
Don’t hammer through a 429 in a tight loop — repeated violations can get an IP temporarily blocked at the edge. Respect Retry-After.