x-api-key header and the base URL
https://client-api.salesfinity.co.
/v2/sequencer/* is the Salesfinity Sequencer. The older GET /v1/sequences is a different
thing entirely — it lists sequence names seen on your call logs from an external CRM. It is
unchanged and unrelated.Before you start: who is acting
An API key identifies a team, not a person. The Sequencer records a person on everything it writes — a sequence has an author, an enrollment has an owner, a task has an assignee — so every write takes auser_id, which must be an active member of the key’s team.
Some endpoints also take owner_id or assignee_id. The distinction matters:
owner_id and assignee_id default to user_id when omitted.
1. Create the sequence
2. Add steps
Steps run in the order you create them.interval_seconds is the delay from the previous step — or
from enrolment, for the first one.
auto_email sends on its own. call, task and manual_email create a task and wait for the rep.
3. Preview before you enrol
Preview is free and tells you who would actually go in.preview_id, counts, and a breakdown of everyone excluded and why. Anything Salesfinity
can answer from data it already holds is answered exactly; anything that would need a live CRM read
is reported under unmeasured rather than guessed.
Pass the preview_id back as a preview source to enrol exactly the set you reviewed. Previews
expire after 30 minutes.
4. Add contacts
Up to 500 at a time, synchronously:skipped on every call. The reasons are: suppressed (on your do-not-contact list),
already_enrolled (a contact can hold only one live enrollment per sequence), policy (a rule
blocked them), throttle_capacity / throttle_daily, and contact_not_found.
For more than 500 people, start an enrolment run instead and poll it — it handles up to 5000 in the
background.
Retrying safely
Send anIdempotency-Key on writes. A repeat with the same key returns the original response
instead of acting twice; a repeat with the same key but a different body is a 409, because that
means something is wrong on your side.
5. Turn it on
GET /v2/sequencer/email-accounts.
6. Work the task queue
If the call was dialled inside Salesfinity you do not need to call this at all: dispositioning the
call completes the task and applies the outcome for you.
7. Removing someone
Un-enrolling isPOST /v2/sequencer/enrollments/{id}/finish. There is no DELETE — an enrollment
is a record of what happened, so it is finished rather than destroyed and its timeline survives.
Once finished, the same contact can be enrolled again later.
To stop contacting an entire company at once — you booked a meeting and want everyone else left
alone — use POST /v2/sequencer/enrollments/bulk/account. Send "dry_run": true first; it can
touch a lot of people.
8. Find out why someone was not added
Staying in sync
Rather than polling, subscribe to webhooks in the dashboard under Settings → Connections & API. The sequencer events areSEQUENCE_CONTACT_ENROLLED, SEQUENCE_CONTACT_PAUSED,
SEQUENCE_CONTACT_FINISHED, SEQUENCE_APPROVAL_REQUESTED, SEQUENCE_TASK_CREATED,
SEQUENCE_TASK_COMPLETED, SEQUENCE_TASK_SKIPPED, SEQUENCE_EMAIL_SENT,
SEQUENCE_EMAIL_REPLIED, SEQUENCE_EMAIL_BOUNCED and SEQUENCE_EMAIL_OPTED_OUT.
Each delivery carries an x-salesfinity-signature header: sha256= followed by the HMAC-SHA256 of
the raw request body, keyed with the signing secret shown once when you create the webhook. Verify
it with a constant-time comparison before trusting the payload. Compute the digest over the bytes as
received — re-serializing the JSON first will change them and the comparison will fail.
A webhook created before signing existed has no secret, so its deliveries arrive without the header.
There is currently no way to issue a secret for one; recreate the webhook to get a signed feed.
Make your receiver idempotent. A delivery that fails with a 5xx, a 429, or a transport fault is
retried up to three times with backoff, so the same event can arrive more than once — for example if
your endpoint times out after it has already processed the payload. Deliveries are independent per
subscription and are not ordered, so do not infer sequence from arrival order. A 4xx is not retried:
the event is dropped and recorded on the webhook’s delivery log, which you can read in the dashboard.
Each attempt is bounded at 10 seconds, so return quickly and do your work afterwards.
Rate limits and errors
/v2/sequencer/* allows 120 requests per minute per API key. Over that you get a 429 with a
Retry-After header. Retry 429 and 5xx with exponential backoff and jitter; 400, 403 and 404 will
not succeed on an identical retry.
Every error uses the same envelope as the rest of the API — see Errors.