> For the complete documentation index, see [llms.txt](https://docs.zero.inc/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.zero.inc/features/api/sequences.md).

# Sequences

Build and control multi-step outreach sequences (cadences). A sequence is an ordered series of steps — emails, delays, tasks, and LinkedIn actions — that contacts move through automatically.

#### Use the action endpoints, not raw CRUD

Create, rename, clone, and delete sequences with the dedicated action endpoints below — **not** the generic `POST` / `PATCH` / `DELETE /api/sequences` verbs. Creating a sequence also provisions a backing **source list**, a start step, and a default view; deleting one cascades to its steps, list, and enrollments. The raw verbs skip this scaffolding and leave a sequence that cannot enroll contacts. (`PATCH /api/sequences/{sequenceId}` is still fine for editing settings like the sending mailbox — see that endpoint for the fields to avoid.)

#### Lifecycle

A sequence's `status` moves `draft` → `active` → `paused`. Use `/activate` and `/pause` to transition it — they also move in-flight contacts — rather than patching `status` directly.

#### Steps

Steps are managed with the regular `/api/sequenceSteps` CRUD endpoints. Each step has a `type` (`sendEmail`, `delay`, `addTask`, `sendLinkedinMessage`, `sendLinkedinConnectionRequest`, `startAutomation`, `endSequence`) and an `order`. The `startSequence` step (order `0`) is created for you and should not be removed.

## List sequences

> Returns sequences in a workspace. Filter with the \`where\` parameter, e.g. \`{"workspaceId": "\<WORKSPACE\_UUID>"}\` or \`{"workspaceId": "\<WORKSPACE\_UUID>", "status": "active"}\`.\
> \
> The \`listId\` field on each sequence is its \*\*source list\*\* — add that list to a contact's \`listIds\` to enroll the contact (see the Sequence Enrollments section).<br>

````json
{"openapi":"3.0.3","info":{"title":"Zero API","version":"1.12.0"},"tags":[{"name":"Sequences","description":"Build and control multi-step outreach sequences (cadences). A sequence is an ordered series of steps — emails, delays, tasks, and LinkedIn actions — that contacts move through automatically.\n\n### Use the action endpoints, not raw CRUD\nCreate, rename, clone, and delete sequences with the dedicated action endpoints below — **not** the generic `POST` / `PATCH` / `DELETE /api/sequences` verbs. Creating a sequence also provisions a backing **source list**, a start step, and a default view; deleting one cascades to its steps, list, and enrollments. The raw verbs skip this scaffolding and leave a sequence that cannot enroll contacts. (`PATCH /api/sequences/{sequenceId}` is still fine for editing settings like the sending mailbox — see that endpoint for the fields to avoid.)\n\n### Lifecycle\nA sequence's `status` moves `draft` → `active` → `paused`. Use `/activate` and `/pause` to transition it — they also move in-flight contacts — rather than patching `status` directly.\n\n### Steps\nSteps are managed with the regular `/api/sequenceSteps` CRUD endpoints. Each step has a `type` (`sendEmail`, `delay`, `addTask`, `sendLinkedinMessage`, `sendLinkedinConnectionRequest`, `startAutomation`, `endSequence`) and an `order`. The `startSequence` step (order `0`) is created for you and should not be removed.\n"}],"servers":[{"url":"https://api.zero.inc","description":"Production server"}],"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","description":"All API requests require a Bearer token in the Authorization header. Create an API key from [Workspace Settings → API keys](https://app.zero.inc/settings/workspace/api)"}},"parameters":{"fields":{"name":"fields","in":"query","description":"Comma-separated list of fields to return. Defaults to all fields.","schema":{"type":"string"}},"where":{"name":"where","in":"query","description":"JSON-encoded filter object. All top-level conditions are combined with AND logic. Use `$or` for OR logic.\n\nThe available operators depend on the **data type** of the field you are filtering on.\n\n---\n\n## String fields\nFields like `name`, `domain`, `description`, `linkedin`, `source`, `externalId`, `location`.\n\n| Operator | Description | Example |\n|----------|-------------|---------|\n| *(exact)* | Exact match | `{\"name\": \"Linear\"}` |\n| `$eq` | Explicit exact match | `{\"name\": {\"$eq\": \"Linear\"}}` |\n| `$not` | Not equal | `{\"source\": {\"$not\": \"import\"}}` |\n| `$in` | Matches any value in array | `{\"domain\": {\"$in\": [\"linear.app\", \"granola.so\"]}}` |\n| `$notIn` | Matches none of the values | `{\"source\": {\"$notIn\": [\"import\", \"api\"]}}` |\n| `$contains` | Case-insensitive word-boundary substring match | `{\"name\": {\"$contains\": \"YC\"}}` |\n| `$notContains` | Does not contain | `{\"name\": {\"$notContains\": \"Test\"}}` |\n| `$containsAny` | Contains any of the given strings | `{\"name\": {\"$containsAny\": [\"YC\", \"Techstars\"]}}` |\n| `$startsWith` | Starts with prefix | `{\"domain\": {\"$startsWith\": \"app.\"}}` |\n| `$endsWith` | Ends with suffix | `{\"email\": {\"$endsWith\": \"@zero.inc\"}}` |\n| `$exists` | Field is present and truthy | `{\"linkedin\": {\"$exists\": true}}` |\n| `$notExists` | Field is absent, null, or empty | `{\"linkedin\": {\"$notExists\": true}}` |\n\n---\n\n## Number fields\nFields like `value`, `confidence`.\n\n| Operator | Description | Example |\n|----------|-------------|---------|\n| *(exact)* | Exact match | `{\"value\": 5000}` |\n| `$eq` | Explicit exact match | `{\"value\": {\"$eq\": 5000}}` |\n| `$not` | Not equal | `{\"value\": {\"$not\": 0}}` |\n| `$gt` | Greater than | `{\"value\": {\"$gt\": 10000}}` |\n| `$gte` | Greater than or equal | `{\"value\": {\"$gte\": 5000}}` |\n| `$lt` | Less than | `{\"value\": {\"$lt\": 10000}}` |\n| `$lte` | Less than or equal | `{\"value\": {\"$lte\": 50000}}` |\n| `$in` | Matches any value in array | `{\"confidence\": {\"$in\": [0.25, 0.5, 0.75]}}` |\n| `$notIn` | Matches none of the values | `{\"confidence\": {\"$notIn\": [0, 1]}}` |\n| `$exists` | Field is present and truthy | `{\"value\": {\"$exists\": true}}` |\n| `$notExists` | Field is absent, null, or zero | `{\"value\": {\"$notExists\": true}}` |\n\nMultiple operators can be combined on one field:\n```json\n{\"value\": {\"$gte\": 5000, \"$lt\": 10000}}\n```\n\n---\n\n## Date fields\nFields like `closeDate`, `startDate`, `endDate`, `createdAt`, `updatedAt`.\n\nValues can be ISO 8601 strings (`\"2026-01-01\"`, `\"2026-01-01T00:00:00Z\"`) or **relative time macros**.\n\n**Relative time macros:** `+Nd` / `-Nd` (days), `+Nw` / `-Nw` (weeks), `+Nm` / `-Nm` (months), `+Ny` / `-Ny` (years), `+Nh` / `-Nh` (hours), `+Ns` / `-Ns` (seconds), `now()`.\n\n| Operator | Description | Example |\n|----------|-------------|---------|\n| `$gte` | On or after | `{\"closeDate\": {\"$gte\": \"2026-01-01\"}}` |\n| `$lte` | On or before | `{\"closeDate\": {\"$lte\": \"2026-03-31\"}}` |\n| `$gt` | After | `{\"createdAt\": {\"$gt\": \"2026-01-01T00:00:00Z\"}}` |\n| `$lt` | Before | `{\"createdAt\": {\"$lt\": \"now()\"}}` |\n| `$date` | Exact date match (compares date portion only) | `{\"closeDate\": {\"$date\": \"2026-01-15\"}}` |\n| `$exists` | Field is present and truthy | `{\"closeDate\": {\"$exists\": true}}` |\n| `$notExists` | Field is absent or null | `{\"closeDate\": {\"$notExists\": true}}` |\n\nDate range example:\n```json\n{\"closeDate\": {\"$gte\": \"2026-01-01\", \"$lte\": \"2026-03-31\"}}\n```\nRelative date example (closing in next 30 days):\n```json\n{\"closeDate\": {\"$gte\": \"now()\", \"$lte\": \"+30d\"}}\n```\n\n---\n\n## Array fields\nFields like `listIds`, `ownerIds`, `contactIds`.\n\n| Operator | Description | Example |\n|----------|-------------|---------|\n| `$includes` | Array contains the given value (use this — bare exact match is not supported) | `{\"listIds\": {\"$includes\": \"<LIST_UUID>\"}}` |\n| `$notIncludes` | Array does not contain the given value | `{\"ownerIds\": {\"$notIncludes\": \"<USER_UUID>\"}}` |\n| `$overlaps` | Array contains at least one of the given values | `{\"ownerIds\": {\"$overlaps\": [\"<UUID_1>\", \"<UUID_2>\"]}}` |\n| `$notOverlaps` | Array contains none of the given values | `{\"listIds\": {\"$notOverlaps\": [\"<UUID_1>\", \"<UUID_2>\"]}}` |\n| `$all` | Array contains all of the given values | `{\"listIds\": {\"$all\": [\"<UUID_1>\", \"<UUID_2>\"]}}` |\n| `$length` | Filter by array length (supports nested operators) | `{\"contactIds\": {\"$length\": {\"$gte\": 2}}}` |\n| `$exists` | Field is present and non-empty | `{\"ownerIds\": {\"$exists\": true}}` |\n| `$notExists` | Field is absent or empty | `{\"ownerIds\": {\"$notExists\": true}}` |\n\n---\n\n## UUID / ID fields\nFields like `id`, `workspaceId`, `companyId`, `stage`.\n\n| Operator | Description | Example |\n|----------|-------------|---------|\n| *(exact)* | Exact match | `{\"stage\": \"<PIPELINE_STAGE_UUID>\"}` |\n| `$in` | Matches any value in array | `{\"stage\": {\"$in\": [\"<UUID_1>\", \"<UUID_2>\"]}}` |\n| `$notIn` | Matches none of the values | `{\"stage\": {\"$notIn\": [\"<UUID_1>\"]}}` |\n| `$not` | Not equal | `{\"stage\": {\"$not\": \"<UUID>\"}}` |\n\n---\n\n## Boolean fields\nFields like `archived`.\n\n| Operator | Description | Example |\n|----------|-------------|---------|\n| *(exact)* | Exact match | `{\"archived\": false}` |\n| `$not` | Not equal | `{\"archived\": {\"$not\": true}}` |\n\n---\n\n## Logical operators\nThese work across all data types.\n\n`$or` — matches if **any** sub-condition is true:\n```json\n{\n  \"workspaceId\": \"<WORKSPACE_UUID>\",\n  \"$or\": [\n    {\"ownerIds\": {\"$overlaps\": [\"<USER_UUID_1>\", \"<USER_UUID_2>\"]}},\n    {\"closeDate\": {\"$gte\": \"2026-01-01\"}}\n  ]\n}\n```\n\n`$and` — matches if **all** sub-conditions are true (useful when you need multiple conditions on the same field):\n```json\n{\n  \"$and\": [\n    {\"name\": {\"$contains\": \"Enterprise\"}},\n    {\"name\": {\"$notContains\": \"Test\"}}\n  ]\n}\n```\n\n---\n\n## Dot-notation (relation filtering)\nUse dot-syntax to filter records based on properties of related objects:\n```json\n{\"company.name\": \"Linear\"}\n{\"company.domain\": {\"$in\": [\"linear.app\", \"granola.so\"]}}\n{\"company.location.city\": \"San Francisco\"}\n{\"companyProfile.categories\": {\"$overlaps\": [\"Sales\", \"Marketing\"]}}\n```\nAll operators available for the target field's data type can be used with dot-notation.\n\n---\n\n## Custom property filtering\nCustom properties are stored in the `custom` object on records, keyed by UUID. Use `GET /api/columns` to discover the available custom property IDs, types, and options for a workspace.\n\nFilter on custom properties using `custom.<COLUMN_ID>` with operators appropriate for the column's type.\n\n> **Note:** For `select` and `multiselect` columns, option values are UUIDs (the `key` field from the column's `options` array). Use the UUID, not the human-readable name.\n\n```json\n// Text custom property\n{\"custom.54e1ca7d-69c3-4b77-8266-8085b5834116\": {\"$contains\": \"enterprise\"}}\n\n// Select custom property (use the option key UUID)\n{\"custom.a1b2c3d4-e5f6-7890-abcd-ef1234567890\": \"3e839b5c-b311-4887-b2da-727d2d75cdd6\"}\n\n// Multi-select custom property (use option key UUIDs)\n{\"custom.b2c3d4e5-f6a7-8901-bcde-f12345678901\": {\"$overlaps\": [\"a1b1c1d1-e1f1-1111-aaaa-111111111111\", \"b2b2c2d2-e2f2-2222-bbbb-222222222222\"]}}\n\n// Currency/number custom property\n{\"custom.c3d4e5f6-a7b8-9012-cdef-123456789012\": {\"$gte\": 100000}}\n\n// Date custom property\n{\"custom.d4e5f6a7-b8c9-0123-defa-234567890123\": {\"$gte\": \"2026-01-01\"}}\n\n// Boolean custom property\n{\"custom.e5f6a7b8-c9d0-1234-efab-345678901234\": true}\n\n// Check if custom property has a value\n{\"custom.f6a7b8c9-d0e1-2345-fabc-456789012345\": {\"$exists\": true}}\n```\n\n---\n\n## Complex example\nAll top-level keys are ANDed together:\n```json\n{\n  \"name\": {\"$contains\": \"Zero\"},\n  \"location.city\": \"Helsinki\",\n  \"location.country\": {\"$in\": [\"United Kingdom\", \"Germany\", \"Sweden\"]},\n  \"value\": {\"$gte\": 10000},\n  \"closeDate\": {\"$gte\": \"2026-01-01\", \"$lte\": \"2026-03-31\"},\n  \"ownerIds\": {\"$includes\": \"<USER_UUID>\"},\n  \"stage\": {\"$in\": [\"<UUID_1>\", \"<UUID_2>\"]},\n  \"lastActivity\": {\"$exists\": true},\n  \"companyProfile.categories\": {\"$overlaps\": [\"Sales\", \"Marketing\"]},\n  \"custom.54e1ca7d-69c3-4b77-8266-8085b5834116\": {\"$contains\": \"enterprise\"}\n}\n```\n","schema":{"type":"string"}},"limit":{"name":"limit","in":"query","description":"Maximum number of records to return","schema":{"type":"integer","default":100}},"offset":{"name":"offset","in":"query","description":"Pagination offset","schema":{"type":"integer","default":0}},"orderBy":{"name":"orderBy","in":"query","description":"JSON string for sort order","schema":{"type":"string"}}},"schemas":{"Sequence":{"type":"object","description":"A multi-step outreach sequence (cadence).","properties":{"id":{"type":"string","format":"uuid"},"workspaceId":{"type":"string","format":"uuid"},"name":{"type":"string","nullable":true},"status":{"type":"string","nullable":true,"enum":["draft","active","paused","archived"],"description":"Lifecycle state. Transition with `/activate` and `/pause` rather than patching this directly.\n"},"listId":{"type":"string","format":"uuid","nullable":true,"description":"The sequence's **source list**. Add this list to a contact's `listIds` to enroll the contact."},"mailboxId":{"type":"string","format":"uuid","nullable":true,"description":"Default sending mailbox for the sequence's email steps."},"linkedinAccountId":{"type":"string","format":"uuid","nullable":true},"sequenceFolderId":{"type":"string","format":"uuid","nullable":true},"icon":{"type":"string","nullable":true},"color":{"type":"string","nullable":true},"order":{"type":"integer","nullable":true},"settings":{"type":"object","description":"Sequence-level settings (JSON)."},"archived":{"type":"boolean"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"},"createdById":{"type":"string","format":"uuid","nullable":true},"updatedById":{"type":"string","format":"uuid","nullable":true}}}},"responses":{"Unauthorized":{"description":"Authentication failed or token is invalid/expired","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}}}},"paths":{"/api/sequences":{"get":{"tags":["Sequences"],"summary":"List sequences","description":"Returns sequences in a workspace. Filter with the `where` parameter, e.g. `{\"workspaceId\": \"<WORKSPACE_UUID>\"}` or `{\"workspaceId\": \"<WORKSPACE_UUID>\", \"status\": \"active\"}`.\n\nThe `listId` field on each sequence is its **source list** — add that list to a contact's `listIds` to enroll the contact (see the Sequence Enrollments section).\n","operationId":"listSequences","parameters":[{"$ref":"#/components/parameters/fields"},{"$ref":"#/components/parameters/where"},{"$ref":"#/components/parameters/limit"},{"$ref":"#/components/parameters/offset"},{"$ref":"#/components/parameters/orderBy"}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Sequence"}},"total":{"type":"integer"}}}}}},"401":{"$ref":"#/components/responses/Unauthorized"}}}}}}
````

## Create a sequence

> Creates a draft sequence and provisions everything it needs: a backing \*\*source list\*\* (returned as \`listId\`), a default \`startSequence\` step, and a default view.\
> \
> Use this endpoint instead of the generic \`POST /api/sequences\` — the generic verb creates a bare row with no source list, which cannot enroll contacts.\
> \
> The new sequence starts in \`draft\`. Add steps with \`POST /api/sequenceSteps\`, then call \`POST /api/sequences/activate\` to start it.<br>

```json
{"openapi":"3.0.3","info":{"title":"Zero API","version":"1.12.0"},"tags":[{"name":"Sequences","description":"Build and control multi-step outreach sequences (cadences). A sequence is an ordered series of steps — emails, delays, tasks, and LinkedIn actions — that contacts move through automatically.\n\n### Use the action endpoints, not raw CRUD\nCreate, rename, clone, and delete sequences with the dedicated action endpoints below — **not** the generic `POST` / `PATCH` / `DELETE /api/sequences` verbs. Creating a sequence also provisions a backing **source list**, a start step, and a default view; deleting one cascades to its steps, list, and enrollments. The raw verbs skip this scaffolding and leave a sequence that cannot enroll contacts. (`PATCH /api/sequences/{sequenceId}` is still fine for editing settings like the sending mailbox — see that endpoint for the fields to avoid.)\n\n### Lifecycle\nA sequence's `status` moves `draft` → `active` → `paused`. Use `/activate` and `/pause` to transition it — they also move in-flight contacts — rather than patching `status` directly.\n\n### Steps\nSteps are managed with the regular `/api/sequenceSteps` CRUD endpoints. Each step has a `type` (`sendEmail`, `delay`, `addTask`, `sendLinkedinMessage`, `sendLinkedinConnectionRequest`, `startAutomation`, `endSequence`) and an `order`. The `startSequence` step (order `0`) is created for you and should not be removed.\n"}],"servers":[{"url":"https://api.zero.inc","description":"Production server"}],"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","description":"All API requests require a Bearer token in the Authorization header. Create an API key from [Workspace Settings → API keys](https://app.zero.inc/settings/workspace/api)"}},"schemas":{"Sequence":{"type":"object","description":"A multi-step outreach sequence (cadence).","properties":{"id":{"type":"string","format":"uuid"},"workspaceId":{"type":"string","format":"uuid"},"name":{"type":"string","nullable":true},"status":{"type":"string","nullable":true,"enum":["draft","active","paused","archived"],"description":"Lifecycle state. Transition with `/activate` and `/pause` rather than patching this directly.\n"},"listId":{"type":"string","format":"uuid","nullable":true,"description":"The sequence's **source list**. Add this list to a contact's `listIds` to enroll the contact."},"mailboxId":{"type":"string","format":"uuid","nullable":true,"description":"Default sending mailbox for the sequence's email steps."},"linkedinAccountId":{"type":"string","format":"uuid","nullable":true},"sequenceFolderId":{"type":"string","format":"uuid","nullable":true},"icon":{"type":"string","nullable":true},"color":{"type":"string","nullable":true},"order":{"type":"integer","nullable":true},"settings":{"type":"object","description":"Sequence-level settings (JSON)."},"archived":{"type":"boolean"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"},"createdById":{"type":"string","format":"uuid","nullable":true},"updatedById":{"type":"string","format":"uuid","nullable":true}}}},"responses":{"Unauthorized":{"description":"Authentication failed or token is invalid/expired","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}}}},"paths":{"/api/sequences/create":{"post":{"tags":["Sequences"],"summary":"Create a sequence","description":"Creates a draft sequence and provisions everything it needs: a backing **source list** (returned as `listId`), a default `startSequence` step, and a default view.\n\nUse this endpoint instead of the generic `POST /api/sequences` — the generic verb creates a bare row with no source list, which cannot enroll contacts.\n\nThe new sequence starts in `draft`. Add steps with `POST /api/sequenceSteps`, then call `POST /api/sequences/activate` to start it.\n","operationId":"createSequence","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["workspaceId"],"properties":{"workspaceId":{"type":"string","format":"uuid"},"name":{"type":"string","description":"Sequence name. Defaults to \"New Sequence\". Also used as the source list's name."},"sendingWindowTimezone":{"type":"string","description":"IANA timezone for the start step's sending window (e.g. \"America/New_York\"). Invalid values fall back to \"UTC\"."},"order":{"type":"integer","description":"Optional sort order among sequences."}}}}}},"responses":{"200":{"description":"Sequence created","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"data":{"$ref":"#/components/schemas/Sequence"}}}}}},"400":{"description":"No workspace found"},"401":{"$ref":"#/components/responses/Unauthorized"}}}}}}
```

## Get a sequence

> Retrieve a single sequence by ID. If no sequence matches the ID this returns \`200\` with \`data: null\` (not a \`404\`) — the generic CRUD route doesn't 404. The custom action endpoints (\`activate\`, \`pause\`, etc.) are the ones that return \`404\` for a missing sequence.<br>

```json
{"openapi":"3.0.3","info":{"title":"Zero API","version":"1.12.0"},"tags":[{"name":"Sequences","description":"Build and control multi-step outreach sequences (cadences). A sequence is an ordered series of steps — emails, delays, tasks, and LinkedIn actions — that contacts move through automatically.\n\n### Use the action endpoints, not raw CRUD\nCreate, rename, clone, and delete sequences with the dedicated action endpoints below — **not** the generic `POST` / `PATCH` / `DELETE /api/sequences` verbs. Creating a sequence also provisions a backing **source list**, a start step, and a default view; deleting one cascades to its steps, list, and enrollments. The raw verbs skip this scaffolding and leave a sequence that cannot enroll contacts. (`PATCH /api/sequences/{sequenceId}` is still fine for editing settings like the sending mailbox — see that endpoint for the fields to avoid.)\n\n### Lifecycle\nA sequence's `status` moves `draft` → `active` → `paused`. Use `/activate` and `/pause` to transition it — they also move in-flight contacts — rather than patching `status` directly.\n\n### Steps\nSteps are managed with the regular `/api/sequenceSteps` CRUD endpoints. Each step has a `type` (`sendEmail`, `delay`, `addTask`, `sendLinkedinMessage`, `sendLinkedinConnectionRequest`, `startAutomation`, `endSequence`) and an `order`. The `startSequence` step (order `0`) is created for you and should not be removed.\n"}],"servers":[{"url":"https://api.zero.inc","description":"Production server"}],"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","description":"All API requests require a Bearer token in the Authorization header. Create an API key from [Workspace Settings → API keys](https://app.zero.inc/settings/workspace/api)"}},"parameters":{"fields":{"name":"fields","in":"query","description":"Comma-separated list of fields to return. Defaults to all fields.","schema":{"type":"string"}}},"schemas":{"Sequence":{"type":"object","description":"A multi-step outreach sequence (cadence).","properties":{"id":{"type":"string","format":"uuid"},"workspaceId":{"type":"string","format":"uuid"},"name":{"type":"string","nullable":true},"status":{"type":"string","nullable":true,"enum":["draft","active","paused","archived"],"description":"Lifecycle state. Transition with `/activate` and `/pause` rather than patching this directly.\n"},"listId":{"type":"string","format":"uuid","nullable":true,"description":"The sequence's **source list**. Add this list to a contact's `listIds` to enroll the contact."},"mailboxId":{"type":"string","format":"uuid","nullable":true,"description":"Default sending mailbox for the sequence's email steps."},"linkedinAccountId":{"type":"string","format":"uuid","nullable":true},"sequenceFolderId":{"type":"string","format":"uuid","nullable":true},"icon":{"type":"string","nullable":true},"color":{"type":"string","nullable":true},"order":{"type":"integer","nullable":true},"settings":{"type":"object","description":"Sequence-level settings (JSON)."},"archived":{"type":"boolean"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"},"createdById":{"type":"string","format":"uuid","nullable":true},"updatedById":{"type":"string","format":"uuid","nullable":true}}}},"responses":{"Unauthorized":{"description":"Authentication failed or token is invalid/expired","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}}}},"paths":{"/api/sequences/{sequenceId}":{"get":{"tags":["Sequences"],"summary":"Get a sequence","description":"Retrieve a single sequence by ID. If no sequence matches the ID this returns `200` with `data: null` (not a `404`) — the generic CRUD route doesn't 404. The custom action endpoints (`activate`, `pause`, etc.) are the ones that return `404` for a missing sequence.\n","operationId":"getSequence","parameters":[{"name":"sequenceId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"$ref":"#/components/parameters/fields"}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Sequence"}}}}}},"401":{"$ref":"#/components/responses/Unauthorized"}}}}}}
```

## Update a sequence

> Update editable settings on a sequence, such as the default sending \`mailboxId\`, \`linkedinAccountId\`, \`icon\`, \`color\`, or \`settings\`.\
> \
> \> \*\*Do not\*\* change \`name\` or \`status\` here. Use \`POST /api/sequences/rename\` to rename (it keeps the source list name in sync) and \`POST /api/sequences/activate\` / \`POST /api/sequences/pause\` to change status (they also transition in-flight contacts).\
> \
> If no sequence matches the ID this is a no-op and returns \`200\` with an empty result (not a \`404\`).<br>

```json
{"openapi":"3.0.3","info":{"title":"Zero API","version":"1.12.0"},"tags":[{"name":"Sequences","description":"Build and control multi-step outreach sequences (cadences). A sequence is an ordered series of steps — emails, delays, tasks, and LinkedIn actions — that contacts move through automatically.\n\n### Use the action endpoints, not raw CRUD\nCreate, rename, clone, and delete sequences with the dedicated action endpoints below — **not** the generic `POST` / `PATCH` / `DELETE /api/sequences` verbs. Creating a sequence also provisions a backing **source list**, a start step, and a default view; deleting one cascades to its steps, list, and enrollments. The raw verbs skip this scaffolding and leave a sequence that cannot enroll contacts. (`PATCH /api/sequences/{sequenceId}` is still fine for editing settings like the sending mailbox — see that endpoint for the fields to avoid.)\n\n### Lifecycle\nA sequence's `status` moves `draft` → `active` → `paused`. Use `/activate` and `/pause` to transition it — they also move in-flight contacts — rather than patching `status` directly.\n\n### Steps\nSteps are managed with the regular `/api/sequenceSteps` CRUD endpoints. Each step has a `type` (`sendEmail`, `delay`, `addTask`, `sendLinkedinMessage`, `sendLinkedinConnectionRequest`, `startAutomation`, `endSequence`) and an `order`. The `startSequence` step (order `0`) is created for you and should not be removed.\n"}],"servers":[{"url":"https://api.zero.inc","description":"Production server"}],"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","description":"All API requests require a Bearer token in the Authorization header. Create an API key from [Workspace Settings → API keys](https://app.zero.inc/settings/workspace/api)"}},"schemas":{"SequenceUpdate":{"type":"object","description":"Editable sequence settings. To rename use `POST /api/sequences/rename`; to change status use `/activate` or `/pause`.\n","properties":{"mailboxId":{"type":"string","format":"uuid","nullable":true,"description":"Default sending mailbox for email steps."},"linkedinAccountId":{"type":"string","format":"uuid","nullable":true},"sequenceFolderId":{"type":"string","format":"uuid","nullable":true},"icon":{"type":"string"},"color":{"type":"string"},"order":{"type":"integer"},"settings":{"type":"object"}}}},"responses":{"Unauthorized":{"description":"Authentication failed or token is invalid/expired","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}}}},"paths":{"/api/sequences/{sequenceId}":{"patch":{"tags":["Sequences"],"summary":"Update a sequence","description":"Update editable settings on a sequence, such as the default sending `mailboxId`, `linkedinAccountId`, `icon`, `color`, or `settings`.\n\n> **Do not** change `name` or `status` here. Use `POST /api/sequences/rename` to rename (it keeps the source list name in sync) and `POST /api/sequences/activate` / `POST /api/sequences/pause` to change status (they also transition in-flight contacts).\n\nIf no sequence matches the ID this is a no-op and returns `200` with an empty result (not a `404`).\n","operationId":"updateSequence","parameters":[{"name":"sequenceId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SequenceUpdate"}}}},"responses":{"200":{"description":"Sequence updated","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","description":"Partial sequence object containing only the updated fields."},"sideEffects":{"type":"array","items":{}}}}}}},"401":{"$ref":"#/components/responses/Unauthorized"}}}}}}
```

## Activate a sequence

> Sets a \`draft\` or \`paused\` sequence to \`active\` and begins processing enrolled contacts. Resuming from \`paused\` re-arms contacts that were paused mid-flight.\
> \
> Validation runs first: the sequence must have at least one step after the start step, and every \`sendEmail\` step must have a sending mailbox (step-level or the sequence's \`mailboxId\`). If validation fails the endpoint returns \`400\` with a message.<br>

```json
{"openapi":"3.0.3","info":{"title":"Zero API","version":"1.12.0"},"tags":[{"name":"Sequences","description":"Build and control multi-step outreach sequences (cadences). A sequence is an ordered series of steps — emails, delays, tasks, and LinkedIn actions — that contacts move through automatically.\n\n### Use the action endpoints, not raw CRUD\nCreate, rename, clone, and delete sequences with the dedicated action endpoints below — **not** the generic `POST` / `PATCH` / `DELETE /api/sequences` verbs. Creating a sequence also provisions a backing **source list**, a start step, and a default view; deleting one cascades to its steps, list, and enrollments. The raw verbs skip this scaffolding and leave a sequence that cannot enroll contacts. (`PATCH /api/sequences/{sequenceId}` is still fine for editing settings like the sending mailbox — see that endpoint for the fields to avoid.)\n\n### Lifecycle\nA sequence's `status` moves `draft` → `active` → `paused`. Use `/activate` and `/pause` to transition it — they also move in-flight contacts — rather than patching `status` directly.\n\n### Steps\nSteps are managed with the regular `/api/sequenceSteps` CRUD endpoints. Each step has a `type` (`sendEmail`, `delay`, `addTask`, `sendLinkedinMessage`, `sendLinkedinConnectionRequest`, `startAutomation`, `endSequence`) and an `order`. The `startSequence` step (order `0`) is created for you and should not be removed.\n"}],"servers":[{"url":"https://api.zero.inc","description":"Production server"}],"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","description":"All API requests require a Bearer token in the Authorization header. Create an API key from [Workspace Settings → API keys](https://app.zero.inc/settings/workspace/api)"}},"schemas":{"Sequence":{"type":"object","description":"A multi-step outreach sequence (cadence).","properties":{"id":{"type":"string","format":"uuid"},"workspaceId":{"type":"string","format":"uuid"},"name":{"type":"string","nullable":true},"status":{"type":"string","nullable":true,"enum":["draft","active","paused","archived"],"description":"Lifecycle state. Transition with `/activate` and `/pause` rather than patching this directly.\n"},"listId":{"type":"string","format":"uuid","nullable":true,"description":"The sequence's **source list**. Add this list to a contact's `listIds` to enroll the contact."},"mailboxId":{"type":"string","format":"uuid","nullable":true,"description":"Default sending mailbox for the sequence's email steps."},"linkedinAccountId":{"type":"string","format":"uuid","nullable":true},"sequenceFolderId":{"type":"string","format":"uuid","nullable":true},"icon":{"type":"string","nullable":true},"color":{"type":"string","nullable":true},"order":{"type":"integer","nullable":true},"settings":{"type":"object","description":"Sequence-level settings (JSON)."},"archived":{"type":"boolean"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"},"createdById":{"type":"string","format":"uuid","nullable":true},"updatedById":{"type":"string","format":"uuid","nullable":true}}}},"responses":{"Unauthorized":{"description":"Authentication failed or token is invalid/expired","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}},"NotFound":{"description":"The requested resource was not found","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}}}},"paths":{"/api/sequences/activate":{"post":{"tags":["Sequences"],"summary":"Activate a sequence","description":"Sets a `draft` or `paused` sequence to `active` and begins processing enrolled contacts. Resuming from `paused` re-arms contacts that were paused mid-flight.\n\nValidation runs first: the sequence must have at least one step after the start step, and every `sendEmail` step must have a sending mailbox (step-level or the sequence's `mailboxId`). If validation fails the endpoint returns `400` with a message.\n","operationId":"activateSequence","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["sequenceId"],"properties":{"sequenceId":{"type":"string","format":"uuid"}}}}}},"responses":{"200":{"description":"Sequence activated (or already active)","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"data":{"$ref":"#/components/schemas/Sequence"}}}}}},"400":{"description":"Validation failed (no action step, or an email step has no mailbox)"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"}}}}}}
```

## Pause a sequence

> Sets an \`active\` sequence to \`paused\` and snapshots every in-flight contact so it can resume from the same point when the sequence is re-activated. A sequence already in \`draft\` or \`paused\` is returned unchanged.<br>

```json
{"openapi":"3.0.3","info":{"title":"Zero API","version":"1.12.0"},"tags":[{"name":"Sequences","description":"Build and control multi-step outreach sequences (cadences). A sequence is an ordered series of steps — emails, delays, tasks, and LinkedIn actions — that contacts move through automatically.\n\n### Use the action endpoints, not raw CRUD\nCreate, rename, clone, and delete sequences with the dedicated action endpoints below — **not** the generic `POST` / `PATCH` / `DELETE /api/sequences` verbs. Creating a sequence also provisions a backing **source list**, a start step, and a default view; deleting one cascades to its steps, list, and enrollments. The raw verbs skip this scaffolding and leave a sequence that cannot enroll contacts. (`PATCH /api/sequences/{sequenceId}` is still fine for editing settings like the sending mailbox — see that endpoint for the fields to avoid.)\n\n### Lifecycle\nA sequence's `status` moves `draft` → `active` → `paused`. Use `/activate` and `/pause` to transition it — they also move in-flight contacts — rather than patching `status` directly.\n\n### Steps\nSteps are managed with the regular `/api/sequenceSteps` CRUD endpoints. Each step has a `type` (`sendEmail`, `delay`, `addTask`, `sendLinkedinMessage`, `sendLinkedinConnectionRequest`, `startAutomation`, `endSequence`) and an `order`. The `startSequence` step (order `0`) is created for you and should not be removed.\n"}],"servers":[{"url":"https://api.zero.inc","description":"Production server"}],"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","description":"All API requests require a Bearer token in the Authorization header. Create an API key from [Workspace Settings → API keys](https://app.zero.inc/settings/workspace/api)"}},"schemas":{"Sequence":{"type":"object","description":"A multi-step outreach sequence (cadence).","properties":{"id":{"type":"string","format":"uuid"},"workspaceId":{"type":"string","format":"uuid"},"name":{"type":"string","nullable":true},"status":{"type":"string","nullable":true,"enum":["draft","active","paused","archived"],"description":"Lifecycle state. Transition with `/activate` and `/pause` rather than patching this directly.\n"},"listId":{"type":"string","format":"uuid","nullable":true,"description":"The sequence's **source list**. Add this list to a contact's `listIds` to enroll the contact."},"mailboxId":{"type":"string","format":"uuid","nullable":true,"description":"Default sending mailbox for the sequence's email steps."},"linkedinAccountId":{"type":"string","format":"uuid","nullable":true},"sequenceFolderId":{"type":"string","format":"uuid","nullable":true},"icon":{"type":"string","nullable":true},"color":{"type":"string","nullable":true},"order":{"type":"integer","nullable":true},"settings":{"type":"object","description":"Sequence-level settings (JSON)."},"archived":{"type":"boolean"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"},"createdById":{"type":"string","format":"uuid","nullable":true},"updatedById":{"type":"string","format":"uuid","nullable":true}}}},"responses":{"Unauthorized":{"description":"Authentication failed or token is invalid/expired","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}},"NotFound":{"description":"The requested resource was not found","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}}}},"paths":{"/api/sequences/pause":{"post":{"tags":["Sequences"],"summary":"Pause a sequence","description":"Sets an `active` sequence to `paused` and snapshots every in-flight contact so it can resume from the same point when the sequence is re-activated. A sequence already in `draft` or `paused` is returned unchanged.\n","operationId":"pauseSequence","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["sequenceId"],"properties":{"sequenceId":{"type":"string","format":"uuid"}}}}}},"responses":{"200":{"description":"Sequence paused (or already paused/draft)","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"data":{"$ref":"#/components/schemas/Sequence"},"pausedContacts":{"type":"boolean","description":"Present and `true` when in-flight contacts were paused."}}}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"}}}}}}
```

## Rename a sequence

> Renames the sequence and its source list together, keeping them in sync. Prefer this over patching \`name\` directly.

```json
{"openapi":"3.0.3","info":{"title":"Zero API","version":"1.12.0"},"tags":[{"name":"Sequences","description":"Build and control multi-step outreach sequences (cadences). A sequence is an ordered series of steps — emails, delays, tasks, and LinkedIn actions — that contacts move through automatically.\n\n### Use the action endpoints, not raw CRUD\nCreate, rename, clone, and delete sequences with the dedicated action endpoints below — **not** the generic `POST` / `PATCH` / `DELETE /api/sequences` verbs. Creating a sequence also provisions a backing **source list**, a start step, and a default view; deleting one cascades to its steps, list, and enrollments. The raw verbs skip this scaffolding and leave a sequence that cannot enroll contacts. (`PATCH /api/sequences/{sequenceId}` is still fine for editing settings like the sending mailbox — see that endpoint for the fields to avoid.)\n\n### Lifecycle\nA sequence's `status` moves `draft` → `active` → `paused`. Use `/activate` and `/pause` to transition it — they also move in-flight contacts — rather than patching `status` directly.\n\n### Steps\nSteps are managed with the regular `/api/sequenceSteps` CRUD endpoints. Each step has a `type` (`sendEmail`, `delay`, `addTask`, `sendLinkedinMessage`, `sendLinkedinConnectionRequest`, `startAutomation`, `endSequence`) and an `order`. The `startSequence` step (order `0`) is created for you and should not be removed.\n"}],"servers":[{"url":"https://api.zero.inc","description":"Production server"}],"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","description":"All API requests require a Bearer token in the Authorization header. Create an API key from [Workspace Settings → API keys](https://app.zero.inc/settings/workspace/api)"}},"responses":{"Unauthorized":{"description":"Authentication failed or token is invalid/expired","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}},"NotFound":{"description":"The requested resource was not found","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}}}},"paths":{"/api/sequences/rename":{"post":{"tags":["Sequences"],"summary":"Rename a sequence","description":"Renames the sequence and its source list together, keeping them in sync. Prefer this over patching `name` directly.","operationId":"renameSequence","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["sequenceId","name"],"properties":{"sequenceId":{"type":"string","format":"uuid"},"name":{"type":"string"}}}}}},"responses":{"200":{"description":"Sequence renamed","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"}}}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"}}}}}}
```

## Clone a sequence

> Duplicates an existing sequence into a new \`draft\` sequence with a fresh, empty source list. Steps and sequence-scoped email templates are copied (the auto-managed \`aiCompose\` step is regenerated; \`replyToStepId\` references are remapped to the new steps). Enrolled contacts are \*\*not\*\* copied.<br>

```json
{"openapi":"3.0.3","info":{"title":"Zero API","version":"1.12.0"},"tags":[{"name":"Sequences","description":"Build and control multi-step outreach sequences (cadences). A sequence is an ordered series of steps — emails, delays, tasks, and LinkedIn actions — that contacts move through automatically.\n\n### Use the action endpoints, not raw CRUD\nCreate, rename, clone, and delete sequences with the dedicated action endpoints below — **not** the generic `POST` / `PATCH` / `DELETE /api/sequences` verbs. Creating a sequence also provisions a backing **source list**, a start step, and a default view; deleting one cascades to its steps, list, and enrollments. The raw verbs skip this scaffolding and leave a sequence that cannot enroll contacts. (`PATCH /api/sequences/{sequenceId}` is still fine for editing settings like the sending mailbox — see that endpoint for the fields to avoid.)\n\n### Lifecycle\nA sequence's `status` moves `draft` → `active` → `paused`. Use `/activate` and `/pause` to transition it — they also move in-flight contacts — rather than patching `status` directly.\n\n### Steps\nSteps are managed with the regular `/api/sequenceSteps` CRUD endpoints. Each step has a `type` (`sendEmail`, `delay`, `addTask`, `sendLinkedinMessage`, `sendLinkedinConnectionRequest`, `startAutomation`, `endSequence`) and an `order`. The `startSequence` step (order `0`) is created for you and should not be removed.\n"}],"servers":[{"url":"https://api.zero.inc","description":"Production server"}],"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","description":"All API requests require a Bearer token in the Authorization header. Create an API key from [Workspace Settings → API keys](https://app.zero.inc/settings/workspace/api)"}},"schemas":{"Sequence":{"type":"object","description":"A multi-step outreach sequence (cadence).","properties":{"id":{"type":"string","format":"uuid"},"workspaceId":{"type":"string","format":"uuid"},"name":{"type":"string","nullable":true},"status":{"type":"string","nullable":true,"enum":["draft","active","paused","archived"],"description":"Lifecycle state. Transition with `/activate` and `/pause` rather than patching this directly.\n"},"listId":{"type":"string","format":"uuid","nullable":true,"description":"The sequence's **source list**. Add this list to a contact's `listIds` to enroll the contact."},"mailboxId":{"type":"string","format":"uuid","nullable":true,"description":"Default sending mailbox for the sequence's email steps."},"linkedinAccountId":{"type":"string","format":"uuid","nullable":true},"sequenceFolderId":{"type":"string","format":"uuid","nullable":true},"icon":{"type":"string","nullable":true},"color":{"type":"string","nullable":true},"order":{"type":"integer","nullable":true},"settings":{"type":"object","description":"Sequence-level settings (JSON)."},"archived":{"type":"boolean"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"},"createdById":{"type":"string","format":"uuid","nullable":true},"updatedById":{"type":"string","format":"uuid","nullable":true}}}},"responses":{"Unauthorized":{"description":"Authentication failed or token is invalid/expired","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}},"NotFound":{"description":"The requested resource was not found","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}}}},"paths":{"/api/sequences/clone":{"post":{"tags":["Sequences"],"summary":"Clone a sequence","description":"Duplicates an existing sequence into a new `draft` sequence with a fresh, empty source list. Steps and sequence-scoped email templates are copied (the auto-managed `aiCompose` step is regenerated; `replyToStepId` references are remapped to the new steps). Enrolled contacts are **not** copied.\n","operationId":"cloneSequence","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["sourceSequenceId"],"properties":{"sourceSequenceId":{"type":"string","format":"uuid"},"name":{"type":"string","description":"Name for the copy. Defaults to \"<source name> (copy)\"."}}}}}},"responses":{"200":{"description":"Sequence cloned","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"data":{"$ref":"#/components/schemas/Sequence"}}}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"}}}}}}
```

## Delete a sequence

> Permanently deletes a sequence and cascades to its steps, source list and views, email templates, enrollments (\`SequenceContactStatus\` rows), and any scheduled emails. This is not reversible. Use this instead of the generic \`DELETE /api/sequences/{id}\`, which would orphan the related records.<br>

```json
{"openapi":"3.0.3","info":{"title":"Zero API","version":"1.12.0"},"tags":[{"name":"Sequences","description":"Build and control multi-step outreach sequences (cadences). A sequence is an ordered series of steps — emails, delays, tasks, and LinkedIn actions — that contacts move through automatically.\n\n### Use the action endpoints, not raw CRUD\nCreate, rename, clone, and delete sequences with the dedicated action endpoints below — **not** the generic `POST` / `PATCH` / `DELETE /api/sequences` verbs. Creating a sequence also provisions a backing **source list**, a start step, and a default view; deleting one cascades to its steps, list, and enrollments. The raw verbs skip this scaffolding and leave a sequence that cannot enroll contacts. (`PATCH /api/sequences/{sequenceId}` is still fine for editing settings like the sending mailbox — see that endpoint for the fields to avoid.)\n\n### Lifecycle\nA sequence's `status` moves `draft` → `active` → `paused`. Use `/activate` and `/pause` to transition it — they also move in-flight contacts — rather than patching `status` directly.\n\n### Steps\nSteps are managed with the regular `/api/sequenceSteps` CRUD endpoints. Each step has a `type` (`sendEmail`, `delay`, `addTask`, `sendLinkedinMessage`, `sendLinkedinConnectionRequest`, `startAutomation`, `endSequence`) and an `order`. The `startSequence` step (order `0`) is created for you and should not be removed.\n"}],"servers":[{"url":"https://api.zero.inc","description":"Production server"}],"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","description":"All API requests require a Bearer token in the Authorization header. Create an API key from [Workspace Settings → API keys](https://app.zero.inc/settings/workspace/api)"}},"responses":{"Unauthorized":{"description":"Authentication failed or token is invalid/expired","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}},"NotFound":{"description":"The requested resource was not found","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}}}},"paths":{"/api/sequences/delete":{"post":{"tags":["Sequences"],"summary":"Delete a sequence","description":"Permanently deletes a sequence and cascades to its steps, source list and views, email templates, enrollments (`SequenceContactStatus` rows), and any scheduled emails. This is not reversible. Use this instead of the generic `DELETE /api/sequences/{id}`, which would orphan the related records.\n","operationId":"deleteSequence","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["sequenceId"],"properties":{"sequenceId":{"type":"string","format":"uuid"}}}}}},"responses":{"200":{"description":"Sequence deleted","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"}}}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"}}}}}}
```

## List sequence steps

> Returns the steps of a sequence. Filter with \`where\`, e.g. \`{"workspaceId": "\<WORKSPACE\_UUID>", "sequenceId": "\<SEQUENCE\_UUID>"}\`, and order by \`order\`: \`orderBy={"order":"asc"}\`.<br>

````json
{"openapi":"3.0.3","info":{"title":"Zero API","version":"1.12.0"},"tags":[{"name":"Sequences","description":"Build and control multi-step outreach sequences (cadences). A sequence is an ordered series of steps — emails, delays, tasks, and LinkedIn actions — that contacts move through automatically.\n\n### Use the action endpoints, not raw CRUD\nCreate, rename, clone, and delete sequences with the dedicated action endpoints below — **not** the generic `POST` / `PATCH` / `DELETE /api/sequences` verbs. Creating a sequence also provisions a backing **source list**, a start step, and a default view; deleting one cascades to its steps, list, and enrollments. The raw verbs skip this scaffolding and leave a sequence that cannot enroll contacts. (`PATCH /api/sequences/{sequenceId}` is still fine for editing settings like the sending mailbox — see that endpoint for the fields to avoid.)\n\n### Lifecycle\nA sequence's `status` moves `draft` → `active` → `paused`. Use `/activate` and `/pause` to transition it — they also move in-flight contacts — rather than patching `status` directly.\n\n### Steps\nSteps are managed with the regular `/api/sequenceSteps` CRUD endpoints. Each step has a `type` (`sendEmail`, `delay`, `addTask`, `sendLinkedinMessage`, `sendLinkedinConnectionRequest`, `startAutomation`, `endSequence`) and an `order`. The `startSequence` step (order `0`) is created for you and should not be removed.\n"}],"servers":[{"url":"https://api.zero.inc","description":"Production server"}],"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","description":"All API requests require a Bearer token in the Authorization header. Create an API key from [Workspace Settings → API keys](https://app.zero.inc/settings/workspace/api)"}},"parameters":{"fields":{"name":"fields","in":"query","description":"Comma-separated list of fields to return. Defaults to all fields.","schema":{"type":"string"}},"where":{"name":"where","in":"query","description":"JSON-encoded filter object. All top-level conditions are combined with AND logic. Use `$or` for OR logic.\n\nThe available operators depend on the **data type** of the field you are filtering on.\n\n---\n\n## String fields\nFields like `name`, `domain`, `description`, `linkedin`, `source`, `externalId`, `location`.\n\n| Operator | Description | Example |\n|----------|-------------|---------|\n| *(exact)* | Exact match | `{\"name\": \"Linear\"}` |\n| `$eq` | Explicit exact match | `{\"name\": {\"$eq\": \"Linear\"}}` |\n| `$not` | Not equal | `{\"source\": {\"$not\": \"import\"}}` |\n| `$in` | Matches any value in array | `{\"domain\": {\"$in\": [\"linear.app\", \"granola.so\"]}}` |\n| `$notIn` | Matches none of the values | `{\"source\": {\"$notIn\": [\"import\", \"api\"]}}` |\n| `$contains` | Case-insensitive word-boundary substring match | `{\"name\": {\"$contains\": \"YC\"}}` |\n| `$notContains` | Does not contain | `{\"name\": {\"$notContains\": \"Test\"}}` |\n| `$containsAny` | Contains any of the given strings | `{\"name\": {\"$containsAny\": [\"YC\", \"Techstars\"]}}` |\n| `$startsWith` | Starts with prefix | `{\"domain\": {\"$startsWith\": \"app.\"}}` |\n| `$endsWith` | Ends with suffix | `{\"email\": {\"$endsWith\": \"@zero.inc\"}}` |\n| `$exists` | Field is present and truthy | `{\"linkedin\": {\"$exists\": true}}` |\n| `$notExists` | Field is absent, null, or empty | `{\"linkedin\": {\"$notExists\": true}}` |\n\n---\n\n## Number fields\nFields like `value`, `confidence`.\n\n| Operator | Description | Example |\n|----------|-------------|---------|\n| *(exact)* | Exact match | `{\"value\": 5000}` |\n| `$eq` | Explicit exact match | `{\"value\": {\"$eq\": 5000}}` |\n| `$not` | Not equal | `{\"value\": {\"$not\": 0}}` |\n| `$gt` | Greater than | `{\"value\": {\"$gt\": 10000}}` |\n| `$gte` | Greater than or equal | `{\"value\": {\"$gte\": 5000}}` |\n| `$lt` | Less than | `{\"value\": {\"$lt\": 10000}}` |\n| `$lte` | Less than or equal | `{\"value\": {\"$lte\": 50000}}` |\n| `$in` | Matches any value in array | `{\"confidence\": {\"$in\": [0.25, 0.5, 0.75]}}` |\n| `$notIn` | Matches none of the values | `{\"confidence\": {\"$notIn\": [0, 1]}}` |\n| `$exists` | Field is present and truthy | `{\"value\": {\"$exists\": true}}` |\n| `$notExists` | Field is absent, null, or zero | `{\"value\": {\"$notExists\": true}}` |\n\nMultiple operators can be combined on one field:\n```json\n{\"value\": {\"$gte\": 5000, \"$lt\": 10000}}\n```\n\n---\n\n## Date fields\nFields like `closeDate`, `startDate`, `endDate`, `createdAt`, `updatedAt`.\n\nValues can be ISO 8601 strings (`\"2026-01-01\"`, `\"2026-01-01T00:00:00Z\"`) or **relative time macros**.\n\n**Relative time macros:** `+Nd` / `-Nd` (days), `+Nw` / `-Nw` (weeks), `+Nm` / `-Nm` (months), `+Ny` / `-Ny` (years), `+Nh` / `-Nh` (hours), `+Ns` / `-Ns` (seconds), `now()`.\n\n| Operator | Description | Example |\n|----------|-------------|---------|\n| `$gte` | On or after | `{\"closeDate\": {\"$gte\": \"2026-01-01\"}}` |\n| `$lte` | On or before | `{\"closeDate\": {\"$lte\": \"2026-03-31\"}}` |\n| `$gt` | After | `{\"createdAt\": {\"$gt\": \"2026-01-01T00:00:00Z\"}}` |\n| `$lt` | Before | `{\"createdAt\": {\"$lt\": \"now()\"}}` |\n| `$date` | Exact date match (compares date portion only) | `{\"closeDate\": {\"$date\": \"2026-01-15\"}}` |\n| `$exists` | Field is present and truthy | `{\"closeDate\": {\"$exists\": true}}` |\n| `$notExists` | Field is absent or null | `{\"closeDate\": {\"$notExists\": true}}` |\n\nDate range example:\n```json\n{\"closeDate\": {\"$gte\": \"2026-01-01\", \"$lte\": \"2026-03-31\"}}\n```\nRelative date example (closing in next 30 days):\n```json\n{\"closeDate\": {\"$gte\": \"now()\", \"$lte\": \"+30d\"}}\n```\n\n---\n\n## Array fields\nFields like `listIds`, `ownerIds`, `contactIds`.\n\n| Operator | Description | Example |\n|----------|-------------|---------|\n| `$includes` | Array contains the given value (use this — bare exact match is not supported) | `{\"listIds\": {\"$includes\": \"<LIST_UUID>\"}}` |\n| `$notIncludes` | Array does not contain the given value | `{\"ownerIds\": {\"$notIncludes\": \"<USER_UUID>\"}}` |\n| `$overlaps` | Array contains at least one of the given values | `{\"ownerIds\": {\"$overlaps\": [\"<UUID_1>\", \"<UUID_2>\"]}}` |\n| `$notOverlaps` | Array contains none of the given values | `{\"listIds\": {\"$notOverlaps\": [\"<UUID_1>\", \"<UUID_2>\"]}}` |\n| `$all` | Array contains all of the given values | `{\"listIds\": {\"$all\": [\"<UUID_1>\", \"<UUID_2>\"]}}` |\n| `$length` | Filter by array length (supports nested operators) | `{\"contactIds\": {\"$length\": {\"$gte\": 2}}}` |\n| `$exists` | Field is present and non-empty | `{\"ownerIds\": {\"$exists\": true}}` |\n| `$notExists` | Field is absent or empty | `{\"ownerIds\": {\"$notExists\": true}}` |\n\n---\n\n## UUID / ID fields\nFields like `id`, `workspaceId`, `companyId`, `stage`.\n\n| Operator | Description | Example |\n|----------|-------------|---------|\n| *(exact)* | Exact match | `{\"stage\": \"<PIPELINE_STAGE_UUID>\"}` |\n| `$in` | Matches any value in array | `{\"stage\": {\"$in\": [\"<UUID_1>\", \"<UUID_2>\"]}}` |\n| `$notIn` | Matches none of the values | `{\"stage\": {\"$notIn\": [\"<UUID_1>\"]}}` |\n| `$not` | Not equal | `{\"stage\": {\"$not\": \"<UUID>\"}}` |\n\n---\n\n## Boolean fields\nFields like `archived`.\n\n| Operator | Description | Example |\n|----------|-------------|---------|\n| *(exact)* | Exact match | `{\"archived\": false}` |\n| `$not` | Not equal | `{\"archived\": {\"$not\": true}}` |\n\n---\n\n## Logical operators\nThese work across all data types.\n\n`$or` — matches if **any** sub-condition is true:\n```json\n{\n  \"workspaceId\": \"<WORKSPACE_UUID>\",\n  \"$or\": [\n    {\"ownerIds\": {\"$overlaps\": [\"<USER_UUID_1>\", \"<USER_UUID_2>\"]}},\n    {\"closeDate\": {\"$gte\": \"2026-01-01\"}}\n  ]\n}\n```\n\n`$and` — matches if **all** sub-conditions are true (useful when you need multiple conditions on the same field):\n```json\n{\n  \"$and\": [\n    {\"name\": {\"$contains\": \"Enterprise\"}},\n    {\"name\": {\"$notContains\": \"Test\"}}\n  ]\n}\n```\n\n---\n\n## Dot-notation (relation filtering)\nUse dot-syntax to filter records based on properties of related objects:\n```json\n{\"company.name\": \"Linear\"}\n{\"company.domain\": {\"$in\": [\"linear.app\", \"granola.so\"]}}\n{\"company.location.city\": \"San Francisco\"}\n{\"companyProfile.categories\": {\"$overlaps\": [\"Sales\", \"Marketing\"]}}\n```\nAll operators available for the target field's data type can be used with dot-notation.\n\n---\n\n## Custom property filtering\nCustom properties are stored in the `custom` object on records, keyed by UUID. Use `GET /api/columns` to discover the available custom property IDs, types, and options for a workspace.\n\nFilter on custom properties using `custom.<COLUMN_ID>` with operators appropriate for the column's type.\n\n> **Note:** For `select` and `multiselect` columns, option values are UUIDs (the `key` field from the column's `options` array). Use the UUID, not the human-readable name.\n\n```json\n// Text custom property\n{\"custom.54e1ca7d-69c3-4b77-8266-8085b5834116\": {\"$contains\": \"enterprise\"}}\n\n// Select custom property (use the option key UUID)\n{\"custom.a1b2c3d4-e5f6-7890-abcd-ef1234567890\": \"3e839b5c-b311-4887-b2da-727d2d75cdd6\"}\n\n// Multi-select custom property (use option key UUIDs)\n{\"custom.b2c3d4e5-f6a7-8901-bcde-f12345678901\": {\"$overlaps\": [\"a1b1c1d1-e1f1-1111-aaaa-111111111111\", \"b2b2c2d2-e2f2-2222-bbbb-222222222222\"]}}\n\n// Currency/number custom property\n{\"custom.c3d4e5f6-a7b8-9012-cdef-123456789012\": {\"$gte\": 100000}}\n\n// Date custom property\n{\"custom.d4e5f6a7-b8c9-0123-defa-234567890123\": {\"$gte\": \"2026-01-01\"}}\n\n// Boolean custom property\n{\"custom.e5f6a7b8-c9d0-1234-efab-345678901234\": true}\n\n// Check if custom property has a value\n{\"custom.f6a7b8c9-d0e1-2345-fabc-456789012345\": {\"$exists\": true}}\n```\n\n---\n\n## Complex example\nAll top-level keys are ANDed together:\n```json\n{\n  \"name\": {\"$contains\": \"Zero\"},\n  \"location.city\": \"Helsinki\",\n  \"location.country\": {\"$in\": [\"United Kingdom\", \"Germany\", \"Sweden\"]},\n  \"value\": {\"$gte\": 10000},\n  \"closeDate\": {\"$gte\": \"2026-01-01\", \"$lte\": \"2026-03-31\"},\n  \"ownerIds\": {\"$includes\": \"<USER_UUID>\"},\n  \"stage\": {\"$in\": [\"<UUID_1>\", \"<UUID_2>\"]},\n  \"lastActivity\": {\"$exists\": true},\n  \"companyProfile.categories\": {\"$overlaps\": [\"Sales\", \"Marketing\"]},\n  \"custom.54e1ca7d-69c3-4b77-8266-8085b5834116\": {\"$contains\": \"enterprise\"}\n}\n```\n","schema":{"type":"string"}},"limit":{"name":"limit","in":"query","description":"Maximum number of records to return","schema":{"type":"integer","default":100}},"offset":{"name":"offset","in":"query","description":"Pagination offset","schema":{"type":"integer","default":0}},"orderBy":{"name":"orderBy","in":"query","description":"JSON string for sort order","schema":{"type":"string"}}},"schemas":{"SequenceStep":{"type":"object","description":"A single step within a sequence.","properties":{"id":{"type":"string","format":"uuid"},"sequenceId":{"type":"string","format":"uuid"},"workspaceId":{"type":"string","format":"uuid"},"type":{"type":"string","nullable":true,"enum":["startSequence","sendEmail","sendLinkedinMessage","sendLinkedinConnectionRequest","addTask","endSequence","delay","startAutomation","aiCompose"],"description":"Step type. `startSequence` (order 0) and `aiCompose` are managed automatically; the rest are added via `POST /api/sequenceSteps`.\n"},"name":{"type":"string","nullable":true},"subject":{"type":"string","nullable":true,"description":"Email subject line (for `sendEmail` steps)."},"content":{"type":"object","description":"Step body. For `sendEmail` steps this is a Tiptap document."},"settings":{"type":"object","description":"Per-type configuration. For email steps this includes `mailboxId`, `subject`, `content`, `draft`, `stopOnReply`, and an optional `replyToStepId` (threads the email as a reply to an earlier step's send).\n"},"triggerSettings":{"type":"object","description":"Timing configuration. For `delay` steps, `delayMs` is the wait in milliseconds."},"templateId":{"type":"string","format":"uuid","nullable":true},"order":{"type":"integer","nullable":true},"archived":{"type":"boolean"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"},"createdById":{"type":"string","format":"uuid","nullable":true},"updatedById":{"type":"string","format":"uuid","nullable":true}}}},"responses":{"Unauthorized":{"description":"Authentication failed or token is invalid/expired","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}}}},"paths":{"/api/sequenceSteps":{"get":{"tags":["Sequences"],"summary":"List sequence steps","description":"Returns the steps of a sequence. Filter with `where`, e.g. `{\"workspaceId\": \"<WORKSPACE_UUID>\", \"sequenceId\": \"<SEQUENCE_UUID>\"}`, and order by `order`: `orderBy={\"order\":\"asc\"}`.\n","operationId":"listSequenceSteps","parameters":[{"$ref":"#/components/parameters/fields"},{"$ref":"#/components/parameters/where"},{"$ref":"#/components/parameters/limit"},{"$ref":"#/components/parameters/offset"},{"$ref":"#/components/parameters/orderBy"}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/SequenceStep"}},"total":{"type":"integer"}}}}}},"401":{"$ref":"#/components/responses/Unauthorized"}}}}}}
````

## Add a step

> Adds a step to a sequence. Set \`type\` to one of \`sendEmail\`, \`delay\`, \`addTask\`, \`sendLinkedinMessage\`, \`sendLinkedinConnectionRequest\`, \`startAutomation\`, or \`endSequence\`, and \`order\` to position it after the start step (which is \`order\` 0).\
> \
> Per-step configuration lives in the freeform \`settings\` and \`triggerSettings\` objects, and \*\*the fields differ by \`type\`\*\*. The reference below lists the commonly-used fields for each type.\
> \
> \*\*Applies to every type:\*\*\
> \
> \- \`settings.backgroundPhases\` is managed by the server — don't set it; whatever you send is overwritten.\
> \- Text fields on email, LinkedIn, and task steps support macros such as \`{{contact.firstName}}\`, \`{{contact.email}}\`, \`{{contact.company.name}}\`, and \`{{mailbox.name}}\`.\
> \- You don't create the \`startSequence\` step (order 0) — it ships with the sequence, but you can \`PATCH\` it to tune scheduling (see below). Never create an \`aiCompose\` step; it is auto-managed — enable AI instead by setting \`settings.ai.enabled = true\` on a send step.\
> \
> \### \`sendEmail\`\
> \
> \| Field | Type | Notes |\
> \| --- | --- | --- |\
> \| \`settings.mailboxId\` | uuid | Sending mailbox. Falls back to the sequence's \`mailboxId\`; one of the two is required to activate. |\
> \| \`settings.subject\` | string | Subject line (macros supported). |\
> \| \`settings.content\` | Tiptap doc | Email body (macros supported). |\
> \| \`settings.draft\` | boolean | \`true\` creates a draft for a user to send manually; \`false\` (or omitted) sends automatically. |\
> \| \`settings.replyToStepId\` | uuid | Send as a reply within an earlier \`sendEmail\` step's thread. Must reference an earlier email step in the same sequence. |\
> \| \`settings.stopOnReply\` | boolean | End the sequence for a contact who replies. |\
> \| \`settings.ai\` | object | Set \`{"enabled": true, "mode": "full"}\` to AI-compose the email (this adds the auto-managed \`aiCompose\` step). |\
> \
> The recipient is always the contact's email, and \`from\` defaults to the mailbox identity.\
> \
> \`\`\`json\
> {\
> &#x20; "settings": {\
> &#x20;   "mailboxId": "\<MAILBOX\_UUID>",\
> &#x20;   "subject": "Quick question, {{contact.firstName}}",\
> &#x20;   "content": {"type": "doc", "content": \[{"type": "paragraph", "content": \[{"type": "text", "text": "Hi {{contact.firstName}}, wanted to reach out."}]}]},\
> &#x20;   "draft": false\
> &#x20; }\
> }\
> \`\`\`\
> \
> \### \`delay\`\
> \
> Waits before the next step runs. Configured via \`triggerSettings\`, not \`settings\`.\
> \
> \| Field | Type | Notes |\
> \| --- | --- | --- |\
> \| \`triggerSettings.delayMs\` | number | Wait, in milliseconds. Defaults to \`86400000\` (24h) if omitted. |\
> \
> \`\`\`json\
> { "triggerSettings": { "delayMs": 172800000 } }\
> \`\`\`\
> \
> \### \`addTask\`\
> \
> \| Field | Type | Notes |\
> \| --- | --- | --- |\
> \| \`settings.title\` | string | Task title (macros supported). |\
> \| \`settings.description\` | Tiptap doc / string | Task body. |\
> \| \`settings.taskType\` | string | e.g. \`call\`, \`todo\`, \`meeting\`, \`follow\_up\`. |\
> \| \`settings.priority\` | integer | \`1\` Low to \`4\` Urgent. |\
> \| \`settings.assignedToIds\` | uuid\[] | Assignee user ids. Defaults to the sequence creator. |\
> \| \`settings.continueMode\` | string | When the sequence advances: \`immediate\`, \`done\` (default), or \`deadline\`. |\
> \| \`settings.deadlineDays\` | number | Days after creation for the deadline. |\
> \| \`settings.deadlineTime\` | string | \`HH:MM\` for the deadline (default \`09:00\`). |\
> \| \`settings.deadlineTimezone\` | string | IANA timezone for the deadline. |\
> \
> \`\`\`json\
> {\
> &#x20; "settings": {\
> &#x20;   "title": "Call {{contact.firstName}}",\
> &#x20;   "taskType": "call",\
> &#x20;   "priority": 3,\
> &#x20;   "continueMode": "done",\
> &#x20;   "deadlineDays": 2\
> &#x20; }\
> }\
> \`\`\`\
> \
> \### \`sendLinkedinMessage\` and \`sendLinkedinConnectionRequest\`\
> \
> \| Field | Type | Notes |\
> \| --- | --- | --- |\
> \| \`settings.userId\` | uuid | \*\*Required.\*\* The workspace user whose connected LinkedIn account sends. |\
> \| \`settings.content\` | Tiptap doc | Message body / connection note (macros supported). Connection notes are truncated to 300 characters. |\
> \| \`settings.skipIfNoLinkedinData\` | boolean | Both types — skip the contact (instead of erroring) when they don't have a complete LinkedIn profile. |\
> \| \`settings.skipIfNotConnected\` | boolean | Messages only — skip contacts who aren't 1st-degree connections instead of erroring. |\
> \| \`settings.stopIfNotAccepted\` | boolean | Connection requests only — end the sequence if the request isn't accepted within \`settings.stopIfNotAcceptedDays\` days. Requires \`stopIfNotAcceptedDays\` to be set. |\
> \| \`settings.stopIfNotAcceptedDays\` | number | Connection requests only — days to wait before ending the sequence when \`stopIfNotAccepted\` is on. \`0\` or omitted means no timeout is scheduled (the sequence won't end on non-acceptance). |\
> \
> \`\`\`json\
> {\
> &#x20; "settings": {\
> &#x20;   "userId": "\<WORKSPACE\_USER\_UUID>",\
> &#x20;   "content": {"type": "doc", "content": \[{"type": "paragraph", "content": \[{"type": "text", "text": "Hi {{contact.firstName}}!"}]}]}\
> &#x20; }\
> }\
> \`\`\`\
> \
> \### \`startAutomation\`\
> \
> \| Field | Type | Notes |\
> \| --- | --- | --- |\
> \| \`settings.automationId\` | uuid | \*\*Required.\*\* The manual-trigger automation to run for the contact. |\
> \
> \### \`endSequence\`\
> \
> Takes no settings — it marks the contact complete.\
> \
> \### \`startSequence\` (PATCH only)\
> \
> Created with the sequence; \`PATCH /api/sequenceSteps/{stepId}\` to adjust enrollment and scheduling.\
> \
> \| Field | Type | Notes |\
> \| --- | --- | --- |\
> \| \`settings.rollMode\` | string | \`auto\` (default) enrolls contacts automatically; \`manual\` holds new enrollments in \`waitingForApproval\` until approved in the app. |\
> \| \`settings.dailyStarts\` | number | Max contacts that may start the sequence per day. |\
> \| \`settings.activeDays\` | string\[] | Days sends are allowed, e.g. \`\["mon", "tue", "wed", "thu", "fri"]\`. |\
> \| \`settings.sendingWindow\` | object | \`{"start": "09:00", "end": "17:00", "timezone": "\<IANA>"}\`. |\
> \| \`settings.staggerMinutes\` | number | Minimum minutes between auto-sent emails. |<br>

````json
{"openapi":"3.0.3","info":{"title":"Zero API","version":"1.12.0"},"tags":[{"name":"Sequences","description":"Build and control multi-step outreach sequences (cadences). A sequence is an ordered series of steps — emails, delays, tasks, and LinkedIn actions — that contacts move through automatically.\n\n### Use the action endpoints, not raw CRUD\nCreate, rename, clone, and delete sequences with the dedicated action endpoints below — **not** the generic `POST` / `PATCH` / `DELETE /api/sequences` verbs. Creating a sequence also provisions a backing **source list**, a start step, and a default view; deleting one cascades to its steps, list, and enrollments. The raw verbs skip this scaffolding and leave a sequence that cannot enroll contacts. (`PATCH /api/sequences/{sequenceId}` is still fine for editing settings like the sending mailbox — see that endpoint for the fields to avoid.)\n\n### Lifecycle\nA sequence's `status` moves `draft` → `active` → `paused`. Use `/activate` and `/pause` to transition it — they also move in-flight contacts — rather than patching `status` directly.\n\n### Steps\nSteps are managed with the regular `/api/sequenceSteps` CRUD endpoints. Each step has a `type` (`sendEmail`, `delay`, `addTask`, `sendLinkedinMessage`, `sendLinkedinConnectionRequest`, `startAutomation`, `endSequence`) and an `order`. The `startSequence` step (order `0`) is created for you and should not be removed.\n"}],"servers":[{"url":"https://api.zero.inc","description":"Production server"}],"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","description":"All API requests require a Bearer token in the Authorization header. Create an API key from [Workspace Settings → API keys](https://app.zero.inc/settings/workspace/api)"}},"schemas":{"SequenceStepCreate":{"type":"object","required":["workspaceId","sequenceId","type"],"properties":{"workspaceId":{"type":"string","format":"uuid"},"sequenceId":{"type":"string","format":"uuid"},"type":{"type":"string","enum":["sendEmail","sendLinkedinMessage","sendLinkedinConnectionRequest","addTask","endSequence","delay","startAutomation"]},"name":{"type":"string"},"subject":{"type":"string","description":"Email subject (for `sendEmail` steps)."},"content":{"type":"object","description":"Step body — a Tiptap document for `sendEmail` steps."},"settings":{"type":"object","description":"Per-type configuration. The fields depend on `type` — see the endpoint description for the full per-type reference (e.g. `mailboxId`/`subject`/`content` for `sendEmail`, `userId` for LinkedIn steps, `automationId` for `startAutomation`)."},"triggerSettings":{"type":"object","description":"Timing configuration. Used by `delay` steps (`delayMs`); most other types leave this empty. See the endpoint description."},"templateId":{"type":"string","format":"uuid"},"order":{"type":"integer","description":"Position after the start step (which is order 0)."}}},"SequenceStep":{"type":"object","description":"A single step within a sequence.","properties":{"id":{"type":"string","format":"uuid"},"sequenceId":{"type":"string","format":"uuid"},"workspaceId":{"type":"string","format":"uuid"},"type":{"type":"string","nullable":true,"enum":["startSequence","sendEmail","sendLinkedinMessage","sendLinkedinConnectionRequest","addTask","endSequence","delay","startAutomation","aiCompose"],"description":"Step type. `startSequence` (order 0) and `aiCompose` are managed automatically; the rest are added via `POST /api/sequenceSteps`.\n"},"name":{"type":"string","nullable":true},"subject":{"type":"string","nullable":true,"description":"Email subject line (for `sendEmail` steps)."},"content":{"type":"object","description":"Step body. For `sendEmail` steps this is a Tiptap document."},"settings":{"type":"object","description":"Per-type configuration. For email steps this includes `mailboxId`, `subject`, `content`, `draft`, `stopOnReply`, and an optional `replyToStepId` (threads the email as a reply to an earlier step's send).\n"},"triggerSettings":{"type":"object","description":"Timing configuration. For `delay` steps, `delayMs` is the wait in milliseconds."},"templateId":{"type":"string","format":"uuid","nullable":true},"order":{"type":"integer","nullable":true},"archived":{"type":"boolean"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"},"createdById":{"type":"string","format":"uuid","nullable":true},"updatedById":{"type":"string","format":"uuid","nullable":true}}}},"responses":{"Unauthorized":{"description":"Authentication failed or token is invalid/expired","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}}}},"paths":{"/api/sequenceSteps":{"post":{"tags":["Sequences"],"summary":"Add a step","description":"Adds a step to a sequence. Set `type` to one of `sendEmail`, `delay`, `addTask`, `sendLinkedinMessage`, `sendLinkedinConnectionRequest`, `startAutomation`, or `endSequence`, and `order` to position it after the start step (which is `order` 0).\n\nPer-step configuration lives in the freeform `settings` and `triggerSettings` objects, and **the fields differ by `type`**. The reference below lists the commonly-used fields for each type.\n\n**Applies to every type:**\n\n- `settings.backgroundPhases` is managed by the server — don't set it; whatever you send is overwritten.\n- Text fields on email, LinkedIn, and task steps support macros such as `{{contact.firstName}}`, `{{contact.email}}`, `{{contact.company.name}}`, and `{{mailbox.name}}`.\n- You don't create the `startSequence` step (order 0) — it ships with the sequence, but you can `PATCH` it to tune scheduling (see below). Never create an `aiCompose` step; it is auto-managed — enable AI instead by setting `settings.ai.enabled = true` on a send step.\n\n### `sendEmail`\n\n| Field | Type | Notes |\n| --- | --- | --- |\n| `settings.mailboxId` | uuid | Sending mailbox. Falls back to the sequence's `mailboxId`; one of the two is required to activate. |\n| `settings.subject` | string | Subject line (macros supported). |\n| `settings.content` | Tiptap doc | Email body (macros supported). |\n| `settings.draft` | boolean | `true` creates a draft for a user to send manually; `false` (or omitted) sends automatically. |\n| `settings.replyToStepId` | uuid | Send as a reply within an earlier `sendEmail` step's thread. Must reference an earlier email step in the same sequence. |\n| `settings.stopOnReply` | boolean | End the sequence for a contact who replies. |\n| `settings.ai` | object | Set `{\"enabled\": true, \"mode\": \"full\"}` to AI-compose the email (this adds the auto-managed `aiCompose` step). |\n\nThe recipient is always the contact's email, and `from` defaults to the mailbox identity.\n\n```json\n{\n  \"settings\": {\n    \"mailboxId\": \"<MAILBOX_UUID>\",\n    \"subject\": \"Quick question, {{contact.firstName}}\",\n    \"content\": {\"type\": \"doc\", \"content\": [{\"type\": \"paragraph\", \"content\": [{\"type\": \"text\", \"text\": \"Hi {{contact.firstName}}, wanted to reach out.\"}]}]},\n    \"draft\": false\n  }\n}\n```\n\n### `delay`\n\nWaits before the next step runs. Configured via `triggerSettings`, not `settings`.\n\n| Field | Type | Notes |\n| --- | --- | --- |\n| `triggerSettings.delayMs` | number | Wait, in milliseconds. Defaults to `86400000` (24h) if omitted. |\n\n```json\n{ \"triggerSettings\": { \"delayMs\": 172800000 } }\n```\n\n### `addTask`\n\n| Field | Type | Notes |\n| --- | --- | --- |\n| `settings.title` | string | Task title (macros supported). |\n| `settings.description` | Tiptap doc / string | Task body. |\n| `settings.taskType` | string | e.g. `call`, `todo`, `meeting`, `follow_up`. |\n| `settings.priority` | integer | `1` Low to `4` Urgent. |\n| `settings.assignedToIds` | uuid[] | Assignee user ids. Defaults to the sequence creator. |\n| `settings.continueMode` | string | When the sequence advances: `immediate`, `done` (default), or `deadline`. |\n| `settings.deadlineDays` | number | Days after creation for the deadline. |\n| `settings.deadlineTime` | string | `HH:MM` for the deadline (default `09:00`). |\n| `settings.deadlineTimezone` | string | IANA timezone for the deadline. |\n\n```json\n{\n  \"settings\": {\n    \"title\": \"Call {{contact.firstName}}\",\n    \"taskType\": \"call\",\n    \"priority\": 3,\n    \"continueMode\": \"done\",\n    \"deadlineDays\": 2\n  }\n}\n```\n\n### `sendLinkedinMessage` and `sendLinkedinConnectionRequest`\n\n| Field | Type | Notes |\n| --- | --- | --- |\n| `settings.userId` | uuid | **Required.** The workspace user whose connected LinkedIn account sends. |\n| `settings.content` | Tiptap doc | Message body / connection note (macros supported). Connection notes are truncated to 300 characters. |\n| `settings.skipIfNoLinkedinData` | boolean | Both types — skip the contact (instead of erroring) when they don't have a complete LinkedIn profile. |\n| `settings.skipIfNotConnected` | boolean | Messages only — skip contacts who aren't 1st-degree connections instead of erroring. |\n| `settings.stopIfNotAccepted` | boolean | Connection requests only — end the sequence if the request isn't accepted within `settings.stopIfNotAcceptedDays` days. Requires `stopIfNotAcceptedDays` to be set. |\n| `settings.stopIfNotAcceptedDays` | number | Connection requests only — days to wait before ending the sequence when `stopIfNotAccepted` is on. `0` or omitted means no timeout is scheduled (the sequence won't end on non-acceptance). |\n\n```json\n{\n  \"settings\": {\n    \"userId\": \"<WORKSPACE_USER_UUID>\",\n    \"content\": {\"type\": \"doc\", \"content\": [{\"type\": \"paragraph\", \"content\": [{\"type\": \"text\", \"text\": \"Hi {{contact.firstName}}!\"}]}]}\n  }\n}\n```\n\n### `startAutomation`\n\n| Field | Type | Notes |\n| --- | --- | --- |\n| `settings.automationId` | uuid | **Required.** The manual-trigger automation to run for the contact. |\n\n### `endSequence`\n\nTakes no settings — it marks the contact complete.\n\n### `startSequence` (PATCH only)\n\nCreated with the sequence; `PATCH /api/sequenceSteps/{stepId}` to adjust enrollment and scheduling.\n\n| Field | Type | Notes |\n| --- | --- | --- |\n| `settings.rollMode` | string | `auto` (default) enrolls contacts automatically; `manual` holds new enrollments in `waitingForApproval` until approved in the app. |\n| `settings.dailyStarts` | number | Max contacts that may start the sequence per day. |\n| `settings.activeDays` | string[] | Days sends are allowed, e.g. `[\"mon\", \"tue\", \"wed\", \"thu\", \"fri\"]`. |\n| `settings.sendingWindow` | object | `{\"start\": \"09:00\", \"end\": \"17:00\", \"timezone\": \"<IANA>\"}`. |\n| `settings.staggerMinutes` | number | Minimum minutes between auto-sent emails. |\n","operationId":"createSequenceStep","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SequenceStepCreate"}}}},"responses":{"200":{"description":"Step created","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/SequenceStep"},"sideEffects":{"type":"array","items":{}}}}}}},"401":{"$ref":"#/components/responses/Unauthorized"}}}}}}
````

## Batch update steps

> Updates multiple steps in one request — typically to reorder them. The body is an object keyed by step ID, where each value is the partial update for that step.<br>

```json
{"openapi":"3.0.3","info":{"title":"Zero API","version":"1.12.0"},"tags":[{"name":"Sequences","description":"Build and control multi-step outreach sequences (cadences). A sequence is an ordered series of steps — emails, delays, tasks, and LinkedIn actions — that contacts move through automatically.\n\n### Use the action endpoints, not raw CRUD\nCreate, rename, clone, and delete sequences with the dedicated action endpoints below — **not** the generic `POST` / `PATCH` / `DELETE /api/sequences` verbs. Creating a sequence also provisions a backing **source list**, a start step, and a default view; deleting one cascades to its steps, list, and enrollments. The raw verbs skip this scaffolding and leave a sequence that cannot enroll contacts. (`PATCH /api/sequences/{sequenceId}` is still fine for editing settings like the sending mailbox — see that endpoint for the fields to avoid.)\n\n### Lifecycle\nA sequence's `status` moves `draft` → `active` → `paused`. Use `/activate` and `/pause` to transition it — they also move in-flight contacts — rather than patching `status` directly.\n\n### Steps\nSteps are managed with the regular `/api/sequenceSteps` CRUD endpoints. Each step has a `type` (`sendEmail`, `delay`, `addTask`, `sendLinkedinMessage`, `sendLinkedinConnectionRequest`, `startAutomation`, `endSequence`) and an `order`. The `startSequence` step (order `0`) is created for you and should not be removed.\n"}],"servers":[{"url":"https://api.zero.inc","description":"Production server"}],"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","description":"All API requests require a Bearer token in the Authorization header. Create an API key from [Workspace Settings → API keys](https://app.zero.inc/settings/workspace/api)"}},"schemas":{"SequenceStepUpdate":{"type":"object","properties":{"type":{"type":"string","enum":["sendEmail","sendLinkedinMessage","sendLinkedinConnectionRequest","addTask","endSequence","delay","startAutomation"],"description":"Changing a step's type is allowed but uncommon. The auto-managed `startSequence` and `aiCompose` types are intentionally excluded (matching `SequenceStepCreate`).\n"},"name":{"type":"string"},"subject":{"type":"string"},"content":{"type":"object"},"settings":{"type":"object"},"triggerSettings":{"type":"object"},"templateId":{"type":"string","format":"uuid"},"order":{"type":"integer"}}},"SequenceStep":{"type":"object","description":"A single step within a sequence.","properties":{"id":{"type":"string","format":"uuid"},"sequenceId":{"type":"string","format":"uuid"},"workspaceId":{"type":"string","format":"uuid"},"type":{"type":"string","nullable":true,"enum":["startSequence","sendEmail","sendLinkedinMessage","sendLinkedinConnectionRequest","addTask","endSequence","delay","startAutomation","aiCompose"],"description":"Step type. `startSequence` (order 0) and `aiCompose` are managed automatically; the rest are added via `POST /api/sequenceSteps`.\n"},"name":{"type":"string","nullable":true},"subject":{"type":"string","nullable":true,"description":"Email subject line (for `sendEmail` steps)."},"content":{"type":"object","description":"Step body. For `sendEmail` steps this is a Tiptap document."},"settings":{"type":"object","description":"Per-type configuration. For email steps this includes `mailboxId`, `subject`, `content`, `draft`, `stopOnReply`, and an optional `replyToStepId` (threads the email as a reply to an earlier step's send).\n"},"triggerSettings":{"type":"object","description":"Timing configuration. For `delay` steps, `delayMs` is the wait in milliseconds."},"templateId":{"type":"string","format":"uuid","nullable":true},"order":{"type":"integer","nullable":true},"archived":{"type":"boolean"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"},"createdById":{"type":"string","format":"uuid","nullable":true},"updatedById":{"type":"string","format":"uuid","nullable":true}}}},"responses":{"Unauthorized":{"description":"Authentication failed or token is invalid/expired","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}}}},"paths":{"/api/sequenceSteps":{"patch":{"tags":["Sequences"],"summary":"Batch update steps","description":"Updates multiple steps in one request — typically to reorder them. The body is an object keyed by step ID, where each value is the partial update for that step.\n","operationId":"batchUpdateSequenceSteps","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":{"$ref":"#/components/schemas/SequenceStepUpdate"}}}}},"responses":{"200":{"description":"Steps updated","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/SequenceStep"}},"sideEffects":{"type":"array","items":{}}}}}}},"401":{"$ref":"#/components/responses/Unauthorized"}}}}}}
```

## Delete a step

> Delete a sequence step. Use \`archive=true\` for a recoverable soft delete. The \`startSequence\` step should not be deleted.

```json
{"openapi":"3.0.3","info":{"title":"Zero API","version":"1.12.0"},"tags":[{"name":"Sequences","description":"Build and control multi-step outreach sequences (cadences). A sequence is an ordered series of steps — emails, delays, tasks, and LinkedIn actions — that contacts move through automatically.\n\n### Use the action endpoints, not raw CRUD\nCreate, rename, clone, and delete sequences with the dedicated action endpoints below — **not** the generic `POST` / `PATCH` / `DELETE /api/sequences` verbs. Creating a sequence also provisions a backing **source list**, a start step, and a default view; deleting one cascades to its steps, list, and enrollments. The raw verbs skip this scaffolding and leave a sequence that cannot enroll contacts. (`PATCH /api/sequences/{sequenceId}` is still fine for editing settings like the sending mailbox — see that endpoint for the fields to avoid.)\n\n### Lifecycle\nA sequence's `status` moves `draft` → `active` → `paused`. Use `/activate` and `/pause` to transition it — they also move in-flight contacts — rather than patching `status` directly.\n\n### Steps\nSteps are managed with the regular `/api/sequenceSteps` CRUD endpoints. Each step has a `type` (`sendEmail`, `delay`, `addTask`, `sendLinkedinMessage`, `sendLinkedinConnectionRequest`, `startAutomation`, `endSequence`) and an `order`. The `startSequence` step (order `0`) is created for you and should not be removed.\n"}],"servers":[{"url":"https://api.zero.inc","description":"Production server"}],"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","description":"All API requests require a Bearer token in the Authorization header. Create an API key from [Workspace Settings → API keys](https://app.zero.inc/settings/workspace/api)"}},"schemas":{"SequenceStep":{"type":"object","description":"A single step within a sequence.","properties":{"id":{"type":"string","format":"uuid"},"sequenceId":{"type":"string","format":"uuid"},"workspaceId":{"type":"string","format":"uuid"},"type":{"type":"string","nullable":true,"enum":["startSequence","sendEmail","sendLinkedinMessage","sendLinkedinConnectionRequest","addTask","endSequence","delay","startAutomation","aiCompose"],"description":"Step type. `startSequence` (order 0) and `aiCompose` are managed automatically; the rest are added via `POST /api/sequenceSteps`.\n"},"name":{"type":"string","nullable":true},"subject":{"type":"string","nullable":true,"description":"Email subject line (for `sendEmail` steps)."},"content":{"type":"object","description":"Step body. For `sendEmail` steps this is a Tiptap document."},"settings":{"type":"object","description":"Per-type configuration. For email steps this includes `mailboxId`, `subject`, `content`, `draft`, `stopOnReply`, and an optional `replyToStepId` (threads the email as a reply to an earlier step's send).\n"},"triggerSettings":{"type":"object","description":"Timing configuration. For `delay` steps, `delayMs` is the wait in milliseconds."},"templateId":{"type":"string","format":"uuid","nullable":true},"order":{"type":"integer","nullable":true},"archived":{"type":"boolean"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"},"createdById":{"type":"string","format":"uuid","nullable":true},"updatedById":{"type":"string","format":"uuid","nullable":true}}}},"responses":{"Unauthorized":{"description":"Authentication failed or token is invalid/expired","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}}}},"paths":{"/api/sequenceSteps/{stepId}":{"delete":{"tags":["Sequences"],"summary":"Delete a step","description":"Delete a sequence step. Use `archive=true` for a recoverable soft delete. The `startSequence` step should not be deleted.","operationId":"deleteSequenceStep","parameters":[{"name":"stepId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"archive","in":"query","description":"If true, soft deletes (archives) the step instead of permanently deleting it.","schema":{"type":"boolean","default":false}}],"responses":{"200":{"description":"Step deleted","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"description":"Hard delete (`archive` omitted or `false`): returns `1` on success.\nSoft delete (`archive=true`): returns a single-element array containing the archived step object.\n","oneOf":[{"type":"integer"},{"type":"array","items":{"$ref":"#/components/schemas/SequenceStep"}}]},"sideEffects":{"type":"array","items":{}}}}}}},"401":{"$ref":"#/components/responses/Unauthorized"}}}}}}
```

## Update a step

> Update a single sequence step.

```json
{"openapi":"3.0.3","info":{"title":"Zero API","version":"1.12.0"},"tags":[{"name":"Sequences","description":"Build and control multi-step outreach sequences (cadences). A sequence is an ordered series of steps — emails, delays, tasks, and LinkedIn actions — that contacts move through automatically.\n\n### Use the action endpoints, not raw CRUD\nCreate, rename, clone, and delete sequences with the dedicated action endpoints below — **not** the generic `POST` / `PATCH` / `DELETE /api/sequences` verbs. Creating a sequence also provisions a backing **source list**, a start step, and a default view; deleting one cascades to its steps, list, and enrollments. The raw verbs skip this scaffolding and leave a sequence that cannot enroll contacts. (`PATCH /api/sequences/{sequenceId}` is still fine for editing settings like the sending mailbox — see that endpoint for the fields to avoid.)\n\n### Lifecycle\nA sequence's `status` moves `draft` → `active` → `paused`. Use `/activate` and `/pause` to transition it — they also move in-flight contacts — rather than patching `status` directly.\n\n### Steps\nSteps are managed with the regular `/api/sequenceSteps` CRUD endpoints. Each step has a `type` (`sendEmail`, `delay`, `addTask`, `sendLinkedinMessage`, `sendLinkedinConnectionRequest`, `startAutomation`, `endSequence`) and an `order`. The `startSequence` step (order `0`) is created for you and should not be removed.\n"}],"servers":[{"url":"https://api.zero.inc","description":"Production server"}],"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","description":"All API requests require a Bearer token in the Authorization header. Create an API key from [Workspace Settings → API keys](https://app.zero.inc/settings/workspace/api)"}},"schemas":{"SequenceStepUpdate":{"type":"object","properties":{"type":{"type":"string","enum":["sendEmail","sendLinkedinMessage","sendLinkedinConnectionRequest","addTask","endSequence","delay","startAutomation"],"description":"Changing a step's type is allowed but uncommon. The auto-managed `startSequence` and `aiCompose` types are intentionally excluded (matching `SequenceStepCreate`).\n"},"name":{"type":"string"},"subject":{"type":"string"},"content":{"type":"object"},"settings":{"type":"object"},"triggerSettings":{"type":"object"},"templateId":{"type":"string","format":"uuid"},"order":{"type":"integer"}}}},"responses":{"Unauthorized":{"description":"Authentication failed or token is invalid/expired","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}}}},"paths":{"/api/sequenceSteps/{stepId}":{"patch":{"tags":["Sequences"],"summary":"Update a step","description":"Update a single sequence step.","operationId":"updateSequenceStep","parameters":[{"name":"stepId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SequenceStepUpdate"}}}},"responses":{"200":{"description":"Step updated","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","description":"Partial step object containing only the updated fields."},"sideEffects":{"type":"array","items":{}}}}}}},"401":{"$ref":"#/components/responses/Unauthorized"}}}}}}
```


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://docs.zero.inc/features/api/sequences.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
