Skip to main content
Concurrency is the number of API requests you can have in progress simultaneously. Your plan sets the number of slots: with 10, an 11th request sent while 10 are still processing gets a rate limit error rather than queueing.

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:
These headers are only returned on sync /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 carries X-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.
Async tasks report the equivalent in the task body as latencyMs — see asynchronous requests.

Using headers for optimization

Size each batch against the slots you have left:
Or throttle before you exhaust the per-second budget:
When you do hit a 429, retry with exponential backoff rather than immediately re-sending:
See Error handling for the full 429 error shapes.

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. Watch X-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?

Read X-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 a 429 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, watch X-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.