> 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/models.md).

# Models

## The Company object

```json
{"openapi":"3.0.3","info":{"title":"Zero API","version":"1.12.0"},"components":{"schemas":{"Company":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"workspaceId":{"type":"string","format":"uuid"},"name":{"type":"string"},"domain":{"type":"string"},"logo":{"type":"string","format":"uri"},"description":{"type":"string"},"linkedin":{"type":"string"},"listIds":{"type":"array","items":{"type":"string","format":"uuid"}},"ownerIds":{"type":"array","items":{"type":"string","format":"uuid"}},"location":{"type":"object","description":"Geographic location of the company. Stored as a structured object, not a plain string.\n","properties":{"city":{"type":"string"},"state":{"type":"string"},"country":{"type":"string"},"continent":{"type":"string"},"countryCode":{"type":"string"},"stateCode":{"type":"string"},"coordinates":{"type":"object","properties":{"lat":{"type":"number"},"lng":{"type":"number"}}}}},"parentCompanyId":{"type":"string","format":"uuid","nullable":true,"description":"ID of the parent company, for hierarchical company structures."},"custom":{"type":"object","description":"Custom property values, keyed by column UUID. Use `GET /api/columns` to discover available custom property IDs and types. When updating via PATCH, always use dot-notation (e.g. `\"custom.<COLUMN_ID>\": \"value\"`) to avoid overwriting other custom properties.\n"},"externalId":{"type":"string","description":"ID from external system for integrations"},"source":{"type":"string"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"},"archived":{"type":"boolean"},"createdById":{"type":"string","format":"uuid"}}}}}}
```

## The CompanyCreate object

```json
{"openapi":"3.0.3","info":{"title":"Zero API","version":"1.12.0"},"components":{"schemas":{"CompanyCreate":{"type":"object","required":["workspaceId"],"properties":{"workspaceId":{"type":"string","format":"uuid"},"name":{"type":"string"},"domain":{"type":"string"},"logo":{"type":"string","format":"uri"},"description":{"type":"string"},"linkedin":{"type":"string"},"listIds":{"type":"array","items":{"type":"string","format":"uuid"}},"ownerIds":{"type":"array","items":{"type":"string","format":"uuid"}},"location":{"type":"object","description":"Geographic location as a structured object. Do not pass a plain string.","properties":{"city":{"type":"string"},"state":{"type":"string"},"country":{"type":"string"},"continent":{"type":"string"}}},"parentCompanyId":{"type":"string","format":"uuid","description":"ID of the parent company."},"custom":{"type":"object"},"externalId":{"type":"string"},"source":{"type":"string"}}}}}}
```

## The CompanyUpdate object

```json
{"openapi":"3.0.3","info":{"title":"Zero API","version":"1.12.0"},"components":{"schemas":{"CompanyUpdate":{"type":"object","properties":{"name":{"type":"string"},"domain":{"type":"string"},"logo":{"type":"string","format":"uri"},"description":{"type":"string"},"linkedin":{"type":"string"},"listIds":{"type":"array","items":{"type":"string","format":"uuid"}},"ownerIds":{"type":"array","items":{"type":"string","format":"uuid"}},"location":{"type":"object","description":"Geographic location as a structured object. Do not pass a plain string.","properties":{"city":{"type":"string"},"state":{"type":"string"},"country":{"type":"string"},"continent":{"type":"string"}}},"parentCompanyId":{"type":"string","format":"uuid"},"custom":{"type":"object"},"externalId":{"type":"string"},"source":{"type":"string"}}}}}}
```

## The Contact object

```json
{"openapi":"3.0.3","info":{"title":"Zero API","version":"1.12.0"},"components":{"schemas":{"Contact":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"workspaceId":{"type":"string","format":"uuid"},"companyId":{"type":"string","format":"uuid"},"name":{"type":"string"},"email":{"type":"string","format":"email"},"title":{"type":"string"},"phone":{"type":"string"},"linkedin":{"type":"string"},"x":{"type":"string","description":"X (formerly Twitter) handle"},"facebook":{"type":"string"},"github":{"type":"string"},"avatar":{"type":"string","format":"uri"},"location":{"type":"object","description":"Geographic location of the contact. Stored as a structured object, not a plain string.\n","properties":{"city":{"type":"string"},"state":{"type":"string"},"country":{"type":"string"},"continent":{"type":"string"},"countryCode":{"type":"string"},"stateCode":{"type":"string"},"coordinates":{"type":"object","properties":{"lat":{"type":"number"},"lng":{"type":"number"}}}}},"type":{"type":"string"},"custom":{"type":"object","description":"Custom property values, keyed by column UUID. Use `GET /api/columns` to discover available custom property IDs and types. When updating via PATCH, always use dot-notation (e.g. `\"custom.<COLUMN_ID>\": \"value\"`) to avoid overwriting other custom properties.\n"},"listIds":{"type":"array","items":{"type":"string","format":"uuid"}},"ownerIds":{"type":"array","items":{"type":"string","format":"uuid"}},"externalId":{"type":"string"},"source":{"type":"string"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"},"archived":{"type":"boolean"},"createdById":{"type":"string","format":"uuid"},"unsubscribedFromAllMessaging":{"type":"boolean","description":"Whether the contact has opted out of all outbound messaging. When `true`, the contact is suppressed across every send channel: email sequences (blocked at enrollment and stopped mid-run), automations, AI-agent email sends, and bulk email/LinkedIn composers.\n"},"unsubscribedFromAllMessagingAt":{"type":"string","format":"date-time","description":"When the contact was marked as unsubscribed from all messaging."}}}}}}
```

## The ContactCreate object

```json
{"openapi":"3.0.3","info":{"title":"Zero API","version":"1.12.0"},"components":{"schemas":{"ContactCreate":{"type":"object","required":["workspaceId"],"properties":{"workspaceId":{"type":"string","format":"uuid"},"companyId":{"type":"string","format":"uuid","description":"If not provided but email or linkedin is given, the system will automatically find or create the associated company."},"name":{"type":"string"},"email":{"type":"string","format":"email"},"title":{"type":"string"},"phone":{"type":"string"},"linkedin":{"type":"string"},"x":{"type":"string","description":"X (formerly Twitter) handle"},"facebook":{"type":"string"},"github":{"type":"string"},"avatar":{"type":"string","format":"uri"},"location":{"type":"object","description":"Geographic location as a structured object. Do not pass a plain string.","properties":{"city":{"type":"string"},"state":{"type":"string"},"country":{"type":"string"},"continent":{"type":"string"}}},"type":{"type":"string"},"custom":{"type":"object"},"listIds":{"type":"array","items":{"type":"string","format":"uuid"}},"ownerIds":{"type":"array","items":{"type":"string","format":"uuid"}},"externalId":{"type":"string"},"source":{"type":"string"},"unsubscribedFromAllMessaging":{"type":"boolean","description":"Create the contact already opted out of all outbound messaging (for example when importing a suppression list). Defaults to `false`. When set to `true`, also set `unsubscribedFromAllMessagingAt` — it is not stamped automatically.\n"},"unsubscribedFromAllMessagingAt":{"type":"string","format":"date-time","nullable":true,"description":"When the contact opted out. Not set automatically — provide it when creating the contact with `unsubscribedFromAllMessaging` set to true."}}}}}}
```

## The ContactUpdate object

```json
{"openapi":"3.0.3","info":{"title":"Zero API","version":"1.12.0"},"components":{"schemas":{"ContactUpdate":{"type":"object","properties":{"companyId":{"type":"string","format":"uuid"},"name":{"type":"string"},"email":{"type":"string","format":"email"},"title":{"type":"string"},"phone":{"type":"string"},"linkedin":{"type":"string"},"x":{"type":"string","description":"X (formerly Twitter) handle"},"facebook":{"type":"string"},"github":{"type":"string"},"avatar":{"type":"string","format":"uri"},"location":{"type":"object","description":"Geographic location as a structured object. Do not pass a plain string.","properties":{"city":{"type":"string"},"state":{"type":"string"},"country":{"type":"string"},"continent":{"type":"string"}}},"type":{"type":"string"},"custom":{"type":"object"},"listIds":{"type":"array","items":{"type":"string","format":"uuid"}},"ownerIds":{"type":"array","items":{"type":"string","format":"uuid"}},"externalId":{"type":"string"},"source":{"type":"string"},"unsubscribedFromAllMessaging":{"type":"boolean","description":"Set to `true` to opt the contact out of all outbound messaging. This is the supported way to unsubscribe a contact via the API — once set, the contact is suppressed everywhere: email sequences (new enrollment is blocked and any active run is stopped on its next step), automations, AI-agent email sends, and bulk email/LinkedIn composers. The server does **not** stamp the time automatically, so set `unsubscribedFromAllMessagingAt` in the same request to record when it happened (if omitted, the timestamp is left unchanged). To re-subscribe a contact, `PATCH` this back to `false` — and send `unsubscribedFromAllMessagingAt: null` to clear the record.\n"},"unsubscribedFromAllMessagingAt":{"type":"string","format":"date-time","nullable":true,"description":"Timestamp recording when the contact opted out. Not set automatically — provide it when setting `unsubscribedFromAllMessaging` to true, or send null to clear it when re-subscribing."}}}}}}
```

## The Deal object

```json
{"openapi":"3.0.3","info":{"title":"Zero API","version":"1.12.0"},"components":{"schemas":{"Deal":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"workspaceId":{"type":"string","format":"uuid"},"pipelineId":{"type":"string","format":"uuid","description":"The pipeline this deal belongs to."},"companyId":{"type":"string","format":"uuid"},"contactIds":{"type":"array","items":{"type":"string","format":"uuid"}},"name":{"type":"string"},"stage":{"type":"string","description":"UUID of the pipeline stage."},"value":{"type":"number"},"confidence":{"type":"number","minimum":0,"maximum":1,"description":"Win probability as a decimal fraction between 0 and 1 (e.g. `0.75` = 75%).\nDo not use percentages (0–100) — values outside the 0–1 range will fail.\n"},"closeDate":{"type":"string","format":"date"},"startDate":{"type":"string","format":"date"},"endDate":{"type":"string","format":"date"},"listIds":{"type":"array","items":{"type":"string","format":"uuid"}},"ownerIds":{"type":"array","items":{"type":"string","format":"uuid"}},"custom":{"type":"object","description":"Custom property values, keyed by column UUID. Use `GET /api/columns` to discover available custom property IDs and types. When updating via PATCH, always use dot-notation (e.g. `\"custom.<COLUMN_ID>\": \"value\"`) to avoid overwriting other custom properties.\n"},"externalId":{"type":"string"},"source":{"type":"string"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"},"archived":{"type":"boolean"},"createdById":{"type":"string","format":"uuid"}}}}}}
```

## The DealCreate object

```json
{"openapi":"3.0.3","info":{"title":"Zero API","version":"1.12.0"},"components":{"schemas":{"DealCreate":{"type":"object","required":["workspaceId"],"properties":{"workspaceId":{"type":"string","format":"uuid"},"companyId":{"type":"string","format":"uuid"},"contactIds":{"type":"array","items":{"type":"string","format":"uuid"}},"name":{"type":"string"},"stage":{"type":"string","description":"If not provided, defaults to the workspace defaultDealStage setting."},"value":{"type":"number"},"confidence":{"type":"number","minimum":0,"maximum":1,"description":"Win probability as a decimal fraction between 0 and 1 (e.g. `0.75` = 75%). Do not use percentages."},"closeDate":{"type":"string","format":"date"},"startDate":{"type":"string","format":"date"},"endDate":{"type":"string","format":"date"},"listIds":{"type":"array","items":{"type":"string","format":"uuid"}},"ownerIds":{"type":"array","items":{"type":"string","format":"uuid"}},"custom":{"type":"object"},"externalId":{"type":"string"},"source":{"type":"string"}}}}}}
```

## The DealUpdate object

```json
{"openapi":"3.0.3","info":{"title":"Zero API","version":"1.12.0"},"components":{"schemas":{"DealUpdate":{"type":"object","properties":{"companyId":{"type":"string","format":"uuid"},"contactIds":{"type":"array","items":{"type":"string","format":"uuid"}},"name":{"type":"string"},"stage":{"type":"string"},"value":{"type":"number"},"confidence":{"type":"number","minimum":0,"maximum":1,"description":"Win probability as a decimal fraction between 0 and 1 (e.g. `0.75` = 75%). Do not use percentages."},"closeDate":{"type":"string","format":"date"},"startDate":{"type":"string","format":"date"},"endDate":{"type":"string","format":"date"},"listIds":{"type":"array","items":{"type":"string","format":"uuid"}},"ownerIds":{"type":"array","items":{"type":"string","format":"uuid"}},"custom":{"type":"object"},"externalId":{"type":"string"},"source":{"type":"string"}}}}}}
```

## The Column object

```json
{"openapi":"3.0.3","info":{"title":"Zero API","version":"1.12.0"},"components":{"schemas":{"Column":{"type":"object","description":"A custom property definition. The `id` is used as the key inside the `custom` object on records.","properties":{"id":{"type":"string","format":"uuid","description":"The unique identifier for this custom property. Use this as the key when filtering or updating custom fields on records."},"workspaceId":{"type":"string","format":"uuid"},"name":{"type":"string","description":"Human-readable name of the custom property"},"description":{"type":"string","nullable":true,"description":"Optional description of the custom property"},"key":{"type":"string","description":"Dot-notation path for this column, e.g. `custom.<UUID>`. Convenient for constructing filter and update payloads."},"type":{"type":"string","enum":["text","richtext","number","currency","date","timestamp","select","multiselect","boolean","url","email","phone","user","company","companies","contact","contacts"],"description":"The data type of the custom property.\n\n| Type | Description |\n|------|-------------|\n| `text` | Plain text string |\n| `richtext` | Rich-text / formatted content |\n| `number` | Numeric value |\n| `currency` | Monetary value |\n| `date` | Date (no time) |\n| `timestamp` | Date and time |\n| `select` | Single choice from a predefined list — use option `key` UUIDs |\n| `multiselect` | Multiple choices from a predefined list — use option `key` UUIDs |\n| `boolean` | True/false |\n| `url` | URL string |\n| `email` | Email address |\n| `phone` | Phone number |\n| `user` | Reference to a workspace user |\n| `company` | Relation to a single company record |\n| `companies` | Relation to multiple company records |\n| `contact` | Relation to a single contact record |\n| `contacts` | Relation to multiple contact records |\n"},"entity":{"type":"string","enum":["companies","contacts","deals"],"description":"Which record type this custom property belongs to (plural form)."},"options":{"type":"array","nullable":true,"description":"Available options for `select` and `multiselect` type columns. `null` for all other types.\n\n> **Important:** Use the option `key` UUID (not the `name`) when filtering or updating records.\n","items":{"type":"object","properties":{"key":{"type":"string","format":"uuid","description":"The UUID value stored on records. Use this when filtering (`$in`, `$overlaps`, exact match) or writing to a select/multiselect field."},"name":{"type":"string","description":"Human-readable display name for the option"},"color":{"type":"string","description":"Hex color code for UI display (e.g. `#4CAF50`)"}}}},"ai":{"type":"boolean","description":"Whether this column is AI-generated"},"archived":{"type":"boolean"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"},"createdById":{"type":"string","format":"uuid"}}}}}}
```

## The Note object

````json
{"openapi":"3.0.3","info":{"title":"Zero API","version":"1.12.0"},"components":{"schemas":{"Note":{"type":"object","description":"A note attached to one or more records (company, contact, or deal).","properties":{"id":{"type":"string","format":"uuid"},"workspaceId":{"type":"string","format":"uuid"},"name":{"type":"string","description":"Title of the note"},"emoji":{"type":"string","description":"Emoji icon for the note (e.g. \"🗒️\", \"🔥\")"},"content":{"type":"object","nullable":true,"description":"Note body in [Tiptap](https://tiptap.dev/) document format. A JSON object with `type: \"doc\"` at the root containing an array of block nodes.\n\n```json\n{\n  \"type\": \"doc\",\n  \"content\": [\n    {\n      \"type\": \"paragraph\",\n      \"content\": [\n        {\"type\": \"text\", \"text\": \"Your note text here\"}\n      ]\n    }\n  ]\n}\n```\n"},"companyId":{"type":"string","format":"uuid","nullable":true},"contactId":{"type":"string","format":"uuid","nullable":true},"dealId":{"type":"string","format":"uuid","nullable":true},"archived":{"type":"boolean"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"},"createdById":{"type":"string","format":"uuid"},"externalId":{"type":"string","nullable":true},"source":{"type":"string","nullable":true}}}}}}
````

## The NoteCreate object

```json
{"openapi":"3.0.3","info":{"title":"Zero API","version":"1.12.0"},"components":{"schemas":{"NoteCreate":{"type":"object","required":["workspaceId"],"properties":{"workspaceId":{"type":"string","format":"uuid"},"name":{"type":"string","description":"Title of the note"},"emoji":{"type":"string","description":"Emoji icon for the note"},"content":{"type":"object","description":"Note body in Tiptap document format. Can be omitted and set later via PATCH."},"companyId":{"type":"string","format":"uuid","description":"Associate the note with a company"},"contactId":{"type":"string","format":"uuid","description":"Associate the note with a contact"},"dealId":{"type":"string","format":"uuid","description":"Associate the note with a deal"},"externalId":{"type":"string"},"source":{"type":"string"}}}}}}
```

## The NoteUpdate object

```json
{"openapi":"3.0.3","info":{"title":"Zero API","version":"1.12.0"},"components":{"schemas":{"NoteUpdate":{"type":"object","properties":{"name":{"type":"string"},"emoji":{"type":"string"},"content":{"type":"object","description":"Replaces the entire note body. Must be a valid Tiptap document."},"companyId":{"type":"string","format":"uuid"},"contactId":{"type":"string","format":"uuid"},"dealId":{"type":"string","format":"uuid"},"externalId":{"type":"string"},"source":{"type":"string"}}}}}}
```

## The Task object

```json
{"openapi":"3.0.3","info":{"title":"Zero API","version":"1.12.0"},"components":{"schemas":{"Task":{"type":"object","description":"A task that can be assigned to users and linked to companies, contacts, and deals.","properties":{"id":{"type":"string","format":"uuid"},"workspaceId":{"type":"string","format":"uuid"},"name":{"type":"string","description":"Title of the task"},"done":{"type":"boolean","description":"Whether the task has been completed","default":false},"priority":{"type":"integer","nullable":true,"description":"Task priority level.\n- `null` — No priority\n- `1` — Low\n- `2` — Medium\n- `3` — High\n- `4` — Urgent\n","enum":[null,1,2,3,4]},"deadline":{"type":"string","format":"date-time","nullable":true,"description":"Due date and time (ISO 8601)"},"content":{"type":"object","description":"Task title as a Tiptap document. Auto-generated from `name` if not provided on creation."},"description":{"type":"object","description":"Extended notes or context for the task, in Tiptap document format. Supports rich formatting."},"companyIds":{"type":"array","items":{"type":"string","format":"uuid"},"description":"Companies linked to this task"},"contactIds":{"type":"array","items":{"type":"string","format":"uuid"},"description":"Contacts linked to this task"},"dealIds":{"type":"array","items":{"type":"string","format":"uuid"},"description":"Deals linked to this task"},"assignedToIds":{"type":"array","items":{"type":"string","format":"uuid"},"description":"User IDs this task is assigned to"},"type":{"type":"string","nullable":true,"description":"Set automatically by integrations (e.g. `circleback` for meeting-generated tasks, `ai-generated` for AI-created tasks). Not intended to be set manually via the API.\n"},"message":{"type":"string","nullable":true},"archived":{"type":"boolean"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"},"createdById":{"type":"string","format":"uuid","nullable":true},"externalId":{"type":"string","nullable":true},"source":{"type":"string","nullable":true}}}}}}
```

## The TaskCreate object

```json
{"openapi":"3.0.3","info":{"title":"Zero API","version":"1.12.0"},"components":{"schemas":{"TaskCreate":{"type":"object","required":["workspaceId","name"],"properties":{"workspaceId":{"type":"string","format":"uuid"},"name":{"type":"string","description":"Title of the task. Also used to auto-generate `content` if `content` is not provided."},"content":{"type":"object","description":"Task title as a Tiptap document. If omitted, auto-generated from `name`."},"description":{"type":"object","description":"Extended notes in Tiptap document format. Supports headings, bullet lists, task lists, and inline formatting."},"done":{"type":"boolean","default":false},"priority":{"type":"integer","nullable":true,"description":"`null` = No priority, `1` = Low, `2` = Medium, `3` = High, `4` = Urgent","enum":[null,1,2,3,4]},"deadline":{"type":"string","format":"date-time"},"companyIds":{"type":"array","items":{"type":"string","format":"uuid"}},"contactIds":{"type":"array","items":{"type":"string","format":"uuid"}},"dealIds":{"type":"array","items":{"type":"string","format":"uuid"}},"assignedToIds":{"type":"array","items":{"type":"string","format":"uuid"}},"externalId":{"type":"string"},"source":{"type":"string"}}}}}}
```

## The TaskUpdate object

```json
{"openapi":"3.0.3","info":{"title":"Zero API","version":"1.12.0"},"components":{"schemas":{"TaskUpdate":{"type":"object","description":"All fields are optional. Array fields (`contactIds`, `companyIds`, `dealIds`, `assignedToIds`) replace the existing array entirely on update.\n","properties":{"name":{"type":"string"},"content":{"type":"object","description":"Replaces the entire task content. Must be a valid Tiptap document."},"description":{"type":"object","description":"Replaces the entire description. Must be a valid Tiptap document."},"done":{"type":"boolean"},"priority":{"type":"integer","nullable":true,"enum":[null,1,2,3,4]},"deadline":{"type":"string","format":"date-time","nullable":true},"companyIds":{"type":"array","items":{"type":"string","format":"uuid"}},"contactIds":{"type":"array","items":{"type":"string","format":"uuid"}},"dealIds":{"type":"array","items":{"type":"string","format":"uuid"}},"assignedToIds":{"type":"array","items":{"type":"string","format":"uuid"}},"externalId":{"type":"string"},"source":{"type":"string"}}}}}}
```

## The Pipeline object

```json
{"openapi":"3.0.3","info":{"title":"Zero API","version":"1.12.0"},"components":{"schemas":{"Pipeline":{"type":"object","description":"A sales pipeline that contains stages and deals.","properties":{"id":{"type":"string","format":"uuid"},"workspaceId":{"type":"string","format":"uuid"},"name":{"type":"string"},"description":{"type":"string","nullable":true},"icon":{"type":"string","nullable":true,"description":"Icon identifier for the pipeline"},"color":{"type":"string","nullable":true,"description":"Hex color code (e.g. `#2554F0`)"},"confidenceEnabled":{"type":"boolean","description":"Whether deal confidence scores are enabled for this pipeline"},"defaultStage":{"type":"string","format":"uuid","nullable":true,"description":"The stage ID new deals are assigned to by default"},"order":{"type":"integer","description":"Display order among pipelines"},"archived":{"type":"boolean"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}}}}}
```

## The PipelineCreate object

```json
{"openapi":"3.0.3","info":{"title":"Zero API","version":"1.12.0"},"components":{"schemas":{"PipelineCreate":{"type":"object","required":["workspaceId","name"],"properties":{"workspaceId":{"type":"string","format":"uuid"},"name":{"type":"string"},"description":{"type":"string","nullable":true},"icon":{"type":"string"},"color":{"type":"string","description":"Hex color code"},"confidenceEnabled":{"type":"boolean","default":false},"defaultStage":{"type":"string","format":"uuid","nullable":true},"order":{"type":"integer"}}}}}}
```

## The PipelineUpdate object

```json
{"openapi":"3.0.3","info":{"title":"Zero API","version":"1.12.0"},"components":{"schemas":{"PipelineUpdate":{"type":"object","properties":{"name":{"type":"string"},"description":{"type":"string","nullable":true},"icon":{"type":"string"},"color":{"type":"string"},"confidenceEnabled":{"type":"boolean"},"defaultStage":{"type":"string","format":"uuid","nullable":true},"order":{"type":"integer"}}}}}}
```

## The PipelineStage object

```json
{"openapi":"3.0.3","info":{"title":"Zero API","version":"1.12.0"},"components":{"schemas":{"PipelineStage":{"type":"object","description":"A stage within a pipeline. Deals move through stages as they progress.","properties":{"id":{"type":"string","format":"uuid"},"workspaceId":{"type":"string","format":"uuid"},"pipelineId":{"type":"string","format":"uuid"},"name":{"type":"string"},"description":{"type":"string","nullable":true},"type":{"type":"string","nullable":true,"description":"Semantic type of the stage.\n- `lead` — entry stage\n- `in-progress` — active stage\n- `won` — terminal success stage\n- `lost` — terminal loss stage\n- `null` — unclassified\n","enum":["lead","in-progress","won","lost",null]},"confidence":{"type":"string","nullable":true,"description":"Win probability for deals in this stage (0.0–1.0). Only meaningful when `confidenceEnabled` is true on the pipeline."},"icon":{"type":"string","nullable":true},"color":{"type":"string","nullable":true,"description":"Hex color code"},"order":{"type":"integer","description":"Display order within the pipeline (ascending)"},"archived":{"type":"boolean"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}}}}}
```

## The PipelineStageCreate object

```json
{"openapi":"3.0.3","info":{"title":"Zero API","version":"1.12.0"},"components":{"schemas":{"PipelineStageCreate":{"type":"object","required":["workspaceId","pipelineId","name"],"properties":{"workspaceId":{"type":"string","format":"uuid"},"pipelineId":{"type":"string","format":"uuid"},"name":{"type":"string"},"description":{"type":"string","nullable":true},"type":{"type":"string","nullable":true,"enum":["lead","in-progress","won","lost"]},"confidence":{"type":"number","minimum":0,"maximum":1,"description":"Win probability (0.0–1.0)"},"icon":{"type":"string"},"color":{"type":"string"},"order":{"type":"integer"}}}}}}
```

## The PipelineStageUpdate object

```json
{"openapi":"3.0.3","info":{"title":"Zero API","version":"1.12.0"},"components":{"schemas":{"PipelineStageUpdate":{"type":"object","properties":{"name":{"type":"string"},"description":{"type":"string","nullable":true},"type":{"type":"string","nullable":true,"enum":["lead","in-progress","won","lost"]},"confidence":{"type":"number","minimum":0,"maximum":1},"icon":{"type":"string"},"color":{"type":"string"},"order":{"type":"integer"}}}}}}
```

## The Workspace object

```json
{"openapi":"3.0.3","info":{"title":"Zero API","version":"1.12.0"},"components":{"schemas":{"Workspace":{"type":"object","description":"A workspace is the top-level organizational unit in Zero. All records (companies, contacts, deals, etc.) belong to a workspace.\nCreation of workspaces via the API is not supported.\n","properties":{"id":{"type":"string","format":"uuid"},"name":{"type":"string"},"key":{"type":"string","description":"URL-safe identifier for the workspace (e.g. `my-company`)"},"domain":{"type":"string","nullable":true,"description":"Primary domain associated with the workspace"},"domains":{"type":"array","description":"List of email domains associated with the workspace","items":{"type":"object","properties":{"domain":{"type":"string"}}}},"avatar":{"type":"string","nullable":true,"description":"URL of the workspace logo/avatar"},"color":{"type":"string","nullable":true},"type":{"type":"string","nullable":true,"description":"Workspace type (e.g. `internal`)"},"trialEndsAt":{"type":"string","format":"date-time","nullable":true},"settings":{"type":"object","description":"Workspace configuration. Includes `timezone`, `currency`, `contactTypes`, and `recordColumnConfigs` (column display settings per entity type).\n"},"featureFlags":{"type":"object","description":"Feature flag overrides for this workspace"},"archived":{"type":"boolean"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}}}}}
```

## The WorkspaceUpdate object

```json
{"openapi":"3.0.3","info":{"title":"Zero API","version":"1.12.0"},"components":{"schemas":{"WorkspaceUpdate":{"type":"object","properties":{"name":{"type":"string"},"domain":{"type":"string","nullable":true},"avatar":{"type":"string","nullable":true},"color":{"type":"string","nullable":true},"settings":{"type":"object","description":"Replaces the entire settings object. Include all desired settings, not just changed fields."}}}}}}
```

## The CalendarEvent object

```json
{"openapi":"3.0.3","info":{"title":"Zero API","version":"1.12.0"},"components":{"schemas":{"CalendarEvent":{"type":"object","description":"A meeting (calendar event). Meetings recorded by a connected notetaker integration also have transcript segments, retrievable via `GET /api/calendarEventTranscripts` filtered by `calendarEventId`.\n\nOnly a curated, read-only subset of meeting fields is exposed via the API.\n","properties":{"id":{"type":"string","format":"uuid"},"workspaceId":{"type":"string","format":"uuid"},"name":{"type":"string","nullable":true,"description":"Title of the meeting."},"emoji":{"type":"string","nullable":true},"description":{"type":"string","nullable":true},"location":{"type":"string","nullable":true},"meetingLink":{"type":"string","nullable":true,"description":"Video conferencing link (e.g. Google Meet, Zoom)."},"startTime":{"type":"string","format":"date-time","nullable":true,"description":"Start of the meeting. Null for all-day events, which use `startDate`/`endDate` instead."},"endTime":{"type":"string","format":"date-time","nullable":true,"description":"End of the meeting."},"startDate":{"type":"string","format":"date","nullable":true,"description":"Start date for all-day events."},"endDate":{"type":"string","format":"date","nullable":true,"description":"End date for all-day events."},"busy":{"type":"boolean","description":"Whether the meeting marks attendees as busy."},"organizer":{"type":"object","nullable":true,"description":"The meeting organizer, as provided by the calendar source. May include additional provider-specific fields.","properties":{"email":{"type":"string","nullable":true},"displayName":{"type":"string","nullable":true,"description":"Display name of the organizer."}}},"attendeeEmails":{"type":"array","nullable":true,"items":{"type":"string"},"description":"Email addresses of the meeting attendees."},"summary":{"type":"object","nullable":true,"description":"AI-generated meeting summary in [Tiptap](https://tiptap.dev/) document format (a JSON object with a `type: \"doc\"` root). Null when no summary has been generated.\n"},"userIds":{"type":"array","items":{"type":"string","format":"uuid"},"description":"Zero users associated with the meeting."},"calendarIds":{"type":"array","items":{"type":"string","format":"uuid"},"description":"Calendars the meeting belongs to."},"companyIds":{"type":"array","items":{"type":"string","format":"uuid"},"description":"Companies linked to the meeting."},"contactIds":{"type":"array","items":{"type":"string","format":"uuid"},"description":"Contacts linked to the meeting."},"dealIds":{"type":"array","items":{"type":"string","format":"uuid"},"description":"Deals linked to the meeting."},"external":{"type":"boolean","description":"Whether the meeting originated from an external calendar sync."},"externalNotetakerUrl":{"type":"string","nullable":true,"description":"Link to the meeting in the external notetaker (e.g. Circleback)."},"audioUrl":{"type":"string","nullable":true,"description":"URL to the meeting audio recording, if available."},"videoUrl":{"type":"string","nullable":true,"description":"URL to the meeting video recording, if available."},"archived":{"type":"boolean"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}}}}}
```

## The Transcript object

```json
{"openapi":"3.0.3","info":{"title":"Zero API","version":"1.12.0"},"components":{"schemas":{"Transcript":{"type":"object","description":"A single transcript segment (one speaker turn) from a recorded meeting. A meeting's full transcript is made up of many segments that share the same `calendarEventId`, ordered by `startTime`.\n","properties":{"id":{"type":"string","format":"uuid"},"workspaceId":{"type":"string","format":"uuid"},"calendarEventId":{"type":"string","format":"uuid","description":"The meeting (calendar event) this segment belongs to."},"integrationId":{"type":"string","format":"uuid","nullable":true,"description":"The notetaker integration that produced this segment."},"speaker":{"type":"string","nullable":true,"description":"Name of the speaker for this segment (e.g. \"Jane Doe\"), or \"Unknown\"."},"content":{"type":"string","nullable":true,"description":"The spoken text of this segment."},"startTime":{"type":"integer","nullable":true,"description":"Start offset of this segment, in milliseconds from the start of the meeting."},"endTime":{"type":"integer","nullable":true,"description":"End offset of this segment, in milliseconds from the start of the meeting."},"duration":{"type":"integer","nullable":true,"description":"Length of this segment in milliseconds (`endTime` − `startTime`)."},"topic":{"type":"string","nullable":true,"description":"Optional topic label for the segment. Often empty."},"sentiment":{"type":"string","nullable":true,"description":"Optional sentiment label for the segment. Often empty."},"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}}}}}}
```

## The User object

```json
{"openapi":"3.0.3","info":{"title":"Zero API","version":"1.12.0"},"components":{"schemas":{"User":{"type":"object","description":"A user in the Zero system. The `GET /api/users` endpoint returns all users accessible to the authenticated token.\nTo find members of a specific workspace, use `GET /api/memberships` filtered by `workspaceId`, then resolve user details via `GET /api/users?where={\"id\":{\"$in\":[...]}}`.\n","properties":{"id":{"type":"string","format":"uuid"},"name":{"type":"string","nullable":true},"email":{"type":"string","format":"email"},"title":{"type":"string","nullable":true,"description":"Job title"},"avatar":{"type":"string","nullable":true,"description":"URL of the user's profile picture"},"linkedin":{"type":"string","nullable":true,"description":"LinkedIn username"},"active":{"type":"boolean","description":"Whether the user account is active"},"emailConfirmed":{"type":"boolean"},"lastSeenAt":{"type":"string","format":"date-time","nullable":true},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}}}}}
```

## The Membership object

```json
{"openapi":"3.0.3","info":{"title":"Zero API","version":"1.12.0"},"components":{"schemas":{"Membership":{"type":"object","description":"Links a user to a workspace with a role.","properties":{"id":{"type":"string","format":"uuid"},"userId":{"type":"string","format":"uuid","description":"The ID of the user"},"workspaceId":{"type":"string","format":"uuid","description":"The ID of the workspace"},"role":{"type":"string","enum":["admin","member"],"description":"The user's role within the workspace"},"invitedById":{"type":"string","format":"uuid","nullable":true,"description":"ID of the user who sent the invite"},"inviteMessage":{"type":"string","nullable":true},"archived":{"type":"boolean"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}}}}}
```

## The List object

```json
{"openapi":"3.0.3","info":{"title":"Zero API","version":"1.12.0"},"components":{"schemas":{"List":{"type":"object","description":"A list groups records of a single entity type (contacts, companies, or deals).\n\n- **Regular lists** (`filterBased: false`) — records are explicitly added via the `listIds` field on contact/company/deal PATCH.\n- **Dynamic lists** (`filterBased: true`) — records are not stored. The list shows all records matching the filters defined on its views.\n\nEvery list must have an `icon` set to display correctly in the UI.\nEvery list must have at least one view to be usable in the UI.\n","properties":{"id":{"type":"string","format":"uuid"},"workspaceId":{"type":"string","format":"uuid"},"name":{"type":"string"},"entity":{"type":"string","enum":["contacts","companies","deals"],"description":"The type of records this list contains"},"filterBased":{"type":"boolean","description":"`true` for dynamic lists, `false` for regular lists"},"filters":{"type":"object","description":"Should be left empty (`{}`). Filters for dynamic lists belong on the **views**, not on the list itself.\nThe API will accept and store values here, but the UI uses view-level filters to determine which records are shown — not this field.\n"},"icon":{"type":"string","nullable":true,"description":"Icon name from the Zero icon set. See the `ListCreate` schema for the full list of valid values.\nRequired — lists without an icon do not display correctly in the UI.\n"},"color":{"type":"string","nullable":true,"description":"Hex color code (e.g. `\"#8B5CF6\"`)"},"order":{"type":"integer","nullable":true},"listFolderId":{"type":"string","format":"uuid","nullable":true,"description":"ID of the folder this list belongs to, if any"},"archived":{"type":"boolean"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}}}}}
```

## The ListCreate object

```json
{"openapi":"3.0.3","info":{"title":"Zero API","version":"1.12.0"},"components":{"schemas":{"ListCreate":{"type":"object","required":["workspaceId","name","entity","icon"],"properties":{"workspaceId":{"type":"string","format":"uuid"},"name":{"type":"string"},"entity":{"type":"string","enum":["contacts","companies","deals"]},"filterBased":{"type":"boolean","default":false,"description":"`true` for dynamic list, `false` for regular list"},"color":{"type":"string","description":"Hex color code (e.g. `\"#8B5CF6\"`)"},"icon":{"type":"string","description":"Required. Icon name from the Zero icon set.","enum":["access-point","activity-heartbeat","adjustments-alt","adjustments-horizontal","affiliate","alarm","alert-hexagon","alert-triangle","analyze","antenna-bars-5","aperture","api-app","archery-arrow","archive","armchair","arrow-back-up","arrow-bar-to-down","arrow-bar-to-left","arrow-bar-to-right","arrow-bar-to-up","arrow-bear-right","arrow-big-down","arrow-big-left","arrow-bounce","arrow-down-circle","arrow-down-left-circle","arrow-down-right-circle","arrow-forward-up","arrow-left-circle","arrow-narrow-left","arrow-narrow-right","arrow-right-circle","arrow-up-circle","arrow-up-left-circle","arrow-up-right-circle","arrows-diagonal","arrows-diagonal-2","arrows-double-ne-sw","arrows-double-nw-se","arrows-double-se-nw","arrows-double-sw-ne","arrows-exchange","arrows-horizontal","arrows-join","arrows-join-2","arrows-left-down","arrows-left-right","arrows-maximize","arrows-minimize","arrows-right-down","arrows-right-left","arrows-sort","arrows-split","arrows-split-2","arrows-transfer-down","arrows-transfer-up","arrows-vertical","artboard","artboard-off","aspect-ratio","assembly","asset","asterisk","asterisk-simple","at","at-off","atom","augmented-reality","automatic-gearbox","award","award-off","axe","axis-x","axis-y","baby-carriage","backhoe","backpack","badge","badges","ball-american-football","ball-baseball","ball-basketball","ball-bowling","ball-football","ball-tennis","ball-volleyball","balloon","balloon-off","ballpen","ballpen-off","bandage","barbell","barcode","barrel","barrier-block","baseline","basket","basket-off","bath","battery","battery-charging","battery-off","beach","bell","bike","binoculars","bleach","blob","blur","bolt","bookmark","border-all","border-corners","bowl-chopsticks","box","box-model-2","box-multiple","brackets-angle","brain","briefcase","brightness-down","broadcast","brush","bug","building","building-bank","building-castle","bulb","cactus","calculator","calendar","camera","capture","car","car-fan","carambola","cardboards","cash-banknote","chart-bar","chart-funnel","chart-line","chart-pie","check","chess-king","chess-rook","chevron-down","chevron-down-left","chevron-down-right","chevron-left","chevron-right","chevron-up","chevron-up-left","chevron-up-right","chevrons-down","chevrons-down-left","chevrons-down-right","chevrons-left","chevrons-right","chevrons-up","chevrons-up-left","chevrons-up-right","circle","clipboard","clock","cloud","code","coffee","coin","compass","confetti","copy","crane","credit-card","crown","currency-dollar","currency-euro","cut","cylinder","dashboard","database","details","device-desktop","device-gamepad-2","diamond","diamonds","direction-sign","disc","discount","dna","droplet","ear","edit","exchange","eye","eyeglass","feather","file","file-text","filter","fingerprint","flag","flag-3","flame","flask","flower","focus-2","folder","forbid-2","frustum","gauge","geometry","gift","glass-cocktail","golf","graph","hand-finger","hand-love-you","headphones","heart","hexagonal-pyramid","hierarchy","home","hourglass-empty","jacket","key","keyframe","keyframe-align-horizontal","keyframes","label","laurel-wreath","layers-subtract","layout-board","layout-cards","layout-grid","leaf","lemon","license","link","location","lock-open","mail","mailbox","map-pin","mask","medical-cross","message-chatbot","message-dots","microphone","moneybag","mood-empty","mood-happy","mood-sad","mood-share","mood-smile","moon","mouse-2","mug","music","nut","paperclip","phone","plane-tilt","plant","plus-circle","pointer","presentation","rainbow","road","rocket","rosette-discount-check","rotate-dot","rubber-stamp","run","scale","scissors","search","send","settings","shield","shopping-cart","sparkles","speakerphone","spiral","star","sun","tag","tags","target","thumb-down","thumb-up","timeline-event","toggle-left","tool","trash","trending-up","triangle-inverted","trophy","umbrella","upload","user","users","video","volume","volume-2","wallet","webhook","wifi","windmill","world","x"]},"order":{"type":"integer"},"listFolderId":{"type":"string","format":"uuid","nullable":true}}}}}}
```

## The ListUpdate object

```json
{"openapi":"3.0.3","info":{"title":"Zero API","version":"1.12.0"},"components":{"schemas":{"ListUpdate":{"type":"object","description":"All fields are optional. Multiple fields can be updated in a single PATCH request.","properties":{"name":{"type":"string"},"color":{"type":"string"},"icon":{"type":"string"},"filterBased":{"type":"boolean","description":"Convert between regular and dynamic list. When switching to `true`, set filters on each view rather than on the list itself."},"filters":{"type":"object","description":"The API accepts and stores values here, but the UI uses view-level filters to determine which records are shown.\nRecommended to leave as `{}` and set filters on views instead.\n"},"order":{"type":"integer"},"listFolderId":{"type":"string","format":"uuid","nullable":true}}}}}}
```

## The View object

````json
{"openapi":"3.0.3","info":{"title":"Zero API","version":"1.12.0"},"components":{"schemas":{"View":{"type":"object","description":"A view belongs to a list and defines filters and display configuration. A list can have multiple views, each with its own independent set of filters.\n\nFor dynamic lists, the view filters determine which workspace records are shown.\nFor regular lists, filters narrow down the explicitly-added records.\n","properties":{"id":{"type":"string","format":"uuid"},"workspaceId":{"type":"string","format":"uuid"},"listId":{"type":"string","format":"uuid"},"name":{"type":"string"},"entity":{"type":"string","enum":["contacts","companies","deals"]},"type":{"type":"string","enum":["grid","board"],"description":"View display type.\n- `grid` — flat table layout.\n- `board` — kanban-style layout. `settings.groupBy` should be set for meaningful grouping (the API does not enforce this but the UI needs it to display correctly).\nTo convert a `grid` view to `board`, PATCH `{\"type\": \"board\"}`.\n"},"filters":{"type":"object","description":"Filters that determine which records are shown in this view. Uses the same operator syntax as the `where` query parameter.\n\nFor dynamic lists, this is the primary (and only) mechanism for filtering records — do not set filters on the list object itself.\n\nExample:\n```json\n{\n  \"stage\": { \"$in\": [\"<uuid>\", \"<uuid>\"] },\n  \"lastActivity.time\": { \"$lt\": \"-7d\" },\n  \"custom.<column-id>\": \"some-value\"\n}\n```\n"},"settings":{"type":"object","description":"Display settings for the view.\n\n```json\n{\n  \"columns\": [\n    { \"key\": \"&\" },\n    { \"key\": \"value\" },\n    { \"key\": \"closeDate\" },\n    { \"key\": \"custom.<column-id>\" }\n  ],\n  \"groupBy\": \"stage\",\n  \"isDefault\": true\n}\n```\n\n- `columns` — ordered list of visible columns. `\"&\"` is the primary name column and should always be first.\n- `groupBy` — field key to group records by. Required for `board` views. Accepts standard field names (e.g. `\"stage\"`) or `\"custom.<column-id>\"`.\n- `isDefault` — if `true`, this view is opened by default when navigating to the list. Only one view per list should have this set.\n\nWhen PATCHing `settings`, always include the full object — partial updates will overwrite existing column configuration.\n"},"highlights":{"type":"array","items":{},"description":"Highlight rules for the view"},"order":{"type":"integer"},"archived":{"type":"boolean"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}}}}}
````

## The ViewCreate object

````json
{"openapi":"3.0.3","info":{"title":"Zero API","version":"1.12.0"},"components":{"schemas":{"ViewCreate":{"type":"object","required":["workspaceId","listId","name","entity","type"],"properties":{"workspaceId":{"type":"string","format":"uuid"},"listId":{"type":"string","format":"uuid"},"name":{"type":"string"},"entity":{"type":"string","enum":["contacts","companies","deals"]},"type":{"type":"string","enum":["grid","board"],"description":"View type. Use `grid` for table layout, `board` for kanban.\nNote: you can also POST directly with `type: \"board\"` — the API accepts it. The create-as-grid-then-PATCH approach also works.\n"},"filters":{"type":"object","description":"Initial filters for the view. For dynamic lists, this controls which records are shown."},"settings":{"type":"object","description":"Initial display settings. If omitted, defaults to `{}` (no columns configured).\nShould include `columns` array and optionally `groupBy` and `isDefault`.\n```json\n{\n  \"columns\": [{ \"key\": \"&\" }, { \"key\": \"value\" }],\n  \"groupBy\": null,\n  \"isDefault\": true\n}\n```\n"},"order":{"type":"integer","description":"Display order of this view within the list. Use `0` for the first/default view."}}}}}}
````

## The ViewUpdate object

```json
{"openapi":"3.0.3","info":{"title":"Zero API","version":"1.12.0"},"components":{"schemas":{"ViewUpdate":{"type":"object","description":"All fields are optional. Multiple fields can be updated in a single PATCH request.","properties":{"name":{"type":"string","description":"Display name of the view."},"type":{"type":"string","enum":["grid","board"],"description":"Change the view layout. Use `\"board\"` for kanban, `\"grid\"` for table.\nCan be toggled freely — both `grid→board` and `board→grid` work.\nWhen switching to `\"board\"`, ensure `settings.groupBy` is set for meaningful column grouping.\n"},"filters":{"type":"object","description":"Replaces the **entire** filters object — include all desired filters, not just the changed ones.\nFor dynamic lists this controls which records are shown.\nSet to `{}` to clear all filters.\n"},"settings":{"type":"object","description":"Replaces the **entire** settings object — always include the full `columns` array, `groupBy`, and `isDefault` values.\nPartial settings updates will overwrite existing column configuration.\nIf `settings` is omitted on creation, it defaults to `{}`.\n"},"order":{"type":"integer","description":"Display order of this view within the list."}}}}}}
```

## The CustomActivity object

````json
{"openapi":"3.0.3","info":{"title":"Zero API","version":"1.12.0"},"components":{"schemas":{"CustomActivity":{"type":"object","description":"A logged activity (call, meeting, or custom interaction) linked to companies, contacts, and deals.","properties":{"id":{"type":"string","format":"uuid"},"workspaceId":{"type":"string","format":"uuid"},"name":{"type":"string","description":"Title or summary of the activity"},"typeId":{"type":"string","format":"uuid","nullable":true,"description":"ID of the custom activity type (e.g. Call, Meeting). Use `GET /api/customActivityTypes` to discover available types."},"type":{"type":"string","nullable":true,"description":"Legacy type string. Prefer using `typeId` for new activities."},"time":{"type":"string","format":"date-time","nullable":true,"description":"When the activity occurred (ISO 8601)"},"content":{"type":"object","nullable":true,"description":"Flexible JSONB object for structured activity data (e.g. call notes, meeting agenda)."},"custom":{"type":"object","nullable":true,"description":"Custom property values defined by the activity type's `customFields`. Keyed by the custom field `id`.\n\nFor example, if the Call type has a custom field with `\"id\": \"call-result\"`, you can store:\n```json\n{\"call-result\": \"connected\"}\n```\n\nWhen updating via PATCH, use dot-notation (e.g. `\"custom.call-result\": \"connected\"`) to avoid overwriting other custom properties.\n"},"userId":{"type":"string","format":"uuid","nullable":true,"description":"The user who performed the activity. Auto-set from the authenticated user on creation if not provided."},"userIds":{"type":"array","items":{"type":"string","format":"uuid"},"description":"Multiple users associated with the activity"},"companyIds":{"type":"array","items":{"type":"string","format":"uuid"},"description":"Companies linked to this activity"},"contactIds":{"type":"array","items":{"type":"string","format":"uuid"},"description":"Contacts linked to this activity"},"dealIds":{"type":"array","items":{"type":"string","format":"uuid"},"description":"Deals linked to this activity"},"archived":{"type":"boolean"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"},"createdById":{"type":"string","format":"uuid","nullable":true},"externalId":{"type":"string","nullable":true,"description":"ID from external system for integrations"},"source":{"type":"string","nullable":true}}}}}}
````

## The CustomActivityCreate object

```json
{"openapi":"3.0.3","info":{"title":"Zero API","version":"1.12.0"},"components":{"schemas":{"CustomActivityCreate":{"type":"object","required":["workspaceId"],"properties":{"workspaceId":{"type":"string","format":"uuid"},"name":{"type":"string","description":"Title or summary of the activity"},"typeId":{"type":"string","format":"uuid","description":"ID of the custom activity type. Use `GET /api/customActivityTypes` to discover available types."},"time":{"type":"string","format":"date-time","description":"When the activity occurred. Defaults to now if not provided."},"content":{"type":"object","description":"Flexible JSONB object for structured activity data."},"custom":{"type":"object","description":"Custom property values keyed by the activity type's custom field IDs."},"userId":{"type":"string","format":"uuid","description":"The user who performed the activity. Auto-set from the authenticated user if not provided."},"userIds":{"type":"array","items":{"type":"string","format":"uuid"}},"companyIds":{"type":"array","items":{"type":"string","format":"uuid"}},"contactIds":{"type":"array","items":{"type":"string","format":"uuid"}},"dealIds":{"type":"array","items":{"type":"string","format":"uuid"}},"externalId":{"type":"string"},"source":{"type":"string"}}}}}}
```

## The CustomActivityUpdate object

```json
{"openapi":"3.0.3","info":{"title":"Zero API","version":"1.12.0"},"components":{"schemas":{"CustomActivityUpdate":{"type":"object","description":"All fields are optional. Array fields (`contactIds`, `companyIds`, `dealIds`, `userIds`) replace the existing array entirely on update.\n","properties":{"name":{"type":"string"},"typeId":{"type":"string","format":"uuid"},"time":{"type":"string","format":"date-time"},"content":{"type":"object"},"custom":{"type":"object"},"userId":{"type":"string","format":"uuid"},"userIds":{"type":"array","items":{"type":"string","format":"uuid"}},"companyIds":{"type":"array","items":{"type":"string","format":"uuid"}},"contactIds":{"type":"array","items":{"type":"string","format":"uuid"}},"dealIds":{"type":"array","items":{"type":"string","format":"uuid"}},"externalId":{"type":"string"},"source":{"type":"string"}}}}}}
```

## The CustomActivityType object

```json
{"openapi":"3.0.3","info":{"title":"Zero API","version":"1.12.0"},"components":{"schemas":{"CustomActivityType":{"type":"object","description":"A definition for a type of activity that can be logged in a workspace (e.g. Call, Meeting, Site Visit).\n\nEach type can define custom fields that appear when logging an activity. Default types (Call, Meeting) are created automatically for new workspaces.\n","properties":{"id":{"type":"string","format":"uuid"},"workspaceId":{"type":"string","format":"uuid"},"name":{"type":"string","description":"Display name of the activity type (e.g. \"Call\", \"Meeting\")"},"icon":{"type":"string","nullable":true,"description":"Icon identifier (e.g. \"phone\", \"calendar\", \"building\")"},"color":{"type":"string","nullable":true,"description":"Hex color code for UI display (e.g. \"#C48E1C\")"},"shortcut":{"type":"string","nullable":true,"description":"Keyboard shortcut key for quick activity logging (e.g. \"K\" for Call, \"M\" for Meeting)"},"description":{"type":"string","nullable":true,"description":"Human-readable description of the activity type"},"customFields":{"type":"array","description":"Custom field definitions for this activity type. When creating an activity with this type, the `custom` object on the activity can contain values keyed by these field IDs.\n","items":{"type":"object","properties":{"id":{"type":"string","description":"Unique identifier for the custom field. Used as the key in the activity's `custom` object."},"name":{"type":"string","description":"Human-readable field name"},"type":{"type":"string","description":"Field type (e.g. \"select\", \"text\", \"number\")"},"options":{"type":"array","description":"Available options for select-type fields","items":{"type":"object","properties":{"key":{"type":"string","description":"The value stored on the activity"},"name":{"type":"string","description":"Human-readable option name"},"color":{"type":"string","description":"Hex color code for UI display"}}}}}}},"archived":{"type":"boolean"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"},"createdById":{"type":"string","format":"uuid","nullable":true}}}}}}
```

## The CustomActivityTypeCreate object

```json
{"openapi":"3.0.3","info":{"title":"Zero API","version":"1.12.0"},"components":{"schemas":{"CustomActivityTypeCreate":{"type":"object","required":["workspaceId","name"],"properties":{"workspaceId":{"type":"string","format":"uuid"},"name":{"type":"string","description":"Display name of the activity type"},"icon":{"type":"string","description":"Icon identifier"},"color":{"type":"string","description":"Hex color code"},"shortcut":{"type":"string","description":"Keyboard shortcut key"},"description":{"type":"string"},"customFields":{"type":"array","description":"Custom field definitions for this activity type","items":{"type":"object","required":["id","name","type"],"properties":{"id":{"type":"string"},"name":{"type":"string"},"type":{"type":"string"},"options":{"type":"array","items":{"type":"object","properties":{"key":{"type":"string"},"name":{"type":"string"},"color":{"type":"string"}}}}}}}}}}}}
```

## The CustomActivityTypeUpdate object

```json
{"openapi":"3.0.3","info":{"title":"Zero API","version":"1.12.0"},"components":{"schemas":{"CustomActivityTypeUpdate":{"type":"object","description":"All fields are optional. The `customFields` array replaces the existing array entirely on update — always include all desired fields.\n","properties":{"name":{"type":"string"},"icon":{"type":"string"},"color":{"type":"string"},"shortcut":{"type":"string"},"description":{"type":"string"},"customFields":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"type":{"type":"string"},"options":{"type":"array","items":{"type":"object","properties":{"key":{"type":"string"},"name":{"type":"string"},"color":{"type":"string"}}}}}}}}}}}}
```

## The File object

```json
{"openapi":"3.0.3","info":{"title":"Zero API","version":"1.12.0"},"components":{"schemas":{"File":{"type":"object","description":"A file or attachment uploaded to a workspace. Created via `POST /api/files/upload` (multipart/form-data).\n","properties":{"id":{"type":"string","format":"uuid"},"workspaceId":{"type":"string","format":"uuid"},"companyId":{"type":"string","format":"uuid","nullable":true,"description":"Company this file is attached to, if any."},"contactId":{"type":"string","format":"uuid","nullable":true,"description":"Contact this file is attached to, if any."},"dealId":{"type":"string","format":"uuid","nullable":true,"description":"Deal this file is attached to, if any."},"noteId":{"type":"string","format":"uuid","nullable":true,"description":"Note this file is attached to, if any."},"calendarEventId":{"type":"string","format":"uuid","nullable":true},"placement":{"type":"string","nullable":true,"description":"Optional placement/context label for the file."},"url":{"type":"string","nullable":true,"description":"Storage URL for the file. For `type=file` uploads this points to authenticated storage and is not directly accessible — use `GET /api/files/download` to get a signed URL.\n"},"thumbnailUrl":{"type":"string","nullable":true,"description":"Generated thumbnail image URL, or `null` if the content type does not support previews."},"previewUrl":{"type":"string","nullable":true,"description":"Generated preview image URL, or `null` if the content type does not support previews."},"name":{"type":"string","nullable":true,"description":"Original filename."},"description":{"type":"string","nullable":true},"size":{"type":"integer","nullable":true,"description":"File size in bytes."},"type":{"type":"string","nullable":true,"description":"MIME type of the file (e.g. `application/pdf`, `image/png`)."},"metadata":{"type":"object","nullable":true,"description":"Media metadata extracted on upload.","properties":{"width":{"type":"integer"},"height":{"type":"integer"},"type":{"type":"string"},"format":{"type":"string"},"pages":{"type":"integer","description":"Number of pages (for multi-page documents such as PDFs)."},"duration":{"type":"number","description":"Duration in seconds (for audio/video)."}}},"assetId":{"type":"string","nullable":true,"description":"Cloudinary asset ID."},"publicId":{"type":"string","nullable":true,"description":"Cloudinary public ID."},"googleCloudStorageId":{"type":"string","nullable":true,"description":"Internal storage key. Use `GET /api/files/download` rather than referencing this directly."},"externalId":{"type":"string","nullable":true,"description":"ID from an external system for integrations."},"importId":{"type":"string","format":"uuid","nullable":true},"archived":{"type":"boolean"},"archivedById":{"type":"string","format":"uuid","nullable":true},"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}}}}}}
```

## The FileUpdate object

```json
{"openapi":"3.0.3","info":{"title":"Zero API","version":"1.12.0"},"components":{"schemas":{"FileUpdate":{"type":"object","description":"Editable file metadata. The file's binary contents cannot be changed via PATCH — re-upload to replace them.","properties":{"name":{"type":"string"},"description":{"type":"string"},"placement":{"type":"string"},"companyId":{"type":"string","format":"uuid"},"contactId":{"type":"string","format":"uuid"},"dealId":{"type":"string","format":"uuid"},"noteId":{"type":"string","format":"uuid"},"externalId":{"type":"string"}}}}}}
```

## The Sequence object

```json
{"openapi":"3.0.3","info":{"title":"Zero API","version":"1.12.0"},"components":{"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}}}}}}
```

## The SequenceUpdate object

```json
{"openapi":"3.0.3","info":{"title":"Zero API","version":"1.12.0"},"components":{"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"}}}}}}
```

## The SequenceStep object

```json
{"openapi":"3.0.3","info":{"title":"Zero API","version":"1.12.0"},"components":{"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}}}}}}
```

## The SequenceStepCreate object

```json
{"openapi":"3.0.3","info":{"title":"Zero API","version":"1.12.0"},"components":{"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)."}}}}}}
```

## The SequenceStepUpdate object

```json
{"openapi":"3.0.3","info":{"title":"Zero API","version":"1.12.0"},"components":{"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"}}}}}}
```

## The SequenceContactStatus object

```json
{"openapi":"3.0.3","info":{"title":"Zero API","version":"1.12.0"},"components":{"schemas":{"SequenceContactStatus":{"type":"object","description":"An enrollment — one contact's progress through one sequence. Created automatically when a contact is added to the sequence's source list.\n","properties":{"id":{"type":"string","format":"uuid"},"workspaceId":{"type":"string","format":"uuid"},"sequenceId":{"type":"string","format":"uuid"},"listId":{"type":"string","format":"uuid","description":"The sequence source list the contact was enrolled through."},"contactId":{"type":"string","format":"uuid"},"status":{"type":"string","enum":["waitingForApproval","waitingForPickUp","active","paused","completed","stopped","cancelled"],"description":"`waitingForPickUp` — enrolled, awaiting the background worker.\n`waitingForApproval` — manual roll-out, awaiting approval in the app.\n`active` — in flight. `paused` — sequence paused. `completed` — reached the end.\n`stopped` — ended early (e.g. replied). `cancelled` — removed from the source list.\n"},"outcomeReason":{"type":"string","nullable":true,"enum":["responded","positiveResponse","negativeResponse","automatedResponse","bounced","unsubscribed","error"]},"outcomeStepId":{"type":"string","format":"uuid","nullable":true,"description":"The step the contact was on when the outcome was recorded."},"responseCategorisation":{"type":"string","nullable":true,"enum":["positive","negative","automated"],"description":"How a reply from the contact was categorised, if any."},"errorMessage":{"type":"string","nullable":true,"description":"Populated when the enrollment hit an error."},"currentStepId":{"type":"string","format":"uuid","nullable":true},"waitingOn":{"type":"string","nullable":true,"enum":["delay","emailScheduling","emailSent","linkedinMessageSent","linkedinConnectionRequestSent","linkedinConnectionResponse","sequenceTaskDeadline","sequenceTaskDone"]},"lastCompletedStepId":{"type":"string","format":"uuid","nullable":true},"lastCompletedStepName":{"type":"string","nullable":true},"nextActionAt":{"type":"string","format":"date-time","nullable":true},"startedAt":{"type":"string","format":"date-time","nullable":true},"endedAt":{"type":"string","format":"date-time","nullable":true},"outcomeAt":{"type":"string","format":"date-time","nullable":true},"lastUpdatedAt":{"type":"string","format":"date-time","description":"When the enrollment's state last changed."},"archived":{"type":"boolean"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}}}}}
```

## The SequenceProgressSummaryEntry object

```json
{"openapi":"3.0.3","info":{"title":"Zero API","version":"1.12.0"},"components":{"schemas":{"SequenceProgressSummaryEntry":{"type":"object","description":"Aggregate enrollment metrics for a single sequence.","properties":{"sequenceId":{"type":"string","format":"uuid"},"enrolled":{"type":"integer","description":"Total non-archived enrollments."},"waitingForPickUp":{"type":"integer"},"waitingForApproval":{"type":"integer"},"active":{"type":"integer"},"paused":{"type":"integer"},"statusCompleted":{"type":"integer","description":"Enrollments that reached the end of the sequence."},"stopped":{"type":"integer"},"cancelled":{"type":"integer"},"replied":{"type":"integer"},"bounced":{"type":"integer"},"unsubscribed":{"type":"integer"},"error":{"type":"integer","description":"Enrollments whose outcome was specifically `error` (delivery/processing failure)."},"finished":{"type":"integer","description":"Completed + stopped + cancelled."},"activeOrScheduled":{"type":"integer"},"errors":{"type":"integer","description":"All failed-delivery outcomes combined — `error` + `bounced` + `unsubscribed`."},"responseRatePercent":{"type":"number"}}}}}}
```


---

# 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/models.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.
