Rate limits vs. concurrency limits
Free tier accounts are limited to 1 concurrent request. Upgrade for multi-threaded workloads. See the pricing table for concurrency limits per plan. cloro applies two types of limit depending on the endpoint:
Monitor endpoints are subject to both.
Monitoring concurrency with headers
Each response includes HTTP headers to help you manage your API usage:
On a 20-slot plan with 3 requests in flight:
Monitoring rate limits with headers
All endpoints include rate limit headers in each response:
The limit is per endpoint per API key — each
/v1/* path has its own independent 1,000 RPS bucket, and the counter resets every second. After one request to /v1/monitor/chatgpt:
Credit headers
Monitor endpoints (/v1/monitor/*) also return the credit balance and the amount charged for each request:
Track spend per request and alert before you run low:
/v1/monitor/* responses. For async-only workloads, read your balance from GET /v1/credits instead.
For how credits are allocated, expire, and are priced, see Billing & credits and Providers.
Latency header
Every response carriesX-Latency-Ms — the milliseconds the API spent on the request, from arrival to the start of the response. It excludes network transit, so wall-clock timing on your side is always higher.
latencyMs — see asynchronous requests.
Using headers for optimization
Size each batch against the slots you have left:429, retry with exponential backoff rather than immediately re-sending:
Implementation patterns
Pattern 1: Async with webhooks
For large-scale processing, submit every task concurrently (one request per task) and handle results via webhooks — cloro queues them for you, so you don’t have to batch:Pattern 2: Concurrent workers
For real-time processing where you want immediate results, run multiple workers that make direct API calls:Common questions
Why am I getting 429 rate limit errors?
Two causes: Concurrency limit exceeded (monitor endpoints only) — more simultaneous requests than your plan’s slots. WatchX-Concurrent-Remaining, queue requests in your application, retry with exponential backoff, or upgrade your plan.
Rate limit exceeded (all endpoints) — over 1,000 requests per second to a single endpoint. Watch X-RateLimit-Remaining, spread requests over time, or move non-time-sensitive work to the async queue.
See the error handling guide for the error responses.
How do I check my concurrency limit?
ReadX-Concurrent-Limit on any monitor response, or call the async status endpoint for your account’s concurrency stats.
Can I increase my concurrency limit?
Yes. Self-serve plans can be upgraded directly in the dashboard — the new limit applies immediately, no support ticket required. If you need concurrency above the highest self-serve tier, email info@cloro.dev for an enterprise quote.Does higher concurrency delay my logs or dashboards?
No. Dashboard log ingestion runs independently from request processing. If logs look delayed during heavy load, the cause is usually batching on the dashboard side, not concurrency — entries normally surface within a minute.Can I burst above my concurrency limit?
No. The limit is hard — the (N+1)th simultaneous request gets a429 immediately rather than queueing. Use the async API if you want cloro to handle queueing for you instead of managing burst capacity yourself.
What’s the best way to handle large batches of requests?
For non-time-sensitive batches, use Pattern 1: Async with webhooks: send everything concurrently, let cloro queue it, and take results on the webhook. When you need results in real time, use Pattern 2: Concurrent workers: stay within your plan’s concurrency limit, watchX-Concurrent-Remaining, and back off exponentially on 429s.
Either way, submit through the batch endpoint rather than one call per task. See how to submit many requests in one call for its limits.