| name | apollo-rate-limits |
| description | Implement Apollo.io rate limiting and backoff.
Use when handling rate limits, implementing retry logic,
or optimizing API request throughput.
Trigger with phrases like "apollo rate limit", "apollo 429",
"apollo throttling", "apollo backoff", "apollo request limits".
|
| allowed-tools | Read, Grep, Bash(curl:*) |
| version | 1.13.0 |
| license | MIT |
| author | Jeremy Longshore <jeremy@intentsolutions.io> |
| tags | ["saas","apollo","api"] |
| compatibility | Designed for Claude Code, also compatible with Codex and OpenClaw |
Apollo Rate Limits
Overview
Implement robust rate limiting and backoff for the Apollo.io API. Apollo uses fixed-window rate limiting with per-endpoint limits. Unlike hourly quotas, Apollo limits are per minute with a burst limit per second. Exceeding them returns HTTP 429.
Prerequisites
- Valid Apollo API key
- Node.js 18+
Instructions
Step 1: Understand Apollo's Rate Limit Structure
Apollo's official rate limits (as of 2025):
Endpoint Category | Limit/min | Burst/sec | Notes
----------------------------+-----------+-----------+-------------------------------
People Search | 100 | 10 | /mixed_people/api_search (free)
People Enrichment | 100 | 10 | /people/match (1 credit each)
Bulk People Enrichment | 10 | 2 | /people/bulk_match (up to 10/call)
Organization Search | 100 | 10 | /mixed_companies/search
Organization Enrichment | 100 | 10 | /organizations/enrich
Contacts CRUD | 100 | 10 | /contacts/*
Sequences | 100 | 10 | /emailer_campaigns/*
Deals | 100 | 10 | /opportunities/*
Response headers on every successful call:
x-rate-limit-limit — max requests per window
x-rate-limit-remaining — requests remaining in current window
retry-after — seconds to wait (only on 429 responses)
Step 2: Build a Per-Endpoint Rate Limiter
export class SlidingWindowLimiter {
private timestamps: number[] = [];
constructor(
private maxRequests: number = 100,
private windowMs: number = 60_000,
) {}
async acquire(): Promise<> {
now = .();
. = ..( now - t < .);
(.. >= .) {
oldestInWindow = .[];
waitMs = . - (now - oldestInWindow) + ;
.();
( (r, waitMs));
}
..(.());
}
(): {
now = .();
. = ..( now - t < .);
. - ..;
}
}
limiters = {
: (, ),
: (, ),
: (, ),
: (, ),
: (, ),
};