Woodpecker API Documentation
website·Indexed 40 days ago
https://developers.woodpecker.coRESTful API for managing accounts, prospect lists, and campaigns. Includes documentation on authentication via x-api-key headers, rate limiting, blacklisting of emails and domains, and integrations for LinkedIn and Microsoft 365. Features a hosted MCP server for Claude and Claude Code.
What's inside Woodpecker
- The Woodpecker CLI allows developers to interact with their Woodpecker workspace directly from the terminal. It is designed for quick checks, automating repetitive tasks, and providing a scriptable interface for AI coding agents (such as Codex or Claude Code) to interact with Woodpecker via the shell.
Overview of the Woodpecker REST API
The Woodpecker API is a RESTful infrastructure designed for the full external management of Woodpecker accounts. It allows developers to programmatically manage accounts, prospect lists, campaigns, reports, mailboxes, and client accounts (specifically for agency use cases).Overview of Woodpecker core features
Woodpecker provides a suite of tools for automated email outreach, including:
- Campaign Management: Ability to create, update, run, pause, and delete email campaigns.
- Prospect Operations: Tools to add prospects to accounts and campaigns, update/delete prospect data, and search for prospects.
- Email Composition: Support for creating multi-step email sequences with built-in A/B testing.
- Analytics & Reporting: Access to campaign statistics and performance metrics.
- Mailbox Integration: Ability to assign specific email accounts to campaigns.
- Advanced Configuration: Support for delivery schedules, timezone settings, and GDPR compliance.
Overview of Woodpecker Webhooks
Woodpecker webhooks allow you to receive notifications for events related to prospects and campaigns (e.g., when a prospect replies or is marked as interested). All notifications are triggered at the account level; subscribing to an event provides data for all campaigns associated with that account.Understand Woodpecker API error response schema
Woodpecker API errors use a consistent JSON body schema to provide details about the failure. The root object contains a
statusobject with the following fields:status(string): The overall status, typically set toERRORfor non-2xx responses.code(string): A short code indicating the error category (e.g.,E_SESSION,E_URL_NOT_FOUND,E_UNNOWN).msg(string): A human-readable descriptive error message.
{ "status": { "status": "ERROR", "code": "E_SESSION", "msg": "The API key you've entered is incorrect or no longer valid..." } }Prevent prospects from being contacted using Email Blacklisting
Blacklisting an email address in Woodpecker ensures that no campaign can contact that specific prospect. This is a global setting that overrides campaign-level targeting. Blacklisted emails can be managed (added, retrieved, or removed) via the Woodpecker API.Understand Woodpecker API error response schema
When the Woodpecker API returns a non-2xx response, the response body contains astatusobject providing details about the error. Thestatus.statusfield is set toERRORfor all such responses.{ "status": { "status": "ERROR", "code": "STRING_ERROR_CODE", "msg": "Descriptive error message" } }Manage prospects using the /prospects endpoints
The/prospectsendpoints allow for the management of prospects stored in the Woodpecker database. Prospects can be fetched, added, and updated. Note that prospects have a global status and a campaign-specific status, as a single prospect can be enrolled in multiple campaigns with different interest levels.Handle the `task_created` webhook event
The
task_createdevent is triggered whenever a manual task for a prospect is created in Woodpecker. The payload provides detailed information about the prospect, the associated campaign, and the specific task details (such as type, message, and due date).Key constraints:
- Fields without values are returned as an empty string or
null. - The
campaign.sent_fromfield is only available if the campaign contains at least one email step.
[ { "method": "task_created", "prospect": { "id": 1234567890, "email": "erlich@bachmanity.com", "first_name": "Erlich", "last_name": "Bachman", "company": "Bachmanity", "website": "https://bachmanity.com", "linkedin_url": "https://linkedin.com/erlich-bachman-404xyz", "tags": "#VISIONARY", "title": "CEO", "phone": "+1 987-654-321", "address": "700 Welch Road", "city": "Palo Alto", "country": "United States", "snippet1": "You are running a successful startup incubator Bachmanity", "snippet_labels": { "my snippet label": "You are running a successful startup incubator Bachmanity" }, "industry": "IT", "state": "California", "last_contacted": "2025-01-11T12:18:54+0100", "status": "ACTIVE", "in_campaign": 2, "emails_sent": 3, "imported": "saasinamerica.csv", "interest_level": { "level": "NOT_MARKED", "ai_detected": false }, "campaign_email_sent": 0, "step": 1 }, "campaign": { "campaign_id": 11223344, "campaign_name": "SaaS in America", "sent_from": "jared.dunn@piedpiper.com", "sent_from_emails": [ "jared.dunn@piedpiper.com", "richard.hendricks@piedpiper.com", "jian@bachmanity.com" ] }, "task": { "type": "LINKEDIN", "name": "Send connection request", "message": "Hi Erlich, I'd like to join your connection network.", "due_date": "2025-03-24T15:47:47+0100" }, "timestamp": "2025-03-21T15:47:47+0100", "firm_id": 456789 } ]- Fields without values are returned as an empty string or
Handle LinkedIn direct message sent webhooks
Thelinkedin_automation_direct_message_sentevent is triggered when Woodpecker sends a LinkedIn direct message via LinkedIn automation. This webhook provides detailed information about the prospect and the specific message sent. To track when a prospect replies to such messages, you should subscribe to thelinkedin_automation_prospect_repliedevent.[ { "method": "linkedin_automation_direct_message_sent", "prospect": { "id": 1234567890, "email": "erlich@bachmanity.com", "first_name": "Erlich", "last_name": "Bachman", "company": "Bachmanity", "website": "https://bachmanity.com", "linkedin_url": "https://linkedin.com/erlich-bachman-404xyz", "tags": "#VISIONARY", "title": "CEO", "phone": "+1 987-654-321", "address": "700 Welch Road", "city": "Palo Alto", "country": "United States", "snippet1": "You are running a successful startup incubator Bachmanity", "snippet_labels": { "my snippet label": "You are running a successful startup incubator Bachmanity" }, "industry": "IT", "state": "California", "last_contacted": "2026-03-20T14:32:34+0100", "status": "ACTIVE", "in_campaign": 2, "emails_sent": 3, "imported": "saasinamerica.csv", "interest_level": { "level": "NOT_MARKED", "ai_detected": false }, "campaign_id": 123456, "campaign_name": "SaaS in America", "campaign_email": "jared.dunn@piedpiper.com", "campaign_emails": [ "jared.dunn@piedpiper.com", "richard.hendricks@piedpiper.com", "jian@bachmanity.com" ], "campaign_email_sent": 1, "step": 2, "step_type": "LINKEDIN_DIRECT_MESSAGE", "followup_after": "2026-03-22T00:00:00+0100" }, "direct_message": { "id": 156898745, "campaign_id": 123456, "number": 4, "step": 2, "account_id": 111112, "linkedin_name_from": "Jared Dunn", "linkedin_url_from": "https://www.linkedin.com/in/jareds-account-xyz123", "sent": "2026-03-20T14:32:34+0100", "message": "Hello Erlich, thanks for connecting. I wanted to share a quick idea for Bachmanity.", "target_profile_url": "https://linkedin.com/erlich-bachman-404xyz" }, "timestamp": "2026-03-22T10:00:00+0100", "firm_id": 4567890 } ]Manage account mailboxes via the /mailboxes API
The/mailboxesAPI provides endpoints to manage mailboxes associated with a Woodpecker account. Supported operations include listing, retrieving, connecting, and updating mailboxes, as well as reviewing the status of mailbox connection batches.Handle Woodpecker API error responses
Woodpecker API error responses follow a consistent JSON schema providing details about the failure, including the HTTP status code and a timestamp in
YYYY-MM-DD HH:MM:SSUTC format.Error Body Schema:
title(string): A short title describing the error.status(integer): The HTTP status code.detail(string): A detailed message explaining the error.timestamp(string): The timestamp when the error occurred.
{ "title": "Not Found", "status": 404, "detail": "Requested resource does not exist", "timestamp": "2025-03-05 17:57:00" }