Reference

Sequences

Reusable multi-step templates. One sequence can drive many campaigns.

List sequences

get /v1/sequences
curl -X GET "https://api.clement.so/v1/sequences" \
  -H "Authorization: Bearer $CLEMENT_API_KEY"

Query parameters

  • limit integer
  • starting_after string
  • ending_before string

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

  • 400 Invalid request
  • 401 Authentication failed
  • 403 Insufficient scope
  • 404 Not found
  • 409 Conflict
  • 422 Validation failed
  • 429 Rate limited

See Errors for the full envelope and per-code reference.

Create a sequence (optionally with initial steps)

post /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
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"
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

  • 400 Invalid request
  • 401 Authentication failed
  • 403 Insufficient scope
  • 404 Not found
  • 409 Conflict
  • 422 Validation failed
  • 429 Rate limited

See Errors for the full envelope and per-code reference.

Retrieve a sequence (with steps embedded)

get /v1/sequences/{id}
curl -X GET "https://api.clement.so/v1/sequences/obj_01HZ8X3J9K7P2QV6R5N4M3T2L1" \
  -H "Authorization: Bearer $CLEMENT_API_KEY"

Path parameters

  • id string 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

  • 400 Invalid request
  • 401 Authentication failed
  • 403 Insufficient scope
  • 404 Not found
  • 409 Conflict
  • 422 Validation failed
  • 429 Rate limited

See Errors for the full envelope and per-code reference.

Update sequence metadata

patch /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

  • id string 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

  • 400 Invalid request
  • 401 Authentication failed
  • 403 Insufficient scope
  • 404 Not found
  • 409 Conflict
  • 422 Validation failed
  • 429 Rate limited

See Errors for the full envelope and per-code reference.

Delete a sequence

delete /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

  • id string 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

  • 400 Invalid request
  • 401 Authentication failed
  • 403 Insufficient scope
  • 404 Not found
  • 409 Conflict
  • 422 Validation failed
  • 429 Rate limited

See Errors for the full envelope and per-code reference.

Add a step to a sequence

post /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

  • id string 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

  • 400 Invalid request
  • 401 Authentication failed
  • 403 Insufficient scope
  • 404 Not found
  • 409 Conflict
  • 422 Validation failed
  • 429 Rate limited

See Errors for the full envelope and per-code reference.

Reorder a sequence's steps

post /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

  • id string 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

  • 400 Invalid request
  • 401 Authentication failed
  • 403 Insufficient scope
  • 404 Not found
  • 409 Conflict
  • 422 Validation failed
  • 429 Rate limited

See Errors for the full envelope and per-code reference.

Update a step

patch /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

  • id string required
  • step_id string 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

  • 400 Invalid request
  • 401 Authentication failed
  • 403 Insufficient scope
  • 404 Not found
  • 409 Conflict
  • 422 Validation failed
  • 429 Rate limited

See Errors for the full envelope and per-code reference.

Delete a step

delete /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

  • id string required
  • step_id string required

Errors

  • 400 Invalid request
  • 401 Authentication failed
  • 403 Insufficient scope
  • 404 Not found
  • 409 Conflict
  • 422 Validation failed
  • 429 Rate limited

See Errors for the full envelope and per-code reference.