Rate limits
Two limits apply to every account. The monthly quota caps the number of API calls in a calendar month. The burst limit caps the number of requests in one minute. This page explains both, and the headers that report them.
What counts as an API call
One request to POST /v1/detect costs one API call, whatever the number of checks it runs. A request that fails before the media is loaded does not count. That covers authentication errors, invalid request bodies, and burst limit responses. A request that reaches the download step counts, even if the download then fails.
Requests to POST /v1/uploads and GET /v1/detectors are free.
Monthly quota
The quota counts API calls from the first day of the month to the last, in UTC. It resets at midnight UTC on the first day of the next month. The quota is shared by every key on the account.
| Plan | API calls per month |
|---|---|
| Free | 500 |
| API starter | 10,000 |
| API growth | 100,000 |
| Custom | Agreed with you |
When you reach the quota, the API returns HTTP 429 with the error type quota_exceeded. Nothing is billed for the extra requests. Read the pricing page to move to a larger plan.
Burst limit
The burst limit protects the service from a single caller that sends every request at once. It counts requests per key in the last 60 seconds.
| Plan | Requests per minute |
|---|---|
| Free | 10 |
| API starter | 60 |
| API growth | 120 |
| Custom | 300 |
When you pass the burst limit, the API returns HTTP 429 with the error type rate_limited and a Retry-After header. Wait that many seconds before you send the next request. Burst limit responses do not count toward the monthly quota.
Headers
Every response from POST /v1/detect carries these headers.
| Header | Meaning |
|---|---|
X-Quota-Limit | API calls allowed this month. |
X-Quota-Used | API calls used this month, including this one. |
X-Quota-Remaining | API calls left this month. |
X-Quota-Reset | When the quota resets, as an ISO 8601 time in UTC. |
RateLimit-Limit | Requests allowed per minute for this key. |
RateLimit-Remaining | Requests left in the current minute. |
RateLimit-Reset | Seconds until the burst window resets. |
Retry-After | Only on HTTP 429. Seconds to wait before the next request. |
File size limits
| Media source | Limit |
|---|---|
media (base64) | 4 MB |
Multipart file | 4 MB |
url | 25 MB, 15 second download |
upload | 25 MB |
Read the detect endpoint reference for the direct upload flow.
Handle limits in code
- Read
X-Quota-Remainingand warn your team before the quota runs out. - On HTTP 429, read
Retry-Afterand wait that many seconds. Do not retry in a tight loop. - Cache results by the
media.sha256value. The same file gives the same result, so there is no need to check it twice.