Woodpecker API Documentation

website·Indexed 40 days ago

https://developers.woodpecker.co

RESTful 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.

Tokens
138.2K
Snippets
612
Records
927
Agent score
62%

What's inside Woodpecker

  1. Introduction to the Woodpecker CLI

    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.
  2. 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).
  3. 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.
  4. 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.
  5. 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 status object with the following fields:

    • status (string): The overall status, typically set to ERROR for 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..."
      }
    }
  6. 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.
  7. Understand Woodpecker API error response schema

    When the Woodpecker API returns a non-2xx response, the response body contains a status object providing details about the error. The status.status field is set to ERROR for all such responses.
    {
      "status": {
        "status": "ERROR",
        "code": "STRING_ERROR_CODE",
        "msg": "Descriptive error message"
      }
    }
  8. Manage prospects using the /prospects endpoints

    The /prospects endpoints 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.
  9. Handle the `task_created` webhook event

    The task_created event 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_from field 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
      }
    ]
  10. Handle LinkedIn direct message sent webhooks

    The linkedin_automation_direct_message_sent event 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 the linkedin_automation_prospect_replied event.
    [
      {
        "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
      }
    ]
  11. 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:SS UTC 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"
    }