Plan limits
| Plan | Daily limit per product |
|---|---|
| Free | 10,000 requests |
| Pro | 100,000 requests |
| Enterprise | Organization override or unlimited |
API call counting rules
A request is counted once the product API key is successfully authenticated. This matches the live backend flow: the guard checks the daily limit first, then increments usage for requests with a valid product API key before product- or license-level business failures are returned.Counted
- Valid key + license found (
valid: true) - Valid key + license not found on validate (
200,valid: false,status: license_not_found) - Valid key + license revoked (
200,valid: false,status: revoked) - Valid key +
ip_blocked(200,valid: false,status: ip_blocked) - Valid key + product archived (
200,valid: false,status: product_archived) - Valid key + license lookup request on
GET /api/v1/license/:key, including a lookup that later returns404
Not counted
- Invalid or missing API key (
401 invalid_api_key) - Empty or malformed bearer token that fails auth (
401) - Requests already rejected because the rate limit is exhausted (
429)
The older wording “valid key + license not found (404)” is not correct for the validate endpoint. In the live public validate API,
license_not_found returns HTTP 200 with valid: false. A 404 can still happen on the separate read-only license lookup endpoint.When the limit is hit
Once the daily limit is reached, further requests return HTTP 429 with the following body:retry_after value is the number of seconds remaining until midnight UTC, when the counter resets.
The response also includes a Retry-After HTTP header with the same value.
Handling 429 gracefully
Readretry_after from the response body (or the Retry-After header) to determine when to resume. In most cases, the right behavior is to surface a clear message to your user and avoid hammering the API.
