Skip to main content

Get campaign statistics

warning

This is a v1 legacy endpoint. It uses a different path /rest/v1 and may return different error codes and response formats compared to v2. While it remains functional, consider handling errors accordingly.

Retrieve campaign statistics. Use this endpoint to analyze the performance of a specific cold email campaign, including delivery, open, reply, bounce, and opt-out rates.

Understanding the response:

  • Step versions - The response includes only the A version for email content and step settings, while performance metrics reflect data from all versions combined
  • Tasks - Not supported by this endpoint, they are omitted from the response

If you're looking for:

  • More campaign statistics - supplement your data with predefined reports
  • A detailed campaign structure including all campaign settings - see v2/campaigns/{id} endpoint here
  • A list of all campaigns - see v1/campaign_list endpoint here

Request

Endpoint

GET https://api.woodpecker.co/rest/v1/campaign_list?id={campaign_id}

Headers

x-api-key: {YOUR_API_KEY}

For details on how to authenticate your requests, please see the authentication guide.

Parameters

ParameterRequiredDescription
idYesSpecify a single campaign id to retrieve detailed campaign information. Using multiple IDs returns a list of campaigns without statistics.

Request sample

Fetch a campaign and its statistics

curl --request GET \
--url "https://api.woodpecker.co/rest/v1/campaign_list?id={campaign_id}" \
--header "x-api-key: {YOUR_API_KEY}"

Response

Response examples

An array of all campaigns meeting your criteria.

[
{
"id": 1234567,
"name": "SQL follow-ups",
"status": "RUNNING",
"folder_name": "SaaS in America",
"folder_id": 987,
"from_name": "Erlich Bachman",
"from_names": ["Erlich Bachman", "Jared Dunn", "Richard Hendricks", "Jian"],
"gdpr_unsubscribe": true,
"created": "2025-02-10T13:14:57+0100",
"per_day": 70,
"from_email": "erlich.bachman@piedpiper.com",
"from_emails": ["erlich.bachman@piedpiper.com", "jared.dunn@piedpiper.com", "richard.hendricks@piedpiper.com", "jian@bachmanity.com"],
"bcc": "sentemails@crm.com",
"cc": "",
"stats": {
"prospects": 868,
"delivery": 853,
"invalid": 6,
"bounced": 4,
"queue": 3,
"sent": 857,
"check": 21,
"autoreplied": 0,
"opened": 286,
"optout": 3,
"clicked": 0,
"replied": 74,
"interested": 42,
"maybe_later": 11,
"not_interested": 13,
"emails": [
{
"subject": "Example subject line",
"msg": "<div><p>Hi {{FIRST_NAME | \"there\"}},</p><p>This is an example cold email message.</p><p>Best wishes,<br /><a href=\"https://woodpecker.co\">Woodpecker</a> team</p></div>",
"timezone": "Europe/Warsaw",
"use_prospect_timezone": false,
"sunFrom": null,
"sunTo": null,
"monFrom": null,
"monTo": null,
"tueFrom": null,
"tueTo": null,
"wedFrom": null,
"wedTo": null,
"thuFrom": null,
"thuTo": null,
"friFrom": null,
"friTo": null,
"satFrom": null,
"satTo": null,
"sunday": [{ "from": -1, "to": -1 }],
"monday": [{ "from": 360, "to": 720 }, { "from": 900, "to": 990 }],
"tuesday": [{ "from": 360, "to": 720 }, { "from": 900, "to": 990 }],
"wednesday": [{ "from": 360, "to": 720 }],
"thursday": [{ "from": 360, "to": 720 }],
"friday": [{ "from": 360, "to": 720 }],
"saturday": [{ "from": -1, "to": -1 }],
"track_open": true,
"track_click": false,
"attach_follow": false,
"follow_up": 0,
"number": 1,
"step": 1,
"condition": null,
"emailSend": 857,
"toSend": 3,
"delivery": 854,
"open_": "29.3%",
"open": 250,
"reply_": "2.9%",
"reply": 25,
"invalid_": "0.0%",
"invalid": 0,
"bounce_": "0.4%",
"bounce": 3
},
{
"subject": "Re: Example subject line",
"msg": "<div>First followup</div>",
"timezone": "Europe/Warsaw",
"use_prospect_timezone": false,
"sunFrom": null,
"sunTo": null,
"monFrom": null,
"monTo": null,
"tueFrom": null,
"tueTo": null,
"wedFrom": null,
"wedTo": null,
"thuFrom": null,
"thuTo": null,
"friFrom": null,
"friTo": null,
"satFrom": null,
"satTo": null,
"sunday": [{ "from": -1, "to": -1 }],
"monday": [{ "from": 360, "to": 720 }, { "from": 900, "to": 990 }],
"tuesday": [{ "from": 360, "to": 720 }, { "from": 900, "to": 990 }],
"wednesday": [{ "from": 360, "to": 720 }],
"thursday": [{ "from": 360, "to": 720 }],
"friday": [{ "from": 360, "to": 720 }],
"saturday": [{ "from": -1, "to": -1 }],
"track_open": false,
"track_click": false,
"attach_follow": false,
"follow_up": 0,
"number": 3,
"step": 2,
"condition": {
"operator": "",
"values": [
{
"type": "PROSPECT_FIRST_NAME",
"operand": "EXISTS",
"value": ""
}
]
},
"emailSend": 818,
"toSend": 10,
"delivery": 818,
"open_": "24.1%",
"open": 197,
"reply_": "3.4%",
"reply": 28,
"invalid_": "0.0%",
"invalid": 0,
"bounce_": "0.0%",
"bounce": 0
},
{
"subject": "Re: Example subject line",
"msg": "<div>Second followup</div>",
"timezone": "Europe/Warsaw",
"use_prospect_timezone": false,
"sunFrom": null,
"sunTo": null,
"monFrom": null,
"monTo": null,
"tueFrom": null,
"tueTo": null,
"wedFrom": null,
"wedTo": null,
"thuFrom": null,
"thuTo": null,
"friFrom": null,
"friTo": null,
"satFrom": null,
"satTo": null,
"sunday": [{ "from": -1, "to": -1 }],
"monday": [{ "from": 360, "to": 720 }, { "from": 900, "to": 990 }],
"tuesday": [{ "from": 360, "to": 720 }, { "from": 900, "to": 990 }],
"wednesday": [{ "from": 360, "to": 720 }],
"thursday": [{ "from": 360, "to": 720 }],
"friday": [{ "from": 360, "to": 720 }],
"saturday": [{ "from": -1, "to": -1 }],
"track_open": false,
"track_click": false,
"attach_follow": false,
"follow_up": 0,
"number": 7,
"step": 3,
"condition": null,
"emailSend": 546,
"toSend": 25,
"delivery": 545,
"open_": "16.0%",
"open": 87,
"reply_": "4.0%",
"reply": 22,
"invalid_": "0.0%",
"invalid": 0,
"bounce_": "0.2%",
"bounce": 1
}
]
},
"error": "",
"timestamp": "2025-03-01T15:00:30+0100"
}
]

Body schema

FieldData TypeDescription
idintegerUnique identifier of the campaign
namestringName of the campaign
statusstringCurrent campaign status. Possible values: RUNNING, DRAFT, STOPPED, PAUSED, EDITED, COMPLETED
folder_namestringName of the folder the campaign is assigned to
folder_idintegerID of the folder the campaign is assigned to. 0 stands for general UNASSIGNED folder
from_namestringOne of the sending emails 'from name'. If multiple are used, refer to from_names instead
from_namesarray[string]A list of sender names used in the campaign
gdpr_unsubscribebooleanWhether GDPR-compliant unsubscribe is enabled
createdstringCampaign creation date (ISO 8601)
per_dayintegerMaximum number of opening emails that can be sent per day. The limit is shared between all mailboxes
from_emailstringOne of the campaign sending email addresses. If multiple are used, refer to from_emails instead
from_emailsarray[string]List of campaign sending email addresses
bccstringEmail address that receives a blind copy of outgoing messages
ccstringEmail address that receives a carbon copy of outgoing messages
statsobjectObject holding campaign-level statistics
  └─prospectsintegerNumber of prospects added to the campaign
  └─deliveryintegerNumber of emails successfully delivered opening emails
  └─invalidintegerNumber of invalid email addresses
  └─bouncedintegerNumber of prospects marked as BOUNCED
  └─queueintegerNumber of prospects queued to receive the opening email
  └─sentintegerTotal number of contacted prospects
  └─checkintegerNumber of prospects marked as to check (except manual pause)
  └─autorepliedintegerNumber of prospects marked as AUTOREPLIED
  └─openedintegerNumber of prospects who opened an email
  └─optoutintegerNumber of prospects who opted out
  └─clickedintegerNumber of prospects who clicked a tracked link
  └─repliedintegerNumber of prospects who replied
  └─interestedintegerNumber of "interested" responses
  └─maybe_laterintegerNumber of "maybe later" responses
  └─not_interestedintegerNumber of "not_interested" responses
  └─emailsarray[objects]An array of email objects. Each object being the A version of a campaign steps. More details below
[].errordeprecatedDeprecated. Empty string
[].timestampstringTimestamp of sending the request (ISO 8601)

Emails object body schema

The email object holds step-specific statistics like sent, delivered, opened, replied, bounced, and invalid email counts, along with open and reply rates. It also includes basic details like the subject line and schedule. The array order follows the campaign sequence, with the first element representing the first step.

FieldData TypeDescription
subjectstringEmail subject line
msgstringEmail body content in HTML format
timezonestringThe default timezone of a campaign. It will be used when use_prospect_timezone is disabled or when it is enabled but the prospect's timezone is not specified
use_prospect_timezonebooleanWhether to adjust sending times to prospect's timezone instead of the campaign timezone
track_openbooleanWhether to track email opens for this email step version
track_clickbooleanWhether this email step version contains a tracked link
attach_followbooleanDeprecated. Always false
follow_upintegerDeprecated. Always 0
numberintegerDeprecated
stepintegerStep order in the email sequence
conditionobject/nullAn IF-condition that will evaluate the prospect's YES/NO path after this step
  └─operatorstringEmpty string
  └─valuesarray[object]Array containing condition details
    └─[].typestringType of condition. OPEN, CLICK, PROSPECT_{SNIPPET_NAME}
    └─[].operandstringMORE_THAN, EXISTS, EQUALS, CONTAINS
    └─[].valuestringProspect value that will be evaluated against the type and operand of the condition.
emailSendintegerNumber of emails sent in this step
toSendintegerNumber of emails remaining to be sent in this step
deliveryintegerNumber of delivered emails in this step
open_stringOpen rate percentage for this step (formatted as astring)
openintegerNumber of prospects who have opened an email in this step
reply_stringReply rate percentage (formatted as astring)
replyintegerNumber of prospects who have replied to an email from this step
invalid_stringPercentage of emails marked as INVALID at this step (formatted as astring)
invalidintegerNumber of emails marked as INVALID at this step
bounce_stringBounce rate percentage for this step (formatted as astring)
bounceintegerNumber of bounced emails at this step
sunFrom - satTonullDeprecated. Always null
monday - sundayarray[object]Array of sending time windows per weekday. There can be two sending windows per day
  └─[].fromintegerThe start time of an email sending window, measured in minutes from midnight. Minimum 0, maximum 1440, -1 means no emails will be sent this day
  └─[].tointegerThe end time of an email sending window, measured in minutes from midnight. Minimum 0, maximum 1440, -1 means no emails will be sent this day