List contacts
Returns a paginated list of contacts in the authenticated workspace. Supports cursor-based pagination, filtering by multiple fields, and configurable sorting.
Authorization
apiKey API key from your nodestash dashboard. Pass as a Bearer token in the Authorization header.
In: header
Query Parameters
Opaque pagination cursor returned as next_cursor in a previous response. Pass this to fetch the next page.
Maximum number of contacts to return per page.
"20"Filter by email address (case-insensitive substring match).
Filter by first name (case-insensitive substring match).
Filter by last name (case-insensitive substring match).
Filter by company ID (exact match).
^co_Filter by source (exact match).
Filter by tags (comma-separated). Contacts must contain all specified tags.
Comma-separated sort fields. Prefix with - for descending order. Supported fields: created_at, updated_at, email, first_name, last_name. Default: -created_at.
Response Body
application/json
application/json
application/json
curl -X GET "https://api.nodestash.io/v1/contacts?email=jane%40acme&first_name=Jane&last_name=Doe&company_id=co_xyz789&source=website&tags=vip%2Cearly-adopter&sort=-created_at"{
"data": [
{
"id": "ct_5hJ3kM9pQrVwXyZaB2cD4",
"type": "contact",
"attributes": {
"id": "ct_5hJ3kM9pQrVwXyZaB2cD4",
"email": "jane@acme.com",
"first_name": "Jane",
"last_name": "Doe",
"phone": "+1-555-0100",
"company_id": "co_xyz789",
"title": "VP of Engineering",
"source": "website",
"custom_fields": {
"plan": "enterprise"
},
"tags": [
"vip",
"early-adopter"
],
"created_at": "2026-01-15T10:30:00Z",
"updated_at": "2026-01-15T10:30:00Z"
}
},
{
"id": "ct_9xK7mN2qTsYvAzCe4fG6",
"type": "contact",
"attributes": {
"id": "ct_9xK7mN2qTsYvAzCe4fG6",
"email": "john@example.com",
"first_name": "John",
"last_name": "Smith",
"phone": null,
"company_id": null,
"title": "Engineer",
"source": "api",
"custom_fields": {},
"tags": [
"lead"
],
"created_at": "2026-01-14T08:00:00Z",
"updated_at": "2026-01-14T08:00:00Z"
}
}
],
"meta": {
"request_id": "req_abc123def456",
"pagination": {
"next_cursor": "eyJjcmVhdGVkX2F0IjoiMjAyNi0wMS0xNFQwODowMDowMFoiLCJpZCI6ImN0Xzl4SzdtTjJxVHNZdkF6Q2U0Zkc2In0",
"has_more": true
}
}
}{
"error": {
"code": "INVALID_API_KEY",
"message": "Missing or invalid Authorization header"
},
"meta": {
"request_id": "req_abc123def456"
}
}{
"error": {
"code": "RATE_LIMITED",
"message": "Rate limit exceeded"
},
"meta": {
"request_id": "req_abc123def456"
}
}Get a contact
Retrieves a single contact by ID. Use the `include` parameter to embed related resources.
Update a contact
Partially updates a contact. Only the provided fields are changed — omitted fields remain untouched. `custom_fields` are **merged** with existing values (not replaced). If `email` is changed, uniqueness within the workspace is enforced.