API referenceRate-limit headers

Rate-limit headers

Syntic reports rate-limit state only when a request is refused. Successful responses carry no rate-limit headers, so a client cannot see how much of the minute is left ahead of time; it learns it has gone over from a 429, and from that response’s Retry-After.

On a 429 from the request cap

When a key (or a signed-in user) sends more than 600 requests within a sliding 60-second window, the API answers:

HTTP/1.1 429 Too Many Requests
Retry-After: 7
X-RateLimit-Limit: 600
X-RateLimit-Remaining: 0
X-RateLimit-Reset-Seconds: 7
x-syntic-request-id: req_6f1c2a9e0b7d4c3a8e5f1b2d
Content-Type: application/json
 
{"error":"Rate limit exceeded","scope":"api-proxy:apikey","retry_after_seconds":7}
HeaderValue
Retry-AfterWhole seconds to wait before trying again. Read this one first.
X-RateLimit-LimitThe cap that applied, 600.
X-RateLimit-RemainingAlways 0.
X-RateLimit-Reset-SecondsSeconds until the window has room again; equal to Retry-After. There is no X-RateLimit-Reset header.

The body repeats the wait as retry_after_seconds.

On a 429 or 503 from the model service

A 429 or 503 can also come from further down the line, when the model service is busy. Those responses carry a Retry-After chosen by Syntic, kept within a sensible range, and no X-RateLimit-* headers. Treat them the same way: wait for Retry-After, then retry.

Reading the headers in a browser

Browser JavaScript cannot read the X-RateLimit-* headers, because they are not listed as exposed for cross-origin requests.

On develop, not live yet: Retry-After becomes readable from browser JavaScript. Until that ships, browser code should take the wait from retry_after_seconds in the 429 body, or fall back to a backoff delay.

Reading the wait

Check Retry-After first; fall back to your own backoff when it is missing.

curl -sS -D - -o /dev/null https://app.syntic.ai/v1/chat/completions \
  -H "Authorization: Bearer $SYNTIC_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"model": "Amara Quick", "stream": false, "max_tokens": 16, "messages": [{"role": "user", "content": "ping"}]}' \
  | grep -i -E '^(retry-after|x-ratelimit)'

A full retry helper is on Rate limits & retries.

Was this page helpful?