---
title: "Update sequence"
method: PUT
path: "/sequences/{sequenceId}"
tags: ["Sequences"]
---

# Update sequence

`PUT /sequences/{sequenceId}`

Updates sequence settings and content, inserts linear or branching steps, or performs revision-guarded graph edits.

## Path parameters

- `sequenceId` string, required

## Request body

- SequenceUpdateRequest
  - `description` string — Updated dashboard description.
  - `userCancellable` boolean — Whether recipients can cancel this sequence from email preferences.
  - `labels` string[] — Replacement dashboard label names. Missing labels are created.
  - `fromEmail` string, email — From address for every email in this sequence. Its domain must be configured and verified.
  - `fromName` string — Display name recipients see, e.g. 'Brennon at TradeTally'. Selects the sender identity of that name on fromEmail, creating it when the address has no identity by that name; the mailbox's other display names, and everything pinned to them, are untouched. Requires fromEmail; omit it when using senderProfileId, which already carries its own display name.
  - `senderProfileId` string — Existing sender profile ID. It already supplies both the From address and display name, so send it on its own and omit fromEmail and fromName.
  - `replyTo` string, email — Reply-To address for every email in this sequence.
  - `replyToName` string — Display name for the Reply-To address. Requires replyTo; omit it when using replyProfileId, which already carries its own display name. An address carries one Reply-To name company-wide, so if replyTo already has a saved profile under a different name, that saved name is kept and the response `warnings` array says so.
  - `replyProfileId` string — Existing reply profile ID. It already supplies both the Reply-To address and display name, so send it on its own and omit replyTo and replyToName.
  - `name` string — Updated sequence name.
  - `trigger` 'contact_added' | 'tag_added' | 'segment_entered' | 'event_received' | 'inbound_webhook' | 'inactivity' | 'frequency'
  - `listId` string — List ID for a replacement contact_added trigger.
  - `tagName` string — Tag name for a replacement tag_added trigger.
  - `segmentId` string — Segment ID for a replacement segment_entered trigger.
  - `stopOnSegmentExit` boolean — Stop active enrollments when a contact leaves the replacement trigger segment.
  - `eventName` string — Event name for event_received, inbound_webhook, inactivity, or frequency triggers.
  - `propertyFilters` SequenceTriggerPropertyFilter[]
    - `path` string, required — Dot-path into the event properties. Use [] to match items inside arrays.
    - `operator` 'exists' | 'not_exists' | 'equals' | 'not_equals' | 'one_of' | 'contains' | 'greater_than' | 'less_than', required — Comparison operator. Value is required for every operator except exists and not_exists. `one_of` matches when the property equals any entry of the value array.
    - `value` union — Value to compare against. For `one_of`, pass a non-empty array of strings or numbers (maximum 50 values); all other operators take a single value.
      - string
      - number
      - boolean
      - union[]
        - union
          - string
          - number
  - `integrationSlug` string — Catalog integration slug for an inbound_webhook trigger.
  - `integrationEventKey` string — Catalog event key for an inbound_webhook trigger.
  - `customIntegration` object — Custom integration descriptor for an inbound_webhook trigger.
  - `inactiveDays` number
  - `inactivityBaseline` 'sequence_created_at' | 'subscriber_created_at'
  - `minCount` number
  - `timeWindowDays` number
  - `enrollmentPaused` boolean — Set true to stop new enrollments for an active sequence while current recipients continue. Set false to resume new enrollments.
  - `confirmStructuralChange` boolean — Required when inserting steps or branches, or editing the graph of an active sequence. Set true only after confirming the live-flow impact for current and future recipients.
  - `confirmLiveChange` boolean — Required for trigger replacement or nodeUpdates on an active sequence. Set true only after confirming that the edits can affect recipients who reach those nodes in the future.
  - `enrollmentMode` 'unlimited' | 'one_time' | 'matching_field' — Controls sequence re-entry. `unlimited` allows re-entry after completion but prevents concurrent active runs. `one_time` allows one enrollment ever. `matching_field` is only valid for event-triggered sequences and allows concurrent active runs only when the trigger payload resolves to a different event field value.
  - `enrollmentFieldPath` string, nullable — Scalar dot-path event property used by matching_field enrollment on event_received and inbound_webhook sequences. Array traversal with [] is not supported; use propertyFilters for array matching. Set to null to use built-in defaults.
  - `sendingWindow` SequenceSendingWindow — Optional local-time sending window applied to every email step in a sequence. Email steps that become due outside the window wait until the next allowed local time.
    - `enabled` boolean
    - `timezone` string — IANA timezone for the window.
    - `startTime` string — Earliest local send time in 24-hour HH:mm format.
    - `endTime` string — Latest local send cutoff in 24-hour HH:mm format. Must be later than startTime.
    - `days` string[] — Allowed local days. Omit days when creating or updating to allow every day.
  - `bccEmails` string[], nullable — Email addresses that receive a blind copy of every email this sequence sends, such as a customer support inbox (max 10). Set to null to remove them.
  - `stopCondition` SequenceStopCondition — Auto-stop condition, re-evaluated before every step including the first one. has_tag, added_to_list, entered_segment, field_changed, and event_received stop the run once the thing happens. does_not_have_tag and removed_from_list stop the run whenever the subscriber lacks that tag or list membership, so they act as a required-tag or required-list allowlist and cancel everyone else before any step sends. Guarded-out contacts still enroll and are then cancelled at the trigger node, so they appear as cancellations there rather than in the active or waiting enrollment counts. Clearing the guard does not retry them: they only receive the sequence if the trigger fires for them again, and on the one_time enrollment mode not even then.
    - `type` 'none' | 'has_tag' | 'does_not_have_tag' | 'added_to_list' | 'removed_from_list' | 'entered_segment' | 'field_changed' | 'event_received'
    - `value` string, nullable — Tag name, list ID, segment ID, field path, or event name. For the does_not_have_tag and removed_from_list guards this is the tag or list a subscriber must have to keep receiving the sequence.
    - `matchConfig` union — Optional typed match rule. event_received uses event_property rules; field_changed uses a field_value comparison.
      - object
        - `mode` 'event_property', required
        - `rules` object[], required
          - `entryFieldPath` string, required
          - `eventFieldPath` string, required
      - object
        - `mode` 'field_value', required
        - `operator` 'equals' | 'not_equals' | 'greater_than' | 'less_than' | 'contains' | 'not_contains', required
        - `value` string, required
  - `branch` SequenceBranchInput
    - `afterNodeId` string, required — Existing sequence node ID to insert the branch after.
    - `label` string
    - `branches` SequenceBranchConditionInput[], required — Conditional branches evaluated in order. Each branch should include steps, targetNodeId, or both unless allowEmptyPaths is true.
      - `id` string — Optional stable branch ID. Defaults to branch-0, branch-1, etc.
      - `label` string
      - `conditionType` 'has_tag' | 'does_not_have_tag' | 'in_list' | 'in_segment' | 'event_received' | 'link_clicked' | 'field_equals' | 'field_contains' | 'field_greater_than' | 'field_less_than' | 'has_phone' | 'sms_subscribed', required
      - `tagId` string — Tag ID or tag name for has_tag and does_not_have_tag conditions.
      - `tagName` string — Tag name for has_tag and does_not_have_tag conditions.
      - `listId` string — List ID for in_list conditions.
      - `segmentId` string — Segment ID for in_segment conditions.
      - `segmentName` string — Optional display name for in_segment conditions.
      - `eventName` string — Event name for event_received conditions.
      - `linkUrl` string — Optional URL substring for link_clicked conditions. Omit to match any clicked link.
      - `activityScope` 'ever' | 'this_sequence' | 'previous_email' — Scope for event_received and link_clicked conditions.
      - `fieldName` string — Subscriber attribute name for field conditions.
      - `fieldValue` string — Comparison value for field conditions.
      - `targetNodeId` string — Existing node reached by this branch path after any newly created steps. Use the completion node ID to end this path immediately.
      - `steps` SequenceBranchPathStepInput[] — Optional steps to create in this branch path. When targetNodeId is also set, the final new step connects to that existing node.
        - `type` 'email' | 'sms' | 'delay' | 'create_discount' | 'discount' | 'update_subscriber' | 'condition' | 'webhook' — Step type. Omit for email steps, use sms for a native SMS step, or use delay for a standalone wait.
        - `nodeType` 'logic_delay' | 'action_email' | 'action_sms' | 'action_create_discount' | 'action_add_tag' | 'action_remove_tag' | 'action_add_to_list' | 'action_remove_from_list' | 'action_update_attributes' | 'logic_wait_for_event' | 'logic_condition' | 'action_webhook' — Advanced node type for non-email sequence path actions.
        - `config` SequencePathStepConfig — Update Subscriber config. String values may use standalone trigger-event merge tags such as {{event.plan}}, {{event.amount}}, or {{event.active}}. Number and boolean values are coerced after resolution.
          - `label` string
          - `firstName` string, nullable
          - `lastName` string, nullable
          - `status` 'active' | 'unsubscribed' | 'bounced'
          - `customAttributeUpdates` object[]
            - `name` string, required
            - `value` union, required — Literal scalar, null to delete, or one standalone merge tag.
              - …
            - `valueType` 'text' | 'number' | 'boolean'
        - `subject` string — Email subject. Required for email steps.
        - `previewText` string, nullable — Email preview text.
        - `text` string — SMS steps only. Plain-text message body; merge tags like {{FIRST_NAME}} work.
        - `imageUrls` string[] — SMS steps only. Up to 2 publicly reachable image URLs sent as MMS media.
        - `ineligibleAction` 'skip' | 'exit' — SMS steps only. skip (default) continues the sequence when the contact can't receive SMS; exit removes them from the sequence.
        - `label` string — SMS steps only. Display label for the step in the builder.
        - `blocks` EmailBlock[] — Email blocks for email steps. Put visual styling under styles; top-level style keys such as backgroundColor, backgroundOpacity, borderColor, borderWidth, and borderRadius are normalized into styles.
          - `id` string
          - `type` 'text' | 'html' | 'heading' | 'list' | 'button' | 'spacer' | 'divider' | 'image' | 'columns' | 'conditional-group' | 'repeat' | 'card' | 'cta' | 'social' | 'logo' | 'header' | 'footer' | 'video' | 'product' | 'discount-code' | 'code' | 'countdown' | 'hero' | 'testimonial' | 'gallery' | 'badge' | 'table' | 'features' | 'image-card' | 'pricing' | 'author' | 'article' | 'rating' | 'stats' | 'steps' | 'product-grid' | 'poll', required
          - `content` string — Content for text, html, and heading-like blocks.
          - `styles` object — Per-block visual styles. For compatibility, style fields such as backgroundColor, backgroundOpacity, borderColor, borderWidth, and borderRadius can also be supplied at the block top level and are normalized into this object.
            - `paddingTop` number
            - `paddingBottom` number
            - `paddingLeft` number
            - `paddingRight` number
            - `backgroundColor` string
            - `backgroundOpacity` number — Background opacity percentage from 0 to 100.
            - `textColor` string
            - `textAlign` 'left' | 'center' | 'right'
            - `borderRadius` number
            - `borderColor` string
            - `borderWidth` number
            - `bleed` boolean — Stretch the block edge-to-edge across the email container. Top-level blocks only.
          - `conditions` object[] — Optional per-block display rules. The block renders only when every rule matches. The same shape is used for a conditional-group block's top-level `conditions`.
            - `id` string, required
            - `field` 'variable' | 'attribute' | 'email' | 'firstName' | 'lastName', required — `variable` resolves a merge-tag path from the transactional send `variables` or an automation `event` payload (nested paths like `order.total` or `event.plan` work). `attribute` reads a stored subscriber attribute. `email`, `firstName`, and `lastName` read core subscriber fields.
            - `operator` 'is' | 'is_not' | 'contains' | 'not_contains' | 'gt' | 'gte' | 'lt' | 'lte' | 'is_empty' | 'is_not_empty', required
            - `value` string, required — For `variable` and `attribute`, use `name:value` - the part before the colon is the variable path or attribute name, and the part after it is the comparison value. For `email`, `firstName`, and `lastName`, provide the plain comparison string.
        - `html` string — HTML content for email steps.
        - `delay` SequenceDelayInput — Delay before this step runs. Use duration fields for fixed waits, or mode until_date with untilDateField for event/date-field waits.
          - `mode` 'duration' | 'until_date' — Delay mode. Defaults to duration.
          - `days` number
          - `hours` number
          - `minutes` number
          - `untilDateField` string — Event/subscriber date field path to wait until when mode is until_date.
          - `field` string — Alias for untilDateField.
          - `untilOffsetDirection` 'before' | 'after' — Whether the offset runs before or after the date field. Defaults to after.
          - `direction` 'before' | 'after' — Alias for untilOffsetDirection.
          - `untilMissingAction` 'continue' | 'exit' — What to do when the date field is missing or invalid. Defaults to continue.
          - `missingAction` 'continue' | 'exit' — Alias for untilMissingAction.
        - `waitUntil` SequenceWaitUntilInput — Wait until a date from the enrollment event/subscriber data, optionally offset before or after that date.
          - `field` string — Event/subscriber date field path to wait until.
          - `untilDateField` string — Alias for field.
          - `offset` SequenceDelayOffsetInput — Relative offset for a delay.
            - `days` number
            - `hours` number
            - `minutes` number
          - `days` number — Shorthand offset days when offset is omitted.
          - `hours` number — Shorthand offset hours when offset is omitted.
          - `minutes` number — Shorthand offset minutes when offset is omitted.
          - `direction` 'before' | 'after' — Whether the offset runs before or after the field date. Defaults to after.
          - `untilOffsetDirection` 'before' | 'after' — Alias for direction.
          - `missingAction` 'continue' | 'exit' — What to do when the date field is missing or invalid. Defaults to continue.
          - `untilMissingAction` 'continue' | 'exit' — Alias for missingAction.
        - `delayMs` number — Delay in milliseconds. Useful for standalone delay steps.
        - `name` string — Email template name for email steps.
        - `senderProfileId` string — Email steps only. Sender profile for the new step. Omit to inherit the sender identity of the email step it is inserted after. Mutually exclusive with fromEmail.
        - `fromEmail` string, email — Email steps only. From address for the new step; its domain must be verified. Mutually exclusive with senderProfileId.
        - `fromName` string — Email steps only. Display name override for the new step. With fromEmail, also names a newly created sender profile.
        - `replyProfileId` string — Email steps only. Reply profile for the new step. Omit to inherit from the preceding email step. Mutually exclusive with replyTo.
        - `replyTo` string, email — Email steps only. Reply-To address for the new step. Mutually exclusive with replyProfileId.
        - `replyToName` string — Email steps only. Reply-To display name override for this step. Requires replyTo; omit it when using replyProfileId, which already carries its own display name.
        - `discount` object — Discount configuration for create_discount steps.
    - `elseSteps` SequenceBranchPathStepInput[] — Optional steps to create in the else fallback path. When elseTargetNodeId is also set, the final new step connects to that existing node.
      - `type` 'email' | 'sms' | 'delay' | 'create_discount' | 'discount' | 'update_subscriber' | 'condition' | 'webhook' — Step type. Omit for email steps, use sms for a native SMS step, or use delay for a standalone wait.
      - `nodeType` 'logic_delay' | 'action_email' | 'action_sms' | 'action_create_discount' | 'action_add_tag' | 'action_remove_tag' | 'action_add_to_list' | 'action_remove_from_list' | 'action_update_attributes' | 'logic_wait_for_event' | 'logic_condition' | 'action_webhook' — Advanced node type for non-email sequence path actions.
      - `config` SequencePathStepConfig — Update Subscriber config. String values may use standalone trigger-event merge tags such as {{event.plan}}, {{event.amount}}, or {{event.active}}. Number and boolean values are coerced after resolution.
        - `label` string
        - `firstName` string, nullable
        - `lastName` string, nullable
        - `status` 'active' | 'unsubscribed' | 'bounced'
        - `customAttributeUpdates` object[]
          - `name` string, required
          - `value` union, required — Literal scalar, null to delete, or one standalone merge tag.
            - string
            - number
            - boolean
          - `valueType` 'text' | 'number' | 'boolean'
      - `subject` string — Email subject. Required for email steps.
      - `previewText` string, nullable — Email preview text.
      - `text` string — SMS steps only. Plain-text message body; merge tags like {{FIRST_NAME}} work.
      - `imageUrls` string[] — SMS steps only. Up to 2 publicly reachable image URLs sent as MMS media.
      - `ineligibleAction` 'skip' | 'exit' — SMS steps only. skip (default) continues the sequence when the contact can't receive SMS; exit removes them from the sequence.
      - `label` string — SMS steps only. Display label for the step in the builder.
      - `blocks` EmailBlock[] — Email blocks for email steps. Put visual styling under styles; top-level style keys such as backgroundColor, backgroundOpacity, borderColor, borderWidth, and borderRadius are normalized into styles.
        - `id` string
        - `type` 'text' | 'html' | 'heading' | 'list' | 'button' | 'spacer' | 'divider' | 'image' | 'columns' | 'conditional-group' | 'repeat' | 'card' | 'cta' | 'social' | 'logo' | 'header' | 'footer' | 'video' | 'product' | 'discount-code' | 'code' | 'countdown' | 'hero' | 'testimonial' | 'gallery' | 'badge' | 'table' | 'features' | 'image-card' | 'pricing' | 'author' | 'article' | 'rating' | 'stats' | 'steps' | 'product-grid' | 'poll', required
        - `content` string — Content for text, html, and heading-like blocks.
        - `styles` object — Per-block visual styles. For compatibility, style fields such as backgroundColor, backgroundOpacity, borderColor, borderWidth, and borderRadius can also be supplied at the block top level and are normalized into this object.
          - `paddingTop` number
          - `paddingBottom` number
          - `paddingLeft` number
          - `paddingRight` number
          - `backgroundColor` string
          - `backgroundOpacity` number — Background opacity percentage from 0 to 100.
          - `textColor` string
          - `textAlign` 'left' | 'center' | 'right'
          - `borderRadius` number
          - `borderColor` string
          - `borderWidth` number
          - `bleed` boolean — Stretch the block edge-to-edge across the email container. Top-level blocks only.
        - `conditions` object[] — Optional per-block display rules. The block renders only when every rule matches. The same shape is used for a conditional-group block's top-level `conditions`.
          - `id` string, required
          - `field` 'variable' | 'attribute' | 'email' | 'firstName' | 'lastName', required — `variable` resolves a merge-tag path from the transactional send `variables` or an automation `event` payload (nested paths like `order.total` or `event.plan` work). `attribute` reads a stored subscriber attribute. `email`, `firstName`, and `lastName` read core subscriber fields.
          - `operator` 'is' | 'is_not' | 'contains' | 'not_contains' | 'gt' | 'gte' | 'lt' | 'lte' | 'is_empty' | 'is_not_empty', required
          - `value` string, required — For `variable` and `attribute`, use `name:value` - the part before the colon is the variable path or attribute name, and the part after it is the comparison value. For `email`, `firstName`, and `lastName`, provide the plain comparison string.
      - `html` string — HTML content for email steps.
      - `delay` SequenceDelayInput — Delay before this step runs. Use duration fields for fixed waits, or mode until_date with untilDateField for event/date-field waits.
        - `mode` 'duration' | 'until_date' — Delay mode. Defaults to duration.
        - `days` number
        - `hours` number
        - `minutes` number
        - `untilDateField` string — Event/subscriber date field path to wait until when mode is until_date.
        - `field` string — Alias for untilDateField.
        - `untilOffsetDirection` 'before' | 'after' — Whether the offset runs before or after the date field. Defaults to after.
        - `direction` 'before' | 'after' — Alias for untilOffsetDirection.
        - `untilMissingAction` 'continue' | 'exit' — What to do when the date field is missing or invalid. Defaults to continue.
        - `missingAction` 'continue' | 'exit' — Alias for untilMissingAction.
      - `waitUntil` SequenceWaitUntilInput — Wait until a date from the enrollment event/subscriber data, optionally offset before or after that date.
        - `field` string — Event/subscriber date field path to wait until.
        - `untilDateField` string — Alias for field.
        - `offset` SequenceDelayOffsetInput — Relative offset for a delay.
          - `days` number
          - `hours` number
          - `minutes` number
        - `days` number — Shorthand offset days when offset is omitted.
        - `hours` number — Shorthand offset hours when offset is omitted.
        - `minutes` number — Shorthand offset minutes when offset is omitted.
        - `direction` 'before' | 'after' — Whether the offset runs before or after the field date. Defaults to after.
        - `untilOffsetDirection` 'before' | 'after' — Alias for direction.
        - `missingAction` 'continue' | 'exit' — What to do when the date field is missing or invalid. Defaults to continue.
        - `untilMissingAction` 'continue' | 'exit' — Alias for missingAction.
      - `delayMs` number — Delay in milliseconds. Useful for standalone delay steps.
      - `name` string — Email template name for email steps.
      - `senderProfileId` string — Email steps only. Sender profile for the new step. Omit to inherit the sender identity of the email step it is inserted after. Mutually exclusive with fromEmail.
      - `fromEmail` string, email — Email steps only. From address for the new step; its domain must be verified. Mutually exclusive with senderProfileId.
      - `fromName` string — Email steps only. Display name override for the new step. With fromEmail, also names a newly created sender profile.
      - `replyProfileId` string — Email steps only. Reply profile for the new step. Omit to inherit from the preceding email step. Mutually exclusive with replyTo.
      - `replyTo` string, email — Email steps only. Reply-To address for the new step. Mutually exclusive with replyProfileId.
      - `replyToName` string — Email steps only. Reply-To display name override for this step. Requires replyTo; omit it when using replyProfileId, which already carries its own display name.
      - `discount` object — Discount configuration for create_discount steps.
    - `elseTargetNodeId` string — Existing node reached by the else fallback path after any elseSteps. Use the original follow-up node to keep that path in the existing flow, or the completion node to end it.
    - `allowEmptyPaths` boolean — Set true only when intentionally creating empty UI placeholders. Explicit target node paths do not require this flag.
  - `insertSteps` SequenceLinearStepInsertionInput
    - `afterNodeId` string — Existing sequence node ID to insert after. Omit only to append to an unambiguous linear tail.
    - `steps` SequenceBranchPathStepInput[], required — New linear steps to insert. Supports addable step types that do not require companion records; multi-path branches use the branch payload. Email steps require subject plus blocks or html. Inserted email steps inherit the effective identity of the nearest sequence email unless the step sets its own sender fields. After a branch merge, only identity fields shared by every incoming path are inherited; conflicting fields use sequence or company defaults.
      - `type` 'email' | 'sms' | 'delay' | 'create_discount' | 'discount' | 'update_subscriber' | 'condition' | 'webhook' — Step type. Omit for email steps, use sms for a native SMS step, or use delay for a standalone wait.
      - `nodeType` 'logic_delay' | 'action_email' | 'action_sms' | 'action_create_discount' | 'action_add_tag' | 'action_remove_tag' | 'action_add_to_list' | 'action_remove_from_list' | 'action_update_attributes' | 'logic_wait_for_event' | 'logic_condition' | 'action_webhook' — Advanced node type for non-email sequence path actions.
      - `config` SequencePathStepConfig — Update Subscriber config. String values may use standalone trigger-event merge tags such as {{event.plan}}, {{event.amount}}, or {{event.active}}. Number and boolean values are coerced after resolution.
        - `label` string
        - `firstName` string, nullable
        - `lastName` string, nullable
        - `status` 'active' | 'unsubscribed' | 'bounced'
        - `customAttributeUpdates` object[]
          - `name` string, required
          - `value` union, required — Literal scalar, null to delete, or one standalone merge tag.
            - string
            - number
            - boolean
          - `valueType` 'text' | 'number' | 'boolean'
      - `subject` string — Email subject. Required for email steps.
      - `previewText` string, nullable — Email preview text.
      - `text` string — SMS steps only. Plain-text message body; merge tags like {{FIRST_NAME}} work.
      - `imageUrls` string[] — SMS steps only. Up to 2 publicly reachable image URLs sent as MMS media.
      - `ineligibleAction` 'skip' | 'exit' — SMS steps only. skip (default) continues the sequence when the contact can't receive SMS; exit removes them from the sequence.
      - `label` string — SMS steps only. Display label for the step in the builder.
      - `blocks` EmailBlock[] — Email blocks for email steps. Put visual styling under styles; top-level style keys such as backgroundColor, backgroundOpacity, borderColor, borderWidth, and borderRadius are normalized into styles.
        - `id` string
        - `type` 'text' | 'html' | 'heading' | 'list' | 'button' | 'spacer' | 'divider' | 'image' | 'columns' | 'conditional-group' | 'repeat' | 'card' | 'cta' | 'social' | 'logo' | 'header' | 'footer' | 'video' | 'product' | 'discount-code' | 'code' | 'countdown' | 'hero' | 'testimonial' | 'gallery' | 'badge' | 'table' | 'features' | 'image-card' | 'pricing' | 'author' | 'article' | 'rating' | 'stats' | 'steps' | 'product-grid' | 'poll', required
        - `content` string — Content for text, html, and heading-like blocks.
        - `styles` object — Per-block visual styles. For compatibility, style fields such as backgroundColor, backgroundOpacity, borderColor, borderWidth, and borderRadius can also be supplied at the block top level and are normalized into this object.
          - `paddingTop` number
          - `paddingBottom` number
          - `paddingLeft` number
          - `paddingRight` number
          - `backgroundColor` string
          - `backgroundOpacity` number — Background opacity percentage from 0 to 100.
          - `textColor` string
          - `textAlign` 'left' | 'center' | 'right'
          - `borderRadius` number
          - `borderColor` string
          - `borderWidth` number
          - `bleed` boolean — Stretch the block edge-to-edge across the email container. Top-level blocks only.
        - `conditions` object[] — Optional per-block display rules. The block renders only when every rule matches. The same shape is used for a conditional-group block's top-level `conditions`.
          - `id` string, required
          - `field` 'variable' | 'attribute' | 'email' | 'firstName' | 'lastName', required — `variable` resolves a merge-tag path from the transactional send `variables` or an automation `event` payload (nested paths like `order.total` or `event.plan` work). `attribute` reads a stored subscriber attribute. `email`, `firstName`, and `lastName` read core subscriber fields.
          - `operator` 'is' | 'is_not' | 'contains' | 'not_contains' | 'gt' | 'gte' | 'lt' | 'lte' | 'is_empty' | 'is_not_empty', required
          - `value` string, required — For `variable` and `attribute`, use `name:value` - the part before the colon is the variable path or attribute name, and the part after it is the comparison value. For `email`, `firstName`, and `lastName`, provide the plain comparison string.
      - `html` string — HTML content for email steps.
      - `delay` SequenceDelayInput — Delay before this step runs. Use duration fields for fixed waits, or mode until_date with untilDateField for event/date-field waits.
        - `mode` 'duration' | 'until_date' — Delay mode. Defaults to duration.
        - `days` number
        - `hours` number
        - `minutes` number
        - `untilDateField` string — Event/subscriber date field path to wait until when mode is until_date.
        - `field` string — Alias for untilDateField.
        - `untilOffsetDirection` 'before' | 'after' — Whether the offset runs before or after the date field. Defaults to after.
        - `direction` 'before' | 'after' — Alias for untilOffsetDirection.
        - `untilMissingAction` 'continue' | 'exit' — What to do when the date field is missing or invalid. Defaults to continue.
        - `missingAction` 'continue' | 'exit' — Alias for untilMissingAction.
      - `waitUntil` SequenceWaitUntilInput — Wait until a date from the enrollment event/subscriber data, optionally offset before or after that date.
        - `field` string — Event/subscriber date field path to wait until.
        - `untilDateField` string — Alias for field.
        - `offset` SequenceDelayOffsetInput — Relative offset for a delay.
          - `days` number
          - `hours` number
          - `minutes` number
        - `days` number — Shorthand offset days when offset is omitted.
        - `hours` number — Shorthand offset hours when offset is omitted.
        - `minutes` number — Shorthand offset minutes when offset is omitted.
        - `direction` 'before' | 'after' — Whether the offset runs before or after the field date. Defaults to after.
        - `untilOffsetDirection` 'before' | 'after' — Alias for direction.
        - `missingAction` 'continue' | 'exit' — What to do when the date field is missing or invalid. Defaults to continue.
        - `untilMissingAction` 'continue' | 'exit' — Alias for missingAction.
      - `delayMs` number — Delay in milliseconds. Useful for standalone delay steps.
      - `name` string — Email template name for email steps.
      - `senderProfileId` string — Email steps only. Sender profile for the new step. Omit to inherit the sender identity of the email step it is inserted after. Mutually exclusive with fromEmail.
      - `fromEmail` string, email — Email steps only. From address for the new step; its domain must be verified. Mutually exclusive with senderProfileId.
      - `fromName` string — Email steps only. Display name override for the new step. With fromEmail, also names a newly created sender profile.
      - `replyProfileId` string — Email steps only. Reply profile for the new step. Omit to inherit from the preceding email step. Mutually exclusive with replyTo.
      - `replyTo` string, email — Email steps only. Reply-To address for the new step. Mutually exclusive with replyProfileId.
      - `replyToName` string — Email steps only. Reply-To display name override for this step. Requires replyTo; omit it when using replyProfileId, which already carries its own display name.
      - `discount` object — Discount configuration for create_discount steps.
  - `graphEdit` SequenceGraphEditInput
    - `action` 'move_node' | 'delete_node' | 'duplicate_node' | 'replace_edges', required — Structural graph operation to perform.
    - `expectedRevision` string, required — graphRevision from the latest get-sequence response. The update is rejected if the graph changed after it was read.
    - `nodeId` string — Existing node to move, delete, or duplicate.
    - `afterNodeId` string — Insert the moved or duplicated node immediately after this node. Mutually exclusive with beforeNodeId.
    - `beforeNodeId` string — Insert the moved or duplicated node immediately before this node. Mutually exclusive with afterNodeId.
    - `edges` SequenceGraphEdgeInput[] — Complete replacement topology for replace_edges. Also supported when deleting a split node whose continuation cannot be inferred safely.
      - `sourceNodeId` string, required — Existing source node ID.
      - `targetNodeId` string, required — Existing target node ID.
      - `condition` object, nullable — Exact branch-lane condition for this edge. Omit or set null for an unconditional edge.
  - `nodeUpdates` SequenceNodeUpdateInput[] — Atomic, type-aware patches for existing sequence nodes. A node may appear only once, and either every patch commits or none do.
    - `nodeId` string, required — Existing sequence node ID returned by get sequence.
    - `changes` object, required — Type-aware node patch. Use the editableFields and notes from the node's updateHints. Omitted fields are preserved. For action_email nodes, a blocks patch that omits emailPreset never changes the step's format - see blocks on SequenceEmailUpdateInput.
      - `emailPreset` 'branded' | 'minimal' — For action_email nodes, set the linked email's per-email Style > Format. Native block emails may include supported custom HTML blocks. Not supported when the entire email is standalone raw HTML.
    - `expectedUpdatedAt` string, date-time — Optional optimistic-concurrency token from the node's latest updatedAt or updateHints.expectedUpdatedAt value. MCP clients require this field.
  - `emails` SequenceEmailUpdateInput[] — Existing email step updates. Provide either emails or steps. Items without nodeId or emailId are matched by existing step order and do not create new steps.
    - `emailId` string — Email template ID to update. You can also pass the node ID here for compatibility.
    - `nodeId` string — Sequence email node ID to update.
    - `name` string — Updated step and email template name.
    - `subject` string — Updated subject line.
    - `previewText` string, nullable — Updated preview text.
    - `isTransactional` boolean — Use transactional email chrome for this sequence email.
    - `ccEmails` string[]
    - `bccEmails` string[]
    - `attachments` UrlAttachment[] — URL-backed file attachments for this email step, fetched at send time. Event-triggered sequences may use {{event.*}} URL templates. Send an empty array to clear them.
      - `filename` string, required — Filename shown in the recipient's email client (including extension). Event merge tags are supported.
      - `path` string, required — Public HTTP(S) URL or an event-backed URL template such as {{event.file_url}}. The resolved URL is validated and fetched at send time.
    - `emailPreset` 'branded' | 'minimal' — Per-email Style > Format for native Sequenzy blocks, including emails that contain supported custom HTML blocks. Minimal removes the company logo and uses the simple footer; branded restores the branded chrome. This is not supported when the entire email is standalone raw HTML and must not be combined with html or htmlContent.
    - `blocks` EmailBlock[] — Replacement Sequenzy email blocks. Put visual styling under styles; top-level style keys such as backgroundColor, backgroundOpacity, borderColor, borderWidth, and borderRadius are normalized into styles. Replacing blocks keeps that step's existing Style > Format rather than the company default: a step that already had a logo or a footer gets them back even when you omit them, and every block added that way is named in the response warnings array. Send emailPreset to change the format instead. A step stored as one standalone raw HTML block has no format, so replacing it with another standalone raw HTML block stores it exactly as sent and nothing is added; replacing that markup with native blocks is a conversion rather than a markup edit, so the new blocks do get a footer.
      - `id` string
      - `type` 'text' | 'html' | 'heading' | 'list' | 'button' | 'spacer' | 'divider' | 'image' | 'columns' | 'conditional-group' | 'repeat' | 'card' | 'cta' | 'social' | 'logo' | 'header' | 'footer' | 'video' | 'product' | 'discount-code' | 'code' | 'countdown' | 'hero' | 'testimonial' | 'gallery' | 'badge' | 'table' | 'features' | 'image-card' | 'pricing' | 'author' | 'article' | 'rating' | 'stats' | 'steps' | 'product-grid' | 'poll', required
      - `content` string — Content for text, html, and heading-like blocks.
      - `styles` object — Per-block visual styles. For compatibility, style fields such as backgroundColor, backgroundOpacity, borderColor, borderWidth, and borderRadius can also be supplied at the block top level and are normalized into this object.
        - `paddingTop` number
        - `paddingBottom` number
        - `paddingLeft` number
        - `paddingRight` number
        - `backgroundColor` string
        - `backgroundOpacity` number — Background opacity percentage from 0 to 100.
        - `textColor` string
        - `textAlign` 'left' | 'center' | 'right'
        - `borderRadius` number
        - `borderColor` string
        - `borderWidth` number
        - `bleed` boolean — Stretch the block edge-to-edge across the email container. Top-level blocks only.
      - `conditions` object[] — Optional per-block display rules. The block renders only when every rule matches. The same shape is used for a conditional-group block's top-level `conditions`.
        - `id` string, required
        - `field` 'variable' | 'attribute' | 'email' | 'firstName' | 'lastName', required — `variable` resolves a merge-tag path from the transactional send `variables` or an automation `event` payload (nested paths like `order.total` or `event.plan` work). `attribute` reads a stored subscriber attribute. `email`, `firstName`, and `lastName` read core subscriber fields.
        - `operator` 'is' | 'is_not' | 'contains' | 'not_contains' | 'gt' | 'gte' | 'lt' | 'lte' | 'is_empty' | 'is_not_empty', required
        - `value` string, required — For `variable` and `attribute`, use `name:value` - the part before the colon is the variable path or attribute name, and the part after it is the comparison value. For `email`, `firstName`, and `lastName`, provide the plain comparison string.
    - `html` string — Raw HTML preserved as one HTML block. Provide html/htmlContent or blocks.
    - `htmlContent` string — Alias for html. Raw HTML is preserved as one HTML block.
    - `senderProfileId` string — Sender profile for this step's From identity. Overrides the sequence-level sender for this step. Mutually exclusive with fromEmail.
    - `fromEmail` string, email — From address for this step. Its domain must be configured and verified. Mutually exclusive with senderProfileId.
    - `fromName` string — Display name override for this step. Alone it only changes the visible name; with fromEmail it also names a newly created sender profile.
    - `replyProfileId` string — Reply profile for this step's Reply-To. Mutually exclusive with replyTo.
    - `replyTo` string, email — Reply-To address for this step. Mutually exclusive with replyProfileId.
    - `replyToName` string — Reply-To display name override for this step. Requires replyTo; omit it when using replyProfileId, which already carries its own display name.
  - `steps` SequenceEmailUpdateInput[] — Alias for emails. Use insertSteps to create new steps.
    - `emailId` string — Email template ID to update. You can also pass the node ID here for compatibility.
    - `nodeId` string — Sequence email node ID to update.
    - `name` string — Updated step and email template name.
    - `subject` string — Updated subject line.
    - `previewText` string, nullable — Updated preview text.
    - `isTransactional` boolean — Use transactional email chrome for this sequence email.
    - `ccEmails` string[]
    - `bccEmails` string[]
    - `attachments` UrlAttachment[] — URL-backed file attachments for this email step, fetched at send time. Event-triggered sequences may use {{event.*}} URL templates. Send an empty array to clear them.
      - `filename` string, required — Filename shown in the recipient's email client (including extension). Event merge tags are supported.
      - `path` string, required — Public HTTP(S) URL or an event-backed URL template such as {{event.file_url}}. The resolved URL is validated and fetched at send time.
    - `emailPreset` 'branded' | 'minimal' — Per-email Style > Format for native Sequenzy blocks, including emails that contain supported custom HTML blocks. Minimal removes the company logo and uses the simple footer; branded restores the branded chrome. This is not supported when the entire email is standalone raw HTML and must not be combined with html or htmlContent.
    - `blocks` EmailBlock[] — Replacement Sequenzy email blocks. Put visual styling under styles; top-level style keys such as backgroundColor, backgroundOpacity, borderColor, borderWidth, and borderRadius are normalized into styles. Replacing blocks keeps that step's existing Style > Format rather than the company default: a step that already had a logo or a footer gets them back even when you omit them, and every block added that way is named in the response warnings array. Send emailPreset to change the format instead. A step stored as one standalone raw HTML block has no format, so replacing it with another standalone raw HTML block stores it exactly as sent and nothing is added; replacing that markup with native blocks is a conversion rather than a markup edit, so the new blocks do get a footer.
      - `id` string
      - `type` 'text' | 'html' | 'heading' | 'list' | 'button' | 'spacer' | 'divider' | 'image' | 'columns' | 'conditional-group' | 'repeat' | 'card' | 'cta' | 'social' | 'logo' | 'header' | 'footer' | 'video' | 'product' | 'discount-code' | 'code' | 'countdown' | 'hero' | 'testimonial' | 'gallery' | 'badge' | 'table' | 'features' | 'image-card' | 'pricing' | 'author' | 'article' | 'rating' | 'stats' | 'steps' | 'product-grid' | 'poll', required
      - `content` string — Content for text, html, and heading-like blocks.
      - `styles` object — Per-block visual styles. For compatibility, style fields such as backgroundColor, backgroundOpacity, borderColor, borderWidth, and borderRadius can also be supplied at the block top level and are normalized into this object.
        - `paddingTop` number
        - `paddingBottom` number
        - `paddingLeft` number
        - `paddingRight` number
        - `backgroundColor` string
        - `backgroundOpacity` number — Background opacity percentage from 0 to 100.
        - `textColor` string
        - `textAlign` 'left' | 'center' | 'right'
        - `borderRadius` number
        - `borderColor` string
        - `borderWidth` number
        - `bleed` boolean — Stretch the block edge-to-edge across the email container. Top-level blocks only.
      - `conditions` object[] — Optional per-block display rules. The block renders only when every rule matches. The same shape is used for a conditional-group block's top-level `conditions`.
        - `id` string, required
        - `field` 'variable' | 'attribute' | 'email' | 'firstName' | 'lastName', required — `variable` resolves a merge-tag path from the transactional send `variables` or an automation `event` payload (nested paths like `order.total` or `event.plan` work). `attribute` reads a stored subscriber attribute. `email`, `firstName`, and `lastName` read core subscriber fields.
        - `operator` 'is' | 'is_not' | 'contains' | 'not_contains' | 'gt' | 'gte' | 'lt' | 'lte' | 'is_empty' | 'is_not_empty', required
        - `value` string, required — For `variable` and `attribute`, use `name:value` - the part before the colon is the variable path or attribute name, and the part after it is the comparison value. For `email`, `firstName`, and `lastName`, provide the plain comparison string.
    - `html` string — Raw HTML preserved as one HTML block. Provide html/htmlContent or blocks.
    - `htmlContent` string — Alias for html. Raw HTML is preserved as one HTML block.
    - `senderProfileId` string — Sender profile for this step's From identity. Overrides the sequence-level sender for this step. Mutually exclusive with fromEmail.
    - `fromEmail` string, email — From address for this step. Its domain must be configured and verified. Mutually exclusive with senderProfileId.
    - `fromName` string — Display name override for this step. Alone it only changes the visible name; with fromEmail it also names a newly created sender profile.
    - `replyProfileId` string — Reply profile for this step's Reply-To. Mutually exclusive with replyTo.
    - `replyTo` string, email — Reply-To address for this step. Mutually exclusive with replyProfileId.
    - `replyToName` string — Reply-To display name override for this step. Requires replyTo; omit it when using replyProfileId, which already carries its own display name.
  - `smsSteps` SequenceSmsStepUpdateInput[] — Content updates for existing SMS steps, targeted by action_sms nodeId. Content-only edits; use insertSteps to create new SMS steps.
    - `nodeId` string, required — Target action_sms node ID from GET /sequences/{sequenceId}.
    - `text` string — Replacement plain-text message body. Merge tags like {{FIRST_NAME}} work. Provide text or blocks, not both.
    - `blocks` object[] — Replacement SMS content blocks (text + image subset).
    - `imageUrls` string[] — Up to 2 publicly reachable MMS image URLs. Only valid together with text.
    - `label` string — Updated display label for the step.
    - `ineligibleAction` 'skip' | 'exit' — Updated behavior when the contact can't receive SMS.
  - `subscriberUpdateSteps` SequenceSubscriberUpdateStepUpdateInput[] — Full config replacements for existing action_update_attributes steps, targeted by nodeId.
    - `nodeId` string, required — Target action_update_attributes node ID.
    - `config` SubscriberUpdateConfig, required — Update Subscriber config. String values may use standalone trigger-event merge tags such as {{event.plan}}, {{event.amount}}, or {{event.active}}. Number and boolean values are coerced after resolution.
      - `label` string
      - `firstName` string, nullable
      - `lastName` string, nullable
      - `status` 'active' | 'unsubscribed' | 'bounced'
      - `customAttributeUpdates` object[]
        - `name` string, required
        - `value` union, required — Literal scalar, null to delete, or one standalone merge tag.
          - string
          - number
          - boolean
        - `valueType` 'text' | 'number' | 'boolean'

## Response `200`

Sequence updated successfully

- object
  - `success` boolean
  - `warnings` string[] — Non-blocking advisories about a successful write. Present when an input was discarded or did not take effect as requested. This includes block fields that do not render as their names suggest, sequence email-step formatting restored on top of submitted blocks, and sender-identity conflicts such as a replyToName that differs from the saved profile. Each message identifies the affected input and gives recovery guidance. Absent when there is nothing to report.
  - `sequence` object
    - `id` string
    - `name` string
    - `status` 'draft' | 'active' | 'paused' | 'archived' — Stored lifecycle status. Do not read literally: a sequence can be active while enrollmentPaused blocks new subscribers. Branch on effectiveStatus instead.
    - `enrollmentPaused` boolean
    - `updatedEmailCount` number
    - `updatedSmsStepCount` number
    - `updatedSubscriberStepCount` number
    - `stopCondition` SequenceStopCondition — Auto-stop condition, re-evaluated before every step including the first one. has_tag, added_to_list, entered_segment, field_changed, and event_received stop the run once the thing happens. does_not_have_tag and removed_from_list stop the run whenever the subscriber lacks that tag or list membership, so they act as a required-tag or required-list allowlist and cancel everyone else before any step sends. Guarded-out contacts still enroll and are then cancelled at the trigger node, so they appear as cancellations there rather than in the active or waiting enrollment counts. Clearing the guard does not retry them: they only receive the sequence if the trigger fires for them again, and on the one_time enrollment mode not even then.
      - `type` 'none' | 'has_tag' | 'does_not_have_tag' | 'added_to_list' | 'removed_from_list' | 'entered_segment' | 'field_changed' | 'event_received'
      - `value` string, nullable — Tag name, list ID, segment ID, field path, or event name. For the does_not_have_tag and removed_from_list guards this is the tag or list a subscriber must have to keep receiving the sequence.
      - `matchConfig` union — Optional typed match rule. event_received uses event_property rules; field_changed uses a field_value comparison.
        - object
          - `mode` 'event_property', required
          - `rules` object[], required
            - `entryFieldPath` string, required
            - `eventFieldPath` string, required
        - object
          - `mode` 'field_value', required
          - `operator` 'equals' | 'not_equals' | 'greater_than' | 'less_than' | 'contains' | 'not_contains', required
          - `value` string, required
    - `sendingWindow` SequenceSendingWindow — Optional local-time sending window applied to every email step in a sequence. Email steps that become due outside the window wait until the next allowed local time.
      - `enabled` boolean
      - `timezone` string — IANA timezone for the window.
      - `startTime` string — Earliest local send time in 24-hour HH:mm format.
      - `endTime` string — Latest local send cutoff in 24-hour HH:mm format. Must be later than startTime.
      - `days` string[] — Allowed local days. Omit days when creating or updating to allow every day.
    - `bccEmails` string[], nullable
    - `addedBranchNodeId` string
    - `addedBranchPathNodeIds` object
    - `insertedNodeIds` string[]
    - `insertedEmailIds` string[]
    - `insertedEmailCount` number
    - `graphEditAction` 'move_node' | 'delete_node' | 'duplicate_node' | 'replace_edges'
    - `movedNodeId` string — Node moved by a move_node edit.
    - `deletedNodeId` string — Node deleted by a delete_node edit.
    - `duplicatedNodeId` string — New node created by a duplicate_node edit.
    - `replacedEdgeCount` number — Number of edges in the committed graph after a structural graph edit.
    - `graphRevision` string — Revision of the committed graph. Use it for the next graphEdit.expectedRevision.
    - `migratedRecipientCount` number — Recipients moved off deleted steps to the next step and processed immediately.
    - `completedRecipientCount` number — Recipients completed because their deleted step had no next step.

## Other responses

- `400` — Validation error
- `401` — Unauthorized
- `403` — No company selected
- `404` — Sequence not found

---

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