API rate limit exceeded
Your integration is receiving 429 Too Many Requests responses from the MapleGather API.
What’s happening
Section titled “What’s happening”The MapleGather API enforces rate limits to ensure reliable performance for all organizations. When your integration exceeds the allowed request rate, the API returns 429 and temporarily blocks further requests until the window resets.
Every API response includes rate-limit state in the headers:
| Header | Meaning |
|---|---|
X-RateLimit-Limit |
Maximum requests allowed in the current window |
X-RateLimit-Remaining |
Requests remaining in the current window |
X-RateLimit-Reset |
Unix timestamp when the window resets |
A 429 response includes a Retry-After header specifying how many seconds to wait before retrying.
The burst tolerance is up to 200 requests over any 10-second window. Sustained traffic above the per-window limit also triggers 429.
How to fix it
Section titled “How to fix it”- Read
X-RateLimit-Remainingbefore making requests. If it is0, wait untilX-RateLimit-Resetbefore sending more. - On receiving a
429, read theRetry-Afterheader value (seconds) and wait that long before retrying. - Implement exponential backoff with jitter in your retry logic — do not immediately re-send on
429. A simple exponential-backoff formula: waitmin(2^attempt * base_delay + random_jitter, max_delay)seconds between retries. - When retrying a
POSTorPATCHthat returned429, use the sameIdempotency-Keyas the original request. This ensures the operation is executed only once even if both the original and the retry eventually succeed. - For bulk operations, use the batch endpoint (
POST /bc/v1/orgs/{orgId}/batch) to send up to 100 operations in a single request rather than making 100 individual API calls.
If that didn’t work
Section titled “If that didn’t work”If your integration consistently hits rate limits even with backoff and batching, consider:
- Spreading requests over time (for example, staging a bulk member import in smaller chunks with delays).
- Using webhooks instead of polling — subscribe to
member.createdorpayment.succeededevents and receive data pushed to your endpoint rather than repeatedly fetching it.
Contact support if you have a legitimate use case that requires a higher throughput allocation.