Reference
Sequences
Reusable multi-step templates. One sequence can drive many campaigns.
List sequences
/v1/sequences curl -X GET "https://api.clement.so/v1/sequences" \
-H "Authorization: Bearer $CLEMENT_API_KEY" Query parameters
-
limitinteger -
starting_afterstring -
ending_beforestring
Response200
OK
| Property | Type | Description |
|---|---|---|
object
required
| enum (1) | "list" |
data
required
| array<Sequence> | |
has_more
required
| boolean | |
next_cursor
required
| string | null | |
prev_cursor
required
| string | null |
Example response
{
"object": "list",
"data": [
{
"id": "seq_01HZ8X3J9K7P2QV6R5N4M3T2L6",
"object": "sequence",
"mode": "live",
"name": "Q2 outbound — 3 steps",
"description": "Cold intro → 3-day follow-up → 7-day breakup",
"step_count": 3,
"created_at": "2026-04-25T10:00:00Z",
"updated_at": "2026-04-25T10:00:00Z"
}
],
"has_more": false,
"next_cursor": "string",
"prev_cursor": "string"
} Errors
-
400Invalid request -
401Authentication failed -
403Insufficient scope -
404Not found -
409Conflict -
422Validation failed -
429Rate limited
See Errors for the full envelope and per-code reference.
Create a sequence (optionally with initial steps)
/v1/sequences curl -X POST "https://api.clement.so/v1/sequences" \
-H "Authorization: Bearer $CLEMENT_API_KEY" \
-H "Content-Type: application/json" \
--data '{
"name": "Alice Liddell",
"description": "A short human-readable description.",
"steps": [
{
"step_order": 0,
"delay_days": 0,
"delay_minutes": 0,
"subject": "Quick question about your stack",
"body_html": "<p>Hi {{first_name}}, would love to chat — does Tuesday work?</p>",
"body_text": "Hi {{first_name}}, would love to chat — does Tuesday work?",
"variants": [
{
"id": "string",
"subject": "Quick question about your stack",
"body_html": "<p>Hi {{first_name}}, would love to chat — does Tuesday work?</p>",
"body_text": "Hi {{first_name}}, would love to chat — does Tuesday work?",
"disabled": false
}
],
"winning_variant_id": "win_01HZ8X3J9K7P2QV6R5N4M3T2L1"
}
]
}' Request body
| Property | Type | Description | |||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
name
required
| string | ||||||||||||||||||||||||||||
description | string | ||||||||||||||||||||||||||||
steps | array<object> | Optional initial steps. Add later via POST /v1/sequences/{id}/steps. Show properties
|
Response201
Created
| Property | Type | Description |
|---|---|---|
id
required
| string | |
object
required
| enum (1) | "sequence" |
mode
required
| enum (2) | "live""test" |
name
required
| string | |
description
required
| string | null | |
step_count
required
| integer | |
created_at
required
| string (date-time) | |
updated_at
required
| string (date-time) | |
steps | array<SequenceStepStandalone> | Embedded on retrieve. Omitted from list responses. |
Example response
{
"id": "seq_01HZ8X3J9K7P2QV6R5N4M3T2L6",
"object": "sequence",
"mode": "live",
"name": "Q2 outbound — 3 steps",
"description": "Cold intro → 3-day follow-up → 7-day breakup",
"step_count": 3,
"created_at": "2026-04-25T10:00:00Z",
"updated_at": "2026-04-25T10:00:00Z"
} Errors
-
400Invalid request -
401Authentication failed -
403Insufficient scope -
404Not found -
409Conflict -
422Validation failed -
429Rate limited
See Errors for the full envelope and per-code reference.
Retrieve a sequence (with steps embedded)
/v1/sequences/{id} curl -X GET "https://api.clement.so/v1/sequences/obj_01HZ8X3J9K7P2QV6R5N4M3T2L1" \
-H "Authorization: Bearer $CLEMENT_API_KEY" Path parameters
-
idstring required
Response200
OK
| Property | Type | Description |
|---|---|---|
id
required
| string | |
object
required
| enum (1) | "sequence" |
mode
required
| enum (2) | "live""test" |
name
required
| string | |
description
required
| string | null | |
step_count
required
| integer | |
created_at
required
| string (date-time) | |
updated_at
required
| string (date-time) | |
steps | array<SequenceStepStandalone> | Embedded on retrieve. Omitted from list responses. |
Example response
{
"id": "seq_01HZ8X3J9K7P2QV6R5N4M3T2L6",
"object": "sequence",
"mode": "live",
"name": "Q2 outbound — 3 steps",
"description": "Cold intro → 3-day follow-up → 7-day breakup",
"step_count": 3,
"created_at": "2026-04-25T10:00:00Z",
"updated_at": "2026-04-25T10:00:00Z"
} Errors
-
400Invalid request -
401Authentication failed -
403Insufficient scope -
404Not found -
409Conflict -
422Validation failed -
429Rate limited
See Errors for the full envelope and per-code reference.
Update sequence metadata
/v1/sequences/{id} curl -X PATCH "https://api.clement.so/v1/sequences/obj_01HZ8X3J9K7P2QV6R5N4M3T2L1" \
-H "Authorization: Bearer $CLEMENT_API_KEY" \
-H "Content-Type: application/json" \
--data '{
"name": "Alice Liddell",
"description": "A short human-readable description."
}' Path parameters
-
idstring required
Request body
| Property | Type | Description |
|---|---|---|
name | string | |
description | string | null |
Response200
Updated
| Property | Type | Description |
|---|---|---|
id
required
| string | |
object
required
| enum (1) | "sequence" |
mode
required
| enum (2) | "live""test" |
name
required
| string | |
description
required
| string | null | |
step_count
required
| integer | |
created_at
required
| string (date-time) | |
updated_at
required
| string (date-time) | |
steps | array<SequenceStepStandalone> | Embedded on retrieve. Omitted from list responses. |
Example response
{
"id": "seq_01HZ8X3J9K7P2QV6R5N4M3T2L6",
"object": "sequence",
"mode": "live",
"name": "Q2 outbound — 3 steps",
"description": "Cold intro → 3-day follow-up → 7-day breakup",
"step_count": 3,
"created_at": "2026-04-25T10:00:00Z",
"updated_at": "2026-04-25T10:00:00Z"
} Errors
-
400Invalid request -
401Authentication failed -
403Insufficient scope -
404Not found -
409Conflict -
422Validation failed -
429Rate limited
See Errors for the full envelope and per-code reference.
Delete a sequence
/v1/sequences/{id} Cascades to template steps. Campaigns launched from the sequence keep their own copy of the steps.
curl -X DELETE "https://api.clement.so/v1/sequences/obj_01HZ8X3J9K7P2QV6R5N4M3T2L1" \
-H "Authorization: Bearer $CLEMENT_API_KEY" Path parameters
-
idstring required
Response200
Deleted
| Property | Type | Description |
|---|---|---|
id
required
| string | |
object
required
| enum (1) | "sequence" |
mode
required
| enum (2) | "live""test" |
name
required
| string | |
description
required
| string | null | |
step_count
required
| integer | |
created_at
required
| string (date-time) | |
updated_at
required
| string (date-time) | |
steps | array<SequenceStepStandalone> | Embedded on retrieve. Omitted from list responses. |
Example response
{
"id": "seq_01HZ8X3J9K7P2QV6R5N4M3T2L6",
"object": "sequence",
"mode": "live",
"name": "Q2 outbound — 3 steps",
"description": "Cold intro → 3-day follow-up → 7-day breakup",
"step_count": 3,
"created_at": "2026-04-25T10:00:00Z",
"updated_at": "2026-04-25T10:00:00Z"
} Errors
-
400Invalid request -
401Authentication failed -
403Insufficient scope -
404Not found -
409Conflict -
422Validation failed -
429Rate limited
See Errors for the full envelope and per-code reference.
Add a step to a sequence
/v1/sequences/{id}/steps Appends, or inserts at `step_order` and shifts the later steps down. A follow-up step may leave `subject` blank to reply in the same thread.
curl -X POST "https://api.clement.so/v1/sequences/obj_01HZ8X3J9K7P2QV6R5N4M3T2L1/steps" \
-H "Authorization: Bearer $CLEMENT_API_KEY" \
-H "Content-Type: application/json" \
--data '{
"step_order": 0,
"delay_days": 0,
"delay_minutes": 0,
"subject": "Quick question about your stack",
"body_html": "<p>Hi {{first_name}}, would love to chat — does Tuesday work?</p>",
"body_text": "Hi {{first_name}}, would love to chat — does Tuesday work?",
"variants": [
{
"id": "string",
"subject": "Quick question about your stack",
"body_html": "<p>Hi {{first_name}}, would love to chat — does Tuesday work?</p>",
"body_text": "Hi {{first_name}}, would love to chat — does Tuesday work?",
"disabled": false
}
],
"winning_variant_id": "win_01HZ8X3J9K7P2QV6R5N4M3T2L1"
}' Path parameters
-
idstring required
Request body
| Property | Type | Description |
|---|---|---|
step_order | integer | 0-based position. Omit to append; an existing position inserts before that step. |
delay_days | integer | Wait in whole days. Prefer `delay_minutes`. |
delay_minutes | integer | Wait after the previous step's send, in minutes (sends still respect the campaign's schedule window). Takes precedence over `delay_days`. |
subject | string | May be blank (or omitted) on a follow-up step: the email then goes out in the same thread as `Re: <subject of the previous email>`. The first step needs one. |
body_html | string | |
body_text | string | |
variants | array<SequenceStepVariant> | |
winning_variant_id | string |
Response201
Created
| Property | Type | Description |
|---|---|---|
id
required
| string | |
object
required
| enum (1) | "sequence_step" |
sequence_id
required
| string | |
step_order
required
| integer | |
delay_days
required
| integer | |
delay_minutes
required
| integer | Wait after the previous step, in minutes (authoritative over `delay_days`). |
subject
required
| string | |
body_html
required
| string | |
body_text
required
| string | |
variants
required
| array<SequenceStepVariant> | null | |
winning_variant_id
required
| string | null |
Example response
{
"id": "string",
"object": "sequence_step",
"sequence_id": "seq_01HZ8X3J9K7P2QV6R5N4M3T2L5",
"step_order": 0,
"delay_days": 0,
"delay_minutes": 0,
"subject": "Quick question about your stack",
"body_html": "<p>Hi {{first_name}}, would love to chat — does Tuesday work?</p>",
"body_text": "Hi {{first_name}}, would love to chat — does Tuesday work?",
"variants": [
{
"id": "string",
"subject": "Quick question about your stack",
"body_html": "<p>Hi {{first_name}}, would love to chat — does Tuesday work?</p>",
"body_text": "Hi {{first_name}}, would love to chat — does Tuesday work?",
"disabled": false
}
],
"winning_variant_id": "win_01HZ8X3J9K7P2QV6R5N4M3T2L1"
} Errors
-
400Invalid request -
401Authentication failed -
403Insufficient scope -
404Not found -
409Conflict -
422Validation failed -
429Rate limited
See Errors for the full envelope and per-code reference.
Reorder a sequence's steps
/v1/sequences/{id}/steps/reorder curl -X POST "https://api.clement.so/v1/sequences/obj_01HZ8X3J9K7P2QV6R5N4M3T2L1/steps/reorder" \
-H "Authorization: Bearer $CLEMENT_API_KEY" \
-H "Content-Type: application/json" \
--data '{
"step_ids": [
"string"
]
}' Path parameters
-
idstring required
Request body
| Property | Type | Description |
|---|---|---|
step_ids
required
| array<string> | Every step id of the sequence, in the new order. On a campaign, steps active leads have already reached keep their position. |
Response200
Reordered
| Property | Type | Description |
|---|---|---|
id
required
| string | |
object
required
| enum (1) | "sequence" |
mode
required
| enum (2) | "live""test" |
name
required
| string | |
description
required
| string | null | |
step_count
required
| integer | |
created_at
required
| string (date-time) | |
updated_at
required
| string (date-time) | |
steps | array<SequenceStepStandalone> | Embedded on retrieve. Omitted from list responses. |
Example response
{
"id": "seq_01HZ8X3J9K7P2QV6R5N4M3T2L6",
"object": "sequence",
"mode": "live",
"name": "Q2 outbound — 3 steps",
"description": "Cold intro → 3-day follow-up → 7-day breakup",
"step_count": 3,
"created_at": "2026-04-25T10:00:00Z",
"updated_at": "2026-04-25T10:00:00Z"
} Errors
-
400Invalid request -
401Authentication failed -
403Insufficient scope -
404Not found -
409Conflict -
422Validation failed -
429Rate limited
See Errors for the full envelope and per-code reference.
Update a step
/v1/sequences/{id}/steps/{step_id} Edit content, delay or variants, or move the step with `step_order` (the other steps shift). Only template steps are edited; campaigns keep their own copy (edit those via /v1/campaigns/{id}/steps).
curl -X PATCH "https://api.clement.so/v1/sequences/obj_01HZ8X3J9K7P2QV6R5N4M3T2L1/steps/ste_01HZ8X3J9K7P2QV6R5N4M3T2L1" \
-H "Authorization: Bearer $CLEMENT_API_KEY" \
-H "Content-Type: application/json" \
--data '{
"step_order": 0,
"delay_days": 0,
"delay_minutes": 0,
"subject": "Quick question about your stack",
"body_html": "<p>Hi {{first_name}}, would love to chat — does Tuesday work?</p>",
"body_text": "Hi {{first_name}}, would love to chat — does Tuesday work?",
"variants": [
{
"id": "string",
"subject": "Quick question about your stack",
"body_html": "<p>Hi {{first_name}}, would love to chat — does Tuesday work?</p>",
"body_text": "Hi {{first_name}}, would love to chat — does Tuesday work?",
"disabled": false
}
],
"winning_variant_id": "win_01HZ8X3J9K7P2QV6R5N4M3T2L1"
}' Path parameters
-
idstring required -
step_idstring required
Request body
| Property | Type | Description |
|---|---|---|
step_order | integer | Move the step to this 0-based position. |
delay_days | integer | Wait in whole days. Prefer `delay_minutes`. |
delay_minutes | integer | Wait after the previous step's send, in minutes (sends still respect the campaign's schedule window). Takes precedence over `delay_days`. |
subject | string | May be blank (or omitted) on a follow-up step: the email then goes out in the same thread as `Re: <subject of the previous email>`. The first step needs one. |
body_html | string | |
body_text | string | |
variants | array<SequenceStepVariant> | null | Replaces the step's variants. Ids are stable: keep an id to edit that variant, drop it to delete the variant (its sends keep their stats). null or [] removes A/B. |
winning_variant_id | string | null |
Response200
Updated
| Property | Type | Description |
|---|---|---|
id
required
| string | |
object
required
| enum (1) | "sequence_step" |
sequence_id
required
| string | |
step_order
required
| integer | |
delay_days
required
| integer | |
delay_minutes
required
| integer | Wait after the previous step, in minutes (authoritative over `delay_days`). |
subject
required
| string | |
body_html
required
| string | |
body_text
required
| string | |
variants
required
| array<SequenceStepVariant> | null | |
winning_variant_id
required
| string | null |
Example response
{
"id": "string",
"object": "sequence_step",
"sequence_id": "seq_01HZ8X3J9K7P2QV6R5N4M3T2L5",
"step_order": 0,
"delay_days": 0,
"delay_minutes": 0,
"subject": "Quick question about your stack",
"body_html": "<p>Hi {{first_name}}, would love to chat — does Tuesday work?</p>",
"body_text": "Hi {{first_name}}, would love to chat — does Tuesday work?",
"variants": [
{
"id": "string",
"subject": "Quick question about your stack",
"body_html": "<p>Hi {{first_name}}, would love to chat — does Tuesday work?</p>",
"body_text": "Hi {{first_name}}, would love to chat — does Tuesday work?",
"disabled": false
}
],
"winning_variant_id": "win_01HZ8X3J9K7P2QV6R5N4M3T2L1"
} Errors
-
400Invalid request -
401Authentication failed -
403Insufficient scope -
404Not found -
409Conflict -
422Validation failed -
429Rate limited
See Errors for the full envelope and per-code reference.
Delete a step
/v1/sequences/{id}/steps/{step_id} The later steps shift up to close the gap.
curl -X DELETE "https://api.clement.so/v1/sequences/obj_01HZ8X3J9K7P2QV6R5N4M3T2L1/steps/ste_01HZ8X3J9K7P2QV6R5N4M3T2L1" \
-H "Authorization: Bearer $CLEMENT_API_KEY" Path parameters
-
idstring required -
step_idstring required
Errors
-
400Invalid request -
401Authentication failed -
403Insufficient scope -
404Not found -
409Conflict -
422Validation failed -
429Rate limited
See Errors for the full envelope and per-code reference.