Sequences
Update Sequence
Update sequence identity, settings, structure, or existing nodes
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 withinsertSteps, restructure existing nodes with graphEdit, or target
any existing node with nodeUpdates.
Request
Sequence ID.
Updated sequence name.
Updated dashboard description.
Replacement dashboard label names. Missing labels are created.
Whether recipients can cancel this sequence from email preferences.
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.From address for every sequence email. Its domain must be configured and
verified. Mutually exclusive with
senderProfileId.Display name for a newly created sender profile. Requires
fromEmail.Existing sender profile ID. Mutually exclusive with
fromEmail.Reply-To address for every sequence email. Mutually exclusive with
replyProfileId.Display name for a newly created reply profile. Requires
replyTo.Existing reply profile ID. Mutually exclusive with
replyTo.Updated re-entry mode:
unlimited, one_time, or matching_field.
matching_field is only valid for event-based sequence triggers.Dot-path event property used by
matching_field. Set to null or omit it to
use the built-in defaults.{"enrollmentMode":"matching_field","enrollmentFieldPath":"order.id"} to allow one active run per order while blocking duplicate active runs for the same subscriber and order.
Set to
true to stop new enrollments for an active sequence while current
recipients continue. Set to false to reopen new enrollments.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.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.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.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.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.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.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.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.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.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).Alias for
emails. Use insertSteps to create new steps.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.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.node_end:
Responses
Update Sequence