---
title: "Update a draft campaign"
method: PATCH
path: "/campaigns/{id}"
tags: ["Campaigns"]
---

# Update a draft campaign

`PATCH /campaigns/{id}`

## Request

- Base URL: `https://sending.dev/api/v1`
- URL: `https://sending.dev/api/v1/campaigns/{id}`
- Auth: HTTP bearer

Updates only the fields present in the body: fixing a draft does not require recreating it. After scheduling the content is frozen and the change is rejected. Required scope: `campaigns:write`.

## Path parameters

- `id` string, required: Campaign ID.

## Request body

- UpdateCampaignDraft
  - `name` string
  - `fromAddress` string, email
  - `listId` string, uuid, nullable
  - `segmentId` string, uuid, nullable
  - `templateId` string, uuid, nullable
  - `subject` string
  - `html` string
  - `disableTracking` boolean
  - `disableClickTracking` boolean
  - `disableUtm` boolean

## Response `200`

Campaign updated.

- object
  - `campaign` Campaign, required
    - `id` string, uuid, required
    - `name` string, required
    - `status` string, required
    - `listId` string, uuid, nullable
    - `segmentId` string, uuid, nullable
    - `scheduledAt` string, date-time, nullable
    - `completedAt` string, date-time, nullable
    - `recipientCount` integer
    - `createdAt` string, date-time
    - `metrics` object, nullable: Only with `?metrics=1`; `null` for campaigns without messages.
      - `recipients` integer, required
      - `delivered` integer, required
      - `uniqueOpens` integer, required: Messages with at least one human open.
      - `uniqueClicks` integer, required
      - `contentClicks` integer, required
      - `unsubscribes` integer, required
      - `hardBounces` integer, required
      - `softBounces` integer, required
      - `openRate` number, nullable, required
      - `clickRate` number, nullable, required
      - `clickToOpenRate` number, nullable, required
      - `unsubscribeRate` number, nullable, required
      - `bounceRate` number, nullable, required
  - `warnings` string[]: Non-blocking warnings: present only when there is something to report, e.g. {{...}} variables that match no contact field.

## Other responses

- `401`: Missing or invalid token.
- `403`: Insufficient scope.
- `404`: Resource not found.
- `409`: State conflict (e.g. duplicate).
- `422`: Invalid input.

---

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