Skip to main content

Rate Limits

All API endpoints are rate-limited per API key. Default limits apply unless overridden at the key level.

Default Limits

WindowLimit
Per minute300 requests
Per day10,000 requests
Per-key overrides: API keys can have custom rate_limit_per_minute and rate_limit_per_day values set at creation time. A value of 0 means “use the global default.” Publishable keys (cpk_ prefix) default to 100 requests/minute and can be configured independently.

Rate Limit Headers

Every response includes:
HeaderDescription
X-RateLimit-LimitMaximum requests per window
X-RateLimit-RemainingRequests remaining in current window
X-RateLimit-ResetUnix timestamp when the window resets

Handling 429 Responses

When you exceed the limit:
{
  "error": {
    "code": "RATE_LIMITED",
    "message": "Rate limit exceeded.",
    "status": 429,
    "details": {
      "retry_after_seconds": 12
    }
  }
}
Use the retry_after_seconds value to wait before retrying. For production applications, implement exponential backoff with jitter.

Pagination

All list endpoints return paginated results in a standard envelope:
{
  "data": [...],
  "pagination": {
    "page": 1,
    "page_size": 25,
    "total_count": 342,
    "total_pages": 14,
    "has_next": true,
    "has_previous": false
  }
}

Query Parameters

ParameterDefaultMaxDescription
page1Page number (1-indexed)
page_size25100Items per page

Iterating Through Pages

import requests

page = 1
all_items = []

while True:
    response = requests.get(
        "https://www.closient.com/products/api/v1/products",
        params={"page": page, "page_size": 100},
        headers={"X-API-Key": "YOUR_API_KEY"},
    )
    data = response.json()
    all_items.extend(data["data"])

    if not data["pagination"]["has_next"]:
        break
    page += 1