Overview
Because so much of the enforcement shape is unconfirmed, the safe assumption is the strictest one: a hard 30/minute ceiling with no burst headroom and no progress headers to read.
The defensive baseline
With only 30 requests per minute, the integration must treat the budget as scarce. Three principles:
The single most important shift from a generous API: you cannot run multiple high-volume workloads concurrently against the same token. Sequence them, or allocate explicit slices of the 30/minute budget.
A throttled HTTP client
For any non-trivial workload, route every request through a throttled client. Note the rate is expressed per minute, not per second, and defaults below the 30/minute ceiling for headroom:At this budget, parallel requests on one token are almost always counterproductive: two workers each pacing at 24/minute would together hit 48/minute and trip the limit. Keep one throttled client per token, or share a single client instance across workers.
A token bucket (use sparingly)
A token bucket is only worthwhile here if you have a verified rolling window and a confirmed burst allowance. Absent that confirmation, a small bucket that still averages under 30/minute is the safest form:Allocating the 30/minute budget across workloads
Unlike a generous API, there is no per-workload allowance to hand out freely. There is one pool of 30 requests/minute (per token, pending confirmation), and every workload draws from it. The table below is a starting allocation when workloads run concurrently on the same token; the slices sum to 24/minute to preserve headroom:
For partner integrations serving many customers, what matters is whether the limit is per token or per source. If each customer has their own token, each gets 30/minute. If the partner shares one token or the platform enforces a per-IP cap, 100 customers at 24/minute each would mean 2,400 requests/minute against a shared ceiling. Confirm the scope before scaling (see the flag at the top of this page).
When you hit the limit
A429 means your traffic exceeded the 30/minute budget. Common causes and fixes:
At 30/minute, the fixes are usually structural rather than “just slow down.” A loop that does one
GET per record can only process 30 records per minute, so caching and batching matter far more here than on a generous API.
Polling without webhooks
Volunteer has no webhooks, so change detection means polling, and polling competes directly for the 30/minute budget. Poll no faster than the business need actually requires:Monitoring rate-limit pressure
Because Volunteer exposes noX-RateLimit-* headers to read ahead of a 429, you are flying without a fuel gauge. Track these metrics so pressure surfaces before it reaches customers:
429 rate is the canary. Since there are no headers to warn you, the count-per-minute metric is your only proactive signal; alert as it approaches 30.
When the platform is the culprit
Sometimes 30/minute is genuinely too low for a customer’s workload. The path forward:Whether higher rate tiers exist for Volunteer is not confirmed. Human input required: check with the team whether the 30/minute limit can be raised per customer, and document the tiers if so.
A rate-limit checklist
Walk through this when designing or auditing a Volunteer integration:- All API requests go through a throttled client (per-minute paced)
- The client targets at most 24 requests/minute, not 30, to leave headroom
- Only one high-volume workload runs at a time per token, or concurrent rates sum under the ceiling
429responses honorRetry-Afterwhen present- Default backoff (no
Retry-After) is a full 60-second window - Per-token requests-per-minute is monitored and alerted as it approaches 30
429rate is alerted on (any sustained non-zero)- Polling intervals and per-poll page counts both fit the budget
- Reference data is cached to avoid repeated lookups
- Per-record loops are replaced with batched or cached reads where possible
- No retry-forever loops; bounded attempts only
Common-cases reference
Interactive lookup (user waiting)
At 30/minute, a429 on a user-facing lookup means a wait of up to a full window, which is a poor experience. The real protection is reserving budget for interactive traffic (see allocation table above) so these rarely get rate-limited in the first place. A single retry covers the rare hit:
Steady-state polling (every 15 minutes)
Backfill (one-time bulk read)
Where to go next
Pagination
The page-following pattern that keeps bulk reads inside the request budget.
Errors
How
429 and other error responses are classified and handled.Integration Overview
The broader patterns for building a well-behaved Volunteer integration.
Authentication
Token setup, which determines the scope your 30/minute budget applies to.