---
title: "Bulk create sequence steps"
method: POST
path: "/v3/sequences/{id}/steps/bulk"
tags: ["Sequence Steps"]
---

# Bulk create sequence steps

`POST /v3/sequences/{id}/steps/bulk`

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

Creates multiple steps in a sequence at once. Returns a list of results for each step. Email-step variants may carry up to **3** `attachmentIds` each; inaccessible attachment IDs surface as a per-item `forbidden` result (upload first via `POST /v3/attachments`).

## Path parameters

- `id` integer, required

## Request body

- union[]
  - 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`.

## Response `200`

Array of per-item results, one per input step (same order as request).

Possible per-item error codes:

| Error code | Meaning |
|-------|---------|
| `invalidInput` | Validation failed (e.g. more than 3 attachments on a variant) |
| `invalidStep` | Step type or configuration is invalid |
| `forbidden` | One or more attachment IDs are not accessible to the caller |
| `internalError` | Unexpected server error |
| `stepLocked` | Step cannot be modified |

- object[]
  - `id` integer, nullable — ID of the created resource, null if creation failed
  - `error` integer, nullable — Error code if creation failed
  - `errorDetails` string, nullable — Human-readable error description if creation failed

## Other responses

- `400` — Invalid sequence id, or a business-rule rejection.
- `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. Per-item attachment-accessibility failures surface as `forbidden` entries in the 200 result array, not as a top-level 403.
- `409` — A step in the sequence is locked and blocks bulk creation
- `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)
