Rate limits and quotas
Per-minute limits, monthly quotas, and the headers on every response.
Two independent limits apply to every key: requests per minute, and requests per month.
Headers on every response
RateLimit-Limit: 300
RateLimit-Remaining: 297
RateLimit-Reset: 1755388860
Cruxal-Quota-Remaining: 498112
RateLimit-Reset is a Unix timestamp in seconds. The three RateLimit-* headers are present
on every response, including the 429 — so a client that has just been throttled still
learns exactly when to try again.
Cruxal-Quota-Remaining is the exception: it is sent only when the plan has a monthly quota,
so an unmetered plan never receives it. Treat it as optional.
Per-minute limit → 429
Exceed your per-minute rate and you get 429 Too Many Requests with a Retry-After header.
Wait and retry; this is a limit that recovers on its own.
Limits are measured in fixed one-minute windows, not a sliding window. A burst straddling a window boundary can therefore briefly admit up to twice your limit. That is expected behaviour, not a bug.
Monthly quota → 403
Exhaust your monthly quota and you get 403 Forbidden with
type: .../quota-exceeded — deliberately not a 429, and with no Retry-After.
A monthly quota does not recover by waiting a few seconds. Because well-behaved HTTP clients
retry 429s automatically, returning one here would have your own SDK hammering us for the
rest of the billing month. A 403 says what is true: retrying will not help. Upgrade, or wait
for the next billing month.
The billing month runs on Indian Standard Time, so it rolls over at midnight IST on the 1st.
What counts
Every authenticated request counts, including ones that end in an error. If your integration sends a malformed request in a retry loop, those attempts consume quota.
Requests rejected before authentication — a missing or malformed key — do not count, because there is no key to count them against.
Check your own consumption at any time:
curl -sS https://api.cruxal.in/v1/usage \
-H "Authorization: Bearer $CRUXAL_API_KEY"
Plans
| Plan | Per minute | Per month | Filing delay | History | Logos |
|---|---|---|---|---|---|
Test (ck_test_) | 10 | 1,000 | 60 minutes | Last 7 days | — |
| Developer | 60 | 25,000 | 24 hours | Full | — |
| Starter | 120 | 100,000 | 15 minutes | Full | ✓ |
| Growth | 300 | 500,000 | None | Full | ✓ |
| Enterprise | 1,200 | Unmetered | None | Full | ✓ |
The delay applies to exchange filings only. Our own editorial articles under /v1/news are
never delayed on any plan.
Test keys additionally return a reduced payload — see Authentication. They are for evaluating the integration, not for running on.
Company logos (logo_url on the companies endpoints) are a separate entitlement available from
Starter up, because they are third-party trademarks we redistribute under licence rather than
data of our own.
Limits are recorded per key, so if you have negotiated something specific, your key carries those numbers rather than the table's.
Prices are on the pricing page. Growth and Enterprise are quoted rather than listed — talk to us.