Update Campaign
Partially update a campaign. Only the fields you include are changed.
A campaign can be updated only while its status is draft, scheduled, or
failed. Updating a campaign in any other status returns 409 CAMPAIGN_NOT_EDITABLE.
Request
PATCH /campaigns/{uuid}
Path Parameters
| Parameter | Type | Description |
|---|---|---|
uuid | string | Campaign's UUID |
Request Body
All fields are optional. Only include the fields you want to change. Send null
for an optional field to clear it.
| Parameter | Type | Description |
|---|---|---|
name | string | Campaign name (max 255 characters). When provided it must not be empty. |
subject | string|null | Email subject line (max 255 characters). Send null to clear. |
preheader | string|null | Preview text shown after the subject (max 255 characters). Send null to clear. |
from_name | string|null | Sender display name (max 255 characters). Send null to clear. |
reply_to | string|null | Reply-to email address. Send null to clear. |
from_identity | string|null | UUID of a sender identity to send from. Send null to clear. |
list_uuid | string|null | UUID of a contact list to use as the audience. Send null to clear. |
segment_uuid | string|null | UUID of a contact segment to use as the audience. Send null to clear. |
content | string|null | The email body, in Markdown (max 65000 characters). Send null to clear the body. See Campaign body. |
overwrite | boolean | Set true to replace (or clear) a body that carries formatting Markdown can't preserve. Defaults to false. |
from_identity, list_uuid, and segment_uuid must reference resources that
belong to your account; an unknown value returns 422 VALIDATION_ERROR.
The content body accepts a subset of Markdown — headings, bold, italic, links,
lists, blockquotes, code blocks, images, and horizontal rules. Tables,
strikethrough, task lists, inline `code`, and raw HTML are silently dropped
rather than rejected. See Campaign body for the full
list.
If the campaign's existing body reports content_overwrite_required: true — it
carries styling or layout that Markdown can't preserve — writing content
requires overwrite: true, which permanently discards that formatting.
Otherwise the write is rejected with 409 CONTENT_OVERWRITE_REQUIRED. See
Campaign body.
To update other fields of such a campaign while keeping its body as-is, simply
omit content from the request — the body is left untouched. Neither
overwrite nor the 409 CONTENT_OVERWRITE_REQUIRED check applies unless you
actually send a content value (including null to clear it).
Example Request
curl -X PATCH "https://email.easy.tools/api/v1/campaigns/550e8400-e29b-41d4-a716-446655440000" \
-H "Authorization: Bearer YOUR_API_TOKEN" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-d '{
"subject": "Final hours — up to 40% off",
"from_name": "Acme",
"list_uuid": "660e8400-e29b-41d4-a716-446655440001"
}'
Example Request (clearing the audience)
curl -X PATCH "https://email.easy.tools/api/v1/campaigns/550e8400-e29b-41d4-a716-446655440000" \
-H "Authorization: Bearer YOUR_API_TOKEN" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-d '{
"list_uuid": null,
"segment_uuid": null
}'
Example Request (replacing a richer body)
When the campaign reports content_overwrite_required: true, include
overwrite: true to confirm the existing styling or layout is discarded.
curl -X PATCH "https://email.easy.tools/api/v1/campaigns/550e8400-e29b-41d4-a716-446655440000" \
-H "Authorization: Bearer YOUR_API_TOKEN" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-d '{
"content": "## Spring sale\n\nUp to **40% off**. [Shop now](https://acme.com/sale)",
"overwrite": true
}'
Response
Success Response (200 OK)
Returns the full campaign, identical in shape to Get Campaign.
{
"data": {
"uuid": "550e8400-e29b-41d4-a716-446655440000",
"name": "Spring Sale",
"status": "draft",
"subject": "Final hours — up to 40% off",
"preheader": "Our biggest sale of the season",
"from_name": "Acme",
"reply_to": "support@acme.com",
"from_identity": null,
"from_email": null,
"content": "## Spring sale\n\nUp to **40% off**. [Shop now](https://acme.com/sale)",
"content_editable_via_api": true,
"content_overwrite_required": false,
"audience": {
"list_uuid": "660e8400-e29b-41d4-a716-446655440001",
"segment_uuid": null
},
"readiness": {
"can_send": false,
"missing": ["sender_email"]
},
"created_at": "2026-06-24T10:00:00Z",
"updated_at": "2026-06-24T10:12:00Z",
"last_updated_at": "2026-06-24T10:12:00Z"
}
}
See Get Campaign for the full field reference.
Error Responses
Not Found Error (404)
{
"error": {
"code": "RESOURCE_NOT_FOUND",
"message": "Campaign with UUID '550e8400-e29b-41d4-a716-446655440000' not found"
}
}
Conflict Error (409 — Not Editable)
The campaign's status does not allow editing. This is checked first: a campaign
in a non-editable status returns CAMPAIGN_NOT_EDITABLE before any content
check runs.
{
"error": {
"code": "CAMPAIGN_NOT_EDITABLE",
"message": "Campaign cannot be edited because of its current status"
}
}
Conflict Error (409 — Overwrite Required)
A content write would overwrite a body whose formatting Markdown can't preserve
and overwrite was not true. Resend with overwrite: true to replace it. See
Campaign body.
{
"error": {
"code": "CONTENT_OVERWRITE_REQUIRED",
"message": "This campaign's body contains styling Markdown can't preserve; pass overwrite=true to replace it."
}
}
Validation Error (422 Unprocessable Entity)
{
"error": {
"code": "VALIDATION_ERROR",
"message": "The given data was invalid",
"details": {
"list_uuid": ["Contact list not found"]
}
}
}