Duplicate a campaign
curl --request POST \
--url https://core-service.prod.brudcast.com/api/v1/user/campaigns/{id}/duplicate \
--header 'X-API-Key: <api-key>'import requests
url = "https://core-service.prod.brudcast.com/api/v1/user/campaigns/{id}/duplicate"
headers = {"X-API-Key": "<api-key>"}
response = requests.post(url, headers=headers)
print(response.text)const options = {method: 'POST', headers: {'X-API-Key': '<api-key>'}};
fetch('https://core-service.prod.brudcast.com/api/v1/user/campaigns/{id}/duplicate', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://core-service.prod.brudcast.com/api/v1/user/campaigns/{id}/duplicate",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_HTTPHEADER => [
"X-API-Key: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://core-service.prod.brudcast.com/api/v1/user/campaigns/{id}/duplicate"
req, _ := http.NewRequest("POST", url, nil)
req.Header.Add("X-API-Key", "<api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://core-service.prod.brudcast.com/api/v1/user/campaigns/{id}/duplicate")
.header("X-API-Key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://core-service.prod.brudcast.com/api/v1/user/campaigns/{id}/duplicate")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["X-API-Key"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"success": true,
"message": "<string>",
"data": {
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"organizationId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"name": "Spring collection launch",
"status": "draft",
"type": "regular",
"channels": [
"email"
],
"tags": [
"<string>"
],
"brief": {
"goal": "Announce the spring collection to lapsed buyers",
"audience": "Customers who bought in 2024",
"keyInfo": "<string>",
"tone": "friendly"
},
"estimatedRecipients": 123,
"channelReach": {},
"scheduledAt": "2023-11-07T05:31:56Z",
"sentAt": "2023-11-07T05:31:56Z",
"completedAt": "2023-11-07T05:31:56Z",
"createdAt": "2023-11-07T05:31:56Z",
"updatedAt": "2023-11-07T05:31:56Z",
"emailContent": {
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"campaignId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"fromName": "Acme Marketing",
"fromEmail": "hello@mail.example.com",
"replyTo": "jsmith@example.com",
"subject": "Your spring picks are here",
"previewText": "<string>",
"htmlContent": "<string>",
"plainTextContent": "<string>",
"editorMode": "visual",
"builderData": {}
},
"smsContent": {
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"campaignId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"body": "Spring picks are live. Shop now: https://exa.mp/le",
"senderId": "<string>"
},
"whatsappContent": {
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"campaignId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"templateName": "<string>",
"languageCode": "en_US",
"variables": {},
"headerMediaUrl": "<string>",
"bodyPreview": "<string>",
"phoneNumberId": "<string>",
"senderId": "<string>",
"createdAt": "2023-11-07T05:31:56Z",
"updatedAt": "2023-11-07T05:31:56Z"
},
"pushContent": {
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"campaignId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"title": "<string>",
"body": "<string>",
"imageUrl": "<string>",
"clickUrl": "<string>"
},
"recipients": [
{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"campaignId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"sourceType": "list",
"sourceId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"isExcluded": true,
"sourceName": "<string>"
}
],
"settings": {
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"campaignId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"trackOpens": true,
"trackClicks": true,
"utmEnabled": true,
"utmSource": "<string>",
"utmMedium": "<string>",
"utmCampaign": "<string>",
"includeUnsubLink": true,
"footerText": "<string>"
},
"abTest": {
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"campaignId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"variable": "subject",
"variantCount": 2,
"winnerCriteria": "open_rate",
"testDurationHrs": 4,
"samplePercent": 20,
"variants": [
{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"abTestId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"variantLabel": "A",
"subject": "<string>",
"htmlContent": "<string>",
"sendTime": "2023-11-07T05:31:56Z",
"isWinner": true
}
]
},
"statistics": {
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"campaignId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"sent": 123,
"delivered": 123,
"opened": 123,
"uniqueOpened": 123,
"clicked": 123,
"uniqueClicked": 123,
"bounced": 123,
"hardBounced": 123,
"softBounced": 123,
"unsubscribed": 123,
"complained": 123,
"audienceSize": 123,
"channelReach": {},
"openRate": 123,
"clickRate": 123,
"bounceRate": 123,
"unsubscribeRate": 123
},
"channelStatistics": [
{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"campaignId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"channel": "email",
"sent": 123,
"delivered": 123,
"opened": 123,
"uniqueOpened": 123,
"clicked": 123,
"uniqueClicked": 123,
"bounced": 123,
"hardBounced": 123,
"softBounced": 123,
"unsubscribed": 123,
"complained": 123,
"openRate": 123,
"clickRate": 123,
"bounceRate": 123,
"unsubscribeRate": 123,
"status": "draft",
"snapshotAt": 123,
"createdAt": "2023-11-07T05:31:56Z",
"updatedAt": "2023-11-07T05:31:56Z"
}
]
}
}{
"success": false,
"message": "Resource not found",
"code": "E_ROW_NOT_FOUND"
}{
"success": false,
"message": "Resource not found",
"code": "E_ROW_NOT_FOUND"
}{
"success": false,
"message": "Resource not found",
"code": "E_ROW_NOT_FOUND"
}{
"success": false,
"message": "Resource not found",
"code": "E_ROW_NOT_FOUND"
}{
"success": false,
"message": "The payload is invalid",
"code": "E_VALIDATION_ERROR",
"errors": [
{
"field": "emailAddress",
"rule": "email",
"message": "The emailAddress field must be a valid email address"
}
]
}{
"success": false,
"message": "Too many requests",
"code": "E_TOO_MANY_REQUESTS",
"retryAfter": 60
}Campaigns
Duplicate a campaign
Copies a campaign of any status into a new `draft` named "Copy of <original>", carrying over every channel's content, the audience selection including exclusions, the settings and the A/B test with its variants. Statistics are not copied and the copy starts with zeroed counters. Requires the `campaigns:write` scope.
POST
/
api
/
v1
/
user
/
campaigns
/
{id}
/
duplicate
Duplicate a campaign
curl --request POST \
--url https://core-service.prod.brudcast.com/api/v1/user/campaigns/{id}/duplicate \
--header 'X-API-Key: <api-key>'import requests
url = "https://core-service.prod.brudcast.com/api/v1/user/campaigns/{id}/duplicate"
headers = {"X-API-Key": "<api-key>"}
response = requests.post(url, headers=headers)
print(response.text)const options = {method: 'POST', headers: {'X-API-Key': '<api-key>'}};
fetch('https://core-service.prod.brudcast.com/api/v1/user/campaigns/{id}/duplicate', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://core-service.prod.brudcast.com/api/v1/user/campaigns/{id}/duplicate",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_HTTPHEADER => [
"X-API-Key: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://core-service.prod.brudcast.com/api/v1/user/campaigns/{id}/duplicate"
req, _ := http.NewRequest("POST", url, nil)
req.Header.Add("X-API-Key", "<api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://core-service.prod.brudcast.com/api/v1/user/campaigns/{id}/duplicate")
.header("X-API-Key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://core-service.prod.brudcast.com/api/v1/user/campaigns/{id}/duplicate")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["X-API-Key"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"success": true,
"message": "<string>",
"data": {
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"organizationId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"name": "Spring collection launch",
"status": "draft",
"type": "regular",
"channels": [
"email"
],
"tags": [
"<string>"
],
"brief": {
"goal": "Announce the spring collection to lapsed buyers",
"audience": "Customers who bought in 2024",
"keyInfo": "<string>",
"tone": "friendly"
},
"estimatedRecipients": 123,
"channelReach": {},
"scheduledAt": "2023-11-07T05:31:56Z",
"sentAt": "2023-11-07T05:31:56Z",
"completedAt": "2023-11-07T05:31:56Z",
"createdAt": "2023-11-07T05:31:56Z",
"updatedAt": "2023-11-07T05:31:56Z",
"emailContent": {
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"campaignId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"fromName": "Acme Marketing",
"fromEmail": "hello@mail.example.com",
"replyTo": "jsmith@example.com",
"subject": "Your spring picks are here",
"previewText": "<string>",
"htmlContent": "<string>",
"plainTextContent": "<string>",
"editorMode": "visual",
"builderData": {}
},
"smsContent": {
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"campaignId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"body": "Spring picks are live. Shop now: https://exa.mp/le",
"senderId": "<string>"
},
"whatsappContent": {
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"campaignId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"templateName": "<string>",
"languageCode": "en_US",
"variables": {},
"headerMediaUrl": "<string>",
"bodyPreview": "<string>",
"phoneNumberId": "<string>",
"senderId": "<string>",
"createdAt": "2023-11-07T05:31:56Z",
"updatedAt": "2023-11-07T05:31:56Z"
},
"pushContent": {
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"campaignId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"title": "<string>",
"body": "<string>",
"imageUrl": "<string>",
"clickUrl": "<string>"
},
"recipients": [
{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"campaignId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"sourceType": "list",
"sourceId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"isExcluded": true,
"sourceName": "<string>"
}
],
"settings": {
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"campaignId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"trackOpens": true,
"trackClicks": true,
"utmEnabled": true,
"utmSource": "<string>",
"utmMedium": "<string>",
"utmCampaign": "<string>",
"includeUnsubLink": true,
"footerText": "<string>"
},
"abTest": {
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"campaignId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"variable": "subject",
"variantCount": 2,
"winnerCriteria": "open_rate",
"testDurationHrs": 4,
"samplePercent": 20,
"variants": [
{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"abTestId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"variantLabel": "A",
"subject": "<string>",
"htmlContent": "<string>",
"sendTime": "2023-11-07T05:31:56Z",
"isWinner": true
}
]
},
"statistics": {
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"campaignId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"sent": 123,
"delivered": 123,
"opened": 123,
"uniqueOpened": 123,
"clicked": 123,
"uniqueClicked": 123,
"bounced": 123,
"hardBounced": 123,
"softBounced": 123,
"unsubscribed": 123,
"complained": 123,
"audienceSize": 123,
"channelReach": {},
"openRate": 123,
"clickRate": 123,
"bounceRate": 123,
"unsubscribeRate": 123
},
"channelStatistics": [
{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"campaignId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"channel": "email",
"sent": 123,
"delivered": 123,
"opened": 123,
"uniqueOpened": 123,
"clicked": 123,
"uniqueClicked": 123,
"bounced": 123,
"hardBounced": 123,
"softBounced": 123,
"unsubscribed": 123,
"complained": 123,
"openRate": 123,
"clickRate": 123,
"bounceRate": 123,
"unsubscribeRate": 123,
"status": "draft",
"snapshotAt": 123,
"createdAt": "2023-11-07T05:31:56Z",
"updatedAt": "2023-11-07T05:31:56Z"
}
]
}
}{
"success": false,
"message": "Resource not found",
"code": "E_ROW_NOT_FOUND"
}{
"success": false,
"message": "Resource not found",
"code": "E_ROW_NOT_FOUND"
}{
"success": false,
"message": "Resource not found",
"code": "E_ROW_NOT_FOUND"
}{
"success": false,
"message": "Resource not found",
"code": "E_ROW_NOT_FOUND"
}{
"success": false,
"message": "The payload is invalid",
"code": "E_VALIDATION_ERROR",
"errors": [
{
"field": "emailAddress",
"rule": "email",
"message": "The emailAddress field must be a valid email address"
}
]
}{
"success": false,
"message": "Too many requests",
"code": "E_TOO_MANY_REQUESTS",
"retryAfter": 60
}Authorizations
apiKeyapiKeyBearer
An organization API key, prefixed bk_live_. Takes precedence over Authorization when both are sent. The key is bound to one organization, and the scopes it was issued with are enforced per endpoint.
Headers
Required when authenticating with an access token. Optional with an API key, whose own organization binding is authoritative; a value contradicting it is refused with 403.