Skip to main content
POST
Resume one stopped contact

Authorizations

X-API-Key
string
header
required

Path Parameters

sequence_id
string<uuid>
required
enrolment_id
string<uuid>
required

Response

Successful Response

bounced
boolean
required
company_key
string | null
required
created_at
string<date-time>
required
current_step_id
string<uuid> | null
required
due_at
string<date-time> | null
required
email
string | null
required
id
string<uuid>
required
record_id
string<uuid>
required
replied_at
string<date-time> | null
required
status
enum<string>
required

Where one contact stands in one sequence.

ACTIVE rows carry a due_at and are what the tick claims; CLAIMED is the in-flight guard between claim and outcome. PAUSED (SEQ-30) is a deliberate per-contact hold: unclaimable because the tick claims strictly on ACTIVE, yet still LIVE — it keeps its step and its one-live-sequence slot, and a compliance stop (reply, unsubscribe) reaches it. Everything else is settled: COMPLETED walked off the end; STOPPED was halted (reply, unsubscribe, bounce, manual, company pause); FAILED is terminal per the phase-1 ruling; SUPPRESSED was on the do-not-contact list; SKIPPED_DUPLICATE lost the one-live-sequence-per-contact rule, with the reason visible in the grid.

A contact the workspace's recontact rule refuses is STOPPED with StopReason.COOLDOWN. There is deliberately no held state: a cooldown settles a contact rather than parking them, so nothing here waits on a date and nothing lets itself out later.

AWAITING_ACTION (F-25) is a contact parked behind a task that needs a person or a channel, modelled on PAUSED: live, keeps its step and its one-live-sequence slot, unclaimable because the tick claims strictly on ACTIVE, and a compliance stop reaches it. Unlike PAUSED nobody wakes it by hand — only the outreach-task sweep does, once the task it waits on is decided or delivered. Deliberately not "awaiting approval": an AUTO-mode LinkedIn park is waiting for a browser rather than for anyone's approval, and this value is the word the Contacts tab shows for both.

PENDING is a draft's roster: in, standing on a step, and NOT live. Binding an audience enrols on the spot so the Contacts tab can show who is in, but a sequence nobody has launched must not hold anybody's one-live-sequence slot, or a second sequence written for the same people skips them all. uq_sequence_enrolment_one_live leaves PENDING out, the tick never claims it, and launch turns each row ACTIVE, settling the ones another sequence took meanwhile as SKIPPED_DUPLICATE.

Available options:
pending,
active,
claimed,
paused,
awaiting_action,
completed,
stopped,
failed,
suppressed,
skipped_duplicate
stop_reason
enum<string> | null
required
Available options:
reply,
unsubscribe,
bounce,
manual,
company_reply,
row_left_audience,
step_removed,
removed,
cooldown,
rejected,
mailbox_removed
updated_at
string<date-time>
required
contact_company
string | null

Their company, from whichever column of the audience row holds one.

contact_name
string | null

The person's name from their audience row: a full-name column where filled, else the given and family names joined. Null when the table names nobody.

contact_number
integer
default:0

This contact's ordinal within the sequence, from 1. A label of last resort, for a contact with neither an address nor a LinkedIn profile.

contact_title
string | null

Their job title, from whichever column of the audience row holds one.

decides_at
string<date-time> | null

For a contact on a condition that waits (Replied?, Bounced?, Accepted?): when the branch is decided. In the past on an acceptance, the window is over and the verdict waits for the sender's browser to look at the sent invitations again.

failure_reason
string | null

Why a failed contact stopped, in the words of its status cell: for a LinkedIn step, the browser's own reason. Retry runs the same step again. Null on every other status.

held_by_sequence
HeldBySequenceReadSchema · object | null

On a contact skipped because they are in another live sequence (status skipped_duplicate): that sequence of this workspace, by id and name. Null for every other status, and once nothing holds the contact, which is when the next sync takes them in.

hold_reason
enum<string> | null

Why the send path pushed this contact's next attempt out to due_at. Set only on an active contact whose due_at is still ahead. 'window' also covers a contact due on one of the sending window's openings, whoever scheduled them.

Available options:
window,
daily_cap,
no_mailbox,
pacing,
agent_unavailable,
no_message,
agent_writing,
mailbox_waiting,
no_linkedin_account
last_contacted_at
string<date-time> | null

The touch a cooldown stop is measured from. Whoever made it is deliberately never named — it may be a colleague's sequence entirely.

last_step_at
string<date-time> | null

When that step ran.

last_step_id
string<uuid> | null

The step this contact last actually ran. Not the step before current_step_id: on a branching graph those are different steps.

linkedin_queue
enum<string> | null

Set beside waiting_on 'linkedin': where the contact's step stands in the sending account's line. 'running' is in a browser now; 'queued' is in line (see linkedin_steps_ahead and linkedin_starts_at); the rest say why the line is not moving for it: a daily or weekly limit for its kind, no browser checked in for fifteen minutes, LinkedIn asking to verify the account, or the account disconnected.

Available options:
running,
queued,
daily_limit,
weekly_limit,
kind_disabled,
browser_offline,
verify_account,
disconnected
linkedin_resets_at
string<date-time> | null

For a step held by a daily or weekly limit, when the limit it waits on resets (a UTC midnight). Null otherwise.

linkedin_starts_at
string<date-time> | null

When the step is expected to start, simulated the way the account's governor hands steps out: the next gap is exact, later gaps are the account's time between steps widened by the average jitter, and a step held by a daily or weekly limit starts after that limit resets. Null where no time can be named.

linkedin_steps_ahead
integer | null

For a queued step, how many of the account's steps run before it.

linkedin_url
string | null
mailbox_address
string | null

The address this contact is emailed from. A contact is only ever emailed from the mailbox that first emailed them, in any sequence. Null until something has emailed them.

mailbox_issue
enum<string> | null

Why that mailbox cannot send for this sequence, set while it is what stops the contact (stop_reason mailbox_removed: deleted, not_on_sequence) or holds them (hold_reason mailbox_waiting: disconnected, no_sender).

Available options:
deleted,
not_on_sequence,
disconnected,
no_sender
reachable
boolean
default:true

Whether any channel this sequence's steps use can reach the contact: an email address for an email step, a LinkedIn profile URL for a LinkedIn one. A sequence with no sending step yet counts both.

unreachable_reason
enum<string> | null

Which address the contact lacks, set only while being unreachable is what holds them: the Contacts tab reads it as Unreachable, and the audience eligibility counts them under missing_contact_details. Null for a reachable contact and for one who is settled or held by something named first (do not contact, another sequence, a cooldown).

Available options:
no_email,
no_linkedin_url,
no_email_or_linkedin_url
waiting_on
enum<string> | null

What the approval queue holds this contact behind, read from the task for their current step: a person's approval, a LinkedIn browser, or an approved email the engine has not sent yet. Null when nothing does.

Available options:
approval,
linkedin,
send