Skip to main content
The Developer API enforces rate limits on a per-project basis using a sliding window algorithm. All API keys under the same project share a single rate limit bucket. Limits are not per-key or per-endpoint.

Limits by tier

TierRequests per minute
Free50
Pro200
Enterprise1,000
All endpoints under the Developer API share the same counter. A GET /charities call and a POST /configs call both count toward the same per-minute limit for your project.

Response headers

Every successful response from a rate-limited tier includes headers describing your current usage:
HeaderDescription
X-RateLimit-LimitMaximum requests allowed in the current window
X-RateLimit-RemainingRequests remaining in the current window
X-RateLimit-ResetUnix epoch seconds when the current window resets
These headers are included on both successful responses and 429 responses.

When you’re rate limited

If you exceed your tier’s limit, the API returns a 429 status with an additional Retry-After header:
{
  "error": "Rate limit exceeded",
  "code": "RATE_LIMIT_EXCEEDED"
}
HeaderDescription
Retry-AfterSeconds until you can retry the request
The request handler is not invoked when it is rate limited. No side effects occur and no data is modified.

Best practices

  • Cache responses when possible to reduce unnecessary calls, especially for data that changes infrequently like the charity list or chain list.
  • Respect Retry-After. When you receive a 429, wait at least the number of seconds indicated before retrying.
  • Monitor your headers. Use X-RateLimit-Remaining to proactively slow down before hitting the limit.
  • Spread requests over time rather than sending them in bursts at the start of each window.

Upgrading your limit

If you’re hitting rate limits regularly, you may be eligible for a higher tier. Contact us at support@donate.gg to discuss upgrading your project’s tier.