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

# Schedule a campaign

`POST /campaigns/{campaignId}/schedule`

## Request

- Base URL: `https://app.lettr.com/api`
- URL: `https://app.lettr.com/api/campaigns/{campaignId}/schedule`
- Auth: HTTP bearer

Schedules a campaign for future delivery, or reschedules an already-scheduled campaign to a new time. The campaign transitions to (or stays) `scheduled` and is dispatched automatically at the given time. Requires the `campaigns:write` scope. Not available to sandbox keys.

## Path parameters

- `campaignId` string, uuid, required

## Request body

- ScheduleCampaignRequest
  - `scheduled_at` string, date-time, required: Future delivery time (ISO 8601). Include a timezone offset (e.g. `+02:00` or `Z`); a value without an offset is interpreted as UTC. Must be in the future.

## Response `200`

Campaign scheduled for delivery.

- CampaignActionResponse
  - `message` string, required
  - `data` CampaignSummary: Campaign summary with embedded engagement stats.
    - `id` string, uuid, required
    - `name` string, required
    - `subject` string, nullable: Email subject line
    - `from_email` string, email, nullable: Sender email address
    - `from_name` string, nullable: Sender display name
    - `reply_to` string, email, nullable: Reply-to address
    - `status` 'draft' | 'scheduled' | 'preparing' | 'in_review' | 'sending' | 'sent' | 'failed', required
    - `scheduled_at` string, date-time, nullable: Scheduled delivery time (ISO 8601)
    - `total_recipients` integer, nullable: Total recipients resolved for the send
    - `sent_count` integer, required
    - `sent_at` string, date-time, nullable: When the campaign finished sending (ISO 8601)
    - `created_at` string, date-time, required
    - `stats` CampaignStats, required: Aggregated engagement statistics for a campaign.
      - `injections` integer, required
      - `deliveries` integer, required
      - `bounces` integer, required
      - `spam_complaints` integer, required
      - `opens` integer, required
      - `unique_opens` integer, required
      - `clicks` integer, required
      - `unique_clicks` integer, required
      - `unsubscribes` integer, required

## Other responses

- `401`: Unauthorized - Missing or invalid API key
- `403`: Forbidden - API key does not have the required scope
- `404`: Resource not found
- `422`: Validation error (invalid or missing `scheduled_at`), or `campaign_not_sendable` when the campaign is not a draft or scheduled campaign, or is missing a subject, sender, or content.
- `500`: Internal server error
- `503`: Service unavailable - the API key could not be verified, so the request was not processed. This does not mean the key is invalid; retry after the delay given in the Retry-After header.

---

[API](https://skmtc.dev/lettr/apis/lettr-api.md) · [All operations](https://skmtc.dev/lettr/apis/lettr-api/llms.txt) · [OpenAPI document](https://skmtc.dev/lettr/apis/lettr-api/revisions/48ef0dac1ebd?raw)
