Skip to main content
POST
Start an enrollment run
Enrolls up to 5,000 people in one sequence in the background. The call returns at once with the run, status: queued, and a run_id to poll. For 500 or fewer, Add contacts to a sequence does the same synchronously and reports each outcome in the response. Run a preview first: it shows who would be added and who would not, and changes nothing.

Sources

The request body can be up to 10 MB.

What happens to each person

Everyone goes through the same checks as any enrollment: the suppression list, the sequence’s rules of engagement, the owner’s throttles on the sequence, and the one-live-enrollment rule. A refusal skips that person and the run carries on. The run counts refusals, and the sequence’s refusals list records each one with its reason. owner_id (default user_id) owns the new enrollments and gets their tasks. People listed in force_include are added despite a rule blocking them, and held for approval.

Before it is queued

The sequence, the owner and the source are checked before anything is queued, so a 4xx means nothing started: A sequence that is off is accepted: its enrollments wait in pending and start when it is turned on.

Following the run

Poll Get an enrollment run every few seconds until status is completed, failed or cancelled. To stop early, cancel the run.
Send an Idempotency-Key. Without one, a retried request starts a second run, whose people mostly come back as already enrolled.

Authorizations

x-api-key
string
header
required

Team-scoped API key generated in the Salesfinity dashboard under Settings → Connections → API & Webhooks. A missing or invalid key returns HTTP 403.

Headers

Idempotency-Key
string

Makes this write safe to retry. Send a unique value, such as a UUID, and send the same value again when you retry the same request. A retry with the same key and the same request (method, path including the query string, and JSON body) returns the original successful response without acting twice. The same key with a different body or path returns 409, and so does a retry while the first request is still running; that one is safe to repeat after a moment. A request that fails frees its key, so a retry runs the write again: after a 5xx on a create, confirm with a GET before retrying. Keys are kept for 24 hours and are scoped to your team.

Body

application/json
user_id
string
required

The team member this call acts as. Must be an active member of the team the API key belongs to.

Example:

"507f1f77bcf86cd799439011"

sequence
string
required

The sequence to enroll into. It can be off; it cannot be archived, have enrollment paused, or have no steps.

source
object
required
owner_id
string

Who owns the resulting enrollments and gets their tasks. Defaults to user_id. Must be a member of the team; otherwise 422.

force_include
string[]

Preview row keys of people to add even though a rule of engagement blocks them. They are enrolled and held for approval, not started. Only a rule block can be overridden: the suppression list, a live enrollment and the throttles still apply, and keys of people no rule blocks change nothing. At most 5,000. Ignored by the preview.

Maximum array length: 5000

Response

The run, queued. Poll it for progress.

A background enrollment run. Deleted 7 days after it finishes.

run_id
string

enroll_ followed by 24 hexadecimal characters.

Example:

"enroll_9c1f4e2a7b3d5c6e8f0a1b2c"

status
enum<string>

queued: waiting for a worker. fetching: reading the source; total is not known yet. running: enrolling. completed, failed and cancelled are final.

Available options:
queued,
fetching,
running,
completed,
failed,
cancelled
sequence
string

24-character hexadecimal id.

Example:

"507f1f77bcf86cd799439011"

total
integer

Everyone the source yielded, including rows that cannot be attempted. 0 until the source has been read.

processed
integer

How many of total have been dealt with, enrolled or skipped. Progress is processed out of total.

enrolled
integer

People enrolled, including those held for approval.

skipped_count
integer

People not enrolled: refused by a check, or not attemptable (no email or LinkedIn handle, or past the 5,000 cap).

held_count
integer

Enrolled people a rule is holding for approval. Part of enrolled.

truncated
boolean

The source had more than 5,000 usable people; only the first 5,000 were considered.

sample_skipped
object[]

Up to 50 skipped people, each with the reason. Every refusal is also on the sequence's refusals list, except rows that could not be attempted.

error
string | null

Why the run failed or stopped early. Absent otherwise.

finished_at
string<date-time> | null

When the run reached a final status. Absent while it is in progress.

source
object

What the run was pointed at. A run started from a preview keeps the preview's source and adds preview_id. Runs started in the Salesfinity app from a connected CRM have kind crm and also carry provider, scope and list_id.

cancel_requested
boolean

A cancel has been asked for. The run stops at its next check, and status changes when it does.

created_at
string<date-time>

When the run was started.