POST /search).
Endpoints
| Method | Path | Purpose |
|---|---|---|
GET | /people | List, paginated |
POST | /people | Create |
GET | /people/:id | Fetch one. ?expand=primary_company inlines the company |
PATCH | /people/:id | Update |
DELETE | /people/:id | Delete |
POST | /people/search | Filter, sort, paginate |
Fields
| Field | Type | Notes |
|---|---|---|
id | uuid | Server-assigned |
email | string | null | Indexed (case-insensitive) |
first_name, last_name | string | null | |
primary_company_id | uuid | null | Reference to a companies row |
custom_attributes | object | Validated by the schema engine |
created_at, updated_at | datetime |
Create
Expand the company
primary_company using the same snake_case serializer the /companies endpoint uses — no Drizzle field names leak through.
Search
POST /people/search accepts a filter body. Operators: equals | not_equals | contains | gt | gte | lt | lte | is_null. Combinators: and | or (top-level only in v1). Custom attribute fields addressed via custom_attributes.<key>.
{ data, next_cursor } envelope as the list endpoint.