Skip to content
SSalesShiftDocs
API reference

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.

Auth
get_org_user
Scope
organization
Success
200 · application/json
Envelope
success+custom

Query parameters

NameTypeRequiredNotes
qstring?optional
statusstring?optional
include_archivedbooleanoptionalDefault false.

Request

curl
curl 'https://api.vxcloud.io/api/v1/salesshift/sequences' \
  -H "Authorization: Bearer $SS_TOKEN"

Response · 200

Observed shape
{
  "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"
  }
}
Observed on 2026-08-06 — keys are real, values are the types that came back.
#get-api-v1-salesshift-sequencessequences_router · vxcloud_fastapiclient/app/services/salesshift/sequences_router.py:471Called against http://127.0.0.1:8741 on 2026-08-06 with a real JWT; the response matched the shape recorded below.
POST/api/v1/salesshift/sequencesVerified in sessionCreate an outreach sequence, optionally with its steps.
Auth
get_org_user
Scope
organization
Success
201 · application/json
Envelope
success+data

Request body (required) — SequenceCreateIn

FieldTypeRequiredNotes
namestringrequired≤ 255 chars.
descriptionstring?optional
statusstring?optional
send_as_replybooleanoptionalDefault false.
stop_on_replybooleanoptionalDefault true.
stop_on_clickbooleanoptionalDefault false.
stop_on_meetingbooleanoptionalDefault true.
send_window_startstring(time)?optional
send_window_endstring(time)?optional
send_timezonestringoptionalDefault "UTC".
send_daysstring[]optional
sender_integration_idstring(uuid)?optional
sender_account_idstring(uuid)?optional
daily_capinteger?optional
stepsStepIn[]optional

Values in the request below are typed placeholders, not sample data.

Request

curl
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

Top-level keys
{
  "data": "…",
  "success": "…"
}
Top-level keys read from the handler's return statements.

Errors

Statusdetail
400Invalid status '{...}'
#post-api-v1-salesshift-sequencessequences_router · vxcloud_fastapiclient/app/services/salesshift/sequences_router.py:633The sequences feature was verified working against the live system in the session that produced this inventory. This specific route was not re-called during the inventory run.
GET/api/v1/salesshift/sequences/{sequence_id}Called liveOne sequence with its steps, variants and rollup counters.
Auth
get_org_user
Scope
organization
Success
200 · application/json
Envelope
success+data

Path parameters

NameTypeRequiredNotes
sequence_idstring(uuid)required

Request

curl
curl 'https://api.vxcloud.io/api/v1/salesshift/sequences/{sequence_id}' \
  -H "Authorization: Bearer $SS_TOKEN"

Response · 200

Observed shape
{
  "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"
  }
}
Observed on 2026-08-06 — keys are real, values are the types that came back.
#get-api-v1-salesshift-sequences-sequence-idsequences_router · vxcloud_fastapiclient/app/services/salesshift/sequences_router.py:692Called against http://127.0.0.1:8741 on 2026-08-06 with a real JWT; the response matched the shape recorded below.
PUT/api/v1/salesshift/sequences/{sequence_id}Verified in sessionUpdate a sequence and, when supplied, replace its step list.
Auth
get_org_user
Scope
organization
Success
200 · application/json
Envelope
success+data

Path parameters

NameTypeRequiredNotes
sequence_idstring(uuid)required

Request body (required) — SequenceUpdateIn

FieldTypeRequiredNotes
namestring?optional
descriptionstring?optional
statusstring?optional
send_as_replyboolean?optional
stop_on_replyboolean?optional
stop_on_clickboolean?optional
stop_on_meetingboolean?optional
send_window_startstring(time)?optional
send_window_endstring(time)?optional
send_timezonestring?optional
send_daysstring[]?optional
sender_integration_idstring(uuid)?optional
sender_account_idstring(uuid)?optional
daily_capinteger?optional
mailbox_idstring(uuid)?optional
stepsStepIn[]?optional

Values in the request below are typed placeholders, not sample data.

Request

curl
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

Top-level keys
{
  "data": "…",
  "success": "…"
}
Top-level keys read from the handler's return statements.

Errors

Statusdetail
400Invalid status '{...}'
400daily_cap must be >= 0
#put-api-v1-salesshift-sequences-sequence-idsequences_router · vxcloud_fastapiclient/app/services/salesshift/sequences_router.py:702The sequences feature was verified working against the live system in the session that produced this inventory. This specific route was not re-called during the inventory run.
DELETE/api/v1/salesshift/sequences/{sequence_id}Verified in sessionDelete a sequence.
Auth
get_org_user
Scope
organization
Success
200 · application/json
Envelope
success+custom

Path parameters

NameTypeRequiredNotes
sequence_idstring(uuid)required

Request

curl
curl -X DELETE 'https://api.vxcloud.io/api/v1/salesshift/sequences/{sequence_id}' \
  -H "Authorization: Bearer $SS_TOKEN"

Response · 200

Top-level keys
{
  "success": "…"
}
Top-level keys read from the handler's return statements.

Errors

Statusdetail
404Sequence not found
#delete-api-v1-salesshift-sequences-sequence-idsequences_router · vxcloud_fastapiclient/app/services/salesshift/sequences_router.py:749The sequences feature was verified working against the live system in the session that produced this inventory. This specific route was not re-called during the inventory run.
POST/api/v1/salesshift/sequences/{sequence_id}/activateVerified in sessionSet a sequence's status to active so the dispatcher will send its steps.
Auth
get_org_user
Scope
organization
Success
200 · application/json
Envelope
success+data

Path parameters

NameTypeRequiredNotes
sequence_idstring(uuid)required

Request

curl
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>}.

#post-api-v1-salesshift-sequences-sequence-id-activatesequences_router · vxcloud_fastapiclient/app/services/salesshift/sequences_router.py:860The sequences feature was verified working against the live system in the session that produced this inventory. This specific route was not re-called during the inventory run.
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.

Auth
get_org_user
Scope
organization
Success
200 · application/json
Envelope
success+custom

Path parameters

NameTypeRequiredNotes
sequence_idstring(uuid)required

Request

curl
curl 'https://api.vxcloud.io/api/v1/salesshift/sequences/{sequence_id}/analytics' \
  -H "Authorization: Bearer $SS_TOKEN"

Response · 200

Top-level keys
{
  "data": "…",
  "name": "…",
  "open_rate": "…",
  "reply_rate": "…",
  "sent": "…",
  "step_id": "…",
  "step_number": "…",
  "success": "…"
}
Top-level keys read from the handler's return statements.
#get-api-v1-salesshift-sequences-sequence-id-analyticssequences_router · vxcloud_fastapiclient/app/services/salesshift/sequences_router.py:1424The sequences feature was verified working against the live system in the session that produced this inventory. This specific route was not re-called during the inventory run.
POST/api/v1/salesshift/sequences/{sequence_id}/archiveVerified in sessionSet a sequence's status to archived.
Auth
get_org_user
Scope
organization
Success
200 · application/json
Envelope
success+data

Path parameters

NameTypeRequiredNotes
sequence_idstring(uuid)required

Request

curl
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-archivesequences_router · vxcloud_fastapiclient/app/services/salesshift/sequences_router.py:878The sequences feature was verified working against the live system in the session that produced this inventory. This specific route was not re-called during the inventory run.
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.

Auth
get_org_user
Scope
organization
Success
200 · application/json
Envelope
success+data

Path parameters

NameTypeRequiredNotes
sequence_idstring(uuid)required

Request

curl
curl -X POST 'https://api.vxcloud.io/api/v1/salesshift/sequences/{sequence_id}/duplicate' \
  -H "Authorization: Bearer $SS_TOKEN"

Response · 200

Top-level keys
{
  "data": "…",
  "success": "…"
}
Top-level keys read from the handler's return statements.
#post-api-v1-salesshift-sequences-sequence-id-duplicatesequences_router · vxcloud_fastapiclient/app/services/salesshift/sequences_router.py:767The sequences feature was verified working against the live system in the session that produced this inventory. This specific route was not re-called during the inventory run.
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.

Auth
get_org_user
Scope
organization
Success
200 · application/json
Envelope
success+custom

Path parameters

NameTypeRequiredNotes
sequence_idstring(uuid)required

Request body (required) — EnrollIn

FieldTypeRequiredNotes
contact_idsstring(uuid)[]optional
list_idsstring(uuid)[]optional
list_idstring(uuid)?optional
filterContactFilterIn?optional

Values in the request below are typed placeholders, not sample data.

Request

curl
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

Top-level keys
{
  "candidates": "…",
  "cap": "…",
  "capped": "…",
  "enrolled": "…",
  "skipped": "…",
  "success": "…"
}
Top-level keys read from the handler's return statements.

Errors

Statusdetail
400No contacts to enroll
#post-api-v1-salesshift-sequences-sequence-id-enrollsequences_router · vxcloud_fastapiclient/app/services/salesshift/sequences_router.py:1337The sequences feature was verified working against the live system in the session that produced this inventory. This specific route was not re-called during the inventory run.
GET/api/v1/salesshift/sequences/{sequence_id}/enrollmentsVerified in sessionPaged enrollments for one sequence, joined to the enrolled contact.
Auth
get_org_user
Scope
organization
Success
200 · application/json
Envelope
success+custom

Path parameters

NameTypeRequiredNotes
sequence_idstring(uuid)required

Query parameters

NameTypeRequiredNotes
statusstring?optional
qstring?optional
pageintegeroptionalDefault 1. min 1.
limitintegeroptionalDefault 50. min 1. max 200.

Request

curl
curl 'https://api.vxcloud.io/api/v1/salesshift/sequences/{sequence_id}/enrollments' \
  -H "Authorization: Bearer $SS_TOKEN"

Response · 200

Top-level keys
{
  "data": "…",
  "pagination": "…",
  "status_counts": "…",
  "success": "…"
}
Top-level keys read from the handler's return statements.
#get-api-v1-salesshift-sequences-sequence-id-enrollmentssequences_router · vxcloud_fastapiclient/app/services/salesshift/sequences_router.py:1146The sequences feature was verified working against the live system in the session that produced this inventory. This specific route was not re-called during the inventory run.
DELETE/api/v1/salesshift/sequences/{sequence_id}/enrollments/{enrollment_id}Verified in sessionRemove a contact's enrollment and decrement the sequence's enrolled counter.
Auth
get_org_user
Scope
organization
Success
200 · application/json
Envelope
success+custom

Path parameters

NameTypeRequiredNotes
sequence_idstring(uuid)required
enrollment_idstring(uuid)required

Request

curl
curl -X DELETE 'https://api.vxcloud.io/api/v1/salesshift/sequences/{sequence_id}/enrollments/{enrollment_id}' \
  -H "Authorization: Bearer $SS_TOKEN"

Response · 200

Top-level keys
{
  "success": "…"
}
Top-level keys read from the handler's return statements.
#delete-api-v1-salesshift-sequences-sequence-id-enrollments-enrollment-idsequences_router · vxcloud_fastapiclient/app/services/salesshift/sequences_router.py:1269The sequences feature was verified working against the live system in the session that produced this inventory. This specific route was not re-called during the inventory run.
POST/api/v1/salesshift/sequences/{sequence_id}/enrollments/{enrollment_id}/pauseVerified in sessionPause one contact's enrollment in a sequence.
Auth
get_org_user
Scope
organization
Success
200 · application/json
Envelope
success+data

Path parameters

NameTypeRequiredNotes
sequence_idstring(uuid)required
enrollment_idstring(uuid)required

Request

curl
curl -X POST 'https://api.vxcloud.io/api/v1/salesshift/sequences/{sequence_id}/enrollments/{enrollment_id}/pause' \
  -H "Authorization: Bearer $SS_TOKEN"

Response · 200

Top-level keys
{
  "data": "…",
  "success": "…"
}
Top-level keys read from the handler's return statements.

Errors

Statusdetail
400Cannot pause an enrollment that is '{...}'
#post-api-v1-salesshift-sequences-sequence-id-enrollments-enrollment-id-pausesequences_router · vxcloud_fastapiclient/app/services/salesshift/sequences_router.py:1226The sequences feature was verified working against the live system in the session that produced this inventory. This specific route was not re-called during the inventory run.
POST/api/v1/salesshift/sequences/{sequence_id}/enrollments/{enrollment_id}/resumeVerified in sessionResume a paused or failed enrollment.
Auth
get_org_user
Scope
organization
Success
200 · application/json
Envelope
success+data

Path parameters

NameTypeRequiredNotes
sequence_idstring(uuid)required
enrollment_idstring(uuid)required

Request

curl
curl -X POST 'https://api.vxcloud.io/api/v1/salesshift/sequences/{sequence_id}/enrollments/{enrollment_id}/resume' \
  -H "Authorization: Bearer $SS_TOKEN"

Response · 200

Top-level keys
{
  "data": "…",
  "success": "…"
}
Top-level keys read from the handler's return statements.

Errors

Statusdetail
400Cannot resume an enrollment that is '{...}'
#post-api-v1-salesshift-sequences-sequence-id-enrollments-enrollment-id-resumesequences_router · vxcloud_fastapiclient/app/services/salesshift/sequences_router.py:1246The sequences feature was verified working against the live system in the session that produced this inventory. This specific route was not re-called during the inventory run.
POST/api/v1/salesshift/sequences/{sequence_id}/pauseVerified in sessionSet a sequence's status to paused.
Auth
get_org_user
Scope
organization
Success
200 · application/json
Envelope
success+data

Path parameters

NameTypeRequiredNotes
sequence_idstring(uuid)required

Request

curl
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-pausesequences_router · vxcloud_fastapiclient/app/services/salesshift/sequences_router.py:869The sequences feature was verified working against the live system in the session that produced this inventory. This specific route was not re-called during the inventory run.
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.

Auth
get_org_user
Scope
organization
Success
200 · application/json
Envelope
success+data

Path parameters

NameTypeRequiredNotes
sequence_idstring(uuid)required

Request body (required) — PreviewIn

FieldTypeRequiredNotes
step_idstring(uuid)required
contact_idstring(uuid)?optional

Values in the request below are typed placeholders, not sample data.

Request

curl
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

Top-level keys
{
  "data": "…",
  "success": "…"
}
Top-level keys read from the handler's return statements.

Errors

Statusdetail
404Step not found in this sequence
404Contact not found
#post-api-v1-salesshift-sequences-sequence-id-previewsequences_router · vxcloud_fastapiclient/app/services/salesshift/sequences_router.py:1569The sequences feature was verified working against the live system in the session that produced this inventory. This specific route was not re-called during the inventory run.
POST/api/v1/salesshift/sequences/{sequence_id}/stepsVerified in sessionAppend a step, or insert at `step_number` (1-based) pushing the rest down.
Auth
get_org_user
Scope
organization
Success
201 · application/json
Envelope
success+data

Path parameters

NameTypeRequiredNotes
sequence_idstring(uuid)required

Request body (required) — StepIn

FieldTypeRequiredNotes
step_numberinteger?optional
step_typestringoptionalDefault "email".
namestring?optional
subjectstring?optional
body_htmlstring?optional
delay_daysintegeroptionalDefault 1.
delay_hoursintegeroptionalDefault 0.
task_titlestring?optional
task_notesstring?optional
task_prioritystring?optional
condition_configobject?optional
is_activebooleanoptionalDefault true.

Values in the request below are typed placeholders, not sample data.

Request

curl
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

Top-level keys
{
  "data": "…",
  "success": "…"
}
Top-level keys read from the handler's return statements.
#post-api-v1-salesshift-sequences-sequence-id-stepssequences_router · vxcloud_fastapiclient/app/services/salesshift/sequences_router.py:891The sequences feature was verified working against the live system in the session that produced this inventory. This specific route was not re-called during the inventory run.
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.

Auth
get_org_user
Scope
organization
Success
200 · application/json
Envelope
success+data

Path parameters

NameTypeRequiredNotes
sequence_idstring(uuid)required

Request body (required) — ReorderIn

FieldTypeRequiredNotes
orderstring(uuid)[]required

Values in the request below are typed placeholders, not sample data.

Request

curl
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

Top-level keys
{
  "data": "…",
  "success": "…"
}
Top-level keys read from the handler's return statements.

Errors

Statusdetail
400order contains duplicate step ids
400order must list every step of this sequence exactly once ({...} expected, {...} given)
#post-api-v1-salesshift-sequences-sequence-id-steps-reordersequences_router · vxcloud_fastapiclient/app/services/salesshift/sequences_router.py:981The sequences feature was verified working against the live system in the session that produced this inventory. This specific route was not re-called during the inventory run.
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).

Auth
get_org_user
Scope
organization
Success
200 · application/json
Envelope
success+custom

Request

curl
curl -X POST 'https://api.vxcloud.io/api/v1/salesshift/sequences/dispatch-now' \
  -H "Authorization: Bearer $SS_TOKEN"

Response · 200

Top-level keys
{
  "success": "…",
  "summary": "…"
}
Top-level keys read from the handler's return statements.
#post-api-v1-salesshift-sequences-dispatch-nowsequences_router · vxcloud_fastapiclient/app/services/salesshift/sequences_router.py:679The sequences feature was verified working against the live system in the session that produced this inventory. This specific route was not re-called during the inventory run.
PUT/api/v1/salesshift/steps/{step_id}Verified in sessionUpdate one sequence step, validating step type, condition config and delay.
Auth
get_org_user
Scope
organization
Success
200 · application/json
Envelope
success+data

Path parameters

NameTypeRequiredNotes
step_idstring(uuid)required

Request body (required) — StepUpdateIn

FieldTypeRequiredNotes
step_typestring?optional
namestring?optional
subjectstring?optional
body_htmlstring?optional
delay_daysinteger?optional
delay_hoursinteger?optional
task_titlestring?optional
task_notesstring?optional
task_prioritystring?optional
condition_configobject?optional
is_activeboolean?optional
variant_labelstring?optional
variant_weightinteger?optional

Values in the request below are typed placeholders, not sample data.

Request

curl
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

Top-level keys
{
  "data": "…",
  "success": "…"
}
Top-level keys read from the handler's return statements.
#put-api-v1-salesshift-steps-step-idsequences_router · vxcloud_fastapiclient/app/services/salesshift/sequences_router.py:929The sequences feature was verified working against the live system in the session that produced this inventory. This specific route was not re-called during the inventory run.
DELETE/api/v1/salesshift/steps/{step_id}Verified in sessionDelete a step (its A/B variants cascade) and close the numbering gap.
Auth
get_org_user
Scope
organization
Success
200 · application/json
Envelope
success+custom

Path parameters

NameTypeRequiredNotes
step_idstring(uuid)required

Request

curl
curl -X DELETE 'https://api.vxcloud.io/api/v1/salesshift/steps/{step_id}' \
  -H "Authorization: Bearer $SS_TOKEN"

Response · 200

Top-level keys
{
  "success": "…"
}
Top-level keys read from the handler's return statements.
#delete-api-v1-salesshift-steps-step-idsequences_router · vxcloud_fastapiclient/app/services/salesshift/sequences_router.py:956The sequences feature was verified working against the live system in the session that produced this inventory. This specific route was not re-called during the inventory run.
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.

Auth
get_org_user
Scope
organization
Success
201 · application/json
Envelope
success+data

Path parameters

NameTypeRequiredNotes
step_idstring(uuid)required

Request body (required) — VariantIn

FieldTypeRequiredNotes
variant_labelstring?optional
variant_weightintegeroptionalDefault 50.
namestring?optional
subjectstring?optional
body_htmlstring?optional

Values in the request below are typed placeholders, not sample data.

Request

curl
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

Top-level keys
{
  "data": "…",
  "success": "…"
}
Top-level keys read from the handler's return statements.

Errors

Statusdetail
400Cannot add a variant to a variant
400A/B variants are only supported on email steps
400Maximum number of variants reached
400Variant '{...}' already exists on this step
#post-api-v1-salesshift-steps-step-id-variantssequences_router · vxcloud_fastapiclient/app/services/salesshift/sequences_router.py:1037The sequences feature was verified working against the live system in the session that produced this inventory. This specific route was not re-called during the inventory run.
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).
Auth
get_org_user
Scope
organization
Success
200 · application/json
Envelope
success+custom

Path parameters

NameTypeRequiredNotes
variant_idstring(uuid)required

Request

curl
curl -X DELETE 'https://api.vxcloud.io/api/v1/salesshift/variants/{variant_id}' \
  -H "Authorization: Bearer $SS_TOKEN"

Response · 200

Top-level keys
{
  "success": "…"
}
Top-level keys read from the handler's return statements.

Errors

Statusdetail
400Not a variant — use DELETE /steps/{step_id} to remove a step
#delete-api-v1-salesshift-variants-variant-idsequences_router · vxcloud_fastapiclient/app/services/salesshift/sequences_router.py:1088The sequences feature was verified working against the live system in the session that produced this inventory. This specific route was not re-called during the inventory run.