Skip to main content
Every key is metered on two axes: a per-minute rate and a monthly call quota. The live numbers for your key are on every response, so you never have to look them up. Sandbox keys (scripx_test_…) are unmetered.

Headers on every response

You never have to guess where you stand. Every authenticated response carries the live numbers: The same numbers are available as JSON at GET /v1/usage.

When you hit a limit

Exceeding either the per-minute rate or the monthly quota returns:
with HTTP 429 and a Retry-After header.
The per-minute window is sliding, not fixed. Hammering the endpoint resets nothing and only pushes your recovery further out. Read Retry-After and wait exactly that long.

Handling 429 correctly

  1. On a 429, sleep for the Retry-After seconds, then retry the same request.
  2. Watch X-RateLimit-Remaining and slow down before you hit zero, rather than sprinting into the wall.
  3. Spread bulk work: prefer POST /v1/orders:batch (up to 500 orders in one call) over hundreds of single calls.
  4. Never key retry logic on the message string; branch on the stable code (rate_limited). See Errors.

Idempotency and retries

Because retries are a normal part of living within a rate limit, make them safe. Send an Idempotency-Key on every POST /v1/orders: re-sending the same key returns the original order instead of creating a second one, so a retry after a 429 or a network blip can never double-place.

The public surface

The no-key public rate index and enquiry endpoints are rate-limited per IP, independently of any API key:
  • Rate endpoints (/public/rates*) use a normal per-IP budget and are CDN-cacheable.
  • Enquiry endpoints (/public/enquiry/*) use a stricter per-IP budget.
A public 429 returns a retry_after_s hint in its detail. These limits protect the open surface and are separate from your metered key quota.