Campaigns
Schedule Campaign
Schedule a campaign send
POST
/
api
/
v1
/
campaigns
/
{campaignId}
/
schedule
Schedule Campaign
curl --request POST \
--url https://api.sequenzy.com/api/v1/campaigns/{campaignId}/schedule \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"scheduledAt": "<string>",
"targetLists": {},
"sendTimeOptimization": true,
"spreadOverHours": 123,
"recurringInterval": "<string>"
}
'import requests
url = "https://api.sequenzy.com/api/v1/campaigns/{campaignId}/schedule"
payload = {
"scheduledAt": "<string>",
"targetLists": {},
"sendTimeOptimization": True,
"spreadOverHours": 123,
"recurringInterval": "<string>"
}
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({
scheduledAt: '<string>',
targetLists: {},
sendTimeOptimization: true,
spreadOverHours: 123,
recurringInterval: '<string>'
})
};
fetch('https://api.sequenzy.com/api/v1/campaigns/{campaignId}/schedule', 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://api.sequenzy.com/api/v1/campaigns/{campaignId}/schedule",
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([
'scheduledAt' => '<string>',
'targetLists' => [
],
'sendTimeOptimization' => true,
'spreadOverHours' => 123,
'recurringInterval' => '<string>'
]),
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://api.sequenzy.com/api/v1/campaigns/{campaignId}/schedule"
payload := strings.NewReader("{\n \"scheduledAt\": \"<string>\",\n \"targetLists\": {},\n \"sendTimeOptimization\": true,\n \"spreadOverHours\": 123,\n \"recurringInterval\": \"<string>\"\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://api.sequenzy.com/api/v1/campaigns/{campaignId}/schedule")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"scheduledAt\": \"<string>\",\n \"targetLists\": {},\n \"sendTimeOptimization\": true,\n \"spreadOverHours\": 123,\n \"recurringInterval\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.sequenzy.com/api/v1/campaigns/{campaignId}/schedule")
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 \"scheduledAt\": \"<string>\",\n \"targetLists\": {},\n \"sendTimeOptimization\": true,\n \"spreadOverHours\": 123,\n \"recurringInterval\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"success": true,
"message": "Campaign scheduled for 2026-06-01T14:00:00.000Z",
"scheduledAt": "2026-06-01T14:00:00.000Z",
"jobId": "mock-job-id",
"previewUrl": "https://sequenzy.com/dashboard/company/comp_abc123/campaign/camp_abc123?step=review",
"campaign": {
"id": "camp_abc123",
"name": "April Launch",
"subject": "A quick update",
"status": "scheduled",
"labels": ["edm", "launch"],
"scheduledAt": "2026-06-01T14:00:00.000Z",
"recurringInterval": null,
"url": "https://sequenzy.com/dashboard/company/comp_abc123/campaign/camp_abc123",
"previewUrl": "https://sequenzy.com/dashboard/company/comp_abc123/campaign/camp_abc123?step=review"
}
}
{
"success": true,
"message": "Campaign is awaiting approval before it can be scheduled.",
"scheduledAt": "2026-06-01T14:00:00.000Z",
"previewUrl": "https://sequenzy.com/dashboard/company/comp_abc123/campaign/camp_abc123?step=review",
"campaign": {
"id": "camp_abc123",
"name": "April Launch",
"subject": "A quick update",
"status": "waiting_approval",
"labels": ["edm", "launch"],
"scheduledAt": "2026-06-01T14:00:00.000Z",
"url": "https://sequenzy.com/dashboard/company/comp_abc123/campaign/camp_abc123",
"previewUrl": "https://sequenzy.com/dashboard/company/comp_abc123/campaign/camp_abc123?step=review"
}
}
{
"success": false,
"error": "Scheduled time must be in the future."
}
{
"success": false,
"error": "Sending domain is not verified. Please verify your domain before scheduling emails."
}
{
"success": false,
"error": "Unauthorized"
}
{
"success": false,
"error": "Campaign not found"
}
{
"success": false,
"error": "Campaign is no longer editable. It may have already started sending."
}
Schedule a draft or already scheduled campaign for a future send time. The campaign must have a sender profile whose sending domain is verified.
The response returns
Repeat a campaign monthly to a segment:
campaign.status, which is either scheduled or
waiting_approval. Campaigns that require safety review are held in
waiting_approval and are scheduled once a reviewer approves them.
waiting_approval is a normal, successful (200) outcome, and it is most
common on new accounts and recently registered sending domains. Nothing is
sent while a campaign is held, and retrying the schedule call will not clear
the hold. Automated integrations should branch on campaign.status and then
poll GET /api/v1/campaigns/{campaignId}
instead of retrying. See Safety review
for what triggers the hold and how it clears.Request
string
required
Campaign ID.
string
required
Future ISO 8601 send time.
object
Optional targeting object. Omit this to reuse saved campaign targeting, or to
default to all active subscribers.
boolean
Whether to use send-time optimization.
number
Spread delivery over 1-72 hours. When set, spread delivery takes precedence
over send-time optimization.
string
Repeat the campaign
weekly or monthly starting at scheduledAt. The
campaign becomes a recurring template - each run is duplicated and sent
automatically, re-evaluating audience membership every time. Omit for a
one-shot send; scheduling again without it stops the recurrence. Unschedule
the campaign to stop the series and return it to an editable draft.curl -X POST "https://api.sequenzy.com/api/v1/campaigns/camp_abc123/schedule" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"scheduledAt": "2026-06-01T14:00:00Z",
"targetLists": {
"type": "all"
}
}'
curl -X POST "https://api.sequenzy.com/api/v1/campaigns/camp_abc123/schedule" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"scheduledAt": "2026-06-01T14:00:00Z",
"targetLists": {
"type": "segment",
"segmentId": "seg_abc123"
},
"recurringInterval": "monthly"
}'
Responses
{
"success": true,
"message": "Campaign scheduled for 2026-06-01T14:00:00.000Z",
"scheduledAt": "2026-06-01T14:00:00.000Z",
"jobId": "mock-job-id",
"previewUrl": "https://sequenzy.com/dashboard/company/comp_abc123/campaign/camp_abc123?step=review",
"campaign": {
"id": "camp_abc123",
"name": "April Launch",
"subject": "A quick update",
"status": "scheduled",
"labels": ["edm", "launch"],
"scheduledAt": "2026-06-01T14:00:00.000Z",
"recurringInterval": null,
"url": "https://sequenzy.com/dashboard/company/comp_abc123/campaign/camp_abc123",
"previewUrl": "https://sequenzy.com/dashboard/company/comp_abc123/campaign/camp_abc123?step=review"
}
}
{
"success": true,
"message": "Campaign is awaiting approval before it can be scheduled.",
"scheduledAt": "2026-06-01T14:00:00.000Z",
"previewUrl": "https://sequenzy.com/dashboard/company/comp_abc123/campaign/camp_abc123?step=review",
"campaign": {
"id": "camp_abc123",
"name": "April Launch",
"subject": "A quick update",
"status": "waiting_approval",
"labels": ["edm", "launch"],
"scheduledAt": "2026-06-01T14:00:00.000Z",
"url": "https://sequenzy.com/dashboard/company/comp_abc123/campaign/camp_abc123",
"previewUrl": "https://sequenzy.com/dashboard/company/comp_abc123/campaign/camp_abc123?step=review"
}
}
{
"success": false,
"error": "Scheduled time must be in the future."
}
{
"success": false,
"error": "Sending domain is not verified. Please verify your domain before scheduling emails."
}
{
"success": false,
"error": "Unauthorized"
}
{
"success": false,
"error": "Campaign not found"
}
{
"success": false,
"error": "Campaign is no longer editable. It may have already started sending."
}
⌘I
Schedule Campaign
curl --request POST \
--url https://api.sequenzy.com/api/v1/campaigns/{campaignId}/schedule \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"scheduledAt": "<string>",
"targetLists": {},
"sendTimeOptimization": true,
"spreadOverHours": 123,
"recurringInterval": "<string>"
}
'import requests
url = "https://api.sequenzy.com/api/v1/campaigns/{campaignId}/schedule"
payload = {
"scheduledAt": "<string>",
"targetLists": {},
"sendTimeOptimization": True,
"spreadOverHours": 123,
"recurringInterval": "<string>"
}
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({
scheduledAt: '<string>',
targetLists: {},
sendTimeOptimization: true,
spreadOverHours: 123,
recurringInterval: '<string>'
})
};
fetch('https://api.sequenzy.com/api/v1/campaigns/{campaignId}/schedule', 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://api.sequenzy.com/api/v1/campaigns/{campaignId}/schedule",
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([
'scheduledAt' => '<string>',
'targetLists' => [
],
'sendTimeOptimization' => true,
'spreadOverHours' => 123,
'recurringInterval' => '<string>'
]),
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://api.sequenzy.com/api/v1/campaigns/{campaignId}/schedule"
payload := strings.NewReader("{\n \"scheduledAt\": \"<string>\",\n \"targetLists\": {},\n \"sendTimeOptimization\": true,\n \"spreadOverHours\": 123,\n \"recurringInterval\": \"<string>\"\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://api.sequenzy.com/api/v1/campaigns/{campaignId}/schedule")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"scheduledAt\": \"<string>\",\n \"targetLists\": {},\n \"sendTimeOptimization\": true,\n \"spreadOverHours\": 123,\n \"recurringInterval\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.sequenzy.com/api/v1/campaigns/{campaignId}/schedule")
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 \"scheduledAt\": \"<string>\",\n \"targetLists\": {},\n \"sendTimeOptimization\": true,\n \"spreadOverHours\": 123,\n \"recurringInterval\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"success": true,
"message": "Campaign scheduled for 2026-06-01T14:00:00.000Z",
"scheduledAt": "2026-06-01T14:00:00.000Z",
"jobId": "mock-job-id",
"previewUrl": "https://sequenzy.com/dashboard/company/comp_abc123/campaign/camp_abc123?step=review",
"campaign": {
"id": "camp_abc123",
"name": "April Launch",
"subject": "A quick update",
"status": "scheduled",
"labels": ["edm", "launch"],
"scheduledAt": "2026-06-01T14:00:00.000Z",
"recurringInterval": null,
"url": "https://sequenzy.com/dashboard/company/comp_abc123/campaign/camp_abc123",
"previewUrl": "https://sequenzy.com/dashboard/company/comp_abc123/campaign/camp_abc123?step=review"
}
}
{
"success": true,
"message": "Campaign is awaiting approval before it can be scheduled.",
"scheduledAt": "2026-06-01T14:00:00.000Z",
"previewUrl": "https://sequenzy.com/dashboard/company/comp_abc123/campaign/camp_abc123?step=review",
"campaign": {
"id": "camp_abc123",
"name": "April Launch",
"subject": "A quick update",
"status": "waiting_approval",
"labels": ["edm", "launch"],
"scheduledAt": "2026-06-01T14:00:00.000Z",
"url": "https://sequenzy.com/dashboard/company/comp_abc123/campaign/camp_abc123",
"previewUrl": "https://sequenzy.com/dashboard/company/comp_abc123/campaign/camp_abc123?step=review"
}
}
{
"success": false,
"error": "Scheduled time must be in the future."
}
{
"success": false,
"error": "Sending domain is not verified. Please verify your domain before scheduling emails."
}
{
"success": false,
"error": "Unauthorized"
}
{
"success": false,
"error": "Campaign not found"
}
{
"success": false,
"error": "Campaign is no longer editable. It may have already started sending."
}