---
title: "Update a sequence step"
method: PUT
path: "/v3/sequences/{id}/steps/{step_id}"
tags: ["Sequence Steps"]
---

# Update a sequence step

`PUT /v3/sequences/{id}/steps/{step_id}`

<small>_Requires the `sequences:write` scope (or a broader one that includes it)._</small>

Updates an existing sequence step. Each variant in the request body must include its `id` to identify which variant to update.

For email steps, each variant may carry up to **3** `attachmentIds` (upload first via `POST /v3/attachments`); attachments that don't belong to the caller (or the caller's team) are rejected with `403 sequenceStep.forbidden`.

## Path parameters

- `id` integer, required
- `step_id` integer, required

## Request body

- union — Polymorphic step schema for update operations. Variant `id` is required to identify which variant to update.
  - object — Email step with variant configuration for update operations
    - `id` integer, nullable — Unique identifier for the step
    - `parentId` integer, nullable — ID of the parent step (for branching)
    - `ifConditionPositive` boolean, nullable — Whether this step is on the positive branch of a condition
    - `type` 'email', required — Step type discriminator
    - `delayInMinutes` integer, required — Delay in minutes before executing this step
    - `executionMode` 'automatic' | 'manual', required — Execution mode for the email step
    - `variants` object[], required — Array of email variants (A/B test versions). Each variant must include its `id` for update operations.
      - `id` integer, required — Unique identifier for this email variant. Required for update operations.
      - `subject` string, nullable — Email subject line.
      - `message` string, nullable — Email message content.
      - `attachmentIds` integer[], nullable — **Write-only.** IDs of previously uploaded attachments to attach to this variant. Upload files via `POST /v3/attachments` first to obtain attachment IDs. A variant may carry up to 3 attachments. Omit or pass `null` to leave existing attachments unchanged; pass an empty array to clear them. Not returned on read — use `hasAttachments` to detect presence.
      - `hasAttachments` boolean — Whether the variant has any attachments. Returned on read; ignored on write.
  - object — LinkedIn message action step for update operations
    - `id` integer, nullable — Unique identifier for the step
    - `parentId` integer, nullable — ID of the parent step (for branching)
    - `ifConditionPositive` boolean, nullable — Whether this step is on the positive branch of a condition
    - `type` 'linkedIn', required — Step type discriminator
    - `actionType` 'message', required — LinkedIn action type discriminator
    - `delayInMinutes` integer, required — Delay in minutes before executing this step
    - `executionMode` 'automatic' | 'manual', required — Execution mode for the action
    - `variants` object[], required — Array of LinkedIn message variants (A/B test versions). Each variant must include its `id` for update operations.
      - `id` integer, required — Unique identifier for this LinkedIn variant. Required for update operations.
      - `message` string, required — Message content
      - `isEnabled` boolean, required — Indicates whether the variant is enabled
  - object — LinkedIn connect action step for update operations
    - `id` integer, nullable — Unique identifier for the step
    - `parentId` integer, nullable — ID of the parent step (for branching)
    - `ifConditionPositive` boolean, nullable — Whether this step is on the positive branch of a condition
    - `type` 'linkedIn', required — Step type discriminator
    - `actionType` 'connect', required — LinkedIn action type discriminator
    - `delayInMinutes` integer, required — Delay in minutes before executing this step
    - `executionMode` 'automatic' | 'manual', required — Execution mode for the action
    - `variants` object[], required — Array of LinkedIn connect variants (A/B test versions). Message is optional, max 300 characters. Each variant must include its `id` for update operations.
      - `id` integer, required — Unique identifier for this LinkedIn variant. Required for update operations.
      - `message` string, required — Message content
      - `isEnabled` boolean, required — Indicates whether the variant is enabled
  - object — LinkedIn InMail action step for update operations
    - `id` integer, nullable — Unique identifier for the step
    - `parentId` integer, nullable — ID of the parent step (for branching)
    - `ifConditionPositive` boolean, nullable — Whether this step is on the positive branch of a condition
    - `type` 'linkedIn', required — Step type discriminator
    - `actionType` 'inMail', required — LinkedIn action type discriminator
    - `delayInMinutes` integer, required — Delay in minutes before executing this step
    - `executionMode` 'automatic' | 'manual', required — Execution mode for the InMail
    - `variants` object[], required — Array of LinkedIn InMail variants (A/B test versions). Each variant must include its `id` for update operations.
      - `id` integer, required — Unique identifier for this LinkedIn InMail variant. Required for update operations.
      - `subject` string, required — InMail subject line
      - `message` string, required — InMail message content
      - `isEnabled` boolean, required — Indicates whether the variant is enabled
  - object — LinkedIn view profile action step
    - `id` integer, nullable — Unique identifier for the step
    - `parentId` integer, nullable — ID of the parent step (for branching)
    - `ifConditionPositive` boolean, nullable — Whether this step is on the positive branch of a condition
    - `type` 'linkedIn', required — Step type discriminator
    - `actionType` 'viewProfile', required — LinkedIn action type discriminator
    - `delayInMinutes` integer, required — Delay in minutes before executing this step
    - `executionMode` 'automatic' | 'manual', required — Execution mode for the action
    - `description` string — Description or notes for the profile view
  - object — LinkedIn endorse skills action step
    - `id` integer, nullable — Unique identifier for the step
    - `parentId` integer, nullable — ID of the parent step (for branching)
    - `ifConditionPositive` boolean, nullable — Whether this step is on the positive branch of a condition
    - `type` 'linkedIn', required — Step type discriminator
    - `actionType` 'endorseSkills', required — LinkedIn action type discriminator
    - `delayInMinutes` integer, required — Delay in minutes before executing this step
    - `numberOfSkills` integer, required — Number of skills to endorse (1-3)
  - object — LinkedIn voice message action step
    - `id` integer, nullable — Unique identifier for the step
    - `parentId` integer, nullable — ID of the parent step (for branching)
    - `ifConditionPositive` boolean, nullable — Whether this step is on the positive branch of a condition
    - `type` 'linkedIn', required — Step type discriminator
    - `actionType` 'voiceMessage', required — LinkedIn action type discriminator
    - `delayInMinutes` integer, required — Delay in minutes before executing this step
    - `audioFile` string, required — The audio file URL for the voice message
  - object — LinkedIn like recent posts action step
    - `id` integer, nullable — Unique identifier for the step
    - `parentId` integer, nullable — ID of the parent step (for branching)
    - `ifConditionPositive` boolean, nullable — Whether this step is on the positive branch of a condition
    - `type` 'linkedIn', required — Step type discriminator
    - `actionType` 'likeRecentPosts', required — LinkedIn action type discriminator
    - `delayInMinutes` integer, required — Delay in minutes before executing this step
  - object — LinkedIn follow profile action step
    - `id` integer, nullable — Unique identifier for the step
    - `parentId` integer, nullable — ID of the parent step (for branching)
    - `ifConditionPositive` boolean, nullable — Whether this step is on the positive branch of a condition
    - `type` 'linkedIn', required — Step type discriminator
    - `actionType` 'followProfile', required — LinkedIn action type discriminator
    - `delayInMinutes` integer, required — Delay in minutes before executing this step
  - object — Call step with script/notes
    - `id` integer, nullable — Unique identifier for the step
    - `parentId` integer, nullable — ID of the parent step (for branching)
    - `ifConditionPositive` boolean, nullable — Whether this step is on the positive branch of a condition
    - `type` 'call', required — Step type discriminator
    - `delayInMinutes` integer, required — Delay in minutes before executing this step
    - `message` string — Notes or script for the call
  - object — SMS step with message content
    - `id` integer, nullable — Unique identifier for the step
    - `parentId` integer, nullable — ID of the parent step (for branching)
    - `ifConditionPositive` boolean, nullable — Whether this step is on the positive branch of a condition
    - `type` 'sms', required — Step type discriminator
    - `delayInMinutes` integer, required — Delay in minutes before executing this step
    - `executionMode` 'automatic' | 'manual', required — Execution mode for the SMS step
    - `message` string, required — SMS message content
  - object — WhatsApp step with message content
    - `id` integer, nullable — Unique identifier for the step
    - `parentId` integer, nullable — ID of the parent step (for branching)
    - `ifConditionPositive` boolean, nullable — Whether this step is on the positive branch of a condition
    - `type` 'whatsApp', required — Step type discriminator
    - `delayInMinutes` integer, required — Delay in minutes before executing this step
    - `message` string, required — WhatsApp message content
  - object — Zapier integration step
    - `id` integer, nullable — Unique identifier for the step
    - `parentId` integer, nullable — ID of the parent step (for branching)
    - `ifConditionPositive` boolean, nullable — Whether this step is on the positive branch of a condition
    - `type` 'zapier', required — Step type discriminator
    - `delayInMinutes` integer, required — Delay in minutes before executing this step
    - `name` string, required — Name of the Zapier step
    - `action` 'immediately' | 'wait', required — Zapier action type
  - object — Task step for manual actions
    - `id` integer, nullable — Unique identifier for the step
    - `parentId` integer, nullable — ID of the parent step (for branching)
    - `ifConditionPositive` boolean, nullable — Whether this step is on the positive branch of a condition
    - `type` 'task', required — Step type discriminator
    - `delayInMinutes` integer, required — Delay in minutes before executing this step
    - `actionType` 'toDo' | 'meeting', required — Type of task action to perform
    - `description` string, required — Task description or instructions
  - object — Condition step that evaluates rules before proceeding
    - `id` integer, nullable — Unique identifier for the step
    - `parentId` integer, nullable — ID of the parent step (for branching)
    - `ifConditionPositive` boolean, nullable — Whether this step is on the positive branch of a condition
    - `type` 'condition', required — Step type discriminator
    - `delayInMinutes` integer, required — Delay in minutes before executing this step
    - `waitInMinutes` integer, required — Wait time in minutes for condition evaluation
    - `conditions` object[], required — Array of condition templates to evaluate
      - `property` string, required — Property name to evaluate
      - `rules` object[], required — Set of rules to apply to the property
        - `operator` string, required — Comparison operator (e.g., `isSet`, `isNotSet`, `equals`, etc.)
        - `value` string, nullable — Value to compare against. Null for operators like `isSet`/`isNotSet`.

## Response `200`

Sequence step updated successfully

- union
  - object — Email step with variant configuration
    - `id` integer, nullable — Unique identifier for the step
    - `parentId` integer, nullable — ID of the parent step (for branching)
    - `ifConditionPositive` boolean, nullable — Whether this step is on the positive branch of a condition
    - `type` 'email', required — Step type discriminator
    - `delayInMinutes` integer, required — Delay in minutes before executing this step
    - `executionMode` 'automatic' | 'manual', required — Execution mode for the email step
    - `variants` object[], required — Array of email variants (A/B test versions)
      - `id` integer — Unique identifier for this email variant
      - `subject` string, nullable — Email subject line.
      - `message` string, nullable — Email message content.
      - `attachmentIds` integer[], nullable — **Write-only.** IDs of previously uploaded attachments to attach to this variant. Upload files via `POST /v3/attachments` first to obtain attachment IDs. A variant may carry up to 3 attachments. Omit to leave attachments unset. Not returned on read — use `hasAttachments` to detect presence.
      - `hasAttachments` boolean — Whether the variant has any attachments. Returned on read; ignored on write.
  - object — LinkedIn message action step
    - `id` integer, nullable — Unique identifier for the step
    - `parentId` integer, nullable — ID of the parent step (for branching)
    - `ifConditionPositive` boolean, nullable — Whether this step is on the positive branch of a condition
    - `type` 'linkedIn', required — Step type discriminator
    - `actionType` 'message', required — LinkedIn action type discriminator
    - `delayInMinutes` integer, required — Delay in minutes before executing this step
    - `executionMode` 'automatic' | 'manual', required — Execution mode for the action
    - `variants` object[], required — Array of LinkedIn message variants (A/B test versions)
      - `id` integer — Unique identifier for this LinkedIn variant
      - `message` string, required — Message content
      - `isEnabled` boolean, required — Indicates whether the variant is enabled
  - object — LinkedIn connect action step
    - `id` integer, nullable — Unique identifier for the step
    - `parentId` integer, nullable — ID of the parent step (for branching)
    - `ifConditionPositive` boolean, nullable — Whether this step is on the positive branch of a condition
    - `type` 'linkedIn', required — Step type discriminator
    - `actionType` 'connect', required — LinkedIn action type discriminator
    - `delayInMinutes` integer, required — Delay in minutes before executing this step
    - `executionMode` 'automatic' | 'manual', required — Execution mode for the action
    - `variants` object[], required — Array of LinkedIn connect variants (A/B test versions). Message is optional, max 300 characters.
      - `id` integer — Unique identifier for this LinkedIn variant
      - `message` string, required — Message content
      - `isEnabled` boolean, required — Indicates whether the variant is enabled
  - object — LinkedIn InMail action step
    - `id` integer, nullable — Unique identifier for the step
    - `parentId` integer, nullable — ID of the parent step (for branching)
    - `ifConditionPositive` boolean, nullable — Whether this step is on the positive branch of a condition
    - `type` 'linkedIn', required — Step type discriminator
    - `actionType` 'inMail', required — LinkedIn action type discriminator
    - `delayInMinutes` integer, required — Delay in minutes before executing this step
    - `executionMode` 'automatic' | 'manual', required — Execution mode for the InMail
    - `variants` object[], required — Array of LinkedIn InMail variants (A/B test versions)
      - `id` integer — Unique identifier for this LinkedIn InMail variant
      - `subject` string, required — InMail subject line
      - `message` string, required — InMail message content
      - `isEnabled` boolean, required — Indicates whether the variant is enabled
  - object — LinkedIn view profile action step
    - `id` integer, nullable — Unique identifier for the step
    - `parentId` integer, nullable — ID of the parent step (for branching)
    - `ifConditionPositive` boolean, nullable — Whether this step is on the positive branch of a condition
    - `type` 'linkedIn', required — Step type discriminator
    - `actionType` 'viewProfile', required — LinkedIn action type discriminator
    - `delayInMinutes` integer, required — Delay in minutes before executing this step
    - `executionMode` 'automatic' | 'manual', required — Execution mode for the action
    - `description` string — Description or notes for the profile view
  - object — LinkedIn endorse skills action step
    - `id` integer, nullable — Unique identifier for the step
    - `parentId` integer, nullable — ID of the parent step (for branching)
    - `ifConditionPositive` boolean, nullable — Whether this step is on the positive branch of a condition
    - `type` 'linkedIn', required — Step type discriminator
    - `actionType` 'endorseSkills', required — LinkedIn action type discriminator
    - `delayInMinutes` integer, required — Delay in minutes before executing this step
    - `numberOfSkills` integer, required — Number of skills to endorse (1-3)
  - object — LinkedIn voice message action step
    - `id` integer, nullable — Unique identifier for the step
    - `parentId` integer, nullable — ID of the parent step (for branching)
    - `ifConditionPositive` boolean, nullable — Whether this step is on the positive branch of a condition
    - `type` 'linkedIn', required — Step type discriminator
    - `actionType` 'voiceMessage', required — LinkedIn action type discriminator
    - `delayInMinutes` integer, required — Delay in minutes before executing this step
    - `audioFile` string, required — The audio file URL for the voice message
  - object — LinkedIn like recent posts action step
    - `id` integer, nullable — Unique identifier for the step
    - `parentId` integer, nullable — ID of the parent step (for branching)
    - `ifConditionPositive` boolean, nullable — Whether this step is on the positive branch of a condition
    - `type` 'linkedIn', required — Step type discriminator
    - `actionType` 'likeRecentPosts', required — LinkedIn action type discriminator
    - `delayInMinutes` integer, required — Delay in minutes before executing this step
  - object — LinkedIn follow profile action step
    - `id` integer, nullable — Unique identifier for the step
    - `parentId` integer, nullable — ID of the parent step (for branching)
    - `ifConditionPositive` boolean, nullable — Whether this step is on the positive branch of a condition
    - `type` 'linkedIn', required — Step type discriminator
    - `actionType` 'followProfile', required — LinkedIn action type discriminator
    - `delayInMinutes` integer, required — Delay in minutes before executing this step
  - object — Call step with script/notes
    - `id` integer, nullable — Unique identifier for the step
    - `parentId` integer, nullable — ID of the parent step (for branching)
    - `ifConditionPositive` boolean, nullable — Whether this step is on the positive branch of a condition
    - `type` 'call', required — Step type discriminator
    - `delayInMinutes` integer, required — Delay in minutes before executing this step
    - `message` string — Notes or script for the call
  - object — SMS step with message content
    - `id` integer, nullable — Unique identifier for the step
    - `parentId` integer, nullable — ID of the parent step (for branching)
    - `ifConditionPositive` boolean, nullable — Whether this step is on the positive branch of a condition
    - `type` 'sms', required — Step type discriminator
    - `delayInMinutes` integer, required — Delay in minutes before executing this step
    - `executionMode` 'automatic' | 'manual', required — Execution mode for the SMS step
    - `message` string, required — SMS message content
  - object — WhatsApp step with message content
    - `id` integer, nullable — Unique identifier for the step
    - `parentId` integer, nullable — ID of the parent step (for branching)
    - `ifConditionPositive` boolean, nullable — Whether this step is on the positive branch of a condition
    - `type` 'whatsApp', required — Step type discriminator
    - `delayInMinutes` integer, required — Delay in minutes before executing this step
    - `message` string, required — WhatsApp message content
  - object — Zapier integration step
    - `id` integer, nullable — Unique identifier for the step
    - `parentId` integer, nullable — ID of the parent step (for branching)
    - `ifConditionPositive` boolean, nullable — Whether this step is on the positive branch of a condition
    - `type` 'zapier', required — Step type discriminator
    - `delayInMinutes` integer, required — Delay in minutes before executing this step
    - `name` string, required — Name of the Zapier step
    - `action` 'immediately' | 'wait', required — Zapier action type
  - object — Task step for manual actions
    - `id` integer, nullable — Unique identifier for the step
    - `parentId` integer, nullable — ID of the parent step (for branching)
    - `ifConditionPositive` boolean, nullable — Whether this step is on the positive branch of a condition
    - `type` 'task', required — Step type discriminator
    - `delayInMinutes` integer, required — Delay in minutes before executing this step
    - `actionType` 'toDo' | 'meeting', required — Type of task action to perform
    - `description` string, required — Task description or instructions
  - object — Condition step that evaluates rules before proceeding
    - `id` integer, nullable — Unique identifier for the step
    - `parentId` integer, nullable — ID of the parent step (for branching)
    - `ifConditionPositive` boolean, nullable — Whether this step is on the positive branch of a condition
    - `type` 'condition', required — Step type discriminator
    - `delayInMinutes` integer, required — Delay in minutes before executing this step
    - `waitInMinutes` integer, required — Wait time in minutes for condition evaluation
    - `conditions` object[], required — Array of condition templates to evaluate
      - `property` string, required — Property name to evaluate
      - `rules` object[], required — Set of rules to apply to the property
        - `operator` string, required — Comparison operator (e.g., `isSet`, `isNotSet`, `equals`, etc.)
        - `value` string, nullable — Value to compare against. Null for operators like `isSet`/`isNotSet`.

## Other responses

- `400` — Route/body validation failure, or a business-rule rejection (including more than 3 attachments on a variant).
- `401` — Unauthorized. The response body is empty; check the `WWW-Authenticate` header for the expected scheme.
- `403` — Caller does not have permission to modify this sequence, or one or more of the supplied variant `attachmentIds` are not accessible.
- `404` — Sequence or step not found
- `409` — Step is locked and cannot be modified
- `429` — Too Many Requests

---

[API](https://skmtc.net/reply/apis/reply-api.md) · [All operations](https://skmtc.net/reply/apis/reply-api/llms.txt) · [OpenAPI document](https://skmtc-service-staging.skmtc.workers.dev/v1/apis/reply/reply-api/revisions/1c3d32eaf95e/schema)
