Understand and work within API rate limits to ensure reliable access for all users.
To ensure platform stability and fair usage, the Givebutter API implements rate limiting. Rate limits prevent any single integration from consuming excessive resources and ensure reliable API access for all users.
Instead of repeatedly polling endpoints, use webhooks for real-time updates:❌ Don’t do this (wastes rate limit):
Copy
Ask AI
// Polling every 10 seconds = 360 requests per hoursetInterval(async () => { const response = await fetch('https://api.givebutter.com/v1/transactions?page=1'); const data = await response.json(); checkForNewTransactions(data.data);}, 10000);
✅ Do this (efficient):
Copy
Ask AI
// Set up webhook endpoint to receive real-time notificationsapp.post('/webhooks/givebutter', (req, res) => { const event = req.body; if (event.type === 'transaction.created') { handleNewTransaction(event.data); } res.json({ received: true });});
Batch Requests When Possible
When fetching multiple resources, batch requests efficiently:
Copy
Ask AI
// Add delay between requests to stay within limitsasync function fetchMultipleCampaigns(campaignIds) { const results = []; const delayMs = 1000; // 1 second = 60 requests per minute max for (const id of campaignIds) { const response = await fetch( `https://api.givebutter.com/v1/campaigns/${id}`, { headers: { 'Authorization': 'Bearer YOUR_API_KEY' } } ); results.push(await response.json()); // Delay before next request (except for last one) if (id !== campaignIds[campaignIds.length - 1]) { await new Promise(resolve => setTimeout(resolve, delayMs)); } } return results;}
Use Pagination Efficiently
When paginating, use appropriate page sizes to minimize requests:
Copy
Ask AI
// ❌ Bad - many small requestsasync function getAllCampaigns() { let page = 1; const campaigns = []; while (true) { const response = await fetch( `https://api.givebutter.com/v1/campaigns?page=${page}&per_page=10`, // Small pages { headers: { 'Authorization': 'Bearer YOUR_API_KEY' } } ); const data = await response.json(); campaigns.push(...data.data); if (!data.links.next) break; page++; } return campaigns;}// ✅ Good - fewer large requestsasync function getAllCampaigns() { const campaigns = []; let nextUrl = 'https://api.givebutter.com/v1/campaigns?per_page=100'; // Max size while (nextUrl) { const response = await fetch(nextUrl, { headers: { 'Authorization': 'Bearer YOUR_API_KEY' } }); const data = await response.json(); campaigns.push(...data.data); nextUrl = data.links.next; } return campaigns;}
Implement Request Queuing
Queue requests to automatically stay within rate limits: