Rate limits
The SyncSnap API applies rate limiting per project so that no single project can overwhelm the service. When the limit is exceeded, the API returns 429 Too Many Requests with a JSON body and rate-limit headers (including when to retry).Limits
Limits are enforced per project (per API key), per minute, using a token-bucket algorithm (smooth rate, with burst up to the configured maximum).| Scope | Default | Description |
|---|---|---|
| Per project | 100 requests/min | All requests authenticated with the same project (API key). |
Which endpoints are limited?
Rate limiting is applied to routes where a project is identified (e.g. after API key validation):- Auth — API key validation and related auth routes.
- Job — Create job, get job, wait for completion, and get download URL.
429 response body
When rate limited, the API responds with:Retry-After so clients know when to retry.
Response headers
For requests that are scoped to a project, the API sets these rate-limit headers on both successful and 429 responses:| Header | Description |
|---|---|
x-rate-limit-limit | Maximum requests per minute allowed for this project. |
x-rate-limit-remaining | Number of requests remaining in the current window (0 when rate limited). |
x-rate-limit-reset | Unix timestamp (seconds) when the current rate-limit window resets (e.g. start of the next minute). |
| Header | Description |
|---|---|
Retry-After | Seconds until the window resets; wait this long before retrying. |
Handling rate limits in your app
- Backend — If your server proxies to SyncSnap and you get a 429, return a sensible status and message to the client (e.g. 429 with the same
errorbody) so the frontend can show a “Too many requests, try again shortly” message. - Frontend — Use Error handling: the React SDK’s
onErroranderrorstate will receive failures from the wait endpoint. If the backend returns 429, the error message will reflect that; you can detect it (e.g.err.message.includes('rate limit')) and show a user-friendly message or retry after a short delay.