Skip to main content

Overview

The Integrations API enforces rate limits to keep the service stable and usage fair. Limits are tier-based and resolved per API key: the limit that applies to a request depends on the plan associated with your key and on which capability bucket the request falls into. Exact request-per-minute numbers are configured per tier and are not published here. To see the limits that apply to your key, check the control plane or contact support.

Capability buckets

Each request is counted against one of six buckets. Read operations, write operations, uploads, and sandbox calls are limited independently, so heavy polling does not consume your submission-write budget.

When you exceed a limit

Exceeding a bucket limit returns a 429 with a single error string and a Retry-After header (in seconds).
The API does not emit X-RateLimit-Limit, X-RateLimit-Remaining, or X-RateLimit-Reset headers. The only rate-limit header is Retry-After, returned on 429 responses. Do not write code that reads X-RateLimit-* headers.

When your plan lacks API access

If your tier is not authorized for the Integrations API at all, requests return a 402 instead of a 429. This is a plan-gating response, not a transient rate limit.
The bucket field names the capability that was gated. To enable API access, upgrade your plan in the control plane or contact support. Retrying a 402 will not succeed.

Best practices

Respect Retry-After

When you receive a 429, wait for the duration in the Retry-After header before retrying, then apply exponential backoff with jitter for any further attempts.

Batch assets into one submission

Submit all assets for a job in a single request rather than one submission per asset. This consumes a single submission_write instead of many.

Prefer webhooks over tight polling

Polling submission status in a tight loop consumes your submission_read budget quickly. Subscribe to webhooks so you are notified when processing completes, and poll only as a fallback. See Webhook subscriptions.

Poll with backoff

When you do poll, read status from GET /submissions/{id} (there is no /status suffix), space your requests out, and stop once the top-level status reaches a terminal state of complete, partial, or failed.

Queue and space out requests

If you generate bursts of work, place requests on a queue and release them at a steady rate rather than firing them all at once. This keeps you under your bucket limits and reduces the number of 429 responses you have to recover from.

Troubleshooting

Hitting limits unexpectedly

  • Confirm you are batching assets into single submissions where possible
  • Replace tight polling loops with webhooks
  • Space requests out instead of issuing them concurrently
  • Check your tier’s limits in the control plane

Getting 429 responses

  • Wait for the Retry-After duration before retrying
  • Apply exponential backoff with jitter for repeated retries
  • Remember that read, write, upload, and sandbox buckets are counted separately

Getting a 402 instead of a 429

A 402 with error_code: tier_not_authorized_for_integrations_api means your plan does not include API access. Upgrade in the control plane or contact support at https://support.iclear.ai/ — retrying will not help.

Need higher limits?

Contact support at https://support.iclear.ai/ with your expected request volume, use case, and timeline.