---
title: "Update contact fields"
method: PATCH
path: "/contacts/{id}"
tags: ["Contacts"]
---

# Update contact fields

`PATCH /contacts/{id}`

## Request

- Base URL: `https://www.sagaris.ai/api/v1`
- URL: `https://www.sagaris.ai/api/v1/contacts/{id}`
- Auth: HTTP bearer

Update whitelisted fields of a workspace-owned contact. Uses the same field whitelist and normalizers as the internal edit path and writes contact_field_corrections provenance. Requires the contacts.write scope. `lifecycle` is a GATED CRM stage change, not a plain field: it must respect the stage adjacency rule, advancing to `lead` requires a confirmed meeting on the contact's lead, and advancing to `opportunity` requires a rep-confirmed BANT assessment. An unearned move is refused (422 `meeting_required` / 400 `bant_required`), and an API key can never force past a gate (403 `force_not_permitted`). The data-quality columns (`data_confidence`, `provenance`, `confidence_score`) are SERVER-OWNED: they are derived from the edit itself and stamped at the `public_api` confidence band, so supplying them is ignored rather than persisted.

## Path parameters

- `id` string, uuid, required

## Headers

- `Idempotency-Key` string

## Request body

- object

## Response `200`

The updated contact (public field projection).

- ContactEnvelope
  - `data` Contact, required: The public contact projection returned by list and create.
    - `id` string
    - `email` string, nullable
    - `first_name` string, nullable
    - `last_name` string, nullable
    - `company` string, nullable
    - `job_title` string, nullable
    - `phone` string, nullable
    - `linkedin_url` string, nullable
    - `website` string, nullable
    - `lifecycle` string, nullable
    - `source` string, nullable
    - `tags` string[], nullable
    - `created_at` string, date-time
    - `updated_at` string, date-time
  - `error` unknown, required

## Other responses

- `400`: Invalid JSON body or field validation failure.
- `401`: Missing, malformed, invalid, revoked, or expired API key.
- `403`: The key does not hold the required scope for this operation.
- `404`: The referenced resource was not found in the key's workspace.
- `429`: Per-key write rate limit exceeded (60 requests / 60s).
- `500`: Lookup, update, or provenance-write failure.
- `503`: The database / API-keys table is not provisioned.

---

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