API Reference

Errors & Rate Limits

Error codes, rate limits, and how to handle them.

Error Format

All errors return a consistent JSON structure:

{
  "error": "error_code",
  "message": "Human-readable description"
}

Error Codes

HTTPCodeDescription
401invalid_api_keyMissing, malformed, or revoked API key
402insufficient_creditsMonthly scan limit reached or async requires paid plan
413file_too_largeFile exceeds 100MB
415unsupported_mediaUnrecognized file type
429rate_limitedToo many requests
500internal_errorServer error — retry after a moment

Rate Limits

Each plan has different rate limits:

PlanRequests/MinDaily LimitMonthly Scans
Free510200
Starter202,000
Pro6010,000

Rate Limit Headers

Every response includes rate limit information:

X-RateLimit-Limit: 5
X-RateLimit-Remaining: 3
X-RateLimit-Reset: 1711454400

Handling Rate Limits

When you receive a 429 response, the body includes a retry_after value in seconds:

{
  "error": "rate_limited",
  "message": "Rate limit exceeded. Retry after 60 seconds.",
  "retry_after": 60
}

Wait for the specified duration before retrying. Implement exponential backoff for production integrations.

Best Practices

  • Check X-RateLimit-Remaining before each request to avoid hitting limits
  • Use GET /v1/usage to monitor your monthly quota
  • Use async mode for batch processing to avoid timeout issues
  • Implement retry logic with exponential backoff for 429 and 500 errors