> ## Documentation Index
> Fetch the complete documentation index at: https://docs.nedzo.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# Contact views

> Saved contact filters. A view is the audience of a campaign.

Every plan can use these endpoints. A view is the same saved filter the Contacts page uses, so it shows up in the dashboard too.

| Method | Path | What it does |
| - | - | - |
| `GET` | `/v1/contacts/views?workspaceId=` | List the workspace's views |
| `POST` | `/v1/contacts/views` | Create a view: `{ "workspaceId", "name", "filters", "sort" }` |
| `GET` | `/v1/contacts/views/{viewId}` | Get a view |
| `PATCH` | `/v1/contacts/views/{viewId}` | Change a view's `name`, `filters` or `sort` |
| `DELETE` | `/v1/contacts/views/{viewId}` | Delete a view |

Each filter is `{ "id", "fieldKey", "operator", "value" }`, the same shape the Contacts page saves. Every filter is checked when you save the view: an unknown `fieldKey`, an operator the field doesn't support, or a missing or badly formatted value gets a `400` that lists each problem. That matters because a view is a campaign's audience, and a filter that doesn't apply would match every contact.

| fieldKey | Type | Operators |
| - | - | - |
| `name`, `email`, `phone`, `company` | text | `contains`, `not_contains`, `equals`, `not_equals`, `is_empty`, `is_not_empty` |
| `tags` | tags (comma-separated names) | `all_of`, `none_of`, `is_empty`, `is_not_empty` |
| `dnd` | yes/no | `equals`, `not_equals` |
| `createdAt`, `lastActivity` | date | `equals`, `not_equals`, `is_greater`, `is_less`, `is_between`, `in_past_days`, `is_empty`, `is_not_empty` |
| `custom:{{FieldName}}` | the custom field's type | the operators for that type; number fields: `equals`, `not_equals`, `is_greater`, `is_less`, `is_empty`, `is_not_empty` |

Values by type:

* **Yes/no** (`dnd` and yes/no custom fields): `Yes` or `No`. `true` and `false` also work, in any case. The view stores `Yes` or `No`, the same as the dashboard, so reading a view back shows `Yes` or `No`. `{ "fieldKey": "dnd", "operator": "equals", "value": "Yes" }` matches contacts on Do Not Disturb.
* **Date**: a day as `YYYY-MM-DD`, for example `2026-01-31`. `is_between` takes two days joined by `..`, start first: `2026-01-01..2026-01-31`. Both days count. `in_past_days` takes a whole number of days, for example `30`.
* **Number**: a number, for example `10` or `-2.5`.
* `is_empty` and `is_not_empty` need no value.

For a custom field, `FieldName` is its name with the spaces removed, for example `custom:{{LeadSource}}` for **Lead Source**. `value` is at most 1,000 characters and `id` at most 64.

A view made through the API shows the account owner as its creator. If the account has no owner, creating a view returns a `409`.

```json Create a view theme={null}
{
  "workspaceId": "789e4567-e89b-12d3-a456-426614174000",
  "name": "VIP leads",
  "filters": [{ "id": "flt_1", "fieldKey": "tags", "operator": "all_of", "value": "vip" }],
  "sort": { "key": "created_at", "direction": "desc" }
}
```


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.