---
title: "Edit a contact row's field values"
method: PATCH
path: "/api/v1/ackdb/observe/contacts/{contactId}/fields"
tags: ["ackDB"]
---

# Edit a contact row's field values

`PATCH /api/v1/ackdb/observe/contacts/{contactId}/fields`

## Request

- Base URL: `http://localhost:3009`
- URL: `http://localhost:3009/api/v1/ackdb/observe/contacts/{contactId}/fields`
- Auth: HTTP bearer

Contact-grain equivalent of PATCH /observe/companies/{entityId}/fields (#238). A TRAIT upserts contact_traits; whitelisted attributes (name, email, phone, title, department, linkedin_url, is_external) update the contact row. Computed/event/status fields are rejected per-field. Partial success; manual edits stamped source="manual".

## Path parameters

- `contactId` string, required

## Request body

- object: Field key → new value. Multiple fields allowed.

## Response `200`

The keys that were updated + a per-field error map for any that were rejected.

- AckdbObserveFieldEditResponse: Result of a direct field-value edit (#238). `updated` lists the field keys that were written; `errors` maps each field that was NOT written to a reason - an unknown field, a type/allowedValues violation, or a non-editable field (a computed/derived column, an append-only event/event-field column, or the internal `status` lifecycle enum).
  - `data` object, required
    - `updated` string[], required: Field keys successfully written.
    - `errors` object, required: Field key → rejection/validation reason for fields that were not written.

## Other responses

- `400`: Empty/non-object body, or no field could be updated (BAD_REQUEST; `details.errors` per field).
- `404`: No contact with that contact_id (ENTITY_NOT_FOUND).

---

[API](https://skmtc.dev/floqer/apis/floqer-public-api.md) - [All operations](https://skmtc.dev/floqer/apis/floqer-public-api/llms.txt) - [OpenAPI document](https://skmtc.dev/floqer/apis/floqer-public-api/revisions/fce50dc07b20?raw)
