---
title: "Update a Sequence Step"
method: PATCH
path: "/v1/sequences/{sequence_id}/steps/{step_id}"
tags: ["Sequences"]
---

# Update a Sequence Step

`PATCH /v1/sequences/{sequence_id}/steps/{step_id}`

## Request

- Base URL: `https://api.monaco.com`
- URL: `https://api.monaco.com/v1/sequences/{sequence_id}/steps/{step_id}`
- Auth: none declared

Updates the copy on a single step of a sequence. `step_id` is the `id` of the entry in the sequence's `tasks` list (from `get_sequence`). Supports `message` on email, InMail, LinkedIn message, LinkedIn connection-note, and gifting-email steps, and `subject` on email, InMail, and gifting-email steps. Any supported step that exists and has not been completed can be edited. Only the fields you provide are updated, and omitted fields are left unchanged. Returns the refreshed step. Template variables must be namespaced. Supported tokens are `{{recipient.first_name}}`, `{{recipient.last_name}}`, `{{recipient.company}}`, `{{recipient.email}}`, `{{recipient.title}}`, `{{recipient.location}}`, `{{recipient.notes}}`, `{{sender.first_name}}`, `{{sender.last_name}}`, `{{sender.company}}`, `{{sender.title}}`, `{{sender.email}}`, `{{account.industries}}`, `{{account.notes}}`, and `{{account.description}}`. Custom fields are referenced as `{{recipient.<custom-field-id>}}` or `{{account.<custom-field-id>}}`.

## Path parameters

- `sequence_id` string, uuid, required
- `step_id` string, uuid, required

## Request body

- UpdateSequenceStepRequest: Copy edits for a single sequence step (a per-contact campaign task).
  - `message` string, nullable: New message body for the step. Supported on email, InMail, LinkedIn message, LinkedIn connection-note, and gifting-email steps. Provide final per-contact copy as plain text — unresolved placeholders like `{{first_name}}` and HTML are rejected. LinkedIn connection notes can be up to 300 characters, but a free LinkedIn account can only send notes up to 200, so a longer note fails to send from a free account.
  - `subject` string, nullable: New subject line for the step. Only supported on subject-bearing channels (email, InMail, gifting email). On an InMail step, an empty string clears the subject; email and gifting-email steps require a non-empty subject.

## Response `200`

Successful Response

- PublicItemResponseSequenceTaskResponse
  - `data` SequenceTaskResponse, required: Task within a sequence.
    - `id` string, required: Unique identifier for the task
    - `sequence_id` string, required: ID of the sequence this task belongs to
    - `order` integer, required: Position of the task within the sequence (1-indexed)
    - `name` string, nullable: Display name of the task
    - `type` 'generic' | 'auto_email' | 'manual_email' | 'auto_linkedin_connection' | 'manual_linkedin_connection' | 'auto_linkedin_message' | 'manual_linkedin_message' | 'auto_linkedin_inmail' | 'manual_linkedin_inmail' | 'auto_phone' | 'manual_phone' | 'internal_email' | 'gifting_via_email' | 'gifting_via_address' | 'complete_sequence', required
    - `status` 'unknown' | 'scheduled' | 'pending' | 'in_progress' | 'paused' | 'completed' | 'failed' | 'cancelled' | 'skipped', required
    - `scheduled_at` string, date-time, required: Date and time the task is scheduled for
    - `completed_at` string, date-time, nullable: Date and time the task was completed
    - `task_body` string, nullable: Task message body
    - `subject` string, nullable: Subject line, for subject-bearing channels (email, InMail, gifting email)
    - `outcome` 'cannot_send' | 'positive_reply' | 'negative_reply' | 'noncommital_reply' | 'email_not_found' | 'email_enrichment_failed' | 'email_transient_provider_error' | 'email_verification_failed' | 'email_verification_unavailable' | 'email_bounced' | 'contact_not_enrichable' | 'no_sending_mailbox' | 'mailbox_token_expired' | 'out_of_office' | 'message_opened' | 'link_opened' | 'accepted' | 'declined' | 'profile_unreachable' | 'linkedin_not_found' | 'linkedin_connection_limit_exceeded' | 'linkedin_already_invited_recently' | 'linkedin_cannot_resend_yet' | 'linkedin_invitation_declined_previously' | 'linkedin_account_disconnected' | 'linkedin_no_inmail_credits' | 'linkedin_seat_without_inmail' | 'linkedin_transient_provider_error' | 'linkedin_self_invite' | 'linkedin_already_connected' | 'linkedin_account_paused' | 'incoming_comms_blocked' | 'not_connected' | 'connection_note_too_long' | 'linkedin_access_restricted' | 'linkedin_subscription_required' | 'linkedin_inmail_not_accepted' | 'linkedin_request_rejected' | 'linkedin_empty_message' | 'meeting_scheduled' | 'interested' | 'not_interested' | 'call_back_later' | 'voicemail' | 'invalid_or_wrong_number' | 'gift_shipped' | 'gift_delivered' | 'gift_opened' | 'gift_thank_you_added' | 'gift_refunded' | 'gift_cancelled' | 'connection_not_accepted' | 'previous_task_incomplete' | 'do_not_contact' | 'message_evaluation_blocked' | 'account_status_excluded' | 'phone_not_found'
    - `hold_reason` 'not_connected' | 'inmail_not_in_plan' | 'rate_limited' | 'out_of_inmail_credits'
    - `hold_until` string, date-time, nullable: When the engine will try the task again, if the hold clears on its own
  - `meta` ResponseMeta
    - `timestamp` string, date-time: Server timestamp of the response

## Other responses

- `404`: Step not found
- `422`: Invalid copy for this step
- `4XX`: Client error

## Changes

- **2026-11-03** `fc720ada2a81`: 1 info
  - endpoint added

[Operation history](https://skmtc.dev/monaco/apis/monaco-public-api/changes/v1/sequences/:sequence_id/steps/:step_id/patch.md)

---

[API](https://skmtc.dev/monaco/apis/monaco-public-api.md) - [All operations](https://skmtc.dev/monaco/apis/monaco-public-api/llms.txt) - [OpenAPI document](https://skmtc.dev/monaco/apis/monaco-public-api/revisions/fc720ada2a81?raw)
