Create, read, update, and delete contacts in your workspace. All endpoints require a Bearer token — see Authentication for details.
| Method | Path | Description |
|---|---|---|
GET | /api/v1/contacts | List contacts (paginated) |
POST | /api/v1/contacts | Create a contact |
GET | /api/v1/contacts/:id | Get a single contact |
PATCH | /api/v1/contacts/:id | Update a contact (partial) |
DELETE | /api/v1/contacts/:id | Delete a contact |
Returns a paginated list of contacts for the authenticated workspace.
| Field | Type | Required | Description |
|---|---|---|---|
limit | number | optional | Max contacts to return. Default 50, max 200. |
offset | number | optional | Pagination offset. Default 0. |
status | string | optional | 'subscribed' or 'unsubscribed'. Omit for all. |
search | string | optional | Filter contacts whose email contains this substring. |
Creates a new contact. Returns 409 Conflict if the email already exists in the workspace.
| Field | Type | Required | Description |
|---|---|---|---|
email | string | required | Contact email address. Must be unique per workspace. |
first_name | string | optional | Contact's first name. |
last_name | string | optional | Contact's last name. |
status | string | optional | 'subscribed' or 'unsubscribed'. Defaults to 'subscribed'. |
properties | object | optional | Arbitrary key/value metadata. Must be a JSON object. |
Returns a single contact by UUID. Returns 404 if the contact doesn't exist or belongs to a different workspace.
Partially updates a contact. Only include the fields you want to change. The properties field is merged with existing properties rather than replaced. Email cannot be changed after creation.
| Field | Type | Required | Description |
|---|---|---|---|
first_name | string | optional | New first name. |
last_name | string | optional | New last name. |
status | string | optional | 'subscribed' or 'unsubscribed'. |
properties | object | optional | Properties to merge into existing properties. Email cannot be changed. |
Permanently deletes a contact. Returns 204 No Content on success with no response body. Returns 404 if the contact doesn't exist.
All errors return a consistent JSON envelope:
| Status | code | When |
|---|---|---|
400 | invalid_request | Malformed JSON or invalid query params |
400 | validation_error | Missing required field or invalid value |
401 | unauthorized | Missing or invalid API key |
404 | not_found | Contact doesn't exist in this workspace |
409 | conflict | Email already exists in this workspace |
500 | internal_error | Unexpected server error — safe to retry |
See the full Error codes reference for general API errors.