---
title: "Schedule campaign"
method: POST
path: "/campaigns/{campaignId}/schedule"
tags: ["Campaigns"]
---

# Schedule campaign

`POST /campaigns/{campaignId}/schedule`

Schedules a draft or already scheduled campaign for a future send time. Requires a verified sending domain. Campaigns that require safety review are held in waiting_approval and scheduled after a reviewer approves them. A waiting_approval result is a normal 200 outcome and is most common on new accounts and recently registered sending domains; retrying the schedule call does not clear the hold, so branch on campaign.status and poll GET /campaigns/{campaignId} instead. See https://docs.sequenzy.com/concepts/campaigns#safety-review

## Path parameters

- `campaignId` string, required

## Request body

- object
  - `scheduledAt` string, date-time, required — Future send time.
  - `targetLists` object — Optional targeting object. Omit to reuse saved targeting or default to all active subscribers.
  - `sendTimeOptimization` boolean — Whether to use send-time optimization.
  - `spreadOverHours` number, nullable — Spread delivery over this many hours. When set, spread delivery takes precedence over send-time optimization.
  - `recurringInterval` 'weekly' | 'monthly', nullable — Repeat the campaign on a cadence starting at scheduledAt. The campaign becomes a recurring template - each run is duplicated and sent automatically, re-evaluating audience membership every time. Omit or send null for a one-shot send; scheduling again without it stops the recurrence.

## Response `200`

Campaign scheduled successfully

- object
  - `success` boolean, required
  - `message` string — Scheduling result message. If the campaign requires review, it is held in waiting_approval instead of queueing a send job.
  - `scheduledAt` string, date-time, required
  - `jobId` string, nullable
  - `previewUrl` string, uri, required
  - `campaign` object, required
    - `id` string
    - `name` string
    - `subject` string
    - `status` 'scheduled' | 'waiting_approval' — `scheduled` when the send job was queued. `waiting_approval` when the campaign was held for safety review - common on new accounts and recently registered sending domains - in which case no send job is queued and jobId is omitted.
    - `labels` string[]
    - `scheduledAt` string, date-time
    - `url` string, uri
    - `previewUrl` string, uri

## Other responses

- `400` — Validation error, invalid schedule time, or unverified sending domain
- `401` — Unauthorized
- `404` — Campaign or sender profile not found
- `409` — Campaign is no longer editable

---

[API](https://skmtc.net/sequenzy/apis/sequenzy-api.md) · [All operations](https://skmtc.net/sequenzy/apis/sequenzy-api/llms.txt) · [OpenAPI document](https://skmtc-service-staging.skmtc.workers.dev/v1/apis/sequenzy/sequenzy-api/versions/af1cf9620482/schema)
