---
title: "Upsert contact"
method: PUT
path: "/v1/contacts/{id}"
tags: ["Owner"]
---

# Upsert contact

`PUT /v1/contacts/{id}`

## Request

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

## Path parameters

- `id` string, required

## Request body

- UpsertContactReq
  - `name` string
  - `phones` E164[]
  - `emails` string[]
  - `relationship` string, nullable
  - `mandateLevel` 'observe' | 'handle' | 'act'
  - `urgent` boolean
  - `consents` object
    - `voiceClone` boolean
    - `extendedCard` boolean
    - `knowsIsAi` boolean

## Response `200`

OK

- Contact
  - `id` string, required
  - `name` string, nullable, required
  - `phones` E164[], required
  - `emails` string[], required
  - `relationship` string, nullable, required
  - `mandateLevel` 'observe' | 'handle' | 'act', required
  - `urgent` boolean, required
  - `consents` object, required
    - `voiceClone` boolean
    - `extendedCard` boolean
    - `knowsIsAi` boolean
  - `provenance` 'owner_stated' | 'owner_confirmed' | 'vicem_inferred' | 'third_party_claimed' | 'system_observed', required
  - `blocked` boolean
  - `optedOut` boolean

## Other responses

- `400`: Invalid request (body not JSON, or schema validation failed).
- `401`: Missing, expired or invalid bearer token.
- `404`: No such resource, or not visible to this caller.
- `413`: Body over the limit (64 KB; 512 KB for contact import).
- `500`: Unexpected server error (reported to Sentry).

---

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