{
"success": true,
"schedule": {
"id": "6651a3f2e4b0a1c2d3e4f567",
"name": "Weekend Promo",
"status": "draft",
"send_type": "blast",
"source_lists": [],
"audiences": ["665fa1b2c3d4e5f6a7b8c901"],
"is_repeating": true,
"send_time": "14:30",
"send_date": null,
"start_date": "2025-06-01T00:00:00",
"end_date": "2025-08-31T00:00:00",
"days_of_week": {
"monday": false,
"tuesday": false,
"wednesday": false,
"thursday": false,
"friday": true,
"saturday": true,
"sunday": true
},
"skip_within_hours": 24,
"use_local_time": true,
"filter_bots": true,
"is_transactional": false,
"is_mms": false,
"is_cto": false,
"automated_percent": 0,
"ir_revenue": 0,
"blasts": [
{
"message": "Flash sale this weekend! Shop now: {{link1}}",
"offer_links": [
{
"key": "link1",
"offer_id": "665fa1b2c3d4e5f6a7b8c902",
"offer_source": "sms",
"product_id": null,
"variant_id": null,
"custom_url": null,
"url_params": {"utm_source": "sms", "utm_campaign": "weekend"}
}
],
"percent_audience": 60,
"variant_name": "Control",
"mms_image_url": null
},
{
"message": "20% off everything — this weekend only: {{link1}}",
"offer_links": [
{
"key": "link1",
"offer_id": "665fa1b2c3d4e5f6a7b8c902",
"offer_source": "sms",
"product_id": null,
"variant_id": null,
"custom_url": null,
"url_params": {"utm_source": "sms", "utm_campaign": "weekend"}
}
],
"percent_audience": 40,
"variant_name": "Urgency Variant",
"mms_image_url": null
}
],
"created_at": "2025-05-28T10:15:30",
"updated_at": "2025-05-28T10:15:30"
}
}
{
"error": "blasts is required for blast send type",
"code": "missing_blasts"
}
{
"error": "Invalid credentials",
"code": "invalid_credentials"
}
{
"error": "Audience not found: 665fa1b2c3d4e5f6a7b8c901",
"code": "audience_not_found"
}
Schedules (v2)
Create Schedule or Blast
Create an inline SMS/MMS blast and optionally save its text and links as reusable creatives.
POST
/
v2
/
schedules
{
"success": true,
"schedule": {
"id": "6651a3f2e4b0a1c2d3e4f567",
"name": "Weekend Promo",
"status": "draft",
"send_type": "blast",
"source_lists": [],
"audiences": ["665fa1b2c3d4e5f6a7b8c901"],
"is_repeating": true,
"send_time": "14:30",
"send_date": null,
"start_date": "2025-06-01T00:00:00",
"end_date": "2025-08-31T00:00:00",
"days_of_week": {
"monday": false,
"tuesday": false,
"wednesday": false,
"thursday": false,
"friday": true,
"saturday": true,
"sunday": true
},
"skip_within_hours": 24,
"use_local_time": true,
"filter_bots": true,
"is_transactional": false,
"is_mms": false,
"is_cto": false,
"automated_percent": 0,
"ir_revenue": 0,
"blasts": [
{
"message": "Flash sale this weekend! Shop now: {{link1}}",
"offer_links": [
{
"key": "link1",
"offer_id": "665fa1b2c3d4e5f6a7b8c902",
"offer_source": "sms",
"product_id": null,
"variant_id": null,
"custom_url": null,
"url_params": {"utm_source": "sms", "utm_campaign": "weekend"}
}
],
"percent_audience": 60,
"variant_name": "Control",
"mms_image_url": null
},
{
"message": "20% off everything — this weekend only: {{link1}}",
"offer_links": [
{
"key": "link1",
"offer_id": "665fa1b2c3d4e5f6a7b8c902",
"offer_source": "sms",
"product_id": null,
"variant_id": null,
"custom_url": null,
"url_params": {"utm_source": "sms", "utm_campaign": "weekend"}
}
],
"percent_audience": 40,
"variant_name": "Urgency Variant",
"mms_image_url": null
}
],
"created_at": "2025-05-28T10:15:30",
"updated_at": "2025-05-28T10:15:30"
}
}
{
"error": "blasts is required for blast send type",
"code": "missing_blasts"
}
{
"error": "Invalid credentials",
"code": "invalid_credentials"
}
{
"error": "Audience not found: 665fa1b2c3d4e5f6a7b8c901",
"code": "audience_not_found"
}
Keys requiring send approval cannot create schedules, including drafts (
A successful request returns HTTP
Relevant fields from the HTTP
Use
For text without placeholders, omit
403 confirmation_required). Reads and stop remain available. Use pending sends for approved single or bulk SMS.
Create a new schedule to send SMS or MMS messages to one or more audiences. Schedules can be one-time or repeating, and support multiple blast variants for A/B testing.
API keys with a daily send cap cannot create schedules, including drafts. Scheduled sends do not enforce the key’s daily allowance, so these requests return 403 schedule_not_allowed_for_capped_key without creating a schedule. Every source list must also be allowed by the key’s send_policy.list_numbers.
Keys with list restrictions must supply nonempty source_lists. Omitting this field or sending [] selects all active account lists during execution, so restricted keys cannot use that default. The server validates current key policy and saves the schedule in one transaction; concurrent policy changes cannot retain the earlier permission to create it.
Create a one-time blast
UsePOST https://api.tracklysms.com/api/v2/schedules with a live API key that has no daily send cap
and does not require send approval. Put the key in the X-Api-Key header. Choose an active
audience and allowed
sending lists from the same account. Only keys without list
restrictions may omit source_lists.
This example creates a draft. Replace the example IDs and choose your send date and time:
curl -X POST "https://api.tracklysms.com/api/v2/schedules" \
-H "X-Api-Key: trk_your_api_key_here" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: january-promo-2027-01-15" \
-d '{
"name": "January Promo",
"status": "draft",
"send_type": "blast",
"source_lists": [42],
"audiences": ["665fa1b2c3d4e5f6a7b8c901"],
"is_repeating": false,
"send_date": "2027-01-15",
"send_time": "14:30",
"use_local_time": false,
"blasts": [{
"message": "Our January sale starts today! Reply STOP to opt out.",
"percent_audience": 100
}]
}'
201 with success: true and the new ID in schedule.id.
Supply message text directly in blasts[].message; no saved creative or creative ID is required.
Plain text without link placeholders needs no offer_links. Each {{linkN}} placeholder
requires a mapping with a unique key and either an offer_id from your account or an
public HTTPS custom_url, never both. Different placeholders can use different destinations.
To reuse a saved creative, copy its message
and offer_links into the blast object. This endpoint accepts SMS offer bindings
(offer_source omitted or sms) and custom URLs. OMS offer bindings are not supported
here; use the app’s blast editor for creatives containing OMS offers.
Set status to on in the creation request to activate the blast for its scheduled date and time.
If you create a draft first, activate it with
PUT /v2/schedules/{schedule_id} and {"status":"on"}.
The default draft status and off status do not start sending.
Schedule creation and activation do not provide sandbox simulation; use draft to review without sending.
With use_local_time: false, send_time uses the account timezone. With true, it uses
each recipient’s local timezone. Creation and activation return the schedule; delivery happens
through the scheduler and remains subject to the normal sending checks.
Use a distinct Idempotency-Key for each intended blast and reuse it
with the same request body when retrying that creation request.
Also save a reusable creative
By default, creating a blast saves only the schedule. On any variant you want to keep for later manual sends, setsave_as_creative: true. This option works only on POST with
send_type: "blast". Set creative_name to choose its name; otherwise the name comes from
variant_name, falling back to the schedule’s name.
This request creates a draft with a custom link and saves its text and link mapping as a creative:
curl -X POST "https://api.tracklysms.com/api/v2/schedules" \
-H "X-Api-Key: trk_your_live_api_key_here" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: january-promo-with-creative-2027-01-15" \
-d '{
"name": "January Promo",
"status": "draft",
"send_type": "blast",
"source_lists": [42],
"audiences": ["665fa1b2c3d4e5f6a7b8c901"],
"is_repeating": false,
"send_date": "2027-01-15",
"send_time": "14:30",
"blasts": [{
"message": "Shop our January sale: {{link1}} Reply STOP to opt out.",
"offer_links": [{"key": "link1", "custom_url": "https://example.com/january-sale"}],
"percent_audience": 100,
"save_as_creative": true,
"creative_name": "January Sale Text"
}]
}'
201 response are shown below; schedule also contains
the full schedule configuration:
{
"success": true,
"schedule": {"id": "6651a3f2e4b0a1c2d3e4f567", "status": "draft"},
"saved_creatives": [{"blast_index": 0, "creative_id": 101, "name": "January Sale Text"}],
"creative_save_errors": []
}
schedule.id to retrieve or activate the schedule. Use each integer creative_id with
GET /v2/creatives/{id} to retrieve the saved asset.
In the blast editor, choose Use existing creative to reuse it. Plain-text and custom-link-only
assets are listed under Creatives without offers; offer-backed assets appear under their offer.
blast_index is the zero-based position in your submitted blasts array. Both result arrays
appear only when at least one variant requests saving; either array can be empty.
Each saved creative is active with creative_type: "one_time" for manual sends. It snapshots
the variant’s message and offer/custom-link mappings. Its list controls use include with
the schedule’s source_lists, or all when those lists are omitted or empty. These are
independent records: editing or archiving the schedule does not change the creative, and
editing the creative does not change the schedule. MMS images stay on the schedule and are
not included in the saved creative.
When saving a creative fails
Request validation happens before creation. Invalid save options or link mappings return HTTP400. A 403 key-policy rejection creates neither the schedule nor its optional
creatives. After validation and policy admission, the schedule is saved first. If a creative save then
fails, the request still returns HTTP 201, success: true, and schedule.id. Inspect
creative_save_errors even on success; each failure includes blast_index,
code: "creative_save_failed", and a safe error message. Other requested creatives may have saved.
The schedule remains valid and can send when its status is on. Do not submit another
schedule with a new idempotency key to retry a failed creative save: that creates another
blast. Within the 24-hour cache window, an identical request with the same key replays the
original response, including creative-save errors; it does not retry those saves. The
idempotency limitations still apply.
To recover a failed asset save, create only the creative through
POST /v2/creatives. Use the failed variant’s
original text and links with creative_type: "one_time". For the custom-link example above:
curl -X POST "https://api.tracklysms.com/api/v2/creatives" \
-H "X-Api-Key: trk_your_live_api_key_here" \
-H "Content-Type: application/json" \
-d '{
"name": "January Sale Text",
"message": "Shop our January sale: {{link1}} Reply STOP to opt out.",
"offer_links": [{"key": "link1", "custom_url": "https://example.com/january-sale"}],
"creative_type": "one_time",
"status": "active",
"list_control_mode": "include",
"list_control_ids": [42]
}'
offer_links or send []. To match an original schedule
with no source_lists, use list_control_mode: "all" and list_control_ids: []. HTTP 201
returns the asset ID in creative.id. This creates no schedule and sends no messages.
The dedicated creative endpoint does not support Idempotency-Key; if its response is
uncertain, check existing creatives before retrying.
Body Parameters
string
required
A descriptive name for this schedule.
string
required
The type of schedule. Must be
blast or automated.array of strings
required
Array of audience IDs to target. Each audience must exist and be active on your account.
boolean
required
Set to
true for a recurring schedule that runs on selected days of the week, or false for a one-time send.string
required
Time of day to send, in
HH:MM format (24-hour clock). For example, "14:30" for 2:30 PM.array of integers
IDs of source sending lists. Each list must exist on your account. Required and nonempty for keys with list restrictions; unrestricted keys may omit it or use
[] to select all active account lists.string
default:"draft"
Initial status. Allowed values:
draft, off, on. Defaults to draft. Use on to activate the scheduled send; draft and off do not send.datetime
required
The date to send for a one-time schedule. Required when
is_repeating is false.datetime
required
The first date the repeating schedule should run. Required when
is_repeating is true.datetime
required
The last date the repeating schedule should run. Required when
is_repeating is true.object
required
An object specifying which days the schedule should run. Keys:
monday, tuesday, wednesday, thursday, friday, saturday, sunday. Values are booleans. At least one day must be true.float
default:"0"
Skip sending to a contact if they were already sent to within this many hours. Set to
0 to disable.boolean
default:"false"
When
true, send_time is interpreted in each recipient’s local timezone rather than the account timezone.boolean
default:"false"
Enable bot filtering to display an interstitial page for suspected bots instead of the message.
boolean
default:"false"
Set to
true to send MMS messages with image attachments. Every blast variant must then include mms_image_url, including when creating a draft.boolean
default:"false"
Enable click-to-open mode.
float
default:"0"
Percentage of the audience to allocate to automated (ML-powered) creative selection. Value between
0 and 100.float
default:"0"
Expected or target revenue from this send. This value is for reporting only — it has no effect on audience selection or send optimization.
array
required
Array of blast variant objects. Required when
send_type is blast.Show Blast object properties
Show Blast object properties
string
required
Inline message text, 1–1600 characters, containing non-whitespace text. Every variant must pass content checks, including when you do not save it as a creative. No saved creative is required. Plain text with no link placeholders is valid. If you use
{{link1}}, {{link2}}, etc., supply a mapping for each placeholder.array
Omit this array or use
[] for text without link placeholders. Every mapping requires a unique linkN key and exactly one destination:key(string, required) — placeholder key, e.g."link1"; unique within this variant.offer_id(string) — ID of an offer belonging to your account. Use this orcustom_url, never both.custom_url(string) — public HTTPS URL, at most 2048 characters, with no credentials, whitespace, or backslashes. Use this oroffer_id, never both.url_params(object, optional) — additional URL query parameters as a key/value object.
float
required
Required on every variant: a finite number from
0 to 100. Values across all variants must total 100 (rounding tolerance: 0.01). Missing values, strings, and booleans are rejected.string
A label for this variant (e.g. “Control”, “Variant A”).
string
HTTP(S) URL of an image to attach as MMS, required for every variant when
is_mms is true. The image must be accessible when the message is sent. The image is not copied when saving a reusable creative.boolean
default:"false"
Also save this variant’s text and links as an independent, active
one_time creative for manual sends. Available only on schedule creation with send_type: "blast". Saving does not activate a draft schedule. Saved text must pass the creative content checks.string
Name for the saved creative. Requires
save_as_creative: true; must contain non-whitespace text and be 1–255 characters. Defaults to variant_name, or the schedule’s name when no variant name is set. Surrounding whitespace is trimmed.Response Fields
boolean
true if the schedule was created successfully.object
The full schedule object, including all fields and the generated
id. See List Schedules for the complete schedule object schema.array
Present only when at least one variant requested
save_as_creative: true. Each successful save contains blast_index (zero-based integer), creative_id (integer), and name (string). Empty when no requested save succeeded.array
Present only when at least one variant requested
save_as_creative: true. Each failed save contains blast_index (zero-based integer), code: "creative_save_failed", and error (string). Empty when all requested saves succeeded. An entry does not undo the successful schedule creation or change HTTP 201.Examples
cURL
curl -X POST "https://api.tracklysms.com/api/v2/schedules" \
-H "X-Api-Key: trk_your_api_key_here" \
-H "Content-Type: application/json" \
-d '{
"name": "Weekend Promo",
"send_type": "blast",
"audiences": ["665fa1b2c3d4e5f6a7b8c901"],
"is_repeating": true,
"send_time": "14:30",
"start_date": "2025-06-01T00:00:00",
"end_date": "2025-08-31T00:00:00",
"days_of_week": {
"monday": false,
"tuesday": false,
"wednesday": false,
"thursday": false,
"friday": true,
"saturday": true,
"sunday": true
},
"skip_within_hours": 24,
"use_local_time": true,
"filter_bots": true,
"blasts": [
{
"message": "Flash sale this weekend! Shop now: {{link1}}",
"offer_links": [
{
"key": "link1",
"offer_id": "665fa1b2c3d4e5f6a7b8c902",
"url_params": {"utm_source": "sms", "utm_campaign": "weekend"}
}
],
"percent_audience": 60,
"variant_name": "Control"
},
{
"message": "20% off everything — this weekend only: {{link1}}",
"offer_links": [
{
"key": "link1",
"offer_id": "665fa1b2c3d4e5f6a7b8c902",
"url_params": {"utm_source": "sms", "utm_campaign": "weekend"}
}
],
"percent_audience": 40,
"variant_name": "Urgency Variant"
}
]
}'
Python
import requests
payload = {
"name": "Weekend Promo",
"send_type": "blast",
"audiences": ["665fa1b2c3d4e5f6a7b8c901"],
"is_repeating": True,
"send_time": "14:30",
"start_date": "2025-06-01T00:00:00",
"end_date": "2025-08-31T00:00:00",
"days_of_week": {
"monday": False,
"tuesday": False,
"wednesday": False,
"thursday": False,
"friday": True,
"saturday": True,
"sunday": True,
},
"skip_within_hours": 24,
"use_local_time": True,
"filter_bots": True,
"blasts": [
{
"message": "Flash sale this weekend! Shop now: {{link1}}",
"offer_links": [
{
"key": "link1",
"offer_id": "665fa1b2c3d4e5f6a7b8c902",
"url_params": {"utm_source": "sms", "utm_campaign": "weekend"},
}
],
"percent_audience": 60,
"variant_name": "Control",
},
{
"message": "20% off everything — this weekend only: {{link1}}",
"offer_links": [
{
"key": "link1",
"offer_id": "665fa1b2c3d4e5f6a7b8c902",
"url_params": {"utm_source": "sms", "utm_campaign": "weekend"},
}
],
"percent_audience": 40,
"variant_name": "Urgency Variant",
},
],
}
response = requests.post(
"https://api.tracklysms.com/api/v2/schedules",
headers={
"X-Api-Key": "trk_your_api_key_here",
"Content-Type": "application/json",
},
json=payload,
)
data = response.json()
print(f"Created schedule: {data['schedule']['id']}")
Node.js
const payload = {
name: "Weekend Promo",
send_type: "blast",
audiences: ["665fa1b2c3d4e5f6a7b8c901"],
is_repeating: true,
send_time: "14:30",
start_date: "2025-06-01T00:00:00",
end_date: "2025-08-31T00:00:00",
days_of_week: {
monday: false,
tuesday: false,
wednesday: false,
thursday: false,
friday: true,
saturday: true,
sunday: true
},
skip_within_hours: 24,
use_local_time: true,
filter_bots: true,
blasts: [
{
message: "Flash sale this weekend! Shop now: {{link1}}",
offer_links: [
{
key: "link1",
offer_id: "665fa1b2c3d4e5f6a7b8c902",
url_params: { utm_source: "sms", utm_campaign: "weekend" }
}
],
percent_audience: 60,
variant_name: "Control"
},
{
message: "20% off everything — this weekend only: {{link1}}",
offer_links: [
{
key: "link1",
offer_id: "665fa1b2c3d4e5f6a7b8c902",
url_params: { utm_source: "sms", utm_campaign: "weekend" }
}
],
percent_audience: 40,
variant_name: "Urgency Variant"
}
]
};
const response = await fetch("https://api.tracklysms.com/api/v2/schedules", {
method: "POST",
headers: {
"X-Api-Key": "trk_your_api_key_here",
"Content-Type": "application/json"
},
body: JSON.stringify(payload)
});
const data = await response.json();
console.log(`Created schedule: ${data.schedule.id}`);
{
"success": true,
"schedule": {
"id": "6651a3f2e4b0a1c2d3e4f567",
"name": "Weekend Promo",
"status": "draft",
"send_type": "blast",
"source_lists": [],
"audiences": ["665fa1b2c3d4e5f6a7b8c901"],
"is_repeating": true,
"send_time": "14:30",
"send_date": null,
"start_date": "2025-06-01T00:00:00",
"end_date": "2025-08-31T00:00:00",
"days_of_week": {
"monday": false,
"tuesday": false,
"wednesday": false,
"thursday": false,
"friday": true,
"saturday": true,
"sunday": true
},
"skip_within_hours": 24,
"use_local_time": true,
"filter_bots": true,
"is_transactional": false,
"is_mms": false,
"is_cto": false,
"automated_percent": 0,
"ir_revenue": 0,
"blasts": [
{
"message": "Flash sale this weekend! Shop now: {{link1}}",
"offer_links": [
{
"key": "link1",
"offer_id": "665fa1b2c3d4e5f6a7b8c902",
"offer_source": "sms",
"product_id": null,
"variant_id": null,
"custom_url": null,
"url_params": {"utm_source": "sms", "utm_campaign": "weekend"}
}
],
"percent_audience": 60,
"variant_name": "Control",
"mms_image_url": null
},
{
"message": "20% off everything — this weekend only: {{link1}}",
"offer_links": [
{
"key": "link1",
"offer_id": "665fa1b2c3d4e5f6a7b8c902",
"offer_source": "sms",
"product_id": null,
"variant_id": null,
"custom_url": null,
"url_params": {"utm_source": "sms", "utm_campaign": "weekend"}
}
],
"percent_audience": 40,
"variant_name": "Urgency Variant",
"mms_image_url": null
}
],
"created_at": "2025-05-28T10:15:30",
"updated_at": "2025-05-28T10:15:30"
}
}
{
"error": "blasts is required for blast send type",
"code": "missing_blasts"
}
{
"error": "Invalid credentials",
"code": "invalid_credentials"
}
{
"error": "Audience not found: 665fa1b2c3d4e5f6a7b8c901",
"code": "audience_not_found"
}
Error Codes
| HTTP Status | Error Code | Description |
|---|---|---|
| 400 | missing_name | The name field is required. |
| 400 | missing_send_type | The send_type field is required. |
| 400 | invalid_send_type | send_type must be blast or automated. |
| 400 | missing_is_repeating | The is_repeating field is required. |
| 400 | missing_send_time | The send_time field is required. |
| 400 | missing_audiences | At least one audience ID is required. |
| 400 | invalid_status | status must be draft, off, or on. |
| 400 | missing_send_date | send_date is required for one-time (non-repeating) schedules. |
| 400 | missing_start_date | start_date is required for repeating schedules. |
| 400 | missing_end_date | end_date is required for repeating schedules. |
| 400 | no_days_selected | At least one day must be true in days_of_week for repeating schedules. |
| 400 | missing_blasts | Blast variants are required when send_type is blast. |
| 400 | invalid_blasts | blasts must be an array of objects. |
| 400 | invalid_blast_percent | Each percentage must be a finite number from 0 to 100; values must total 100 within 0.01. |
| 400 | missing_blast_message | Each blast variant must include a message. |
| 400 | invalid_blast_message | Every message must contain 1–1600 characters and non-whitespace text and pass content checks, whether or not it is saved as a creative. |
| 400 | invalid_mms_image_url | With MMS enabled, every blast variant requires a valid HTTP(S) mms_image_url. |
| 400 | invalid_save_as_creative | save_as_creative must be a boolean and requires send_type: "blast". |
| 400 | invalid_creative_name | creative_name requires save_as_creative: true and 1–255 characters containing non-whitespace text. |
| 400 | invalid_offer_links | Link mappings must have unique linkN keys, exactly one destination, object url_params, and cover every message placeholder. |
| 400 | invalid_custom_url | custom_url must be a valid public HTTPS URL without credentials, at most 2048 characters. |
| 400 | invalid_numeric | skip_within_hours, automated_percent, or ir_revenue is not a number. |
| 400 | invalid_audience_id | An audience ID is not a valid identifier. |
| 400 | audience_not_found | One or more audience IDs do not exist or are not active. |
| 400 | source_list_not_found | One or more source list IDs do not exist on this account. |
| 403 | list_not_allowed_for_key | A source list is outside the key’s allowlist, or a restricted key omitted source_lists or supplied [] (see Who Am I). |
| 403 | schedule_not_allowed_for_capped_key | The API key has a daily send cap and cannot create schedules. |
| 503 | send_cap_unavailable | Current key policy or transactional schedule persistence is unavailable, including policy changes after authentication. Retry with current credentials. |
| 409 | schedule_write_outcome_unknown | The server cannot confirm whether the schedule was created. The response includes schedule_id and retryable: false; inspect that schedule before any retry. |
| 400 | invalid_offer_id | An offer ID referenced in offer_links is not a valid identifier. |
| 400 | offer_not_found | One or more offer IDs referenced in offer_links do not exist. |
| 401 | invalid_credentials | API key is missing, invalid, or revoked. |
| 403 | account_suspended | Your account is suspended. Resolve outstanding billing or contact support. |
| 403 | confirmation_required | This key requires send approval and cannot create schedules, including drafts. Use the pending-send flow for approved single or bulk SMS. |
| 503 | send_policy_unavailable | The key’s confirmation policy cannot be verified; schedule creation is blocked. |
creative_save_failed appears inside creative_save_errors on HTTP 201, not as a
request-validation error. The schedule was created successfully; retain its ID and inspect
the per-variant results. See When saving a creative fails.
Next Steps
Campaign Scheduling
Learn scheduling best practices
List Audiences
Find audiences for your campaign