Skip to main content
The Volunteer API enforces a rate limit of 30 requests per minute per API token. This is a tight budget by API standards (0.5 requests per second sustained, or one request every 2 seconds), so partner integrations must pace deliberately rather than relying on generous headroom. This page covers what’s confirmed (the 30/minute threshold), what’s still undocumented in the OpenAPI spec (the response shape and headers), and the defensive patterns that keep integrations comfortably inside the budget.

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:
Design decisions:
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:
A burst is risky under a fixed clock-minute window: five quick requests near a minute boundary could land alongside the next window’s traffic and exceed 30 in a 60-second span. Only use a burst-capable bucket once engineering confirms the window is rolling. Until then, prefer the sequential throttled client above.

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:
The cleanest design at this budget is to run one workload at a time per token. A backfill that owns the whole 24/minute finishes far faster than one squeezed into a 10/minute slice, and you avoid the math of summing concurrent rates.
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

A 429 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:
Watch the per-poll request count, not just the interval. A 5-minute poll that paginates through 10 pages spends 10 of your 30 requests in that minute. Pace the pagination within each poll cycle so a single poll never consumes the whole budget.

Monitoring rate-limit pressure

Because Volunteer exposes no X-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:
Per-customer 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
  • 429 responses honor Retry-After when 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
  • 429 rate 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, a 429 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)

A backfill at 20/minute reads roughly 20 pages per minute, so a backfill of N pages takes about N/20 minutes. Plan accordingly and run it when no other workload needs the token.

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.
Last modified on June 26, 2026