Skip to main content
Every API key has configurable rate limits to protect the platform and ensure fair usage.

How It Works

Rate limiting uses a sliding window algorithm tracked per API key. The window continuously rolls forward — it is not reset at fixed intervals.
  • Per-minute limit - Maximum requests in any rolling 60-second window
  • Per-day limit - Maximum requests in any rolling 24-hour window
Both limits are enforced independently. If either is exceeded, requests return 429 Too Many Requests.

Rate Limit Headers

Every response includes these headers so you can proactively monitor usage without making extra API calls.
HeaderDescription
X-RateLimit-LimitMaximum requests per minute for this key
X-RateLimit-RemainingRemaining requests in the current minute window
X-RateLimit-ResetUnix timestamp when the minute window resets

Handling Rate Limits

When the limit is exceeded, the API returns 429 Too Many Requests with a Retry-After header. Your integration must respect this header — continuing to send requests will extend the backoff period.
When you exceed the limit, you’ll receive:
{
  "error": {
    "code": "rate_limit_exceeded",
    "message": "Rate limit exceeded. Retry after 12 seconds.",
    "details": {
      "retry_after": 12
    }
  }
}
The response also includes a Retry-After header with the number of seconds to wait.

Best Practices

Respect Retry-After

Always wait the number of seconds specified in the Retry-After header before retrying.

Exponential Backoff

If you continue hitting limits, implement exponential backoff with jitter.

Use Batch Endpoints

For bulk operations, use batch endpoints (/ideaclouds/batch, /content/batch) to reduce request count.

Monitor Headers

Track X-RateLimit-Remaining and throttle proactively before hitting the limit.

Default Limits

PlanPer MinutePer Day
Default6010,000
CustomUp to 500Up to 100,000
Rate limits are configured per API key when creating the key in the Dealership Manager.

Example: Retry Logic

# Retry with Retry-After header
MAX_RETRIES=3
ATTEMPT=0

while [ "$ATTEMPT" -le "$MAX_RETRIES" ]; do
  HTTP_CODE=$(curl -s -o response.json -w "%{http_code}" \
    -D headers.txt \
    -X POST "https://api.app.hrizn.io/v1/public/content/batch" \
    -H "X-API-Key: $API_KEY" \
    -H "Content-Type: application/json" \
    -d @batch.json)

  if [ "$HTTP_CODE" -ne 429 ]; then
    break
  fi

  RETRY_AFTER=$(grep -i 'retry-after' headers.txt | tr -d '\r' | awk '{print $2}')
  RETRY_AFTER=${RETRY_AFTER:-5}
  echo "Rate limited. Retrying in ${RETRY_AFTER}s..."
  sleep "$RETRY_AFTER"
  ATTEMPT=$((ATTEMPT + 1))
done
For generating large volumes of content across multiple sites, see the Bulk Content Generation guide for a complete throttling and parallelization strategy.
Last modified on March 1, 2026