Create campaign
Create a multichannel, LinkedIn or email campaign with a sequence of personalized follow-up messages and customizable delivery settings. Configure campaign-wide settings like timezone and daily limits, define message content with support for A/B testing, scheduled delivery windows, and time delays between steps.
Request
Endpoint
POST https://api.woodpecker.co/rest/v2/campaigns
Headers
x-api-key: {YOUR_API_KEY}
Content-type: application/json
For details on how to authenticate your requests, please see the authentication guide.
Body
The campaign payload includes several objects, which are described in detail below. In addition to the general campaign configuration, a campaign is made up of steps that define its structure and actions for each prospect. Each campaign must begin with a START step, followed by 1 to 16 EMAIL or LINKEDIN steps. Subsequent steps are linked using nested follow-up properties, forming a sequence of steps. Each step includes its own configuration and points to the next step, or null if it is the final step.
- Email campaign
- LinkedIn campaign
- Multichannel campaign
The below payload represents a simple one-step campaign sent from one email address.
{
"name": "One-step email campaign",
"email_account_ids": [112233],
"settings": {
"timezone": "Europe/Warsaw",
"prospect_timezone": true,
"daily_enroll": 25,
"gdpr_unsubscribe": true,
"list_unsubscribe": false,
"open_disabled_list": ["google.com"],
"auto_pause_prospect_from_domain": true,
"catch_all_verification_mode": "BALANCED"
},
"steps": {
"type": "START",
"followup": {
"type": "EMAIL",
"delivery_time": {
"MONDAY": [{ "from": "08:00", "to": "18:00" }],
"TUESDAY": [{ "from": "08:00", "to": "18:00" }],
"WEDNESDAY": [{ "from": "08:00", "to": "18:00" }],
"THURSDAY": [{ "from": "08:00", "to": "18:00" }],
"FRIDAY": [{ "from": "08:00", "to": "18:00" }]
},
"body": {
"versions": [
{
"subject": "Example subject line",
"message": "<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>",
"signature": "SENDER",
"track_opens": false
}
]
}
}
}
}
The below payload represents a two-step linkedin campaign. Note that LinkedIn accounts are attached to a specific step of a campaign, not the whole campaign.
{
"name": "Two-step LinkedIn campaign",
"email_account_ids": [],
"settings": {
"timezone": "Europe/Warsaw",
"daily_enroll": 50
},
"steps": {
"type": "START",
"followup": {
"type": "LINKEDIN",
"body": {
"action_type": "VISIT_PROFILE",
"linkedin_account_id": 200002,
"versions": [
{
"message": ""
}
]
},
"followup_after": { "range": "DAY", "value": 3 },
"followup": {
"type": "LINKEDIN",
"body": {
"action_type": "CONNECTION_REQUEST",
"linkedin_account_id": 200002,
"versions": [
{
"message": ""
},
{
"message": "Hello {{FIRST_NAME}}, I'd like to add you to my professional network on LinkedIn"
}
]
}
}
}
}
}
The below payload represents a four-step multichannel campaign. The campaign utilizes both LinkedIn and email steps. It also includes custom options such as multiple versions of a step, tracking settings, and several delivery windows throughout the day.
{
"name": "Four step campaign with custom configuration",
"email_account_ids": [100001, 100002, 100003],
"settings": {
"timezone": "Europe/Warsaw",
"prospect_timezone": true,
"daily_enroll": 10,
"gdpr_unsubscribe": true,
"list_unsubscribe": true,
"open_disabled_list": ["google.com", "OTHER_PROVIDER"],
"auto_pause_prospect_from_domain": true,
"catch_all_verification_mode": "MAXIMUM"
},
"steps": {
"type": "START",
"followup": {
"type": "LINKEDIN",
"body": {
"action_type": "VISIT_PROFILE",
"linkedin_account_id": 200002,
"versions": [
{
"message": ""
}
]
},
"followup_after": { "range": "HOUR", "value": 2 },
"followup": {
"type": "EMAIL",
"delivery_time": {
"MONDAY": [{ "from": "09:00", "to": "18:00" }],
"TUESDAY": [{ "from": "09:00", "to": "18:00" }],
"WEDNESDAY": [{ "from": "09:00", "to": "18:00" }],
"THURSDAY": [{ "from": "09:00", "to": "18:00" }]
},
"body": {
"versions": [
{
"subject": "Example subject line - version A",
"message": "<div>Hi {{FIRST_NAME | \"there\"}},</div><div><br /></div><div>This is an example cold email message. </div><div><br /></div><div>Best wishes, </div><div><a href=\"https://woodpecker.co\">Woodpecker</a> team</div><div><a href=\"{{UNSUBSCRIBE}}\">unsubscribe</a></div>",
"signature": "SENDER",
"track_opens": true
},
{
"subject": "Example subject line - version B",
"message": "<div>{{SPINTAX | \"Hi\" | \"Hello\" | \"Good morning\"}} {{FIRST_NAME}},</div><div><br /></div><div>Yet another example of a cold email message. </div><div><br /></div><div>All the best, </div><div><a href=\"https://woodpecker.co\">Woodpecker</a> team</div>",
"signature": "SENDER",
"track_opens": false
}
]
},
"followup_after": { "range": "DAY", "value": 4 },
"followup": {
"type": "LINKEDIN",
"body": {
"action_type": "CONNECTION_REQUEST",
"linkedin_account_id": 200002,
"versions": [
{
"message": ""
},
{
"message": "Hello {{FIRST_NAME}}, I'd like to add you to my professional network on LinkedIn"
}
]
},
"followup_after": { "range": "DAY", "value": 1 },
"followup": {
"type": "EMAIL",
"delivery_time": { "THURSDAY": [{ "from": "06:00", "to": "08:00" }, { "from": "13:00", "to": "15:00" }] },
"body": {
"versions": [
{
"subject": null,
"message": "<div>First email followup, version A, sender's signature, no open tracking, same subject line</div>",
"signature": "SENDER",
"track_opens": false
},
{
"subject": null,
"message": "<div>First email followup, version B, no signature, no open tracking, same subject line</div>",
"signature": "NO_SIGNATURE",
"track_opens": false
},
{
"subject": null,
"message": "<div>First email followup, version C, sender's signature, open tracking, same subject line</div>",
"signature": "SENDER",
"track_opens": true
}
]
},
"followup_after": { "range": "DAY", "value": 3 },
"followup": null
}
}
}
}
}
}
Body schema
This section provides the body schema for each object in the campaign payloads. For a more detailed overview, please refer to the campaign schema.
Campaign configuration object
The root level of the campaign payload. It provides general information about the campaign and campaign-wide settings.
| Field | Type | Default | Required | Description |
|---|---|---|---|---|
name | string | "My campaign #0" | No | Name of the campaign |
email_account_ids | array[integer] | - | Yes - if campaign contains an EMAIL step | List of email account SMTP IDs used in this campaign. Use /mailboxes endpoint to review them. Chosen mailboxes must be connected to Woodpecker without issues |
settings | object | - | Yes | Campaign-level settings like timezone, sending limit, unsubscribe settings, etc |
└─timezone | string | - | Yes | The default timezone of a campaign. It will be used when setting.prospect_timezone is disabled or when it is enabled but the prospect's timezone is not specified. List of accepted timezones |
└─prospect_timezone | boolean | false | No | Whether to adjust sending times to prospect's timezone instead of the campaign timezone. Applies to EMAIL steps |
└─daily_enroll | integer | - | Yes | Maximum number of prospects that can be contacted in the opening step of the campaign per day. This limit is applied per mailbox or LinkedIn account. The default maximum value is 500 |
└─gdpr_unsubscribe | boolean | false | No | Whether the unsubscribe link should provide prospects with an option for GDPR-compliant data removal. This option will work only if the {{UNSUBSCRIBE}} snippet is included in your email or account signature |
└─list_unsubscribe | boolean | false | No | Whether to include List-Unsubscribe header. This option will work only if the {{UNSUBSCRIBE}} snippet is included in your email or account signature |
└─open_disabled_list | array[string]/null | [] | No | List of email service providers (recipient's ESP) for which open tracking is disabled. Available options: google.com, outlook.com, OTHER_PROVIDER |
└─auto_pause_prospect_from_domain | boolean/null | false | No | Whether to automatically pause sending to prospects after a response from the same domain (free providers excluded) |
└─catch_all_verification_mode | string | BALANCED | No | Catch-all email verification mode - how to approach contacting prospects using catch-all emails.
|
steps | object | - | Yes | Campaign steps, including all LinkedIn actions or emails and their delivery times, content, etc |
Step objects
- START step
- EMAIL step
- LINKEDIN step
The START step must always be the first (root) step of the campaign and cannot occur elsewhere.
| Field | Type | Default | Required | Description |
|---|---|---|---|---|
type | string | - | Yes | Use START to indicate a start step |
followup | object | - | Yes | The next step in the sequence. For a START step, this field is required and must point to the first EMAIL or LINKEDIN step sent to prospects |
This type defines an email step of a campaign, including its content, versions, delivery times, and follow-ups.
| Field | Type | Default | Required | Description |
|---|---|---|---|---|
type | string | - | Yes | Use EMAIL to indicate it is an email step |
delivery_time | object | - | Yes | Time intervals during which emails can be sent. Described in more detail below |
body | object | - | Yes | Email content configuration including A/B test versions. Described in more detail below |
followup_after | object | 1 DAY | No | Object that specifies the time delay before processing a prospect in the next step; if delivery_time allows it. If not provided, a default delay of 1 DAY will be applied |
└─range | string | DAY | No | Time unit: DAY, HOUR, MINUTE |
└─value | integer | 1 | No | Value of the time unit (range: 1 - 9999) |
followup | object/null | null (meaning no followup) | No | Next step in the sequence. Should consist of an EMAIL or LINKEDIN step object. Null indicates end of sequence |
Delivery time object
The delivery_time object defines the time intervals during which email messages can be sent. The timezone will follow the settings of the timezone and prospect_timezone of the campaign configuration.
Each step must define at least one delivery interval. You can assign up to three intervals per day, but they must not overlap. If a day is omitted from the object, no emails will be sent on that day.
To specify a whole day interval, you can use either "from": "00:00", "to": "00:00" or "from": "00:00", "to": "24:00". The first format is set as the default.
| Field | Type | Default | Required | Description |
|---|---|---|---|---|
MONDAY...SUNDAY | array[object] | - | Yes | Array of time windows for each day. Maximum 3 windows per day. The valid keys are the days of the week: MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY |
└─[].from | string | - | Yes | Start time in "HH:mm" format (24-hour) |
└─[].to | string | - | Yes | End time in "HH:mm" format (24-hour) |
Body object
The body and versions objects define the email content, A/B versions, open tracking, and signature settings. Each of these can be configured individually for each version, and at least one version must be present.
| Field | Type | Default | Required | Description |
|---|---|---|---|---|
body.versions | array[object] | - | Yes | Array of email version objects and their definitions. At least one version is required |
└─[].subject | string/null | - | Yes, for the first EMAIL step | Email subject line. Required for the first EMAIL step. If multiple versions exist, all must include a subject. For later EMAIL steps, a null subject sends the message as a follow-up in the same thread. Supports snippets like {{FIRST_NAME}}, snippet fallbacks and spintax |
└─[].message | string | - | Yes | Email body content in HTML format. Supports snippets like {{FIRST_NAME}}, snippet fallbacks and spintax. To track individual link clicks (not recommended), enclose the href attribute value in a {{CLICK}} snippet. Example: <a href=\"{{CLICK=https://google.com}}\">click here</a> |
└─[].signature | string | NO_SIGNATURE | No | Whether to use the sender's email account signature. The available options are: SENDER or NO_SIGNATURE |
└─[].track_opens | boolean | false | No | Whether to track email opens for this email version |
This type defines a linkedin step of a campaign, including its action type, content, versions, and follow-ups. You can define the action to perform within the body. Available actions: VISIT_PROFILE, CONNECTION_REQUEST, DIRECT_MESSAGE
| Field | Type | Default | Required | Description |
|---|---|---|---|---|
type | string | - | Yes | Use LINKEDIN to indicate it is a linkedin step |
body | object | - | Yes | LinkedIn acton configuration. Described in more detail below |
followup_after | object | 1 DAY | No | Object that specifies the time delay before processing a prospect in the next step. If not provided, a default delay of 1 DAY will be applied |
└─range | string | DAY | No | Time unit: DAY, HOUR, MINUTE |
└─value | integer | 1 | No | Value of the time unit (range: 1 - 9999) |
followup | object/null | null (meaning no followup) | No | Next step in the sequence. Should consist of an EMAIL or LINKEDIN step object. Null indicates end of sequence |
Body object
The body and versions define the LinkedIn action type and its content. All action types share the same data structure but differ in their use of version and message fields. Supported actions are: VISIT_PROFILE, CONNECTION_REQUEST, and DIRECT_MESSAGE.
- Profile visit
- Connection request
- Direct message
| Field | Type | Default | Required | Description |
|---|---|---|---|---|
body.versions | array[object] | null | No | VISIT_PROFILE action does not support multiple verions, so null is recommended |
└─[].message | string | null | No | VISIT_PROFILE action does not support message content, so null is recommended |
body.linkedin_account_id | integer | - | Yes | Unique ID of a LinkedIn account in Woodpecker that will perform the action. Use /linkedin_accounts endpoint to review it |
body.action_type | string | - | Yes | Action type that will be performed in LinkedIn: VISIT_PROFILE |
| Field | Type | Default | Required | Description |
|---|---|---|---|---|
body.versions | array[object] | - | Yes | Array of LinkedIn action version objects. At least one version is required |
└─[].message | string | null | No | Connection request message content. An empty string ("") and null sends a connection request without a message; otherwise, the provided note will be included with the request. Character limits: CLASSIC accounts — 200 characters, SALES_NAVIGATOR — 300 characters. Supports snippets like {{FIRST_NAME}}, snippet fallbacks and spintax |
body.linkedin_account_id | integer | - | Yes | Unique ID of a LinkedIn account in Woodpecker that will perform the action. Use /linkedin_accounts endpoint to review it |
body.action_type | string | - | Yes | Action type that will be performed in LinkedIn: CONNECTION_REQUEST |
| Field | Type | Default | Required | Description |
|---|---|---|---|---|
body.versions | array[object] | - | Yes | Array of LinkedIn action version objects. At least one version is required |
└─[].message | string | - | Yes | Direct message content. Unlike other actions, message content is required. Character limit: 6000 characters. Supports snippets like {{FIRST_NAME}}, snippet fallbacks and spintax |
body.linkedin_account_id | integer | - | Yes | Unique ID of a LinkedIn account in Woodpecker that will perform the action. Use /linkedin_accounts endpoint to review it |
body.action_type | string | - | Yes | Action type that will be performed in LinkedIn: DIRECT_MESSAGE |
Request samples
Create campaign
- cURL
- Python
- Java
- Node.js
- PHP
curl --request POST \
--url "https://api.woodpecker.co/rest/v2/campaigns" \
--header "x-api-key: {YOUR_API_KEY}" \
--header "Content-Type: application/json" \
--data '{
"email_account_ids": [ {YOUR_SMTP_IDs} ],
"settings": {
"timezone": "Europe/Warsaw",
"daily_enroll": 30
},
"steps": {
"type": "START",
"followup": {
"type": "EMAIL",
"delivery_time": {
"MONDAY": [
{
"from": "08:00",
"to": "17:00"
}
]
},
"body": {
"versions": [
{
"subject": "Hi {{FIRST_NAME | \"there\"}}. {{SPINTAX | \"Hi\" | \"Hello\" | \"Good morning\"}}",
"message": "<div>Hi {{FIRST_NAME | \"there\"}},</div><div><br /></div><div>This is an example cold email message. </div><div><br /></div><div>Best wishes, </div><div><a href=\"https://woodpecker.co\">Woodpecker</a> team</div><div><a href=\"{{UNSUBSCRIBE}}\">unsubscribe</a></div>",
"track_opens": true
}
]
}
}
}
}'
import requests
def createCampaign():
url = "https://api.woodpecker.co/rest/v2/campaigns"
headers = {
"x-api-key": "{YOUR_API_KEY}", # Replace the API key
"Content-Type": "application/json"
}
payload = {
"email_account_ids": [112233], # Replace the SMTP id
"settings": {
"timezone": "Europe/Warsaw",
"daily_enroll": 30
},
"steps": {
"type": "START",
"followup": {
"type": "EMAIL",
"delivery_time": {
"MONDAY": [
{
"from": "08:00",
"to": "17:00"
}
]
},
"body": {
"versions": [
{
"subject": "Hi {{FIRST_NAME | \"there\"}}. {{SPINTAX | \"Hi\" | \"Hello\" | \"Good morning\"}}",
"message": "<div>Hi {{FIRST_NAME | \"there\"}},</div><div><br /></div><div>This is an example cold email message. </div><div><br /></div><div>Best wishes, </div><div><a href=\"https://woodpecker.co\">Woodpecker</a> team</div><div><a href=\"{{UNSUBSCRIBE}}\">unsubscribe</a></div>",
"track_opens": True
}
]
}
}
}
}
response = requests.post(url, headers=headers, json=payload)
if response.status_code == 201:
print("POST successful:", response.json())
else:
print("POST failed with status:", response.status_code)
if __name__ == "__main__":
createCampaign()
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.net.URI;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ObjectNode;
import com.fasterxml.jackson.databind.node.ArrayNode;
public class WoodpeckerApiClient {
private static final String API_URL = "https://api.woodpecker.co/rest/v2/campaigns";
public static void main(String[] args) {
try {
String apiKey = "YOUR_API_KEY"; // Replace the API key
HttpResponse<String> response = sendRequest(apiKey);
System.out.println("Response status code: " + response.statusCode());
System.out.println("Response body: " + response.body());
} catch (Exception e) {
e.printStackTrace();
}
}
private static HttpResponse<String> sendRequest(String apiKey) throws Exception {
ObjectMapper mapper = new ObjectMapper();
ObjectNode payload = createPayload(mapper);
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create(API_URL))
.header("x-api-key", apiKey)
.header("Content-Type", "application/json")
.POST(HttpRequest.BodyPublishers.ofString(payload.toString()))
.build();
return client.send(request, HttpResponse.BodyHandlers.ofString());
}
private static ObjectNode createPayload(ObjectMapper mapper) {
ObjectNode payload = mapper.createObjectNode();
ArrayNode emailAccounts = payload.putArray("email_account_ids");
emailAccounts.add(112233); // Replace the SMTP id
ObjectNode settings = payload.putObject("settings");
settings.put("timezone", "Europe/Warsaw");
settings.put("daily_enroll", 30);
ObjectNode steps = payload.putObject("steps");
steps.put("type", "START");
ObjectNode followup = steps.putObject("followup");
followup.put("type", "EMAIL");
ObjectNode deliveryTime = followup.putObject("delivery_time");
ArrayNode monday = deliveryTime.putArray("MONDAY");
ObjectNode timeSlot = monday.addObject();
timeSlot.put("from", "08:00");
timeSlot.put("to", "17:00");
ObjectNode body = followup.putObject("body");
ArrayNode versions = body.putArray("versions");
ObjectNode version = versions.addObject();
version.put("subject", "Hi {{FIRST_NAME | \"there\"}}. {{SPINTAX | \"Hi\" | \"Hello\" | \"Good morning\"}}");
version.put("message", "<div>Hi {{FIRST_NAME | \"there\"}},</div><div><br /></div><div>This is an example cold email message. </div><div><br /></div><div>Best wishes, </div><div><a href=\"https://woodpecker.co\">Woodpecker</a> team</div><div><a href=\"{{UNSUBSCRIBE}}\">unsubscribe</a></div>");
version.put("track_opens", true);
return payload;
}
}
const axios = require("axios");
async function createCampaign() {
const url = "https://api.woodpecker.co/rest/v2/campaigns";
const headers = {
"x-api-key": "{YOUR_API_KEY}", // Replace the API key
"Content-Type": "application/json"
};
const data = {
email_account_ids: [112233], // Replace the SMTP id
settings: {
timezone: "Europe/Warsaw",
daily_enroll: 30
},
steps: {
type: "START",
followup: {
type: "EMAIL",
delivery_time: {
MONDAY: [
{
from: "08:00",
to: "17:00"
}
]
},
body: {
versions: [
{
subject: "Hi {{FIRST_NAME | \"there\"}}. {{SPINTAX | \"Hi\" | \"Hello\" | \"Good morning\"}}",
message: "<div>Hi {{FIRST_NAME | \"there\"}},</div><div><br /></div><div>This is an example cold email message. </div><div><br /></div><div>Best wishes, </div><div><a href=\"https://woodpecker.co\">Woodpecker</a> team</div><div><a href=\"{{UNSUBSCRIBE}}\">unsubscribe</a></div>",
track_opens: true
}
]
}
}
}
};
try {
const response = await axios.post(url, data, { headers: headers });
if (response.status === 201) {
console.log("POST successful:", response.data);
} else {
console.error("POST failed with status:", response.status);
}
} catch (error) {
console.error("Request error:", error.response?.status || error.message);
}
}
createCampaign();
<?php
require 'vendor/autoload.php';
use GuzzleHttp\Client;
use GuzzleHttp\Exception\RequestException;
$client = new Client([
'base_uri' => 'https://api.woodpecker.co/rest/v2/',
'headers' => [
'x-api-key' => getenv('WOODPECKER_API_KEY'), // Replace the API key
'Content-Type' => 'application/json',
],
]);
try {
$response = $client->post('campaigns', [
'json' => [
'email_account_ids' => [112233], // Replace the SMTP id
'settings' => [
'timezone' => 'Europe/Warsaw',
'daily_enroll' => 30,
],
'steps' => [
'type' => 'START',
'followup' => [
'type' => 'EMAIL',
'delivery_time' => [
'MONDAY' => [
['from' => '08:00', 'to' => '17:00']
]
],
'body' => [
'versions' => [
[
'subject' => 'Hi {{FIRST_NAME | "there"}}. {{SPINTAX | "Hi" | "Hello" | "Good morning"}}',
'message' => '<div>Hi {{FIRST_NAME | "there"}},</div><div><br /></div><div>This is an example cold email message. </div><div><br /></div><div>Best wishes, </div><div><a href="https://woodpecker.co">Woodpecker</a> team</div><div><a href="{{UNSUBSCRIBE}}">unsubscribe</a></div>',
'track_opens' => true,
]
]
]
]
]
],
]);
echo $response->getStatusCode(), "\n";
echo $response->getBody(), "\n";
} catch (RequestException $e) {
echo "Error: ", $e->getMessage(), "\n";
if ($e->hasResponse()) {
echo $e->getResponse()->getBody(), "\n";
}
}
Response
Response examples
- 201
- 400
- 401
- 404
- 409
- 500
Campaign created. The returned body will be a full campaign payload, which consists of any optional fields that were not included in the POST request, along with the following information:
id- unique identifiers for the campaign, each step, and versionstatus- status of the campaign, alwaysDRAFTafter creationversion- version identifiers for each email, ranging fromAtoE
You can review the full campaign payload here.
Invalid request or malformed request syntax. For example missing array of email accounts. Please review the request body.
{
"code": "INPUT_DATA_VALIDATION_FAILURE",
"message": "Input data validation failure",
"details": "Detailed message"
}
Body schema
| Field | Type | Description |
|---|---|---|
code | string | Error code |
message | string | Descriptive error message |
details | string/null | Additional information |
An issue with authorization. Please review the authorization guide
{
"title": "Unauthorized",
"status": 401,
"detail": "Invalid api key",
"timestamp": "2025-03-05 17:57:00"
}
Body schema
| Field | Type | Description |
|---|---|---|
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, YYYY-MM-DD HH:MM:SS UTC |
Please review the request URL
{
"title": "Not Found",
"status": 404,
"detail": "Requested resource does not exist",
"timestamp": "2025-03-05 17:57:00"
}
Body schema
| Field | Type | Description |
|---|---|---|
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, YYYY-MM-DD HH:MM:SS UTC |
The payload body passes the validation but there is an issue with requested data, for example the assigned email has connection problems
{
"code": "VALIDATION_FAILURE",
"message": "Validation failure",
"details": "Detailed message"
}
Body schema
| Field | Type | Description |
|---|---|---|
code | string | Error code |
message | string | Descriptive error message |
details | string/null | Additional information |
Unexpected error, please try again later.
{
"code": "UNKNOWN",
"message": "Unknown error during create campaign call",
"details": null
}
Body schema
| Field | Type | Description |
|---|---|---|
code | string | Error code |
message | string | Descriptive error message |
details | string/null | Additional information |