Sequences
Multi-step outreach sequences, their steps and variants, and contact enrollments.
23 endpoints· 2 called live· verified against http://127.0.0.1:8741
23 endpoints
GET/api/v1/salesshift/sequencesCalled liveSequence list with real rollups — steps, enrollment breakdown and the send/open/reply funnel measured against ss_email_tracking.
Sequence list with real rollups — steps, enrollment breakdown and the send/open/reply funnel measured against ss_email_tracking.
Query parameters
| Name | Type | Required | Notes |
|---|---|---|---|
| q | string? | optional | |
| status | string? | optional | |
| include_archived | boolean | optional | Default false. |
Request
curl 'https://api.vxcloud.io/api/v1/salesshift/sequences' \
-H "Authorization: Bearer $SS_TOKEN"Response · 200
{
"success": "bool",
"data": [
{
"id": "str",
"organization_id": "str",
"created_by_id": "int",
"name": "str",
"description": "str",
"status": "str",
"total_enrolled": "int",
"total_replied": "int",
"total_sent": "int",
"total_opened": "int",
"reply_rate": "float",
"reply_rate_stored": "float",
"archived_at": "null",
"created_at": "str",
"updated_at": "str",
"settings": {
"send_as_reply": "...",
"stop_on_reply": "...",
"stop_on_click": "...",
"stop_on_meeting": "...",
"send_window_start": "...",
"send_window_end": "...",
"send_timezone": "...",
"send_days": "...",
"sender_integration_id": "...",
"sender_account_id": "...",
"daily_cap": "...",
"mailbox_id": "..."
},
"send_as_reply": "bool",
"stop_on_reply": "bool",
"stop_on_click": "bool",
"stop_on_meeting": "bool",
"send_window_start": "null",
"send_window_end": "null",
"send_timezone": "str",
"send_days": [
"...",
"...x5"
],
"sender_integration_id": "null",
"sender_account_id": "null",
"daily_cap": "null",
"mailbox_id": "null",
"steps_count": "int",
"enrollment_counts": {},
"enrolled": "int",
"active": "int",
"paused": "int",
"completed": "int",
"sent": "int",
"opened": "int",
"clicked": "int",
"replied": "int",
"bounced": "int",
"open_rate": "float"
},
"...x3"
],
"totals": {
"sequences": "int",
"active": "int",
"enrolled": "int",
"sent": "int",
"opened": "int",
"replied": "int",
"open_rate": "float",
"reply_rate": "float"
}
}POST/api/v1/salesshift/sequencesVerified in sessionCreate an outreach sequence, optionally with its steps.
Request body (required) — SequenceCreateIn
| Field | Type | Required | Notes |
|---|---|---|---|
| name | string | required | ≤ 255 chars. |
| description | string? | optional | |
| status | string? | optional | |
| send_as_reply | boolean | optional | Default false. |
| stop_on_reply | boolean | optional | Default true. |
| stop_on_click | boolean | optional | Default false. |
| stop_on_meeting | boolean | optional | Default true. |
| send_window_start | string(time)? | optional | |
| send_window_end | string(time)? | optional | |
| send_timezone | string | optional | Default "UTC". |
| send_days | string[] | optional | |
| sender_integration_id | string(uuid)? | optional | |
| sender_account_id | string(uuid)? | optional | |
| daily_cap | integer? | optional | |
| steps | StepIn[] | optional |
Values in the request below are typed placeholders, not sample data.
Request
curl -X POST 'https://api.vxcloud.io/api/v1/salesshift/sequences' \
-H "Authorization: Bearer $SS_TOKEN" \
-H 'Content-Type: application/json' \
-d '{ "name": "<string>", "description": "<string>", "status": "<string>", "send_as_reply": false, "stop_on_reply": true, "stop_on_click": false, "stop_on_meeting": true, "send_window_start": "<string(time)>", "send_window_end": "<string(time)>", "send_timezone": "UTC", "send_days": [ "<string>" ], "sender_integration_id": "<string(uuid)>", "sender_account_id": "<string(uuid)>", "daily_cap": 0, "steps": [ "<StepIn>" ] }'Response · 201
{
"data": "…",
"success": "…"
}Errors
| Status | detail |
|---|---|
| 400 | Invalid status '{...}' |
GET/api/v1/salesshift/sequences/{sequence_id}Called liveOne sequence with its steps, variants and rollup counters.
Path parameters
| Name | Type | Required | Notes |
|---|---|---|---|
| sequence_id | string(uuid) | required |
Request
curl 'https://api.vxcloud.io/api/v1/salesshift/sequences/{sequence_id}' \
-H "Authorization: Bearer $SS_TOKEN"Response · 200
{
"success": "bool",
"data": {
"id": "str",
"organization_id": "str",
"created_by_id": "int",
"name": "str",
"description": "str",
"status": "str",
"total_enrolled": "int",
"total_replied": "int",
"total_sent": "int",
"total_opened": "int",
"reply_rate": "float",
"reply_rate_stored": "float",
"archived_at": "null",
"created_at": "str",
"updated_at": "str",
"settings": {
"send_as_reply": "bool",
"stop_on_reply": "bool",
"stop_on_click": "bool",
"stop_on_meeting": "bool",
"send_window_start": "null",
"send_window_end": "null",
"send_timezone": "str",
"send_days": [
"...",
"...x5"
],
"sender_integration_id": "null",
"sender_account_id": "null",
"daily_cap": "null",
"mailbox_id": "null"
},
"send_as_reply": "bool",
"stop_on_reply": "bool",
"stop_on_click": "bool",
"stop_on_meeting": "bool",
"send_window_start": "null",
"send_window_end": "null",
"send_timezone": "str",
"send_days": [
"str",
"...x5"
],
"sender_integration_id": "null",
"sender_account_id": "null",
"daily_cap": "null",
"mailbox_id": "null",
"steps": [
{
"id": "...",
"sequence_id": "...",
"step_number": "...",
"step_type": "...",
"name": "...",
"subject": "...",
"body_html": "...",
"delay_days": "...",
"delay_hours": "...",
"task_title": "...",
"task_notes": "...",
"task_priority": "...",
"condition_config": "...",
"is_active": "...",
"variant_of": "...",
"variant_label": "...",
"variant_weight": "...",
"sent_count": "...",
"opened_count": "...",
"replied_count": "...",
"clicked_count": "...",
"bounced_count": "...",
"open_rate": "...",
"reply_rate": "...",
"click_rate": "...",
"created_at": "...",
"updated_at": "...",
"variants": "..."
},
"...x5"
],
"steps_count": "int",
"enrollment_counts": {},
"enrolled": "int",
"active": "int",
"paused": "int",
"completed": "int",
"sent": "int",
"opened": "int",
"replied": "int",
"open_rate": "float",
"reply_rate_actual": "float"
}
}PUT/api/v1/salesshift/sequences/{sequence_id}Verified in sessionUpdate a sequence and, when supplied, replace its step list.
Path parameters
| Name | Type | Required | Notes |
|---|---|---|---|
| sequence_id | string(uuid) | required |
Request body (required) — SequenceUpdateIn
| Field | Type | Required | Notes |
|---|---|---|---|
| name | string? | optional | |
| description | string? | optional | |
| status | string? | optional | |
| send_as_reply | boolean? | optional | |
| stop_on_reply | boolean? | optional | |
| stop_on_click | boolean? | optional | |
| stop_on_meeting | boolean? | optional | |
| send_window_start | string(time)? | optional | |
| send_window_end | string(time)? | optional | |
| send_timezone | string? | optional | |
| send_days | string[]? | optional | |
| sender_integration_id | string(uuid)? | optional | |
| sender_account_id | string(uuid)? | optional | |
| daily_cap | integer? | optional | |
| mailbox_id | string(uuid)? | optional | |
| steps | StepIn[]? | optional |
Values in the request below are typed placeholders, not sample data.
Request
curl -X PUT 'https://api.vxcloud.io/api/v1/salesshift/sequences/{sequence_id}' \
-H "Authorization: Bearer $SS_TOKEN" \
-H 'Content-Type: application/json' \
-d '{ "name": "<string>", "description": "<string>", "status": "<string>", "send_as_reply": false, "stop_on_reply": false, "stop_on_click": false, "stop_on_meeting": false, "send_window_start": "<string(time)>", "send_window_end": "<string(time)>", "send_timezone": "<string>", "send_days": [ "<string>" ], "sender_integration_id": "<string(uuid)>", "sender_account_id": "<string(uuid)>", "daily_cap": 0, "mailbox_id": "<string(uuid)>", "steps": [ "<StepIn>" ] }'Response · 200
{
"data": "…",
"success": "…"
}Errors
| Status | detail |
|---|---|
| 400 | Invalid status '{...}' |
| 400 | daily_cap must be >= 0 |
DELETE/api/v1/salesshift/sequences/{sequence_id}Verified in sessionDelete a sequence.
Path parameters
| Name | Type | Required | Notes |
|---|---|---|---|
| sequence_id | string(uuid) | required |
Request
curl -X DELETE 'https://api.vxcloud.io/api/v1/salesshift/sequences/{sequence_id}' \
-H "Authorization: Bearer $SS_TOKEN"Response · 200
{
"success": "…"
}Errors
| Status | detail |
|---|---|
| 404 | Sequence not found |
POST/api/v1/salesshift/sequences/{sequence_id}/activateVerified in sessionSet a sequence's status to active so the dispatcher will send its steps.
Path parameters
| Name | Type | Required | Notes |
|---|---|---|---|
| sequence_id | string(uuid) | required |
Request
curl -X POST 'https://api.vxcloud.io/api/v1/salesshift/sequences/{sequence_id}/activate' \
-H "Authorization: Bearer $SS_TOKEN"Response · 200
Returns _set_status(...) -> {success, data: <sequence detail>}.
GET/api/v1/salesshift/sequences/{sequence_id}/analyticsVerified in sessionPer-step funnel measured against ss_email_tracking — nothing estimated.
Per-step funnel measured against ss_email_tracking — nothing estimated. Variant rows are rolled up into their parent position and also returned individually so the builder can show per-arm A/B numbers.
Path parameters
| Name | Type | Required | Notes |
|---|---|---|---|
| sequence_id | string(uuid) | required |
Request
curl 'https://api.vxcloud.io/api/v1/salesshift/sequences/{sequence_id}/analytics' \
-H "Authorization: Bearer $SS_TOKEN"Response · 200
{
"data": "…",
"name": "…",
"open_rate": "…",
"reply_rate": "…",
"sent": "…",
"step_id": "…",
"step_number": "…",
"success": "…"
}POST/api/v1/salesshift/sequences/{sequence_id}/archiveVerified in sessionSet a sequence's status to archived.
Path parameters
| Name | Type | Required | Notes |
|---|---|---|---|
| sequence_id | string(uuid) | required |
Request
curl -X POST 'https://api.vxcloud.io/api/v1/salesshift/sequences/{sequence_id}/archive' \
-H "Authorization: Bearer $SS_TOKEN"Response · 200
Returns _set_status(...) -> {success, data: <sequence detail>}.
POST/api/v1/salesshift/sequences/{sequence_id}/duplicateVerified in sessionDeep copy: settings + every step + every A/B variant.
Deep copy: settings + every step + every A/B variant. Lands as a draft with zeroed counters and no enrollments.
Path parameters
| Name | Type | Required | Notes |
|---|---|---|---|
| sequence_id | string(uuid) | required |
Request
curl -X POST 'https://api.vxcloud.io/api/v1/salesshift/sequences/{sequence_id}/duplicate' \
-H "Authorization: Bearer $SS_TOKEN"Response · 200
{
"data": "…",
"success": "…"
}POST/api/v1/salesshift/sequences/{sequence_id}/enrollVerified in sessionEnroll contacts by id, by list, or by saved contact filter.
Enroll contacts by id, by list, or by saved contact filter. Suppressed, unsubscribed, email-less and already-enrolled contacts are skipped — the suppression list is a hard gate (plan 3.13) — and every skip is reported both individually and as a breakdown count.
Path parameters
| Name | Type | Required | Notes |
|---|---|---|---|
| sequence_id | string(uuid) | required |
Request body (required) — EnrollIn
| Field | Type | Required | Notes |
|---|---|---|---|
| contact_ids | string(uuid)[] | optional | |
| list_ids | string(uuid)[] | optional | |
| list_id | string(uuid)? | optional | |
| filter | ContactFilterIn? | optional |
Values in the request below are typed placeholders, not sample data.
Request
curl -X POST 'https://api.vxcloud.io/api/v1/salesshift/sequences/{sequence_id}/enroll' \
-H "Authorization: Bearer $SS_TOKEN" \
-H 'Content-Type: application/json' \
-d '{ "contact_ids": [ "<string(uuid)>" ], "list_ids": [ "<string(uuid)>" ], "list_id": "<string(uuid)>", "filter": "<ContactFilterIn>" }'Response · 200
{
"candidates": "…",
"cap": "…",
"capped": "…",
"enrolled": "…",
"skipped": "…",
"success": "…"
}Errors
| Status | detail |
|---|---|
| 400 | No contacts to enroll |
GET/api/v1/salesshift/sequences/{sequence_id}/enrollmentsVerified in sessionPaged enrollments for one sequence, joined to the enrolled contact.
Path parameters
| Name | Type | Required | Notes |
|---|---|---|---|
| sequence_id | string(uuid) | required |
Query parameters
| Name | Type | Required | Notes |
|---|---|---|---|
| status | string? | optional | |
| q | string? | optional | |
| page | integer | optional | Default 1. min 1. |
| limit | integer | optional | Default 50. min 1. max 200. |
Request
curl 'https://api.vxcloud.io/api/v1/salesshift/sequences/{sequence_id}/enrollments' \
-H "Authorization: Bearer $SS_TOKEN"Response · 200
{
"data": "…",
"pagination": "…",
"status_counts": "…",
"success": "…"
}DELETE/api/v1/salesshift/sequences/{sequence_id}/enrollments/{enrollment_id}Verified in sessionRemove a contact's enrollment and decrement the sequence's enrolled counter.
Path parameters
| Name | Type | Required | Notes |
|---|---|---|---|
| sequence_id | string(uuid) | required | |
| enrollment_id | string(uuid) | required |
Request
curl -X DELETE 'https://api.vxcloud.io/api/v1/salesshift/sequences/{sequence_id}/enrollments/{enrollment_id}' \
-H "Authorization: Bearer $SS_TOKEN"Response · 200
{
"success": "…"
}POST/api/v1/salesshift/sequences/{sequence_id}/enrollments/{enrollment_id}/pauseVerified in sessionPause one contact's enrollment in a sequence.
Path parameters
| Name | Type | Required | Notes |
|---|---|---|---|
| sequence_id | string(uuid) | required | |
| enrollment_id | string(uuid) | required |
Request
curl -X POST 'https://api.vxcloud.io/api/v1/salesshift/sequences/{sequence_id}/enrollments/{enrollment_id}/pause' \
-H "Authorization: Bearer $SS_TOKEN"Response · 200
{
"data": "…",
"success": "…"
}Errors
| Status | detail |
|---|---|
| 400 | Cannot pause an enrollment that is '{...}' |
POST/api/v1/salesshift/sequences/{sequence_id}/enrollments/{enrollment_id}/resumeVerified in sessionResume a paused or failed enrollment.
Path parameters
| Name | Type | Required | Notes |
|---|---|---|---|
| sequence_id | string(uuid) | required | |
| enrollment_id | string(uuid) | required |
Request
curl -X POST 'https://api.vxcloud.io/api/v1/salesshift/sequences/{sequence_id}/enrollments/{enrollment_id}/resume' \
-H "Authorization: Bearer $SS_TOKEN"Response · 200
{
"data": "…",
"success": "…"
}Errors
| Status | detail |
|---|---|
| 400 | Cannot resume an enrollment that is '{...}' |
POST/api/v1/salesshift/sequences/{sequence_id}/pauseVerified in sessionSet a sequence's status to paused.
Path parameters
| Name | Type | Required | Notes |
|---|---|---|---|
| sequence_id | string(uuid) | required |
Request
curl -X POST 'https://api.vxcloud.io/api/v1/salesshift/sequences/{sequence_id}/pause' \
-H "Authorization: Bearer $SS_TOKEN"Response · 200
Returns _set_status(...) -> {success, data: <sequence detail>}.
POST/api/v1/salesshift/sequences/{sequence_id}/previewVerified in sessionRender one step's merge fields against a real contact, or against a clearly-flagged sample when no contact is supplied.
Render one step's merge fields against a real contact, or against a clearly-flagged sample when no contact is supplied.
Path parameters
| Name | Type | Required | Notes |
|---|---|---|---|
| sequence_id | string(uuid) | required |
Request body (required) — PreviewIn
| Field | Type | Required | Notes |
|---|---|---|---|
| step_id | string(uuid) | required | |
| contact_id | string(uuid)? | optional |
Values in the request below are typed placeholders, not sample data.
Request
curl -X POST 'https://api.vxcloud.io/api/v1/salesshift/sequences/{sequence_id}/preview' \
-H "Authorization: Bearer $SS_TOKEN" \
-H 'Content-Type: application/json' \
-d '{ "step_id": "<string(uuid)>", "contact_id": "<string(uuid)>" }'Response · 200
{
"data": "…",
"success": "…"
}Errors
| Status | detail |
|---|---|
| 404 | Step not found in this sequence |
| 404 | Contact not found |
POST/api/v1/salesshift/sequences/{sequence_id}/stepsVerified in sessionAppend a step, or insert at `step_number` (1-based) pushing the rest down.
Path parameters
| Name | Type | Required | Notes |
|---|---|---|---|
| sequence_id | string(uuid) | required |
Request body (required) — StepIn
| Field | Type | Required | Notes |
|---|---|---|---|
| step_number | integer? | optional | |
| step_type | string | optional | Default "email". |
| name | string? | optional | |
| subject | string? | optional | |
| body_html | string? | optional | |
| delay_days | integer | optional | Default 1. |
| delay_hours | integer | optional | Default 0. |
| task_title | string? | optional | |
| task_notes | string? | optional | |
| task_priority | string? | optional | |
| condition_config | object? | optional | |
| is_active | boolean | optional | Default true. |
Values in the request below are typed placeholders, not sample data.
Request
curl -X POST 'https://api.vxcloud.io/api/v1/salesshift/sequences/{sequence_id}/steps' \
-H "Authorization: Bearer $SS_TOKEN" \
-H 'Content-Type: application/json' \
-d '{ "step_number": 0, "step_type": "email", "name": "<string>", "subject": "<string>", "body_html": "<string>", "delay_days": 1, "delay_hours": 0, "task_title": "<string>", "task_notes": "<string>", "task_priority": "<string>", "condition_config": {}, "is_active": true }'Response · 201
{
"data": "…",
"success": "…"
}POST/api/v1/salesshift/sequences/{sequence_id}/steps/reorderVerified in sessionRenumber the timeline atomically.
Renumber the timeline atomically. `order` must be exactly the sequence's non-variant step ids — that guarantees the result is a 1..N permutation with no duplicates and no step left behind. The write happens in two passes inside one transaction (negative placeholders first) so no intermediate state can collide even if a unique index is added on (sequence_id, step_number) later.
Path parameters
| Name | Type | Required | Notes |
|---|---|---|---|
| sequence_id | string(uuid) | required |
Request body (required) — ReorderIn
| Field | Type | Required | Notes |
|---|---|---|---|
| order | string(uuid)[] | required |
Values in the request below are typed placeholders, not sample data.
Request
curl -X POST 'https://api.vxcloud.io/api/v1/salesshift/sequences/{sequence_id}/steps/reorder' \
-H "Authorization: Bearer $SS_TOKEN" \
-H 'Content-Type: application/json' \
-d '{ "order": [ "<string(uuid)>" ] }'Response · 200
{
"data": "…",
"success": "…"
}Errors
| Status | detail |
|---|---|
| 400 | order contains duplicate step ids |
| 400 | order must list every step of this sequence exactly once ({...} expected, {...} given) |
POST/api/v1/salesshift/sequences/dispatch-nowVerified in sessionManually run one dispatch tick for the caller's org (the background loop runs the same engine every minute).
Manually run one dispatch tick for the caller's org (the background loop runs the same engine every minute).
Request
curl -X POST 'https://api.vxcloud.io/api/v1/salesshift/sequences/dispatch-now' \
-H "Authorization: Bearer $SS_TOKEN"Response · 200
{
"success": "…",
"summary": "…"
}PUT/api/v1/salesshift/steps/{step_id}Verified in sessionUpdate one sequence step, validating step type, condition config and delay.
Path parameters
| Name | Type | Required | Notes |
|---|---|---|---|
| step_id | string(uuid) | required |
Request body (required) — StepUpdateIn
| Field | Type | Required | Notes |
|---|---|---|---|
| step_type | string? | optional | |
| name | string? | optional | |
| subject | string? | optional | |
| body_html | string? | optional | |
| delay_days | integer? | optional | |
| delay_hours | integer? | optional | |
| task_title | string? | optional | |
| task_notes | string? | optional | |
| task_priority | string? | optional | |
| condition_config | object? | optional | |
| is_active | boolean? | optional | |
| variant_label | string? | optional | |
| variant_weight | integer? | optional |
Values in the request below are typed placeholders, not sample data.
Request
curl -X PUT 'https://api.vxcloud.io/api/v1/salesshift/steps/{step_id}' \
-H "Authorization: Bearer $SS_TOKEN" \
-H 'Content-Type: application/json' \
-d '{ "step_type": "<string>", "name": "<string>", "subject": "<string>", "body_html": "<string>", "delay_days": 0, "delay_hours": 0, "task_title": "<string>", "task_notes": "<string>", "task_priority": "<string>", "condition_config": {}, "is_active": false, "variant_label": "<string>", "variant_weight": 0 }'Response · 200
{
"data": "…",
"success": "…"
}DELETE/api/v1/salesshift/steps/{step_id}Verified in sessionDelete a step (its A/B variants cascade) and close the numbering gap.
Path parameters
| Name | Type | Required | Notes |
|---|---|---|---|
| step_id | string(uuid) | required |
Request
curl -X DELETE 'https://api.vxcloud.io/api/v1/salesshift/steps/{step_id}' \
-H "Authorization: Bearer $SS_TOKEN"Response · 200
{
"success": "…"
}POST/api/v1/salesshift/steps/{step_id}/variantsVerified in sessionAdd an A/B variant to an email step.
Add an A/B variant to an email step. The parent row IS variant A.
Path parameters
| Name | Type | Required | Notes |
|---|---|---|---|
| step_id | string(uuid) | required |
Request body (required) — VariantIn
| Field | Type | Required | Notes |
|---|---|---|---|
| variant_label | string? | optional | |
| variant_weight | integer | optional | Default 50. |
| name | string? | optional | |
| subject | string? | optional | |
| body_html | string? | optional |
Values in the request below are typed placeholders, not sample data.
Request
curl -X POST 'https://api.vxcloud.io/api/v1/salesshift/steps/{step_id}/variants' \
-H "Authorization: Bearer $SS_TOKEN" \
-H 'Content-Type: application/json' \
-d '{ "variant_label": "<string>", "variant_weight": 50, "name": "<string>", "subject": "<string>", "body_html": "<string>" }'Response · 201
{
"data": "…",
"success": "…"
}Errors
| Status | detail |
|---|---|
| 400 | Cannot add a variant to a variant |
| 400 | A/B variants are only supported on email steps |
| 400 | Maximum number of variants reached |
| 400 | Variant '{...}' already exists on this step |
DELETE/api/v1/salesshift/variants/{variant_id}Verified in sessionDelete an A/B variant of a step (use DELETE /steps/{step_id} for a step itself).
Path parameters
| Name | Type | Required | Notes |
|---|---|---|---|
| variant_id | string(uuid) | required |
Request
curl -X DELETE 'https://api.vxcloud.io/api/v1/salesshift/variants/{variant_id}' \
-H "Authorization: Bearer $SS_TOKEN"Response · 200
{
"success": "…"
}Errors
| Status | detail |
|---|---|
| 400 | Not a variant — use DELETE /steps/{step_id} to remove a step |