Skip to main content
PUT
Update Sequence

Update Sequence

Updates sequence sending identity, metadata, auto-stop behavior, branch logic, graph topology, linear steps, and email content. You can insert new linear steps with insertSteps, restructure existing nodes with graphEdit, or target any existing node with nodeUpdates.

Request

sequenceId
string
required
Sequence ID.
name
string
Updated sequence name.
description
string
Updated dashboard description.
labels
string[]
Replacement dashboard label names. Missing labels are created.
userCancellable
boolean
Whether recipients can cancel this sequence from email preferences.
trigger
string
Atomically replace the current trigger with contact_added, tag_added, segment_entered, event_received, inbound_webhook, inactivity, or frequency. Include the matching trigger fields (listId, tagName, segmentId, eventName, propertyFilters, integrationSlug, integrationEventKey, customIntegration, inactiveDays, inactivityBaseline, minCount, or timeWindowDays) in the same request. Active sequences require confirmLiveChange: true. Trigger replacement cannot be combined with node, content, or structural graph changes.
fromEmail
string
From address for every sequence email. Its domain must be configured and verified. Mutually exclusive with senderProfileId.
fromName
string
Display name for a newly created sender profile. Requires fromEmail.
senderProfileId
string
Existing sender profile ID. Mutually exclusive with fromEmail.
replyTo
string
Reply-To address for every sequence email. Mutually exclusive with replyProfileId.
replyToName
string
Display name for a newly created reply profile. Requires replyTo.
replyProfileId
string
Existing reply profile ID. Mutually exclusive with replyTo.
enrollmentMode
string
Updated re-entry mode: unlimited, one_time, or matching_field. matching_field is only valid for event-based sequence triggers.
enrollmentFieldPath
string
Dot-path event property used by matching_field. Set to null or omit it to use the built-in defaults.
For example, use {"enrollmentMode":"matching_field","enrollmentFieldPath":"order.id"} to allow one active run per order while blocking duplicate active runs for the same subscriber and order.
enrollmentPaused
boolean
Set to true to stop new enrollments for an active sequence while current recipients continue. Set to false to reopen new enrollments.
sendingWindow
object | null
Updated local-time sending window for every email step. Set to null to remove the sending restriction. When set, email steps that become due outside the window wait until the next allowed local time.
bccEmails
string[] | null
Email addresses that receive a blind copy of every email this sequence sends, such as a customer support inbox (max 10). BCC recipients are invisible to the subscriber. Set to null to remove them.
stopCondition
object
Updated auto-stop condition. Use has_tag, does_not_have_tag, added_to_list, removed_from_list, entered_segment, field_changed, event_received, or none. event_received can use typed event_property match rules and field_changed can use a typed field_value comparison.
branch
object
Insert an if/else branch after an existing node. Provide afterNodeId and a branches array. Each conditional path can create steps, route directly to an existing targetNodeId, or run steps and then reach that target. The else path uses elseSteps and/or elseTargetNodeId. Use the completion node ID returned by the sequence GET endpoint to end one path immediately. Empty branch paths are rejected unless you set allowEmptyPaths: true. Branch conditionType values include has_tag, does_not_have_tag, in_list, in_segment, event_received, link_clicked, and field comparisons. For has_tag and does_not_have_tag, provide tagId or tagName. For event_received and link_clicked, set activityScope to this_sequence, previous_email, or ever; omitting it checks ever.
insertSteps
object
Insert one or more new linear steps into the sequence. Provide afterNodeId to insert after a specific node from GET /api/v1/sequences/{sequenceId}. If afterNodeId is omitted, the steps are appended only when the sequence has exactly one linear tail. Linear insertion supports every non-trigger addable step type that does not require companion records: email, SMS, delay, tag/list actions, attribute updates, discounts, conditions, wait-for-event steps, and webhooks. SMS steps use type: "sms" with a plain-text text field (optional label, ineligibleAction, imageUrls); generate copy with the Generate SMS endpoint. Email and delay steps can use fixed delay/delayMs waits or dynamic waitUntil date-field waits. Use nodeType: "logic_wait_for_event" with a config containing eventName, timeoutDays (1-365), timeoutAction (continue or exit), and an optional label to insert an event gate. Event receipt and a continuing timeout both use the gate’s single next path; timeoutAction: "exit" completes the enrollment on timeout. Use branch for if/else paths. Provide only one of branch, insertSteps, or graphEdit in a request. Inserted email steps inherit the effective sender identity (sender profile, display name, and Reply-To) of the nearest sequence email. Across a branch merge, only identity fields shared by every incoming path are inherited; conflicting fields use the sequence or company defaults. Set senderProfileId/fromEmail or replyProfileId/replyTo on a step to override the inherited identity.
graphEdit
object
Restructure existing sequence nodes. Set action to move_node, duplicate_node, delete_node, or replace_edges, and include the expectedRevision returned as graphRevision by the latest GET /api/v1/sequences/{sequenceId} response. A stale revision is rejected.move_node and duplicate_node require nodeId plus exactly one of afterNodeId or beforeNodeId. beforeNodeId funnels every incoming path through the moved or copied node, so it can relocate an A/B test below paths that converge at a shared continuation. Duplicated email and A/B test steps receive independent content records; A/B metrics and winner state reset.delete_node automatically reconnects a linear step. To delete a split node, also provide the complete replacement edges. replace_edges always requires the complete normalized topology returned by the sequence GET endpoint and supports atomic path reconnects or multi-node reorders. Deleting an A/B test step also removes its test, variants, and variant localizations unless the test is currently in progress or replacement variants are still being generated.Preserve condition.branchId on every edge leaving a branch node. Graph edits reject cycles, disconnected nodes, invalid branch lanes, changes that remove the trigger/end path, and deletion of a node that currently holds an active or waiting recipient.
confirmStructuralChange
boolean
Required when inserting linear steps, branches, or applying graphEdit to an active sequence. Set it to true only after confirming the live-flow impact for current and future recipients. Content-only email edits do not require this flag.
nodeUpdates
array
Atomic, type-aware patches for existing nodes. Each item requires nodeId and a non-empty changes object. Pass the updatedAt returned for that node by GET /api/v1/sequences/{sequenceId} as expectedUpdatedAt to prevent a stale write. A node may appear only once, and nodeUpdates cannot be combined with legacy email/SMS/subscriber step arrays or structural edits.Each node read also includes updateHints, which lists that node type’s editable fields, managed fields, special restrictions, and the exact expectedUpdatedAt token to return.logic_delay accepts exactly one of delay (days, hours, minutes), delayMs, or waitUntil. action_email accepts name/label, subject, preview text, HTML or blocks, emailPreset (branded or minimal), transactional mode, and per-step sender/reply identity. Setting emailPreset transforms that linked email’s native blocks using the same Style > Format behavior as the dashboard without changing the company default. Native block emails may include supported custom HTML blocks. An email stored entirely as one standalone raw HTML block does not support emailPreset, and emailPreset cannot be combined with html or htmlContent. SMS and every other stored node type accept their type-specific editable config fields. Omitted fields are preserved. Managed linked-resource IDs, node-type conversion, and branch path IDs/count are rejected; use graphEdit for topology changes. Webhook header patches merge with existing headers, and redacted values from the read response cannot be written back.
confirmLiveChange
boolean
Required with nodeUpdates when the sequence is active. Set it to true only after confirming the behavior change. Existing waiting recipients retain their already-calculated scheduledFor; a new delay applies when recipients reach that node after the update.
emails
array
Existing email step updates. Provide emails or steps, not both. Items without nodeId or emailId are matched by existing step order and do not create new steps. html and htmlContent are preserved as one raw HTML block; provide blocks for native Sequenzy block content. Each item can also set emailPreset to minimal or branded when working with native blocks, including emails that contain supported custom HTML blocks. Emails stored entirely as one standalone raw HTML block do not support format changes. Each item can also set per-step sender identity: senderProfileId or fromEmail (+ optional fromName) for the From identity, and replyProfileId or replyTo (+ optional replyToName) for the Reply-To. A fromName on its own only changes the visible display name. Per-step identity overrides the sequence-level sender for that step. Email items can also set isTransactional, ccEmails, and bccEmails to match the dashboard delivery settings, and attachments ([{ filename, path }]) to configure URL-backed file attachments fetched at send time. For event-triggered sequences, path may use {{event.file_url}} and filename may also use event merge tags; values come from the event that enrolled each subscriber (max 10, 7MB total per email; an empty array removes them).
steps
array
Alias for emails. Use insertSteps to create new steps.
smsSteps
array
Content updates for existing SMS steps, targeted by nodeId (an action_sms node from GET /api/v1/sequences/{sequenceId}). Each entry can set text (or blocks), imageUrls (with text), label, and ineligibleAction (skip or exit). SMS content edits are content-only and do not require confirmStructuralChange. Use insertSteps to create new SMS steps.
subscriberUpdateSteps
array
Full config replacements for existing Update Subscriber steps, targeted by an action_update_attributes node ID from GET /api/v1/sequences/{sequenceId}. Values can use standalone event merge tags such as {{event.plan}}; number and boolean tags are coerced after resolution.
Suppress a follow-up after a reply by routing the matching path to completion and the else path to the existing second email:
Move an existing A/B test below paths that converge at node_end:
Atomically change two existing delays from five minutes to seven days:

Responses