Create a new broadcast.
curl --request POST \
--url https://{subdomain}.outseta.com/api/v1/email/campaigns/broadcasts \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data @- <<EOF
{
"Campaign": {
"Name": "Product launch",
"FromName": "Acme",
"FromEmail": "hello@acme.com"
},
"EmailListUids": [
"YOUR_EMAIL_LIST_UID"
],
"Message": {
"Subject": "{{ Person.FirstName }}, see what's new",
"PreviewText": "A quick look at what's new",
"Body": "<div style='font-family:Arial,sans-serif;font-size:16px;line-height:1.5;color:#111'><p>Hi {{ Person.FirstName }},</p><p>We just shipped something we think you'll love. <a href='https://acme.com/whats-new' style='color:#2f80ed'>Take a look</a>.</p></div>"
}
}
EOFimport requests
url = "https://{subdomain}.outseta.com/api/v1/email/campaigns/broadcasts"
payload = {
"Campaign": {
"Name": "Product launch",
"FromName": "Acme",
"FromEmail": "hello@acme.com"
},
"EmailListUids": ["YOUR_EMAIL_LIST_UID"],
"Message": {
"Subject": "{{ Person.FirstName }}, see what's new",
"PreviewText": "A quick look at what's new",
"Body": "<div style='font-family:Arial,sans-serif;font-size:16px;line-height:1.5;color:#111'><p>Hi {{ Person.FirstName }},</p><p>We just shipped something we think you'll love. <a href='https://acme.com/whats-new' style='color:#2f80ed'>Take a look</a>.</p></div>"
}
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
Campaign: {Name: 'Product launch', FromName: 'Acme', FromEmail: 'hello@acme.com'},
EmailListUids: ['YOUR_EMAIL_LIST_UID'],
Message: {
Subject: '{{ Person.FirstName }}, see what\'s new',
PreviewText: 'A quick look at what\'s new',
Body: '<div style=\'font-family:Arial,sans-serif;font-size:16px;line-height:1.5;color:#111\'><p>Hi {{ Person.FirstName }},</p><p>We just shipped something we think you\'ll love. <a href=\'https://acme.com/whats-new\' style=\'color:#2f80ed\'>Take a look</a>.</p></div>'
}
})
};
fetch('https://{subdomain}.outseta.com/api/v1/email/campaigns/broadcasts', 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://{subdomain}.outseta.com/api/v1/email/campaigns/broadcasts",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'Campaign' => [
'Name' => 'Product launch',
'FromName' => 'Acme',
'FromEmail' => 'hello@acme.com'
],
'EmailListUids' => [
'YOUR_EMAIL_LIST_UID'
],
'Message' => [
'Subject' => '{{ Person.FirstName }}, see what\'s new',
'PreviewText' => 'A quick look at what\'s new',
'Body' => '<div style=\'font-family:Arial,sans-serif;font-size:16px;line-height:1.5;color:#111\'><p>Hi {{ Person.FirstName }},</p><p>We just shipped something we think you\'ll love. <a href=\'https://acme.com/whats-new\' style=\'color:#2f80ed\'>Take a look</a>.</p></div>'
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://{subdomain}.outseta.com/api/v1/email/campaigns/broadcasts"
payload := strings.NewReader("{\n \"Campaign\": {\n \"Name\": \"Product launch\",\n \"FromName\": \"Acme\",\n \"FromEmail\": \"hello@acme.com\"\n },\n \"EmailListUids\": [\n \"YOUR_EMAIL_LIST_UID\"\n ],\n \"Message\": {\n \"Subject\": \"{{ Person.FirstName }}, see what's new\",\n \"PreviewText\": \"A quick look at what's new\",\n \"Body\": \"<div style='font-family:Arial,sans-serif;font-size:16px;line-height:1.5;color:#111'><p>Hi {{ Person.FirstName }},</p><p>We just shipped something we think you'll love. <a href='https://acme.com/whats-new' style='color:#2f80ed'>Take a look</a>.</p></div>\"\n }\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://{subdomain}.outseta.com/api/v1/email/campaigns/broadcasts")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"Campaign\": {\n \"Name\": \"Product launch\",\n \"FromName\": \"Acme\",\n \"FromEmail\": \"hello@acme.com\"\n },\n \"EmailListUids\": [\n \"YOUR_EMAIL_LIST_UID\"\n ],\n \"Message\": {\n \"Subject\": \"{{ Person.FirstName }}, see what's new\",\n \"PreviewText\": \"A quick look at what's new\",\n \"Body\": \"<div style='font-family:Arial,sans-serif;font-size:16px;line-height:1.5;color:#111'><p>Hi {{ Person.FirstName }},</p><p>We just shipped something we think you'll love. <a href='https://acme.com/whats-new' style='color:#2f80ed'>Take a look</a>.</p></div>\"\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://{subdomain}.outseta.com/api/v1/email/campaigns/broadcasts")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"Campaign\": {\n \"Name\": \"Product launch\",\n \"FromName\": \"Acme\",\n \"FromEmail\": \"hello@acme.com\"\n },\n \"EmailListUids\": [\n \"YOUR_EMAIL_LIST_UID\"\n ],\n \"Message\": {\n \"Subject\": \"{{ Person.FirstName }}, see what's new\",\n \"PreviewText\": \"A quick look at what's new\",\n \"Body\": \"<div style='font-family:Arial,sans-serif;font-size:16px;line-height:1.5;color:#111'><p>Hi {{ Person.FirstName }},</p><p>We just shipped something we think you'll love. <a href='https://acme.com/whats-new' style='color:#2f80ed'>Take a look</a>.</p></div>\"\n }\n}"
response = http.request(request)
puts response.read_body{
"Uid": "string",
"_objectType": "string",
"Created": "string",
"Updated": "string",
"ActivityEventData": {},
"SendDateTime": "string",
"NextRunDateTime": "string",
"Campaign": {
"Uid": "string",
"_objectType": "string",
"Created": "string",
"Updated": "string",
"ActivityEventData": {},
"Name": "string",
"FromName": "string",
"FromEmail": "string",
"CampaignType": 1
},
"Message": {
"Uid": "string",
"_objectType": "string",
"Created": "string",
"Updated": "string",
"ActivityEventData": {},
"Template": {},
"Name": "string",
"Subject": "string",
"PreviewText": "string",
"Body": "string",
"Design": "string",
"CountSent": 0,
"CountDelivered": 0,
"CountBounce": 0,
"CountSpam": 0,
"CountOpen": 0,
"CountClick": 0,
"CountUnsubscribed": 0,
"CountTotalOpen": 0,
"CountTotalClick": 0,
"IgnoredSpamBounce": 0,
"IsBounceRatePaused": false,
"IsSpamScorePaused": false,
"EmailLinks": [],
"SpamAssassinScore": 0,
"SpamStatus": 0,
"SpamReason": "string"
},
"RecipientData": "string",
"EmailListUids": [
"string"
],
"SegmentUids": [
"string"
],
"TemplateUid": "string",
"Status": 1,
"ErrorMessage": "string",
"Tags": [
{
"Uid": "string",
"_objectType": "string",
"Created": "string",
"Updated": "string",
"ActivityEventData": {},
"Name": "string",
"SystemName": "string",
"SystemDescription": "string",
"TagColor": 1,
"EntityType": 0
}
]
}Broadcasts
Create a new broadcast.
To copy an existing broadcast, retrieve it and pass its data as the request body — the
Uid, SendDateTime, and message counts are automatically reset. A new broadcast is always
created as a Draft; schedule it by updating it with a SendDateTime (see the update endpoint).
Specify who the broadcast is sent to with EmailListUids and/or SegmentUids: EmailListUids is
an array of email list Uids (from GET /api/v1/email/lists) and SegmentUids is an array of
segment Uids (from GET /api/v1/crm/segments). These are the recommended way to set recipients
— they are merged into the underlying RecipientData for you, so callers (including LLM tools)
do not need to build that structure by hand; unknown Uids are rejected. RecipientData may
still be supplied directly (a JSON string of the form
{"BroadcastRecipientsEmailLists":[{"Uid":"..."}],"BroadcastRecipientsSegments":[{"Uid":"..."}]});
when both are present they are merged.
Message.Body is rendered as a Liquid template, so it may include merge tags such as
{{ Person.FirstName }}; unknown {{ }} tokens render as empty text. An inline-styled HTML
fragment is recommended. Message.Design (the drag-and-drop editor state) is optional — when
omitted it is derived automatically, so callers (including LLM tools) do not need to
understand it. Use Message.PreviewText for inbox preview text rather than an in-body
preheader.
When Body is a content fragment with no Design, it is composed into the account's API
email layout — a branded header and footer that includes the unsubscribe and
manage-subscriptions links — and the composed result is what is sent and opened in the
editor. Do not add your own unsubscribe link in this case; the layout provides one. The
layout is editable in the app; TemplateUid selects a specific layout template when the
account has more than one.
The layout is NOT applied when a Design is supplied or when the body is a complex full
HTML document (Outlook conditional comments, stylesheet links) — in those cases the body
is sent exactly as supplied, and you must include a visible unsubscribe link in it
yourself: add {{ UnsubscribeLink }} (a ready-made anchor) or {{ UnsubscribeUrl }} (the raw
URL) where you want it. Its presence is not validated. A one-click List-Unsubscribe header
is always added, but most anti-spam laws (e.g. CAN-SPAM) also require a visible
unsubscribe link in the body.
POST
/
api
/
v1
/
email
/
campaigns
/
broadcasts
Create a new broadcast.
curl --request POST \
--url https://{subdomain}.outseta.com/api/v1/email/campaigns/broadcasts \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data @- <<EOF
{
"Campaign": {
"Name": "Product launch",
"FromName": "Acme",
"FromEmail": "hello@acme.com"
},
"EmailListUids": [
"YOUR_EMAIL_LIST_UID"
],
"Message": {
"Subject": "{{ Person.FirstName }}, see what's new",
"PreviewText": "A quick look at what's new",
"Body": "<div style='font-family:Arial,sans-serif;font-size:16px;line-height:1.5;color:#111'><p>Hi {{ Person.FirstName }},</p><p>We just shipped something we think you'll love. <a href='https://acme.com/whats-new' style='color:#2f80ed'>Take a look</a>.</p></div>"
}
}
EOFimport requests
url = "https://{subdomain}.outseta.com/api/v1/email/campaigns/broadcasts"
payload = {
"Campaign": {
"Name": "Product launch",
"FromName": "Acme",
"FromEmail": "hello@acme.com"
},
"EmailListUids": ["YOUR_EMAIL_LIST_UID"],
"Message": {
"Subject": "{{ Person.FirstName }}, see what's new",
"PreviewText": "A quick look at what's new",
"Body": "<div style='font-family:Arial,sans-serif;font-size:16px;line-height:1.5;color:#111'><p>Hi {{ Person.FirstName }},</p><p>We just shipped something we think you'll love. <a href='https://acme.com/whats-new' style='color:#2f80ed'>Take a look</a>.</p></div>"
}
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
Campaign: {Name: 'Product launch', FromName: 'Acme', FromEmail: 'hello@acme.com'},
EmailListUids: ['YOUR_EMAIL_LIST_UID'],
Message: {
Subject: '{{ Person.FirstName }}, see what\'s new',
PreviewText: 'A quick look at what\'s new',
Body: '<div style=\'font-family:Arial,sans-serif;font-size:16px;line-height:1.5;color:#111\'><p>Hi {{ Person.FirstName }},</p><p>We just shipped something we think you\'ll love. <a href=\'https://acme.com/whats-new\' style=\'color:#2f80ed\'>Take a look</a>.</p></div>'
}
})
};
fetch('https://{subdomain}.outseta.com/api/v1/email/campaigns/broadcasts', 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://{subdomain}.outseta.com/api/v1/email/campaigns/broadcasts",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'Campaign' => [
'Name' => 'Product launch',
'FromName' => 'Acme',
'FromEmail' => 'hello@acme.com'
],
'EmailListUids' => [
'YOUR_EMAIL_LIST_UID'
],
'Message' => [
'Subject' => '{{ Person.FirstName }}, see what\'s new',
'PreviewText' => 'A quick look at what\'s new',
'Body' => '<div style=\'font-family:Arial,sans-serif;font-size:16px;line-height:1.5;color:#111\'><p>Hi {{ Person.FirstName }},</p><p>We just shipped something we think you\'ll love. <a href=\'https://acme.com/whats-new\' style=\'color:#2f80ed\'>Take a look</a>.</p></div>'
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://{subdomain}.outseta.com/api/v1/email/campaigns/broadcasts"
payload := strings.NewReader("{\n \"Campaign\": {\n \"Name\": \"Product launch\",\n \"FromName\": \"Acme\",\n \"FromEmail\": \"hello@acme.com\"\n },\n \"EmailListUids\": [\n \"YOUR_EMAIL_LIST_UID\"\n ],\n \"Message\": {\n \"Subject\": \"{{ Person.FirstName }}, see what's new\",\n \"PreviewText\": \"A quick look at what's new\",\n \"Body\": \"<div style='font-family:Arial,sans-serif;font-size:16px;line-height:1.5;color:#111'><p>Hi {{ Person.FirstName }},</p><p>We just shipped something we think you'll love. <a href='https://acme.com/whats-new' style='color:#2f80ed'>Take a look</a>.</p></div>\"\n }\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://{subdomain}.outseta.com/api/v1/email/campaigns/broadcasts")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"Campaign\": {\n \"Name\": \"Product launch\",\n \"FromName\": \"Acme\",\n \"FromEmail\": \"hello@acme.com\"\n },\n \"EmailListUids\": [\n \"YOUR_EMAIL_LIST_UID\"\n ],\n \"Message\": {\n \"Subject\": \"{{ Person.FirstName }}, see what's new\",\n \"PreviewText\": \"A quick look at what's new\",\n \"Body\": \"<div style='font-family:Arial,sans-serif;font-size:16px;line-height:1.5;color:#111'><p>Hi {{ Person.FirstName }},</p><p>We just shipped something we think you'll love. <a href='https://acme.com/whats-new' style='color:#2f80ed'>Take a look</a>.</p></div>\"\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://{subdomain}.outseta.com/api/v1/email/campaigns/broadcasts")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"Campaign\": {\n \"Name\": \"Product launch\",\n \"FromName\": \"Acme\",\n \"FromEmail\": \"hello@acme.com\"\n },\n \"EmailListUids\": [\n \"YOUR_EMAIL_LIST_UID\"\n ],\n \"Message\": {\n \"Subject\": \"{{ Person.FirstName }}, see what's new\",\n \"PreviewText\": \"A quick look at what's new\",\n \"Body\": \"<div style='font-family:Arial,sans-serif;font-size:16px;line-height:1.5;color:#111'><p>Hi {{ Person.FirstName }},</p><p>We just shipped something we think you'll love. <a href='https://acme.com/whats-new' style='color:#2f80ed'>Take a look</a>.</p></div>\"\n }\n}"
response = http.request(request)
puts response.read_body{
"Uid": "string",
"_objectType": "string",
"Created": "string",
"Updated": "string",
"ActivityEventData": {},
"SendDateTime": "string",
"NextRunDateTime": "string",
"Campaign": {
"Uid": "string",
"_objectType": "string",
"Created": "string",
"Updated": "string",
"ActivityEventData": {},
"Name": "string",
"FromName": "string",
"FromEmail": "string",
"CampaignType": 1
},
"Message": {
"Uid": "string",
"_objectType": "string",
"Created": "string",
"Updated": "string",
"ActivityEventData": {},
"Template": {},
"Name": "string",
"Subject": "string",
"PreviewText": "string",
"Body": "string",
"Design": "string",
"CountSent": 0,
"CountDelivered": 0,
"CountBounce": 0,
"CountSpam": 0,
"CountOpen": 0,
"CountClick": 0,
"CountUnsubscribed": 0,
"CountTotalOpen": 0,
"CountTotalClick": 0,
"IgnoredSpamBounce": 0,
"IsBounceRatePaused": false,
"IsSpamScorePaused": false,
"EmailLinks": [],
"SpamAssassinScore": 0,
"SpamStatus": 0,
"SpamReason": "string"
},
"RecipientData": "string",
"EmailListUids": [
"string"
],
"SegmentUids": [
"string"
],
"TemplateUid": "string",
"Status": 1,
"ErrorMessage": "string",
"Tags": [
{
"Uid": "string",
"_objectType": "string",
"Created": "string",
"Updated": "string",
"ActivityEventData": {},
"Name": "string",
"SystemName": "string",
"SystemDescription": "string",
"TagColor": 1,
"EntityType": 0
}
]
}Authorizations
BearerApiKey
Enter your access token (OAuth / JWT).
Body
application/json
The broadcast campaign to create. Must include a Campaign (with Name) and a Message (with Subject and Body); the Message Name defaults to the campaign name when omitted.
Maximum string length:
10Show child attributes
Show child attributes
Show child attributes
Show child attributes
1 - Draft, 2 - Pending, 3 - Sent, 4 - Queuing, 5 - Queued, 6 - Sending, 7 - Error, 8 - WaitingToResume, 9 - QueuedEmails, 10 - Archived
Available options:
1, 2, 3, 4, 5, 6, 7, 8, 9, 10 Maximum string length:
500Show child attributes
Show child attributes
Response
Minimum string length:
1Minimum string length:
1Maximum string length:
10Show child attributes
Show child attributes
Show child attributes
Show child attributes
1 - Draft, 2 - Pending, 3 - Sent, 4 - Queuing, 5 - Queued, 6 - Sending, 7 - Error, 8 - WaitingToResume, 9 - QueuedEmails, 10 - Archived
Available options:
1, 2, 3, 4, 5, 6, 7, 8, 9, 10 Maximum string length:
500Show child attributes
Show child attributes