Skip to content

Sequence

Sequences are multi-step outreach cadences that send email and LinkedIn messages to enrolled contacts. A sequence is edited through its draft, published, then activated; contacts are enrolled into the published sequence. Start with Using sequences with the API for the lifecycle, the draft and version model, and a worked example.

List sequences
client.sequence.list(SequenceListParams { limit, offset } query?, RequestOptionsoptions?): SequenceListResponse { data, object, totalCount }
GET/v1/sequences
Retrieve a sequence
client.sequence.retrieve(stringid, RequestOptionsoptions?): SequenceRetrieveResponse { id, channels, createdAt, 8 more }
GET/v1/sequences/{id}
Retrieve sequence performance
client.sequence.retrievePerformance(stringid, RequestOptionsoptions?): SequenceRetrievePerformanceResponse { byStepType, perStep }
GET/v1/sequences/{id}/performance
Retrieve a sequence enrollment
client.sequence.retrieveEnrollment(stringenrollmentID, SequenceRetrieveEnrollmentParams { id } params, RequestOptionsoptions?): SequenceRetrieveEnrollmentResponse { id, cancelledAt, completedAt, 10 more }
GET/v1/sequences/{id}/enrollments/{enrollmentId}
List sequence enrollments
client.sequence.listEnrollments(stringid, SequenceListEnrollmentsParams { limit, offset } query?, RequestOptionsoptions?): SequenceListEnrollmentsResponse { data, object, totalCount }
GET/v1/sequences/{id}/enrollments
List sequence messages
client.sequence.listMessages(stringid, SequenceListMessagesParams { limit, offset } query?, RequestOptionsoptions?): SequenceListMessagesResponse { data, object, totalCount }
GET/v1/sequences/{id}/messages
Retrieve a sequence message
client.sequence.retrieveMessage(stringmessageID, SequenceRetrieveMessageParams { id } params, RequestOptionsoptions?): SequenceRetrieveMessageResponse
GET/v1/sequences/{id}/messages/{messageId}
Enroll and cancel contacts
client.sequence.updateEnrollments(stringid, SequenceUpdateEnrollmentsParams { add, remove } body, RequestOptionsoptions?): SequenceUpdateEnrollmentsResponse { results }
POST/v1/sequences/{id}/enrollments
Create a sequence
client.sequence.create(SequenceCreateParams { definition, name, reviewers, senders } body, RequestOptionsoptions?): SequenceCreateResponse { channels, definition, name, 6 more }
POST/v1/sequences
Activate a sequence
client.sequence.activate(stringid, SequenceActivateParams { body } params?, RequestOptionsoptions?): SequenceActivateResponse { id, channels, createdAt, 8 more }
POST/v1/sequences/{id}/activate
Deactivate a sequence
client.sequence.deactivate(stringid, SequenceDeactivateParams { body } params?, RequestOptionsoptions?): SequenceDeactivateResponse { id, channels, createdAt, 8 more }
POST/v1/sequences/{id}/deactivate
Retrieve a sequence draft
client.sequence.retrieveDraft(stringid, RequestOptionsoptions?): SequenceRetrieveDraftResponse { channels, definition, name, 6 more }
GET/v1/sequences/{id}/draft
Update a sequence draft
client.sequence.updateDraft(stringid, SequenceUpdateDraftParams { definition, expectedVersion, name, 2 more } body, RequestOptionsoptions?): SequenceUpdateDraftResponse { channels, definition, name, 6 more }
POST/v1/sequences/{id}/draft
Publish a sequence draft
client.sequence.publishDraft(stringid, SequencePublishDraftParams { expectedVersion } body, RequestOptionsoptions?): SequencePublishDraftResponse { id, channels, createdAt, 8 more }
POST/v1/sequences/{id}/draft/publish
Discard a sequence draft
client.sequence.discardDraft(stringid, SequenceDiscardDraftParams { expectedVersion } body, RequestOptionsoptions?): SequenceDiscardDraftResponse { sequenceDeleted, sequenceId }
POST/v1/sequences/{id}/draft/discard
ModelsExpand Collapse
SequenceActivateResponse { id, channels, createdAt, 8 more }
id: string

Unique identifier of the sequence.

channels: Array<"EMAIL" | "LINKEDIN">

Channels the published steps send on; empty before the first publish.

One of the following:
"EMAIL"
"LINKEDIN"
createdAt: string

ISO 8601 creation timestamp.

definition: Definition | null

Published configuration, or null before the first publish.

description: string

What this version of the sequence is for.

messaging: Messaging { callToAction, persona, trigger, valueProp }

Messaging inputs that frame every step.

callToAction: string | null

What the recipient is asked to do.

persona: string | null

Who the sequence targets.

trigger: string | null

Why the outreach is timely.

valueProp: string | null

The value proposition.

pacing: Pacing { EMAIL, LINKEDIN_INVITE, LINKEDIN_MESSAGE }

How the whole sequence paces each step type it sends, keyed by sequence step type.

EMAIL: Email { dailyLimit }

Email steps.

dailyLimit: number | null

Most sends of this step type across the whole sequence in any rolling 24 hours, or null when the sequence sets no daily cap. Workspace and sender limits still apply.

minimum-9007199254740991
maximum9007199254740991
LINKEDIN_INVITE: LinkedinInvite { dailyLimit }

LinkedIn connection requests.

dailyLimit: number | null

Most sends of this step type across the whole sequence in any rolling 24 hours, or null when the sequence sets no daily cap. Workspace and sender limits still apply.

minimum-9007199254740991
maximum9007199254740991
LINKEDIN_MESSAGE: LinkedinMessage { dailyLimit }

LinkedIn messages.

dailyLimit: number | null

Most sends of this step type across the whole sequence in any rolling 24 hours, or null when the sequence sets no daily cap. Workspace and sender limits still apply.

minimum-9007199254740991
maximum9007199254740991
priority: "HIGH" | "NORMAL"

Send priority relative to other sequences.

One of the following:
"HIGH"
"NORMAL"
sendWindow: SendWindow { daysOfWeek, endHour, startHour, timezone }

When the sequence may send.

daysOfWeek: Array<number>

Days sends may go out, 0 = Sunday.

endHour: number

Local hour sends stop, exclusive (1–24).

minimum-9007199254740991
maximum9007199254740991
startHour: number

First local hour sends may go out (0–23).

minimum-9007199254740991
maximum9007199254740991
timezone: string

IANA timezone of the window.

steps: Array<UnionMember0 { id, deliveryMode, name, 2 more } | UnionMember1 { id, deliveryMode, includeNote, 3 more } | UnionMember2 { id, duration, type, unit } >

Email, LinkedIn and wait steps in execution order.

One of the following:
UnionMember0 { id, deliveryMode, name, 2 more }
id: string

Step identifier, referenced by enrollment currentStepId and message sequenceStepId.

deliveryMode: "AUTO" | "FOR_REVIEW"

AUTO sends without manual approval, subject to the send window and limits; FOR_REVIEW requires a person to approve the draft before sending.

One of the following:
"AUTO"
"FOR_REVIEW"
name: string

Display name of the step.

prompt: string

Instructions the agent follows when composing this message.

type: "EMAIL" | "LINKEDIN_MESSAGE"

Step type.

One of the following:
"EMAIL"
"LINKEDIN_MESSAGE"
UnionMember1 { id, deliveryMode, includeNote, 3 more }
id: string

Step identifier, referenced by enrollment currentStepId and message sequenceStepId.

deliveryMode: "AUTO" | "FOR_REVIEW"

AUTO sends without manual approval, subject to the send window and limits; FOR_REVIEW requires a person to approve the draft before sending.

One of the following:
"AUTO"
"FOR_REVIEW"
includeNote: boolean

Whether the connection request carries a note. A step authored before this setting existed reads as true.

name: string

Display name of the step.

prompt: string

Instructions the agent follows when composing this message.

type: "LINKEDIN_INVITE"

Step type.

UnionMember2 { id, duration, type, unit }
id: string

Step identifier.

duration: number

Length of the wait.

minimum-9007199254740991
maximum9007199254740991
type: "WAIT" | "WAIT_FOR_CONNECTION"

WAIT pauses for a fixed time; WAIT_FOR_CONNECTION waits up to that long for a LinkedIn invite to be accepted.

One of the following:
"WAIT"
"WAIT_FOR_CONNECTION"
unit: "DAY" | "MINUTE"

Unit of duration.

One of the following:
"DAY"
"MINUTE"
firstActivatedAt: string | null

When the sequence was first activated.

lastActivatedAt: string | null

When the sequence was most recently activated.

name: string

Name of the sequence.

objectType: "sequence"

Always sequence.

reviewers: Array<Reviewer>

Extra members who may approve this sequence’s FOR_REVIEW messages before they send. The sending member and the sequence’s creator always review, whether or not they are listed.

id: string

ID of the member.

minLength1
objectType: "member"

Always member.

senders: Array<Sender>

The senders this sequence sends from; new contacts rotate across them. An archived sender stays listed but never sends; any change to the list drops it.

id: string

ID of the sender.

minLength1
objectType: "sender"

Always sender.

status: "DRAFT" | "ACTIVE" | "DEACTIVATED"

DRAFT has not been published; ACTIVE is enabled for sending; DEACTIVATED is published but paused.

One of the following:
"DRAFT"
"ACTIVE"
"DEACTIVATED"
SequenceCreateResponse { channels, definition, name, 6 more }
channels: Array<"EMAIL" | "LINKEDIN">

Channels the draft’s steps send on.

One of the following:
"EMAIL"
"LINKEDIN"
definition: Definition { description, messaging, pacing, 3 more }

The draft configuration, in the same shape as a published definition.

description: string

What this version of the sequence is for.

messaging: Messaging { callToAction, persona, trigger, valueProp }

Messaging inputs that frame every step.

callToAction: string | null

What the recipient is asked to do.

persona: string | null

Who the sequence targets.

trigger: string | null

Why the outreach is timely.

valueProp: string | null

The value proposition.

pacing: Pacing { EMAIL, LINKEDIN_INVITE, LINKEDIN_MESSAGE }

How the whole sequence paces each step type it sends, keyed by sequence step type.

EMAIL: Email { dailyLimit }

Email steps.

dailyLimit: number | null

Most sends of this step type across the whole sequence in any rolling 24 hours, or null when the sequence sets no daily cap. Workspace and sender limits still apply.

minimum-9007199254740991
maximum9007199254740991
LINKEDIN_INVITE: LinkedinInvite { dailyLimit }

LinkedIn connection requests.

dailyLimit: number | null

Most sends of this step type across the whole sequence in any rolling 24 hours, or null when the sequence sets no daily cap. Workspace and sender limits still apply.

minimum-9007199254740991
maximum9007199254740991
LINKEDIN_MESSAGE: LinkedinMessage { dailyLimit }

LinkedIn messages.

dailyLimit: number | null

Most sends of this step type across the whole sequence in any rolling 24 hours, or null when the sequence sets no daily cap. Workspace and sender limits still apply.

minimum-9007199254740991
maximum9007199254740991
priority: "HIGH" | "NORMAL"

Send priority relative to other sequences.

One of the following:
"HIGH"
"NORMAL"
sendWindow: SendWindow { daysOfWeek, endHour, startHour, timezone }

When the sequence may send.

daysOfWeek: Array<number>

Days sends may go out, 0 = Sunday.

endHour: number

Local hour sends stop, exclusive (1–24).

minimum-9007199254740991
maximum9007199254740991
startHour: number

First local hour sends may go out (0–23).

minimum-9007199254740991
maximum9007199254740991
timezone: string

IANA timezone of the window.

steps: Array<UnionMember0 { id, deliveryMode, name, 2 more } | UnionMember1 { id, deliveryMode, includeNote, 3 more } | UnionMember2 { id, duration, type, unit } >

Email, LinkedIn and wait steps in execution order.

One of the following:
UnionMember0 { id, deliveryMode, name, 2 more }
id: string

Step identifier, referenced by enrollment currentStepId and message sequenceStepId.

deliveryMode: "AUTO" | "FOR_REVIEW"

AUTO sends without manual approval, subject to the send window and limits; FOR_REVIEW requires a person to approve the draft before sending.

One of the following:
"AUTO"
"FOR_REVIEW"
name: string

Display name of the step.

prompt: string

Instructions the agent follows when composing this message.

type: "EMAIL" | "LINKEDIN_MESSAGE"

Step type.

One of the following:
"EMAIL"
"LINKEDIN_MESSAGE"
UnionMember1 { id, deliveryMode, includeNote, 3 more }
id: string

Step identifier, referenced by enrollment currentStepId and message sequenceStepId.

deliveryMode: "AUTO" | "FOR_REVIEW"

AUTO sends without manual approval, subject to the send window and limits; FOR_REVIEW requires a person to approve the draft before sending.

One of the following:
"AUTO"
"FOR_REVIEW"
includeNote: boolean

Whether the connection request carries a note. A step authored before this setting existed reads as true.

name: string

Display name of the step.

prompt: string

Instructions the agent follows when composing this message.

type: "LINKEDIN_INVITE"

Step type.

UnionMember2 { id, duration, type, unit }
id: string

Step identifier.

duration: number

Length of the wait.

minimum-9007199254740991
maximum9007199254740991
type: "WAIT" | "WAIT_FOR_CONNECTION"

WAIT pauses for a fixed time; WAIT_FOR_CONNECTION waits up to that long for a LinkedIn invite to be accepted.

One of the following:
"WAIT"
"WAIT_FOR_CONNECTION"
unit: "DAY" | "MINUTE"

Unit of duration.

One of the following:
"DAY"
"MINUTE"
name: string

Name the sequence takes when the draft is published.

publishWarnings: Array<PublishWarning>

What publishing this draft would change for contacts already in the sequence; empty when nothing is affected. Before the first publish, the only possible warning is a proposed sender that was archived and would be left off.

code: "delay_shortened" | "delay_lengthened" | "connection_wait_shortened" | 18 more

What publishing would change.

One of the following:
"delay_shortened"
"delay_lengthened"
"connection_wait_shortened"
"connection_wait_lengthened"
"send_schedule_changed"
"send_configuration_changed"
"send_priority_changed"
"senders_changed"
"email_sender_pool_emptied"
"linkedin_account_pool_emptied"
"assigned_sender_removed"
"delivery_became_automatic"
"invite_note_enabled"
"invite_note_disabled"
"step_inserted"
"automatic_send_step_inserted"
"step_removed"
"step_type_changed"
"step_order_changed"
"full_identity_rewrite"
"low_identity_overlap"
message: string

What would change, in plain language.

severity: "warning" | "destructive"

destructive when contacts already in the sequence may skip, repeat or receive a step they would not have; warning otherwise.

One of the following:
"warning"
"destructive"
stepIds: Array<string>

The steps involved; empty for a sequence-wide change.

reviewers: Array<Reviewer>

Extra members who may approve this sequence’s FOR_REVIEW messages before they send. The sending member and the sequence’s creator always review, whether or not they are listed.

id: string

ID of the member.

minLength1
objectType: "member"

Always member.

senders: Array<Sender>

The senders this draft will publish; new contacts rotate across them. Until a save changes it, this is the sequence’s live list. An archived sender stays listed but never sends; any change to the list drops it.

id: string

ID of the sender.

minLength1
objectType: "sender"

Always sender.

sequenceId: string

The sequence this draft belongs to.

updatedAt: string

When the draft last changed.

version: string

Opaque token for the current state of the draft. Send it as expectedVersion on the next save, publish or discard; it changes whenever anyone edits the draft.

SequenceDeactivateResponse { id, channels, createdAt, 8 more }
id: string

Unique identifier of the sequence.

channels: Array<"EMAIL" | "LINKEDIN">

Channels the published steps send on; empty before the first publish.

One of the following:
"EMAIL"
"LINKEDIN"
createdAt: string

ISO 8601 creation timestamp.

definition: Definition | null

Published configuration, or null before the first publish.

description: string

What this version of the sequence is for.

messaging: Messaging { callToAction, persona, trigger, valueProp }

Messaging inputs that frame every step.

callToAction: string | null

What the recipient is asked to do.

persona: string | null

Who the sequence targets.

trigger: string | null

Why the outreach is timely.

valueProp: string | null

The value proposition.

pacing: Pacing { EMAIL, LINKEDIN_INVITE, LINKEDIN_MESSAGE }

How the whole sequence paces each step type it sends, keyed by sequence step type.

EMAIL: Email { dailyLimit }

Email steps.

dailyLimit: number | null

Most sends of this step type across the whole sequence in any rolling 24 hours, or null when the sequence sets no daily cap. Workspace and sender limits still apply.

minimum-9007199254740991
maximum9007199254740991
LINKEDIN_INVITE: LinkedinInvite { dailyLimit }

LinkedIn connection requests.

dailyLimit: number | null

Most sends of this step type across the whole sequence in any rolling 24 hours, or null when the sequence sets no daily cap. Workspace and sender limits still apply.

minimum-9007199254740991
maximum9007199254740991
LINKEDIN_MESSAGE: LinkedinMessage { dailyLimit }

LinkedIn messages.

dailyLimit: number | null

Most sends of this step type across the whole sequence in any rolling 24 hours, or null when the sequence sets no daily cap. Workspace and sender limits still apply.

minimum-9007199254740991
maximum9007199254740991
priority: "HIGH" | "NORMAL"

Send priority relative to other sequences.

One of the following:
"HIGH"
"NORMAL"
sendWindow: SendWindow { daysOfWeek, endHour, startHour, timezone }

When the sequence may send.

daysOfWeek: Array<number>

Days sends may go out, 0 = Sunday.

endHour: number

Local hour sends stop, exclusive (1–24).

minimum-9007199254740991
maximum9007199254740991
startHour: number

First local hour sends may go out (0–23).

minimum-9007199254740991
maximum9007199254740991
timezone: string

IANA timezone of the window.

steps: Array<UnionMember0 { id, deliveryMode, name, 2 more } | UnionMember1 { id, deliveryMode, includeNote, 3 more } | UnionMember2 { id, duration, type, unit } >

Email, LinkedIn and wait steps in execution order.

One of the following:
UnionMember0 { id, deliveryMode, name, 2 more }
id: string

Step identifier, referenced by enrollment currentStepId and message sequenceStepId.

deliveryMode: "AUTO" | "FOR_REVIEW"

AUTO sends without manual approval, subject to the send window and limits; FOR_REVIEW requires a person to approve the draft before sending.

One of the following:
"AUTO"
"FOR_REVIEW"
name: string

Display name of the step.

prompt: string

Instructions the agent follows when composing this message.

type: "EMAIL" | "LINKEDIN_MESSAGE"

Step type.

One of the following:
"EMAIL"
"LINKEDIN_MESSAGE"
UnionMember1 { id, deliveryMode, includeNote, 3 more }
id: string

Step identifier, referenced by enrollment currentStepId and message sequenceStepId.

deliveryMode: "AUTO" | "FOR_REVIEW"

AUTO sends without manual approval, subject to the send window and limits; FOR_REVIEW requires a person to approve the draft before sending.

One of the following:
"AUTO"
"FOR_REVIEW"
includeNote: boolean

Whether the connection request carries a note. A step authored before this setting existed reads as true.

name: string

Display name of the step.

prompt: string

Instructions the agent follows when composing this message.

type: "LINKEDIN_INVITE"

Step type.

UnionMember2 { id, duration, type, unit }
id: string

Step identifier.

duration: number

Length of the wait.

minimum-9007199254740991
maximum9007199254740991
type: "WAIT" | "WAIT_FOR_CONNECTION"

WAIT pauses for a fixed time; WAIT_FOR_CONNECTION waits up to that long for a LinkedIn invite to be accepted.

One of the following:
"WAIT"
"WAIT_FOR_CONNECTION"
unit: "DAY" | "MINUTE"

Unit of duration.

One of the following:
"DAY"
"MINUTE"
firstActivatedAt: string | null

When the sequence was first activated.

lastActivatedAt: string | null

When the sequence was most recently activated.

name: string

Name of the sequence.

objectType: "sequence"

Always sequence.

reviewers: Array<Reviewer>

Extra members who may approve this sequence’s FOR_REVIEW messages before they send. The sending member and the sequence’s creator always review, whether or not they are listed.

id: string

ID of the member.

minLength1
objectType: "member"

Always member.

senders: Array<Sender>

The senders this sequence sends from; new contacts rotate across them. An archived sender stays listed but never sends; any change to the list drops it.

id: string

ID of the sender.

minLength1
objectType: "sender"

Always sender.

status: "DRAFT" | "ACTIVE" | "DEACTIVATED"

DRAFT has not been published; ACTIVE is enabled for sending; DEACTIVATED is published but paused.

One of the following:
"DRAFT"
"ACTIVE"
"DEACTIVATED"
SequenceDiscardDraftResponse { sequenceDeleted, sequenceId }
sequenceDeleted: boolean

True when the sequence had never been published, so discarding its only draft deleted it.

sequenceId: string

The sequence whose draft was discarded.

SequenceListEnrollmentsResponse { data, object, totalCount }
data: Array<Data>
id: string

Unique identifier of the enrollment.

cancelledAt: string | null

When the enrollment was cancelled, or null if it was not.

completedAt: string | null

When the enrollment completed, or null if it has not.

contactId: string

ID of the enrolled contact.

currentStepId: string | null

ID of the step the contact is on, matching definition.steps; null when the contact has no current step the API returns.

enrolledAt: string

When the contact was enrolled.

enrolledBy: string | null

Member ID of whoever enrolled the contact; null when they are no longer a member or the enrollment was automatic.

lastActivityAt: string | null

When lastActivityKind happened; null when there has been no activity.

lastActivityKind: "SENT" | "OPENED" | "REPLIED" | 4 more | null

The latest activity on the enrollment. A reply or bounce that ended the enrollment is reported over a later open.

One of the following:
"SENT"
"OPENED"
"REPLIED"
"BOUNCED"
"INVITED"
"CONNECTED"
"SEEN"
nextSendAt: string | null

Estimated time of the next send, from the cadence, send window, pacing and sender; queue order and random gaps can push it later. Null while a message awaits review or is sending, while paused, or when it cannot be estimated.

remainingSends: number | null

Email and LinkedIn steps not yet sent, connection requests included.

minimum-9007199254740991
maximum9007199254740991
repliedAt: string | null

When the contact first replied, on email or LinkedIn; null if they have not.

status: "ACTIVE" | "AWAITING_REVIEW" | "NEEDS_ATTENTION" | 5 more | null

ACTIVE is progressing; AWAITING_REVIEW has a message waiting for approval; NEEDS_ATTENTION is held by a failed step, a held draft or an unavailable sender; PAUSED is stopped because the sequence is deactivated or it was paused in Lightfield. REPLIED, COMPLETED, CANCELLED and FAILED are final.

One of the following:
"ACTIVE"
"AWAITING_REVIEW"
"NEEDS_ATTENTION"
"REPLIED"
"COMPLETED"
"PAUSED"
"CANCELLED"
"FAILED"
object: "list"
totalCount: number
minimum-9007199254740991
maximum9007199254740991
SequenceListMessagesResponse { data, object, totalCount }
data: Array<OutboundMessage { id, acceptedAt, bouncedAt, 14 more } | Reply { id, channel, contactId, 7 more } >
One of the following:
OutboundMessage { id, acceptedAt, bouncedAt, 14 more }
id: string

Unique identifier of the message.

acceptedAt: string | null

When the connection request was accepted; null until then.

bouncedAt: string | null

When the email bounced; null until then.

channel: "EMAIL" | "LINKEDIN"

Channel the message went over.

One of the following:
"EMAIL"
"LINKEDIN"
contactId: string

ID of the contact.

createdAt: string

When the message was created, or when a reply was received. Lists sort by this field, newest first.

direction: "OUTBOUND"

Always OUTBOUND.

enrollmentId: string

ID of the enrollment the message belongs to.

openedAt: string | null

When the email was opened; null until then.

readAt: string | null

When the LinkedIn message was read; null until then.

reference: Email { id, objectType } | Message { id, objectType } | null

The email or LinkedIn message record behind this sequence message, readable with Retrieve an email or Retrieve a message under their own scopes; null when there is none.

One of the following:
Email { id, objectType }
id: string

ID of the email.

objectType: "email"

Always email.

Message { id, objectType }
id: string

ID of the message.

objectType: "message"

Always message.

repliedAt: string | null

When the contact replied to this message; null until then.

sentAt: string | null

When the message was sent; null until then.

sequenceStepId: string

ID of the step that sent the message or, for a reply, the step it replied to.

sequenceStepType: "EMAIL" | "LINKEDIN_MESSAGE" | "LINKEDIN_INVITE"

Type of that step.

One of the following:
"EMAIL"
"LINKEDIN_MESSAGE"
"LINKEDIN_INVITE"
status: "AWAITING_REVIEW" | "SCHEDULED" | "QUEUED" | 4 more

AWAITING_REVIEW is waiting for approval; SCHEDULED is composed and waiting for its send time; QUEUED is due and waiting on the sender. SENT, SKIPPED, FAILED and CANCELLED are final.

One of the following:
"AWAITING_REVIEW"
"SCHEDULED"
"QUEUED"
"SENT"
"SKIPPED"
"FAILED"
"CANCELLED"
statusChangedAt: string

When status last changed.

Reply { id, channel, contactId, 7 more }
id: string

Unique identifier of the message.

channel: "EMAIL" | "LINKEDIN"

Channel the message went over.

One of the following:
"EMAIL"
"LINKEDIN"
contactId: string

ID of the contact.

createdAt: string

When the message was created, or when a reply was received. Lists sort by this field, newest first.

direction: "INBOUND"

Always INBOUND.

enrollmentId: string

ID of the enrollment the message belongs to.

receivedAt: string

When the reply was received.

reference: Email { id, objectType } | Message { id, objectType } | null

The email or LinkedIn message record behind this sequence message, readable with Retrieve an email or Retrieve a message under their own scopes; null when there is none.

One of the following:
Email { id, objectType }
id: string

ID of the email.

objectType: "email"

Always email.

Message { id, objectType }
id: string

ID of the message.

objectType: "message"

Always message.

sequenceStepId: string

ID of the step that sent the message or, for a reply, the step it replied to.

sequenceStepType: "EMAIL" | "LINKEDIN_MESSAGE" | "LINKEDIN_INVITE"

Type of that step.

One of the following:
"EMAIL"
"LINKEDIN_MESSAGE"
"LINKEDIN_INVITE"
object: "list"
totalCount: number
minimum-9007199254740991
maximum9007199254740991
SequenceListResponse { data, object, totalCount }
data: Array<Data>
id: string

Unique identifier of the sequence.

channels: Array<"EMAIL" | "LINKEDIN">

Channels the published steps send on; empty before the first publish.

One of the following:
"EMAIL"
"LINKEDIN"
createdAt: string

ISO 8601 creation timestamp.

definition: Definition | null

Published configuration, or null before the first publish.

description: string

What this version of the sequence is for.

messaging: Messaging { callToAction, persona, trigger, valueProp }

Messaging inputs that frame every step.

callToAction: string | null

What the recipient is asked to do.

persona: string | null

Who the sequence targets.

trigger: string | null

Why the outreach is timely.

valueProp: string | null

The value proposition.

pacing: Pacing { EMAIL, LINKEDIN_INVITE, LINKEDIN_MESSAGE }

How the whole sequence paces each step type it sends, keyed by sequence step type.

EMAIL: Email { dailyLimit }

Email steps.

dailyLimit: number | null

Most sends of this step type across the whole sequence in any rolling 24 hours, or null when the sequence sets no daily cap. Workspace and sender limits still apply.

minimum-9007199254740991
maximum9007199254740991
LINKEDIN_INVITE: LinkedinInvite { dailyLimit }

LinkedIn connection requests.

dailyLimit: number | null

Most sends of this step type across the whole sequence in any rolling 24 hours, or null when the sequence sets no daily cap. Workspace and sender limits still apply.

minimum-9007199254740991
maximum9007199254740991
LINKEDIN_MESSAGE: LinkedinMessage { dailyLimit }

LinkedIn messages.

dailyLimit: number | null

Most sends of this step type across the whole sequence in any rolling 24 hours, or null when the sequence sets no daily cap. Workspace and sender limits still apply.

minimum-9007199254740991
maximum9007199254740991
priority: "HIGH" | "NORMAL"

Send priority relative to other sequences.

One of the following:
"HIGH"
"NORMAL"
sendWindow: SendWindow { daysOfWeek, endHour, startHour, timezone }

When the sequence may send.

daysOfWeek: Array<number>

Days sends may go out, 0 = Sunday.

endHour: number

Local hour sends stop, exclusive (1–24).

minimum-9007199254740991
maximum9007199254740991
startHour: number

First local hour sends may go out (0–23).

minimum-9007199254740991
maximum9007199254740991
timezone: string

IANA timezone of the window.

steps: Array<UnionMember0 { id, deliveryMode, name, 2 more } | UnionMember1 { id, deliveryMode, includeNote, 3 more } | UnionMember2 { id, duration, type, unit } >

Email, LinkedIn and wait steps in execution order.

One of the following:
UnionMember0 { id, deliveryMode, name, 2 more }
id: string

Step identifier, referenced by enrollment currentStepId and message sequenceStepId.

deliveryMode: "AUTO" | "FOR_REVIEW"

AUTO sends without manual approval, subject to the send window and limits; FOR_REVIEW requires a person to approve the draft before sending.

One of the following:
"AUTO"
"FOR_REVIEW"
name: string

Display name of the step.

prompt: string

Instructions the agent follows when composing this message.

type: "EMAIL" | "LINKEDIN_MESSAGE"

Step type.

One of the following:
"EMAIL"
"LINKEDIN_MESSAGE"
UnionMember1 { id, deliveryMode, includeNote, 3 more }
id: string

Step identifier, referenced by enrollment currentStepId and message sequenceStepId.

deliveryMode: "AUTO" | "FOR_REVIEW"

AUTO sends without manual approval, subject to the send window and limits; FOR_REVIEW requires a person to approve the draft before sending.

One of the following:
"AUTO"
"FOR_REVIEW"
includeNote: boolean

Whether the connection request carries a note. A step authored before this setting existed reads as true.

name: string

Display name of the step.

prompt: string

Instructions the agent follows when composing this message.

type: "LINKEDIN_INVITE"

Step type.

UnionMember2 { id, duration, type, unit }
id: string

Step identifier.

duration: number

Length of the wait.

minimum-9007199254740991
maximum9007199254740991
type: "WAIT" | "WAIT_FOR_CONNECTION"

WAIT pauses for a fixed time; WAIT_FOR_CONNECTION waits up to that long for a LinkedIn invite to be accepted.

One of the following:
"WAIT"
"WAIT_FOR_CONNECTION"
unit: "DAY" | "MINUTE"

Unit of duration.

One of the following:
"DAY"
"MINUTE"
firstActivatedAt: string | null

When the sequence was first activated.

lastActivatedAt: string | null

When the sequence was most recently activated.

name: string

Name of the sequence.

objectType: "sequence"

Always sequence.

reviewers: Array<Reviewer>

Extra members who may approve this sequence’s FOR_REVIEW messages before they send. The sending member and the sequence’s creator always review, whether or not they are listed.

id: string

ID of the member.

minLength1
objectType: "member"

Always member.

senders: Array<Sender>

The senders this sequence sends from; new contacts rotate across them. An archived sender stays listed but never sends; any change to the list drops it.

id: string

ID of the sender.

minLength1
objectType: "sender"

Always sender.

status: "DRAFT" | "ACTIVE" | "DEACTIVATED"

DRAFT has not been published; ACTIVE is enabled for sending; DEACTIVATED is published but paused.

One of the following:
"DRAFT"
"ACTIVE"
"DEACTIVATED"
object: "list"
totalCount: number
minimum-9007199254740991
maximum9007199254740991
SequencePublishDraftResponse { id, channels, createdAt, 8 more }
id: string

Unique identifier of the sequence.

channels: Array<"EMAIL" | "LINKEDIN">

Channels the published steps send on; empty before the first publish.

One of the following:
"EMAIL"
"LINKEDIN"
createdAt: string

ISO 8601 creation timestamp.

definition: Definition | null

Published configuration, or null before the first publish.

description: string

What this version of the sequence is for.

messaging: Messaging { callToAction, persona, trigger, valueProp }

Messaging inputs that frame every step.

callToAction: string | null

What the recipient is asked to do.

persona: string | null

Who the sequence targets.

trigger: string | null

Why the outreach is timely.

valueProp: string | null

The value proposition.

pacing: Pacing { EMAIL, LINKEDIN_INVITE, LINKEDIN_MESSAGE }

How the whole sequence paces each step type it sends, keyed by sequence step type.

EMAIL: Email { dailyLimit }

Email steps.

dailyLimit: number | null

Most sends of this step type across the whole sequence in any rolling 24 hours, or null when the sequence sets no daily cap. Workspace and sender limits still apply.

minimum-9007199254740991
maximum9007199254740991
LINKEDIN_INVITE: LinkedinInvite { dailyLimit }

LinkedIn connection requests.

dailyLimit: number | null

Most sends of this step type across the whole sequence in any rolling 24 hours, or null when the sequence sets no daily cap. Workspace and sender limits still apply.

minimum-9007199254740991
maximum9007199254740991
LINKEDIN_MESSAGE: LinkedinMessage { dailyLimit }

LinkedIn messages.

dailyLimit: number | null

Most sends of this step type across the whole sequence in any rolling 24 hours, or null when the sequence sets no daily cap. Workspace and sender limits still apply.

minimum-9007199254740991
maximum9007199254740991
priority: "HIGH" | "NORMAL"

Send priority relative to other sequences.

One of the following:
"HIGH"
"NORMAL"
sendWindow: SendWindow { daysOfWeek, endHour, startHour, timezone }

When the sequence may send.

daysOfWeek: Array<number>

Days sends may go out, 0 = Sunday.

endHour: number

Local hour sends stop, exclusive (1–24).

minimum-9007199254740991
maximum9007199254740991
startHour: number

First local hour sends may go out (0–23).

minimum-9007199254740991
maximum9007199254740991
timezone: string

IANA timezone of the window.

steps: Array<UnionMember0 { id, deliveryMode, name, 2 more } | UnionMember1 { id, deliveryMode, includeNote, 3 more } | UnionMember2 { id, duration, type, unit } >

Email, LinkedIn and wait steps in execution order.

One of the following:
UnionMember0 { id, deliveryMode, name, 2 more }
id: string

Step identifier, referenced by enrollment currentStepId and message sequenceStepId.

deliveryMode: "AUTO" | "FOR_REVIEW"

AUTO sends without manual approval, subject to the send window and limits; FOR_REVIEW requires a person to approve the draft before sending.

One of the following:
"AUTO"
"FOR_REVIEW"
name: string

Display name of the step.

prompt: string

Instructions the agent follows when composing this message.

type: "EMAIL" | "LINKEDIN_MESSAGE"

Step type.

One of the following:
"EMAIL"
"LINKEDIN_MESSAGE"
UnionMember1 { id, deliveryMode, includeNote, 3 more }
id: string

Step identifier, referenced by enrollment currentStepId and message sequenceStepId.

deliveryMode: "AUTO" | "FOR_REVIEW"

AUTO sends without manual approval, subject to the send window and limits; FOR_REVIEW requires a person to approve the draft before sending.

One of the following:
"AUTO"
"FOR_REVIEW"
includeNote: boolean

Whether the connection request carries a note. A step authored before this setting existed reads as true.

name: string

Display name of the step.

prompt: string

Instructions the agent follows when composing this message.

type: "LINKEDIN_INVITE"

Step type.

UnionMember2 { id, duration, type, unit }
id: string

Step identifier.

duration: number

Length of the wait.

minimum-9007199254740991
maximum9007199254740991
type: "WAIT" | "WAIT_FOR_CONNECTION"

WAIT pauses for a fixed time; WAIT_FOR_CONNECTION waits up to that long for a LinkedIn invite to be accepted.

One of the following:
"WAIT"
"WAIT_FOR_CONNECTION"
unit: "DAY" | "MINUTE"

Unit of duration.

One of the following:
"DAY"
"MINUTE"
firstActivatedAt: string | null

When the sequence was first activated.

lastActivatedAt: string | null

When the sequence was most recently activated.

name: string

Name of the sequence.

objectType: "sequence"

Always sequence.

reviewers: Array<Reviewer>

Extra members who may approve this sequence’s FOR_REVIEW messages before they send. The sending member and the sequence’s creator always review, whether or not they are listed.

id: string

ID of the member.

minLength1
objectType: "member"

Always member.

senders: Array<Sender>

The senders this sequence sends from; new contacts rotate across them. An archived sender stays listed but never sends; any change to the list drops it.

id: string

ID of the sender.

minLength1
objectType: "sender"

Always sender.

status: "DRAFT" | "ACTIVE" | "DEACTIVATED"

DRAFT has not been published; ACTIVE is enabled for sending; DEACTIVATED is published but paused.

One of the following:
"DRAFT"
"ACTIVE"
"DEACTIVATED"
SequenceRetrieveDraftResponse { channels, definition, name, 6 more }
channels: Array<"EMAIL" | "LINKEDIN">

Channels the draft’s steps send on.

One of the following:
"EMAIL"
"LINKEDIN"
definition: Definition { description, messaging, pacing, 3 more }

The draft configuration, in the same shape as a published definition.

description: string

What this version of the sequence is for.

messaging: Messaging { callToAction, persona, trigger, valueProp }

Messaging inputs that frame every step.

callToAction: string | null

What the recipient is asked to do.

persona: string | null

Who the sequence targets.

trigger: string | null

Why the outreach is timely.

valueProp: string | null

The value proposition.

pacing: Pacing { EMAIL, LINKEDIN_INVITE, LINKEDIN_MESSAGE }

How the whole sequence paces each step type it sends, keyed by sequence step type.

EMAIL: Email { dailyLimit }

Email steps.

dailyLimit: number | null

Most sends of this step type across the whole sequence in any rolling 24 hours, or null when the sequence sets no daily cap. Workspace and sender limits still apply.

minimum-9007199254740991
maximum9007199254740991
LINKEDIN_INVITE: LinkedinInvite { dailyLimit }

LinkedIn connection requests.

dailyLimit: number | null

Most sends of this step type across the whole sequence in any rolling 24 hours, or null when the sequence sets no daily cap. Workspace and sender limits still apply.

minimum-9007199254740991
maximum9007199254740991
LINKEDIN_MESSAGE: LinkedinMessage { dailyLimit }

LinkedIn messages.

dailyLimit: number | null

Most sends of this step type across the whole sequence in any rolling 24 hours, or null when the sequence sets no daily cap. Workspace and sender limits still apply.

minimum-9007199254740991
maximum9007199254740991
priority: "HIGH" | "NORMAL"

Send priority relative to other sequences.

One of the following:
"HIGH"
"NORMAL"
sendWindow: SendWindow { daysOfWeek, endHour, startHour, timezone }

When the sequence may send.

daysOfWeek: Array<number>

Days sends may go out, 0 = Sunday.

endHour: number

Local hour sends stop, exclusive (1–24).

minimum-9007199254740991
maximum9007199254740991
startHour: number

First local hour sends may go out (0–23).

minimum-9007199254740991
maximum9007199254740991
timezone: string

IANA timezone of the window.

steps: Array<UnionMember0 { id, deliveryMode, name, 2 more } | UnionMember1 { id, deliveryMode, includeNote, 3 more } | UnionMember2 { id, duration, type, unit } >

Email, LinkedIn and wait steps in execution order.

One of the following:
UnionMember0 { id, deliveryMode, name, 2 more }
id: string

Step identifier, referenced by enrollment currentStepId and message sequenceStepId.

deliveryMode: "AUTO" | "FOR_REVIEW"

AUTO sends without manual approval, subject to the send window and limits; FOR_REVIEW requires a person to approve the draft before sending.

One of the following:
"AUTO"
"FOR_REVIEW"
name: string

Display name of the step.

prompt: string

Instructions the agent follows when composing this message.

type: "EMAIL" | "LINKEDIN_MESSAGE"

Step type.

One of the following:
"EMAIL"
"LINKEDIN_MESSAGE"
UnionMember1 { id, deliveryMode, includeNote, 3 more }
id: string

Step identifier, referenced by enrollment currentStepId and message sequenceStepId.

deliveryMode: "AUTO" | "FOR_REVIEW"

AUTO sends without manual approval, subject to the send window and limits; FOR_REVIEW requires a person to approve the draft before sending.

One of the following:
"AUTO"
"FOR_REVIEW"
includeNote: boolean

Whether the connection request carries a note. A step authored before this setting existed reads as true.

name: string

Display name of the step.

prompt: string

Instructions the agent follows when composing this message.

type: "LINKEDIN_INVITE"

Step type.

UnionMember2 { id, duration, type, unit }
id: string

Step identifier.

duration: number

Length of the wait.

minimum-9007199254740991
maximum9007199254740991
type: "WAIT" | "WAIT_FOR_CONNECTION"

WAIT pauses for a fixed time; WAIT_FOR_CONNECTION waits up to that long for a LinkedIn invite to be accepted.

One of the following:
"WAIT"
"WAIT_FOR_CONNECTION"
unit: "DAY" | "MINUTE"

Unit of duration.

One of the following:
"DAY"
"MINUTE"
name: string

Name the sequence takes when the draft is published.

publishWarnings: Array<PublishWarning>

What publishing this draft would change for contacts already in the sequence; empty when nothing is affected. Before the first publish, the only possible warning is a proposed sender that was archived and would be left off.

code: "delay_shortened" | "delay_lengthened" | "connection_wait_shortened" | 18 more

What publishing would change.

One of the following:
"delay_shortened"
"delay_lengthened"
"connection_wait_shortened"
"connection_wait_lengthened"
"send_schedule_changed"
"send_configuration_changed"
"send_priority_changed"
"senders_changed"
"email_sender_pool_emptied"
"linkedin_account_pool_emptied"
"assigned_sender_removed"
"delivery_became_automatic"
"invite_note_enabled"
"invite_note_disabled"
"step_inserted"
"automatic_send_step_inserted"
"step_removed"
"step_type_changed"
"step_order_changed"
"full_identity_rewrite"
"low_identity_overlap"
message: string

What would change, in plain language.

severity: "warning" | "destructive"

destructive when contacts already in the sequence may skip, repeat or receive a step they would not have; warning otherwise.

One of the following:
"warning"
"destructive"
stepIds: Array<string>

The steps involved; empty for a sequence-wide change.

reviewers: Array<Reviewer>

Extra members who may approve this sequence’s FOR_REVIEW messages before they send. The sending member and the sequence’s creator always review, whether or not they are listed.

id: string

ID of the member.

minLength1
objectType: "member"

Always member.

senders: Array<Sender>

The senders this draft will publish; new contacts rotate across them. Until a save changes it, this is the sequence’s live list. An archived sender stays listed but never sends; any change to the list drops it.

id: string

ID of the sender.

minLength1
objectType: "sender"

Always sender.

sequenceId: string

The sequence this draft belongs to.

updatedAt: string

When the draft last changed.

version: string

Opaque token for the current state of the draft. Send it as expectedVersion on the next save, publish or discard; it changes whenever anyone edits the draft.

SequenceRetrieveEnrollmentResponse { id, cancelledAt, completedAt, 10 more }
id: string

Unique identifier of the enrollment.

cancelledAt: string | null

When the enrollment was cancelled, or null if it was not.

completedAt: string | null

When the enrollment completed, or null if it has not.

contactId: string

ID of the enrolled contact.

currentStepId: string | null

ID of the step the contact is on, matching definition.steps; null when the contact has no current step the API returns.

enrolledAt: string

When the contact was enrolled.

enrolledBy: string | null

Member ID of whoever enrolled the contact; null when they are no longer a member or the enrollment was automatic.

lastActivityAt: string | null

When lastActivityKind happened; null when there has been no activity.

lastActivityKind: "SENT" | "OPENED" | "REPLIED" | 4 more | null

The latest activity on the enrollment. A reply or bounce that ended the enrollment is reported over a later open.

One of the following:
"SENT"
"OPENED"
"REPLIED"
"BOUNCED"
"INVITED"
"CONNECTED"
"SEEN"
nextSendAt: string | null

Estimated time of the next send, from the cadence, send window, pacing and sender; queue order and random gaps can push it later. Null while a message awaits review or is sending, while paused, or when it cannot be estimated.

remainingSends: number | null

Email and LinkedIn steps not yet sent, connection requests included.

minimum-9007199254740991
maximum9007199254740991
repliedAt: string | null

When the contact first replied, on email or LinkedIn; null if they have not.

status: "ACTIVE" | "AWAITING_REVIEW" | "NEEDS_ATTENTION" | 5 more | null

ACTIVE is progressing; AWAITING_REVIEW has a message waiting for approval; NEEDS_ATTENTION is held by a failed step, a held draft or an unavailable sender; PAUSED is stopped because the sequence is deactivated or it was paused in Lightfield. REPLIED, COMPLETED, CANCELLED and FAILED are final.

One of the following:
"ACTIVE"
"AWAITING_REVIEW"
"NEEDS_ATTENTION"
"REPLIED"
"COMPLETED"
"PAUSED"
"CANCELLED"
"FAILED"
SequenceRetrieveMessageResponse = OutboundMessage { id, acceptedAt, bouncedAt, 15 more } | Reply { id, channel, contactId, 8 more }
One of the following:
OutboundMessage { id, acceptedAt, bouncedAt, 15 more }
id: string

Unique identifier of the message.

acceptedAt: string | null

When the connection request was accepted; null until then.

bouncedAt: string | null

When the email bounced; null until then.

channel: "EMAIL" | "LINKEDIN"

Channel the message went over.

One of the following:
"EMAIL"
"LINKEDIN"
contactId: string

ID of the contact.

content: Content | null

Plain-text content of the message. Null when the underlying record is no longer available; not included in list responses.

body: string | null

Plain-text body; null for a connection request sent without a note.

subject: string | null

Email subject; null for LinkedIn.

createdAt: string

When the message was created, or when a reply was received. Lists sort by this field, newest first.

direction: "OUTBOUND"

Always OUTBOUND.

enrollmentId: string

ID of the enrollment the message belongs to.

openedAt: string | null

When the email was opened; null until then.

readAt: string | null

When the LinkedIn message was read; null until then.

reference: Email { id, objectType } | Message { id, objectType } | null

The email or LinkedIn message record behind this sequence message, readable with Retrieve an email or Retrieve a message under their own scopes; null when there is none.

One of the following:
Email { id, objectType }
id: string

ID of the email.

objectType: "email"

Always email.

Message { id, objectType }
id: string

ID of the message.

objectType: "message"

Always message.

repliedAt: string | null

When the contact replied to this message; null until then.

sentAt: string | null

When the message was sent; null until then.

sequenceStepId: string

ID of the step that sent the message or, for a reply, the step it replied to.

sequenceStepType: "EMAIL" | "LINKEDIN_MESSAGE" | "LINKEDIN_INVITE"

Type of that step.

One of the following:
"EMAIL"
"LINKEDIN_MESSAGE"
"LINKEDIN_INVITE"
status: "AWAITING_REVIEW" | "SCHEDULED" | "QUEUED" | 4 more

AWAITING_REVIEW is waiting for approval; SCHEDULED is composed and waiting for its send time; QUEUED is due and waiting on the sender. SENT, SKIPPED, FAILED and CANCELLED are final.

One of the following:
"AWAITING_REVIEW"
"SCHEDULED"
"QUEUED"
"SENT"
"SKIPPED"
"FAILED"
"CANCELLED"
statusChangedAt: string

When status last changed.

Reply { id, channel, contactId, 8 more }
id: string

Unique identifier of the message.

channel: "EMAIL" | "LINKEDIN"

Channel the message went over.

One of the following:
"EMAIL"
"LINKEDIN"
contactId: string

ID of the contact.

content: Content | null

Plain-text content of the message. Null when the underlying record is no longer available; not included in list responses.

body: string | null

Plain-text body; null for a connection request sent without a note.

subject: string | null

Email subject; null for LinkedIn.

createdAt: string

When the message was created, or when a reply was received. Lists sort by this field, newest first.

direction: "INBOUND"

Always INBOUND.

enrollmentId: string

ID of the enrollment the message belongs to.

receivedAt: string

When the reply was received.

reference: Email { id, objectType } | Message { id, objectType } | null

The email or LinkedIn message record behind this sequence message, readable with Retrieve an email or Retrieve a message under their own scopes; null when there is none.

One of the following:
Email { id, objectType }
id: string

ID of the email.

objectType: "email"

Always email.

Message { id, objectType }
id: string

ID of the message.

objectType: "message"

Always message.

sequenceStepId: string

ID of the step that sent the message or, for a reply, the step it replied to.

sequenceStepType: "EMAIL" | "LINKEDIN_MESSAGE" | "LINKEDIN_INVITE"

Type of that step.

One of the following:
"EMAIL"
"LINKEDIN_MESSAGE"
"LINKEDIN_INVITE"
SequenceRetrievePerformanceResponse { byStepType, perStep }
byStepType: ByStepType { EMAIL, LINKEDIN_INVITE, LINKEDIN_MESSAGE, 2 more }

Lifetime totals for each step type, across all of its steps.

EMAIL: Email { bounced, bounceRate, currentEnrollments, 6 more }

Email steps.

bounced: number

Sent emails that bounced.

minimum-9007199254740991
maximum9007199254740991
bounceRate: number | null

Bounced divided by sent; null if none sent.

currentEnrollments: number

Enrollments currently on steps of this type, paused ones included.

minimum-9007199254740991
maximum9007199254740991
delivered: number

Sent minus bounced, never below zero.

minimum-9007199254740991
maximum9007199254740991
opened: number

Sent emails that were opened.

minimum-9007199254740991
maximum9007199254740991
openRate: number | null

Opened divided by delivered; null if none delivered.

replied: number

Sent messages that received a reply.

minimum-9007199254740991
maximum9007199254740991
replyRate: number | null

Replied divided by delivered; null if none delivered.

sent: number

Messages sent.

minimum-9007199254740991
maximum9007199254740991
LINKEDIN_INVITE: LinkedinInvite { acceptanceRate, accepted, currentEnrollments, 3 more }

LinkedIn connection request steps.

acceptanceRate: number | null

Accepted divided by sent; null if none sent.

accepted: number

Connection requests that were accepted.

minimum-9007199254740991
maximum9007199254740991
currentEnrollments: number

Enrollments currently on steps of this type, paused ones included.

minimum-9007199254740991
maximum9007199254740991
replied: number

Sent messages that received a reply.

minimum-9007199254740991
maximum9007199254740991
replyRate: number | null

Replied divided by sent; null if none sent.

sent: number

Messages sent.

minimum-9007199254740991
maximum9007199254740991
LINKEDIN_MESSAGE: LinkedinMessage { currentEnrollments, read, readRate, 3 more }

LinkedIn message steps.

currentEnrollments: number

Enrollments currently on steps of this type, paused ones included.

minimum-9007199254740991
maximum9007199254740991
read: number

Sent messages that were read.

minimum-9007199254740991
maximum9007199254740991
readRate: number | null

Read divided by sent; null if none sent.

replied: number

Sent messages that received a reply.

minimum-9007199254740991
maximum9007199254740991
replyRate: number | null

Replied divided by sent; null if none sent.

sent: number

Messages sent.

minimum-9007199254740991
maximum9007199254740991
WAIT: Wait { currentEnrollments }

Wait steps.

currentEnrollments: number

Enrollments currently on steps of this type, paused ones included.

minimum-9007199254740991
maximum9007199254740991
WAIT_FOR_CONNECTION: WaitForConnection { currentEnrollments }

Wait-for-connection steps.

currentEnrollments: number

Enrollments currently on steps of this type, paused ones included.

minimum-9007199254740991
maximum9007199254740991
perStep: Array<EmailStep { bounced, bounceRate, currentEnrollments, 8 more } | LinkedInMessageStep { currentEnrollments, read, readRate, 5 more } | LinkedInInviteStep { acceptanceRate, accepted, currentEnrollments, 5 more } | 2 more>

Per-step statistics in published sequence order, including steps with no activity. Steps no longer in the published definition are included if they have sent messages.

One of the following:
EmailStep { bounced, bounceRate, currentEnrollments, 8 more }
bounced: number

Sent emails that bounced.

minimum-9007199254740991
maximum9007199254740991
bounceRate: number | null

Bounced divided by sent; null if none sent.

currentEnrollments: number

Enrollments currently on this step, paused ones included.

minimum-9007199254740991
maximum9007199254740991
delivered: number

Sent minus bounced, never below zero.

minimum-9007199254740991
maximum9007199254740991
opened: number

Sent emails that were opened.

minimum-9007199254740991
maximum9007199254740991
openRate: number | null

Opened divided by delivered; null if none delivered.

replied: number

Sent messages that received a reply.

minimum-9007199254740991
maximum9007199254740991
replyRate: number | null

Replied divided by delivered; null if none delivered.

sent: number

Messages sent.

minimum-9007199254740991
maximum9007199254740991
sequenceStepId: string

ID of the step. A step no longer in the published definition keeps its original ID.

sequenceStepType: "EMAIL"
LinkedInMessageStep { currentEnrollments, read, readRate, 5 more }
currentEnrollments: number

Enrollments currently on this step, paused ones included.

minimum-9007199254740991
maximum9007199254740991
read: number

Sent messages that were read.

minimum-9007199254740991
maximum9007199254740991
readRate: number | null

Read divided by sent; null if none sent.

replied: number

Sent messages that received a reply.

minimum-9007199254740991
maximum9007199254740991
replyRate: number | null

Replied divided by sent; null if none sent.

sent: number

Messages sent.

minimum-9007199254740991
maximum9007199254740991
sequenceStepId: string

ID of the step. A step no longer in the published definition keeps its original ID.

sequenceStepType: "LINKEDIN_MESSAGE"
LinkedInInviteStep { acceptanceRate, accepted, currentEnrollments, 5 more }
acceptanceRate: number | null

Accepted divided by sent; null if none sent.

accepted: number

Connection requests that were accepted.

minimum-9007199254740991
maximum9007199254740991
currentEnrollments: number

Enrollments currently on this step, paused ones included.

minimum-9007199254740991
maximum9007199254740991
replied: number

Sent messages that received a reply.

minimum-9007199254740991
maximum9007199254740991
replyRate: number | null

Replied divided by sent; null if none sent.

sent: number

Messages sent.

minimum-9007199254740991
maximum9007199254740991
sequenceStepId: string

ID of the step. A step no longer in the published definition keeps its original ID.

sequenceStepType: "LINKEDIN_INVITE"
WaitStep { currentEnrollments, sequenceStepId, sequenceStepType }
currentEnrollments: number

Enrollments currently on this step, paused ones included.

minimum-9007199254740991
maximum9007199254740991
sequenceStepId: string

ID of the step. A step no longer in the published definition keeps its original ID.

sequenceStepType: "WAIT"
WaitForConnectionStep { currentEnrollments, sequenceStepId, sequenceStepType }
currentEnrollments: number

Enrollments currently on this step, paused ones included.

minimum-9007199254740991
maximum9007199254740991
sequenceStepId: string

ID of the step. A step no longer in the published definition keeps its original ID.

sequenceStepType: "WAIT_FOR_CONNECTION"
SequenceRetrieveResponse { id, channels, createdAt, 8 more }
id: string

Unique identifier of the sequence.

channels: Array<"EMAIL" | "LINKEDIN">

Channels the published steps send on; empty before the first publish.

One of the following:
"EMAIL"
"LINKEDIN"
createdAt: string

ISO 8601 creation timestamp.

definition: Definition | null

Published configuration, or null before the first publish.

description: string

What this version of the sequence is for.

messaging: Messaging { callToAction, persona, trigger, valueProp }

Messaging inputs that frame every step.

callToAction: string | null

What the recipient is asked to do.

persona: string | null

Who the sequence targets.

trigger: string | null

Why the outreach is timely.

valueProp: string | null

The value proposition.

pacing: Pacing { EMAIL, LINKEDIN_INVITE, LINKEDIN_MESSAGE }

How the whole sequence paces each step type it sends, keyed by sequence step type.

EMAIL: Email { dailyLimit }

Email steps.

dailyLimit: number | null

Most sends of this step type across the whole sequence in any rolling 24 hours, or null when the sequence sets no daily cap. Workspace and sender limits still apply.

minimum-9007199254740991
maximum9007199254740991
LINKEDIN_INVITE: LinkedinInvite { dailyLimit }

LinkedIn connection requests.

dailyLimit: number | null

Most sends of this step type across the whole sequence in any rolling 24 hours, or null when the sequence sets no daily cap. Workspace and sender limits still apply.

minimum-9007199254740991
maximum9007199254740991
LINKEDIN_MESSAGE: LinkedinMessage { dailyLimit }

LinkedIn messages.

dailyLimit: number | null

Most sends of this step type across the whole sequence in any rolling 24 hours, or null when the sequence sets no daily cap. Workspace and sender limits still apply.

minimum-9007199254740991
maximum9007199254740991
priority: "HIGH" | "NORMAL"

Send priority relative to other sequences.

One of the following:
"HIGH"
"NORMAL"
sendWindow: SendWindow { daysOfWeek, endHour, startHour, timezone }

When the sequence may send.

daysOfWeek: Array<number>

Days sends may go out, 0 = Sunday.

endHour: number

Local hour sends stop, exclusive (1–24).

minimum-9007199254740991
maximum9007199254740991
startHour: number

First local hour sends may go out (0–23).

minimum-9007199254740991
maximum9007199254740991
timezone: string

IANA timezone of the window.

steps: Array<UnionMember0 { id, deliveryMode, name, 2 more } | UnionMember1 { id, deliveryMode, includeNote, 3 more } | UnionMember2 { id, duration, type, unit } >

Email, LinkedIn and wait steps in execution order.

One of the following:
UnionMember0 { id, deliveryMode, name, 2 more }
id: string

Step identifier, referenced by enrollment currentStepId and message sequenceStepId.

deliveryMode: "AUTO" | "FOR_REVIEW"

AUTO sends without manual approval, subject to the send window and limits; FOR_REVIEW requires a person to approve the draft before sending.

One of the following:
"AUTO"
"FOR_REVIEW"
name: string

Display name of the step.

prompt: string

Instructions the agent follows when composing this message.

type: "EMAIL" | "LINKEDIN_MESSAGE"

Step type.

One of the following:
"EMAIL"
"LINKEDIN_MESSAGE"
UnionMember1 { id, deliveryMode, includeNote, 3 more }
id: string

Step identifier, referenced by enrollment currentStepId and message sequenceStepId.

deliveryMode: "AUTO" | "FOR_REVIEW"

AUTO sends without manual approval, subject to the send window and limits; FOR_REVIEW requires a person to approve the draft before sending.

One of the following:
"AUTO"
"FOR_REVIEW"
includeNote: boolean

Whether the connection request carries a note. A step authored before this setting existed reads as true.

name: string

Display name of the step.

prompt: string

Instructions the agent follows when composing this message.

type: "LINKEDIN_INVITE"

Step type.

UnionMember2 { id, duration, type, unit }
id: string

Step identifier.

duration: number

Length of the wait.

minimum-9007199254740991
maximum9007199254740991
type: "WAIT" | "WAIT_FOR_CONNECTION"

WAIT pauses for a fixed time; WAIT_FOR_CONNECTION waits up to that long for a LinkedIn invite to be accepted.

One of the following:
"WAIT"
"WAIT_FOR_CONNECTION"
unit: "DAY" | "MINUTE"

Unit of duration.

One of the following:
"DAY"
"MINUTE"
firstActivatedAt: string | null

When the sequence was first activated.

lastActivatedAt: string | null

When the sequence was most recently activated.

name: string

Name of the sequence.

objectType: "sequence"

Always sequence.

reviewers: Array<Reviewer>

Extra members who may approve this sequence’s FOR_REVIEW messages before they send. The sending member and the sequence’s creator always review, whether or not they are listed.

id: string

ID of the member.

minLength1
objectType: "member"

Always member.

senders: Array<Sender>

The senders this sequence sends from; new contacts rotate across them. An archived sender stays listed but never sends; any change to the list drops it.

id: string

ID of the sender.

minLength1
objectType: "sender"

Always sender.

status: "DRAFT" | "ACTIVE" | "DEACTIVATED"

DRAFT has not been published; ACTIVE is enabled for sending; DEACTIVATED is published but paused.

One of the following:
"DRAFT"
"ACTIVE"
"DEACTIVATED"
SequenceUpdateDraftResponse { channels, definition, name, 6 more }
channels: Array<"EMAIL" | "LINKEDIN">

Channels the draft’s steps send on.

One of the following:
"EMAIL"
"LINKEDIN"
definition: Definition { description, messaging, pacing, 3 more }

The draft configuration, in the same shape as a published definition.

description: string

What this version of the sequence is for.

messaging: Messaging { callToAction, persona, trigger, valueProp }

Messaging inputs that frame every step.

callToAction: string | null

What the recipient is asked to do.

persona: string | null

Who the sequence targets.

trigger: string | null

Why the outreach is timely.

valueProp: string | null

The value proposition.

pacing: Pacing { EMAIL, LINKEDIN_INVITE, LINKEDIN_MESSAGE }

How the whole sequence paces each step type it sends, keyed by sequence step type.

EMAIL: Email { dailyLimit }

Email steps.

dailyLimit: number | null

Most sends of this step type across the whole sequence in any rolling 24 hours, or null when the sequence sets no daily cap. Workspace and sender limits still apply.

minimum-9007199254740991
maximum9007199254740991
LINKEDIN_INVITE: LinkedinInvite { dailyLimit }

LinkedIn connection requests.

dailyLimit: number | null

Most sends of this step type across the whole sequence in any rolling 24 hours, or null when the sequence sets no daily cap. Workspace and sender limits still apply.

minimum-9007199254740991
maximum9007199254740991
LINKEDIN_MESSAGE: LinkedinMessage { dailyLimit }

LinkedIn messages.

dailyLimit: number | null

Most sends of this step type across the whole sequence in any rolling 24 hours, or null when the sequence sets no daily cap. Workspace and sender limits still apply.

minimum-9007199254740991
maximum9007199254740991
priority: "HIGH" | "NORMAL"

Send priority relative to other sequences.

One of the following:
"HIGH"
"NORMAL"
sendWindow: SendWindow { daysOfWeek, endHour, startHour, timezone }

When the sequence may send.

daysOfWeek: Array<number>

Days sends may go out, 0 = Sunday.

endHour: number

Local hour sends stop, exclusive (1–24).

minimum-9007199254740991
maximum9007199254740991
startHour: number

First local hour sends may go out (0–23).

minimum-9007199254740991
maximum9007199254740991
timezone: string

IANA timezone of the window.

steps: Array<UnionMember0 { id, deliveryMode, name, 2 more } | UnionMember1 { id, deliveryMode, includeNote, 3 more } | UnionMember2 { id, duration, type, unit } >

Email, LinkedIn and wait steps in execution order.

One of the following:
UnionMember0 { id, deliveryMode, name, 2 more }
id: string

Step identifier, referenced by enrollment currentStepId and message sequenceStepId.

deliveryMode: "AUTO" | "FOR_REVIEW"

AUTO sends without manual approval, subject to the send window and limits; FOR_REVIEW requires a person to approve the draft before sending.

One of the following:
"AUTO"
"FOR_REVIEW"
name: string

Display name of the step.

prompt: string

Instructions the agent follows when composing this message.

type: "EMAIL" | "LINKEDIN_MESSAGE"

Step type.

One of the following:
"EMAIL"
"LINKEDIN_MESSAGE"
UnionMember1 { id, deliveryMode, includeNote, 3 more }
id: string

Step identifier, referenced by enrollment currentStepId and message sequenceStepId.

deliveryMode: "AUTO" | "FOR_REVIEW"

AUTO sends without manual approval, subject to the send window and limits; FOR_REVIEW requires a person to approve the draft before sending.

One of the following:
"AUTO"
"FOR_REVIEW"
includeNote: boolean

Whether the connection request carries a note. A step authored before this setting existed reads as true.

name: string

Display name of the step.

prompt: string

Instructions the agent follows when composing this message.

type: "LINKEDIN_INVITE"

Step type.

UnionMember2 { id, duration, type, unit }
id: string

Step identifier.

duration: number

Length of the wait.

minimum-9007199254740991
maximum9007199254740991
type: "WAIT" | "WAIT_FOR_CONNECTION"

WAIT pauses for a fixed time; WAIT_FOR_CONNECTION waits up to that long for a LinkedIn invite to be accepted.

One of the following:
"WAIT"
"WAIT_FOR_CONNECTION"
unit: "DAY" | "MINUTE"

Unit of duration.

One of the following:
"DAY"
"MINUTE"
name: string

Name the sequence takes when the draft is published.

publishWarnings: Array<PublishWarning>

What publishing this draft would change for contacts already in the sequence; empty when nothing is affected. Before the first publish, the only possible warning is a proposed sender that was archived and would be left off.

code: "delay_shortened" | "delay_lengthened" | "connection_wait_shortened" | 18 more

What publishing would change.

One of the following:
"delay_shortened"
"delay_lengthened"
"connection_wait_shortened"
"connection_wait_lengthened"
"send_schedule_changed"
"send_configuration_changed"
"send_priority_changed"
"senders_changed"
"email_sender_pool_emptied"
"linkedin_account_pool_emptied"
"assigned_sender_removed"
"delivery_became_automatic"
"invite_note_enabled"
"invite_note_disabled"
"step_inserted"
"automatic_send_step_inserted"
"step_removed"
"step_type_changed"
"step_order_changed"
"full_identity_rewrite"
"low_identity_overlap"
message: string

What would change, in plain language.

severity: "warning" | "destructive"

destructive when contacts already in the sequence may skip, repeat or receive a step they would not have; warning otherwise.

One of the following:
"warning"
"destructive"
stepIds: Array<string>

The steps involved; empty for a sequence-wide change.

reviewers: Array<Reviewer>

Extra members who may approve this sequence’s FOR_REVIEW messages before they send. The sending member and the sequence’s creator always review, whether or not they are listed.

id: string

ID of the member.

minLength1
objectType: "member"

Always member.

senders: Array<Sender>

The senders this draft will publish; new contacts rotate across them. Until a save changes it, this is the sequence’s live list. An archived sender stays listed but never sends; any change to the list drops it.

id: string

ID of the sender.

minLength1
objectType: "sender"

Always sender.

sequenceId: string

The sequence this draft belongs to.

updatedAt: string

When the draft last changed.

version: string

Opaque token for the current state of the draft. Send it as expectedVersion on the next save, publish or discard; it changes whenever anyone edits the draft.

SequenceUpdateEnrollmentsResponse { results }
results: Array<EnrollmentChanged { contactId, enrollmentId, outcome } | NothingToCancel { contactId, enrollmentId, outcome } >

One result per distinct contact, additions first, then removals.

One of the following:
EnrollmentChanged { contactId, enrollmentId, outcome }
contactId: string

ID of the contact.

enrollmentId: string

ID of the enrollment the outcome applies to.

outcome: "enrolled" | "already_enrolled" | "unenrolled"

enrolled created the enrollment, already_enrolled left an open one as is, unenrolled cancelled it.

One of the following:
"enrolled"
"already_enrolled"
"unenrolled"
NothingToCancel { contactId, enrollmentId, outcome }
contactId: string

ID of the contact.

enrollmentId: unknown

Always null.

outcome: "no_active_enrollment"

The contact had no open enrollment to cancel.