Rate limit headers
Every API response includes three headers that tell you exactly where you stand against your daily quota:
Here is what those headers look like on a typical response:
X-RateLimit-Reset value to a human-readable time by treating it as seconds since the Unix epoch — in the example above, 1735689600 corresponds to 2025-01-01T00:00:00Z.
When you hit the limit
OnceX-RateLimit-Remaining reaches zero, the API will reject further calls with a 429 Too Many Requests response until the window resets. The response body will have the following shape:
message field includes the human-readable reset time, which you can surface to operators or log for debugging. The X-RateLimit-Reset header is also present on 429 responses, so you always have the raw epoch value available for programmatic handling.
Handling 429s in code
The recommended strategy for handling a429 is to wait until the reset window passes before retrying, rather than using a short fixed back-off. The X-RateLimit-Reset header gives you the exact time to wait until, which makes the calculation straightforward:
maxRetries times. On a 429, it reads the X-RateLimit-Reset header, calculates how many milliseconds remain until the reset, waits that long (with a floor of 1 second to guard against clock skew), and then retries. If all attempts are exhausted, it throws so the caller can handle the failure explicitly.
Best practices
MonitorX-RateLimit-Remaining proactively. Rather than waiting to receive a 429, read the X-RateLimit-Remaining header on every response and begin throttling your request rate — for example, by introducing a small delay between calls — as it approaches zero. This prevents hard failures in production and gives you time to react.
Use batch and enrich endpoints to reduce total call count. POST /v1/fragrances/batch and POST /v1/fragrances/enrich each count as a single call against your quota regardless of how much data they return. Replacing many individual calls with a single batch or enrich call is the most effective way to stretch your daily allowance further.
Schedule high-volume jobs after the reset window. If you run nightly data pipelines or large bulk exports, schedule them to start shortly after midnight UTC. This ensures they have the full daily quota available and are least likely to compete with interactive traffic from your application.