| name | exa-rate-limits |
| description | Implement Exa rate limiting, exponential backoff, and request queuing.
Use when handling 429 errors, implementing retry logic,
or optimizing API request throughput for Exa.
Trigger with phrases like "exa rate limit", "exa throttling",
"exa 429", "exa retry", "exa backoff", "exa QPS".
|
| allowed-tools | Read, Write, Edit |
| version | 1.11.0 |
| license | MIT |
| author | Jeremy Longshore <jeremy@intentsolutions.io> |
| tags | ["saas","exa","api","rate-limiting"] |
| compatibility | Designed for Claude Code, also compatible with Codex and OpenClaw |
Exa Rate Limits
Overview
Handle Exa API rate limits gracefully. Default limit is 10 QPS (queries per second) across all endpoints. Rate limit errors return HTTP 429 with a simple { "error": "rate limit exceeded" } response. For higher limits, contact hello@exa.ai for Enterprise plans.
Rate Limit Structure
| Endpoint | Default QPS | Notes |
|---|
/search | 10 | Most endpoints share this limit |
/find-similar | 10 | Same pool as search |
/contents | 10 | Same pool |
/answer | 10 | Same pool |
| Research API | Concurrent task limit | Long-running operations |
Prerequisites
exa-js SDK installed
- Understanding of async/await patterns
Instructions
Step 1: Exponential Backoff with Jitter
import Exa from "exa-js";
const exa = new Exa(process.env.EXA_API_KEY);
async function withBackoff<T>(
operation: () => Promise<T>,
config = { maxRetries: 5, baseDelayMs: 1000, maxDelayMs: 32000 }
): Promise<T> {
for (let attempt = 0; attempt <= config.maxRetries; attempt++) {
try {
();
} (: ) {
status = err. || err.?.;
(status !== && (status < || status >= )) err;
(attempt === config.) err;
exponentialDelay = config. * .(, attempt);
jitter = .() * ;
delay = .(exponentialDelay + jitter, config.);
.();
( (r, delay));
}
}
();
}
results = (
exa.(, { : , : })
);