Tasks
All API requests require a Bearer token in the Authorization header. Contact the Zero team to obtain your API token.
Comma-separated list of fields to return. Defaults to all fields.
id,name,domainJSON-encoded filter object. All top-level conditions are combined with AND logic. Use $or for OR logic.
The available operators depend on the data type of the field you are filtering on.
String fields
Fields like name, domain, description, linkedin, source, externalId, location.
| Operator | Description | Example |
|---|---|---|
| (exact) | Exact match | {"name": "Linear"} |
$eq |
Explicit exact match | {"name": {"$eq": "Linear"}} |
$not |
Not equal | {"source": {"$not": "import"}} |
$in |
Matches any value in array | {"domain": {"$in": ["linear.app", "granola.so"]}} |
$notIn |
Matches none of the values | {"source": {"$notIn": ["import", "api"]}} |
$contains |
Case-insensitive word-boundary substring match | {"name": {"$contains": "YC"}} |
$notContains |
Does not contain | {"name": {"$notContains": "Test"}} |
$containsAny |
Contains any of the given strings | {"name": {"$containsAny": ["YC", "Techstars"]}} |
$startsWith |
Starts with prefix | {"domain": {"$startsWith": "app."}} |
$endsWith |
Ends with suffix | {"email": {"$endsWith": "@zero.inc"}} |
$exists |
Field is present and truthy | {"linkedin": {"$exists": true}} |
$notExists |
Field is absent, null, or empty | {"linkedin": {"$notExists": true}} |
Number fields
Fields like value, confidence.
| Operator | Description | Example |
|---|---|---|
| (exact) | Exact match | {"value": 5000} |
$eq |
Explicit exact match | {"value": {"$eq": 5000}} |
$not |
Not equal | {"value": {"$not": 0}} |
$gt |
Greater than | {"value": {"$gt": 10000}} |
$gte |
Greater than or equal | {"value": {"$gte": 5000}} |
$lt |
Less than | {"value": {"$lt": 10000}} |
$lte |
Less than or equal | {"value": {"$lte": 50000}} |
$in |
Matches any value in array | {"confidence": {"$in": [0.25, 0.5, 0.75]}} |
$notIn |
Matches none of the values | {"confidence": {"$notIn": [0, 1]}} |
$exists |
Field is present and truthy | {"value": {"$exists": true}} |
$notExists |
Field is absent, null, or zero | {"value": {"$notExists": true}} |
Multiple operators can be combined on one field:
{"value": {"$gte": 5000, "$lt": 10000}}
Date fields
Fields like closeDate, startDate, endDate, createdAt, updatedAt.
Values can be ISO 8601 strings ("2026-01-01", "2026-01-01T00:00:00Z") or relative time macros.
Relative time macros: +Nd / -Nd (days), +Nw / -Nw (weeks), +Nm / -Nm (months), +Ny / -Ny (years), +Nh / -Nh (hours), +Ns / -Ns (seconds), now().
| Operator | Description | Example |
|---|---|---|
$gte |
On or after | {"closeDate": {"$gte": "2026-01-01"}} |
$lte |
On or before | {"closeDate": {"$lte": "2026-03-31"}} |
$gt |
After | {"createdAt": {"$gt": "2026-01-01T00:00:00Z"}} |
$lt |
Before | {"createdAt": {"$lt": "now()"}} |
$date |
Exact date match (compares date portion only) | {"closeDate": {"$date": "2026-01-15"}} |
$exists |
Field is present and truthy | {"closeDate": {"$exists": true}} |
$notExists |
Field is absent or null | {"closeDate": {"$notExists": true}} |
Date range example:
{"closeDate": {"$gte": "2026-01-01", "$lte": "2026-03-31"}}
Relative date example (closing in next 30 days):
{"closeDate": {"$gte": "now()", "$lte": "+30d"}}
Array fields
Fields like listIds, ownerIds, contactIds.
| Operator | Description | Example |
|---|---|---|
$includes |
Array contains the given value (use this — bare exact match is not supported) | {"listIds": {"$includes": "<LIST_UUID>"}} |
$notIncludes |
Array does not contain the given value | {"ownerIds": {"$notIncludes": "<USER_UUID>"}} |
$overlaps |
Array contains at least one of the given values | {"ownerIds": {"$overlaps": ["<UUID_1>", "<UUID_2>"]}} |
$notOverlaps |
Array contains none of the given values | {"listIds": {"$notOverlaps": ["<UUID_1>", "<UUID_2>"]}} |
$all |
Array contains all of the given values | {"listIds": {"$all": ["<UUID_1>", "<UUID_2>"]}} |
$length |
Filter by array length (supports nested operators) | {"contactIds": {"$length": {"$gte": 2}}} |
$exists |
Field is present and non-empty | {"ownerIds": {"$exists": true}} |
$notExists |
Field is absent or empty | {"ownerIds": {"$notExists": true}} |
UUID / ID fields
Fields like id, workspaceId, companyId, stage.
| Operator | Description | Example |
|---|---|---|
| (exact) | Exact match | {"stage": "<PIPELINE_STAGE_UUID>"} |
$in |
Matches any value in array | {"stage": {"$in": ["<UUID_1>", "<UUID_2>"]}} |
$notIn |
Matches none of the values | {"stage": {"$notIn": ["<UUID_1>"]}} |
$not |
Not equal | {"stage": {"$not": "<UUID>"}} |
Boolean fields
Fields like archived.
| Operator | Description | Example |
|---|---|---|
| (exact) | Exact match | {"archived": false} |
$not |
Not equal | {"archived": {"$not": true}} |
Logical operators
These work across all data types.
$or — matches if any sub-condition is true:
{
"workspaceId": "<WORKSPACE_UUID>",
"$or": [
{"ownerIds": {"$overlaps": ["<USER_UUID_1>", "<USER_UUID_2>"]}},
{"closeDate": {"$gte": "2026-01-01"}}
]
}
$and — matches if all sub-conditions are true (useful when you need multiple conditions on the same field):
{
"$and": [
{"name": {"$contains": "Enterprise"}},
{"name": {"$notContains": "Test"}}
]
}
Dot-notation (relation filtering)
Use dot-syntax to filter records based on properties of related objects:
{"company.name": "Linear"}
{"company.domain": {"$in": ["linear.app", "granola.so"]}}
{"company.location.city": "San Francisco"}
{"companyProfile.categories": {"$overlaps": ["Sales", "Marketing"]}}
All operators available for the target field's data type can be used with dot-notation.
Custom property filtering
Custom 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.
Filter on custom properties using custom.<COLUMN_ID> with operators appropriate for the column's type.
Note: For
selectandmultiselectcolumns, option values are UUIDs (thekeyfield from the column'soptionsarray). Use the UUID, not the human-readable name.
// Text custom property
{"custom.54e1ca7d-69c3-4b77-8266-8085b5834116": {"$contains": "enterprise"}}
// Select custom property (use the option key UUID)
{"custom.a1b2c3d4-e5f6-7890-abcd-ef1234567890": "3e839b5c-b311-4887-b2da-727d2d75cdd6"}
// Multi-select custom property (use option key UUIDs)
{"custom.b2c3d4e5-f6a7-8901-bcde-f12345678901": {"$overlaps": ["a1b1c1d1-e1f1-1111-aaaa-111111111111", "b2b2c2d2-e2f2-2222-bbbb-222222222222"]}}
// Currency/number custom property
{"custom.c3d4e5f6-a7b8-9012-cdef-123456789012": {"$gte": 100000}}
// Date custom property
{"custom.d4e5f6a7-b8c9-0123-defa-234567890123": {"$gte": "2026-01-01"}}
// Boolean custom property
{"custom.e5f6a7b8-c9d0-1234-efab-345678901234": true}
// Check if custom property has a value
{"custom.f6a7b8c9-d0e1-2345-fabc-456789012345": {"$exists": true}}
Complex example
All top-level keys are ANDed together:
{
"name": {"$contains": "Zero"},
"location.city": "Helsinki",
"location.country": {"$in": ["United Kingdom", "Germany", "Sweden"]},
"value": {"$gte": 10000},
"closeDate": {"$gte": "2026-01-01", "$lte": "2026-03-31"},
"ownerIds": {"$includes": "<USER_UUID>"},
"stage": {"$in": ["<UUID_1>", "<UUID_2>"]},
"lastActivity": {"$exists": true},
"companyProfile.categories": {"$overlaps": ["Sales", "Marketing"]},
"custom.54e1ca7d-69c3-4b77-8266-8085b5834116": {"$contains": "enterprise"}
}
{"stage":"<PIPELINE_STAGE_UUID>"}Maximum number of records to return
100Pagination offset
0JSON string for sort order
{"name":"asc"}Successful response
Authentication failed or token is invalid/expired
content vs description
Tiptap document format
{
"type": "doc",
"content": [
{
"type": "paragraph",
"content": [{"type": "text", "text": "Your text here"}]
}
]
}{
"type": "doc",
"content": [
{
"type": "heading",
"attrs": {"level": 3},
"content": [{"type": "text", "text": "Goal"}]
},
{
"type": "paragraph",
"content": [
{"type": "text", "text": "Complete the "},
{"type": "text", "text": "onboarding proposal", "marks": [{"type": "bold"}]},
{"type": "text", "text": " before Friday."}
]
},
{
"type": "taskList",
"content": [
{
"type": "taskItem",
"attrs": {"checked": false},
"content": [{"type": "paragraph", "content": [{"type": "text", "text": "Review requirements"}]}]
},
{
"type": "taskItem",
"attrs": {"checked": false},
"content": [{"type": "paragraph", "content": [{"type": "text", "text": "Draft document"}]}]
}
]
},
{
"type": "bulletList",
"content": [
{
"type": "listItem",
"content": [{"type": "paragraph", "content": [{"type": "text", "text": "Keep it concise"}]}]
}
]
}
]
}Priority
Linking records
All API requests require a Bearer token in the Authorization header. Contact the Zero team to obtain your API token.
Title of the task. Also used to auto-generate content if content is not provided.
Task title as a Tiptap document. If omitted, auto-generated from name.
Extended notes in Tiptap document format. Supports headings, bullet lists, task lists, and inline formatting.
falsenull = No priority, 1 = Low, 2 = Medium, 3 = High, 4 = Urgent
Task created successfully
Authentication failed or token is invalid/expired
All API requests require a Bearer token in the Authorization header. Contact the Zero team to obtain your API token.
Successful response
Authentication failed or token is invalid/expired
All API requests require a Bearer token in the Authorization header. Contact the Zero team to obtain your API token.
If true, soft deletes (archives) the task instead of permanently deleting it.
falseTask deleted successfully
Hard delete (archive omitted or false): returns 1 on success.
Soft delete (archive=true): returns a single-element array containing the archived task object.
1Authentication failed or token is invalid/expired
All API requests require a Bearer token in the Authorization header. Contact the Zero team to obtain your API token.
All fields are optional. Array fields (contactIds, companyIds, dealIds, assignedToIds) replace the existing array entirely on update.
Replaces the entire task content. Must be a valid Tiptap document.
Replaces the entire description. Must be a valid Tiptap document.
Task updated successfully. Only the fields that were changed are returned in data.
Partial task object containing only the updated fields plus updatedAt and updatedById.
Authentication failed or token is invalid/expired
Last updated

