Hey there, fellow dev! Ready to dive into the world of Givebutter API integration? You're in for a treat. Givebutter's API is a powerful tool that'll let you tap into fundraising data and functionality. Whether you're building a custom dashboard or automating donation processes, this guide will get you up and running in no time.
Before we jump in, make sure you've got:
Let's get this show on the road:
mkdir givebutter-integration cd givebutter-integration npm init -y npm install axios dotenv
Create a .env
file for your API key:
GIVEBUTTER_API_KEY=your_api_key_here
Time to get cozy with the Givebutter API. First, let's set up our authentication:
require('dotenv').config(); const axios = require('axios'); const givebutter = axios.create({ baseURL: 'https://api.givebutter.com/v1', headers: { 'Content-Type': 'application/json', 'Authorization': `Bearer ${process.env.GIVEBUTTER_API_KEY}` } });
Now that we're all set up, let's make our first request:
async function getCampaigns() { try { const response = await givebutter.get('/campaigns'); console.log(response.data); } catch (error) { console.error('Error fetching campaigns:', error.response.data); } } getCampaigns();
Givebutter's got a bunch of endpoints, but here are the heavy hitters:
/campaigns
: Your fundraising campaigns/donations
: Where the money comes in/supporters
: The awesome people backing your causeLet's put these endpoints to work:
async function processDonation(amount, campaignId, supporterEmail) { try { const response = await givebutter.post('/donations', { amount, campaign_id: campaignId, supporter_email: supporterEmail }); console.log('Donation processed:', response.data); } catch (error) { console.error('Error processing donation:', error.response.data); } }
Don't let those pesky errors get you down. Let's add some retry logic:
async function makeRequest(endpoint, method = 'get', data = null) { const maxRetries = 3; let retries = 0; while (retries < maxRetries) { try { const response = await givebutter[method](endpoint, data); return response.data; } catch (error) { if (error.response && error.response.status === 429) { retries++; await new Promise(resolve => setTimeout(resolve, 1000 * retries)); } else { throw error; } } } throw new Error('Max retries reached'); }
Webhooks are your friends. Here's a quick Express server to handle them:
const express = require('express'); const app = express(); app.post('/webhook', express.json(), (req, res) => { const event = req.body; console.log('Received webhook:', event); // Process the event res.sendStatus(200); }); app.listen(3000, () => console.log('Webhook server running on port 3000'));
Don't forget to test your integration! Here's a simple test using Jest:
test('getCampaigns returns data', async () => { const campaigns = await getCampaigns(); expect(campaigns).toBeDefined(); expect(Array.isArray(campaigns)).toBe(true); });
Remember to cache when you can and handle your data efficiently. Your future self will thank you!
const NodeCache = require('node-cache'); const cache = new NodeCache({ stdTTL: 600 }); // Cache for 10 minutes async function getCachedCampaigns() { const cachedCampaigns = cache.get('campaigns'); if (cachedCampaigns) return cachedCampaigns; const campaigns = await getCampaigns(); cache.set('campaigns', campaigns); return campaigns; }
And there you have it! You're now equipped to build some awesome integrations with the Givebutter API. Remember, this is just the beginning. There's a whole world of possibilities out there, so go forth and code! If you hit any snags, the Givebutter docs are your best friend. Happy coding, and may your integrations be ever smooth and your donations plentiful!