---
title: "Update campaign sequence"
method: POST
path: "/api/v1/tools/update_campaign_sequence"
tags: ["default"]
---

# Update campaign sequence

`POST /api/v1/tools/update_campaign_sequence`

## Request

- Base URL: `https://www.affiliatespy.io`
- URL: `https://www.affiliatespy.io/api/v1/tools/update_campaign_sequence`
- Auth: HTTP bearer

Edit one step of a campaign's email sequence (subject, body, delay), as the dashboard's email editor does; on a live campaign the change applies to every enrolled recipient's next unsent step. Follow-ups always reply in step 1's thread as Re: plus its subject, so subject is for step 1 only. Website copy must pass the check enrolment runs (no links, bare domains, stock phrases, unknown tokens or empty offer), else nothing is saved. Website copy personalises with tokens such as {{greeting}}, {{opener}}, {{tease_pitch}}, {{offer_pitch}} and {{signoff}}: get_campaign shows a campaign's templates and preview_campaign_step renders one for a site.

## Request body

- object
  - `campaign_id` string, uuid, required: A campaign id from list_campaigns.
  - `step` integer, required: The step to edit, 1 for the opener.
  - `subject` string: Step 1 only.
  - `body` string: The body template, with {{tokens}}.
  - `delay_days` integer: Days after step 1 this step is due (step 1 goes at enrolment).
  - `confirm` boolean: Set true after the user confirmed an action the guard flagged as hard to undo.

## Response `200`

The tool's JSON result (same payload the MCP tool returns).

- unknown

## Other responses

- `400`: Arguments failed validation; body lists the issues.
- `401`: Missing or invalid API key.
- `403`: Guarded tool with Unrestricted MCP off.
- `429`: Rate limited (60 requests per minute per key).

---

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