计划执行与检查节点
executing-plans
按既定实施计划完成工作,保持过程检查和反馈。
intercom-rate-limits【效率与协作】Handle Intercom API rate limits with backoff, queuing, and header monitoring. Use when handling 429 errors, implementing retry logic, or optimizing API request throughput for Intercom. Trigger with phrases like "intercom rate limit", "intercom throttling", "intercom 429", "intercom retry", "intercom backoff", "intercom request limit".
独立 GitHub 快照 · 自动分类 · 以原作者文档为准
name: intercom-rate-limits description: 'Handle Intercom API rate limits with backoff, queuing, and header monitoring.
Use when handling 429 errors, implementing retry logic,
or optimizing API request throughput for Intercom.
Trigger with phrases like "intercom rate limit", "intercom throttling",
"intercom 429", "intercom retry", "intercom backoff", "intercom request limit".
' allowed-tools: Read, Write, Edit version: 1.6.0 license: MIT author: Jeremy Longshore jeremy@intentsolutions.io tags:
Intercom enforces rate limits per app and per workspace. Handle 429 errors gracefully with exponential backoff, queue-based throttling, and proactive header monitoring. This skill gives you five composable defenses — a retry wrapper, a live monitor, a request queue, request batching, and metrics — so a high-volume integration stays under the ceiling instead of spraying 429s.
The full, copy-paste TypeScript for all five lives in references/implementation.md; this page carries the limits, the header contract, and a lean skeleton so you can wire it up from here and drill in for depth.
| Scope | Limit | Notes |
|---|---|---|
| Private app | 10,000 req/min | Per app |
| Public app (OAuth) | 10,000 req/min | Per app |
| Workspace total | 25,000 req/min | Across all apps |
| Search endpoints | 1,000 req/min | /contacts/search, /conversations/search |
| Scroll endpoints | 100 req/min | Bulk data export |
Every response includes these headers — read them to throttle proactively:
X-RateLimit-Limit: <max requests per window>
X-RateLimit-Remaining: <remaining requests>
X-RateLimit-Reset: <unix timestamp when window resets>
INTERCOM_ACCESS_TOKEN (Developer Hub > Your App
Authentication) — all requests below send it as
Authorization: Bearer.
npm install intercom-client.npm install p-queue.Apply the defenses in order — each builds on the previous one. Use Write to
create a new intercom-rate-limit.ts module, or Edit to fold these into an
existing client wrapper.
Wrap every call in header-aware retry. On 429, wait until
X-RateLimit-Reset; on 5xx, exponential backoff with jitter. Skeleton:
async function withRateLimitRetry<T>(op: () => Promise<T>): Promise<T> {
// On 429: delay = (X-RateLimit-Reset * 1000) - Date.now() + 1000
// On 5xx: delay = baseDelay * 2^attempt + jitter, capped at maxDelayMs
}
Add a proactive monitor. Feed response headers into a monitor and call
waitIfNeeded() before firing when usage crosses ~90%, so you slow down
before a 429.
Throttle with a queue. Route requests through a p-queue capped at
~150 req/s to keep bursts under the per-app ceiling.
Batch to cut request count. Replace N individual lookups with OR-batched
contacts.search queries.
Emit metrics. Log remaining, usage_percent, and ms_until_reset so
you can alert before saturation.
Full implementation for every step: references/implementation.md.
Wiring these in yields three concrete artifacts in your integration:
withRateLimitRetry + queuedRequest, so transient 429/5xx are absorbed
automatically instead of surfacing as failures.intercom.rate_limit metrics (remaining,
usage percent, ms-until-reset) ready for dashboards and alerts.| Scenario | Strategy | Implementation |
|---|---|---|
| 429 with reset header | Wait until reset | Parse X-RateLimit-Reset |
| 429 without headers | Exponential backoff | 1s, 2s, 4s, 8s, 16s |
| Approaching limit (>90%) | Proactive throttle | Check remaining before request |
| Bulk operations | Queue-based | p-queue with intervalCap |
| Multiple apps hitting workspace limit | Coordinate | Shared rate limit monitor |
Absorb a burst of contact lookups. Fan out hundreds of contacts.find
calls without tripping the limit by routing each through the queue + retry
wrapper:
const contacts = await Promise.all(
userIds.map(id =>
queuedRequest(() => client.contacts.find({ contactId: id }))
)
);
Precise wait on a 429. When a response carries X-RateLimit-Reset, wait
exactly until that epoch (plus a 1s buffer) instead of guessing a backoff — see
Step 1 in references/implementation.md.
Batch email lookups. Replace 100 single-contact requests with 10 OR-batched
searches — full findContactsByEmails helper in
references/implementation.md.
Rate limiting is one layer of a hardened Intercom integration. Once retries and
throttling are in place, pair them with intercom-common-errors for full
status-code triage, and intercom-security-basics for token scoping and
webhook-signature verification.