Hey there, fellow code wrangler! Ready to supercharge your outreach game with Woodpecker.co's API? You're in the right place. We're going to walk through building a Python integration that'll have you managing prospects and campaigns like a pro. Let's dive in!
Before we start cooking, let's make sure we've got all the ingredients:
requests
library (pip install requests
)First things first, let's get you authenticated:
import requests API_KEY = 'your_api_key_here' BASE_URL = 'https://api.woodpecker.co/rest/v1' headers = { 'X-API-KEY': API_KEY, 'Content-Type': 'application/json' }
Now, let's make our first API call. Here's a GET request to fetch your prospects:
response = requests.get(f'{BASE_URL}/prospects', headers=headers) if response.status_code == 200: prospects = response.json() print(prospects) else: print(f"Error: {response.status_code}")
You'll be working with these main endpoints:
/prospects
: Manage your prospect list/campaigns
: Create and control campaigns/stats
: Get those juicy campaign statisticsLet's add a new prospect to your list:
new_prospect = { "email": "[email protected]", "first_name": "John", "last_name": "Doe" } response = requests.post(f'{BASE_URL}/prospects', headers=headers, json=new_prospect) if response.status_code == 201: print("Prospect added successfully!")
Time to set up a campaign:
new_campaign = { "name": "My Awesome Campaign", "subject": "You won't believe this offer!" } response = requests.post(f'{BASE_URL}/campaigns', headers=headers, json=new_campaign) if response.status_code == 201: print("Campaign created successfully!")
Let's see how your campaigns are performing:
campaign_id = 123 # Replace with your actual campaign ID response = requests.get(f'{BASE_URL}/campaigns/{campaign_id}/stats', headers=headers) if response.status_code == 200: stats = response.json() print(f"Opens: {stats['opens']}, Clicks: {stats['clicks']}")
Always be prepared for things to go sideways:
def make_api_call(endpoint, method='GET', data=None): url = f'{BASE_URL}/{endpoint}' try: response = requests.request(method, url, headers=headers, json=data) response.raise_for_status() return response.json() except requests.exceptions.HTTPError as err: print(f"HTTP error occurred: {err}") except requests.exceptions.RequestException as err: print(f"An error occurred: {err}") # Check for rate limiting if response.status_code == 429: print("Rate limit exceeded. Take a breather!") time.sleep(60) # Wait for a minute before retrying
Parse that JSON like a boss:
import json def process_prospects(prospects_data): for prospect in prospects_data: print(f"Name: {prospect['first_name']} {prospect['last_name']}, Email: {prospect['email']}") # Here you could insert into a database, CSV, etc. prospects = make_api_call('prospects') process_prospects(prospects)
Let's wrap this up in a neat little CLI package:
import argparse def main(): parser = argparse.ArgumentParser(description="Woodpecker.co API CLI") parser.add_argument('action', choices=['list_prospects', 'add_prospect', 'create_campaign']) args = parser.parse_args() if args.action == 'list_prospects': prospects = make_api_call('prospects') process_prospects(prospects) elif args.action == 'add_prospect': # Implement add prospect logic pass elif args.action == 'create_campaign': # Implement create campaign logic pass if __name__ == "__main__": main()
Always test your code! Here's a simple unit test to get you started:
import unittest class TestWoodpeckerAPI(unittest.TestCase): def test_list_prospects(self): prospects = make_api_call('prospects') self.assertIsNotNone(prospects) self.assertIsInstance(prospects, list) if __name__ == '__main__': unittest.main()
And there you have it! You've just built a solid foundation for your Woodpecker.co API integration. Remember, this is just the beginning - there's so much more you can do with webhooks, bulk operations, and advanced filtering.
Keep exploring, keep coding, and most importantly, keep reaching out! The Woodpecker.co API documentation is your new best friend, so don't be shy about diving deeper.
Now go forth and conquer those inboxes! 🚀📧