---
title: "Update a contact of a recipient"
method: PUT
path: "/api/v1/recipients/{recipient}/contacts/{contact}"
tags: ["Recipients"]
---

# Update a contact of a recipient

`PUT /api/v1/recipients/{recipient}/contacts/{contact}`

## Request

- Base URL: `https://wardenpoint.com` (the document declares no server; this is the origin it was published from)
- URL: `https://wardenpoint.com/api/v1/recipients/{recipient}/contacts/{contact}`
- Auth: API key in header `X-API-Key`

Changes the address, the primary flag or the label of one contact. `is_primary` and `label` keep their stored value when omitted; `value` does NOT — always send it. Omitting `value` is read as "no address", which answers 422 for every type that needs one and clears the address for the externally-bound types (slack, telegram_bot_chat_id, msteams). The contact type cannot be changed here — switching channel means deleting this contact and adding another. Unlike create, the value is NOT re-normalised to E.164: send phone numbers already in E.164. Changing the value of an internal_sip contact re-allocates the extension and the contact is recreated, so the returned uuid differs from the one in the path — re-read it from the response. PATCH is accepted on the same path with identical semantics.

## Path parameters

- `recipient` string, uuid, required
- `contact` string, uuid, required

## Request body

- RecipientContactUpdateRequest: The contact type is fixed by the contact itself and cannot be changed — switching channel means deleting this contact and adding another.
  - `value` string: The new address. Effectively required: an absent value is read as an empty one, which only the externally-bound types accept. Same emptiness rules as on create.
  - `is_primary` boolean: Omit to leave the primary flag as it is. Sending true clears the flag on every other contact of the recipient.
  - `label` string, nullable: Short human note. Omit to keep the stored one; send an empty string to drop it. Sending a label replaces the whole stored metadata object of the contact.

## Response `200`

Updated contact.

- object
  - `data` RecipientContact: One delivery address of a recipient.
    - `uuid` string, uuid
    - `contact_type` string: Slug of the contact type — the same value the write endpoints accept.
    - `value` string: The address itself: a Telegram handle, a phone number in E.164, an email.
    - `is_primary` boolean: The contact preferred when a channel could use more than one of this recipient's addresses. At most one per recipient is primary.
    - `is_active` boolean: Flipped to false automatically after repeated delivery failures.
    - `is_verified` boolean: A bookkeeping flag an operator sets by hand. Nothing in delivery consults it — an unverified contact is used exactly like a verified one, so do not read this as "reachable". `is_active` is the flag that actually gates delivery.
    - `metadata` object, nullable: Free-form data stored with the contact, plus keys we derive ourselves (phone voice zone, the Teams and SIP binding). Returned so a read-modify-write cycle can send it back unchanged.

## Other responses

- `401`: API key missing, invalid, revoked or expired.
- `403`: API key lacks config.write, or the recipient belongs to another company.
- `404`: No such recipient, or the contact belongs to a different recipient.
- `422`: The value is missing for a type that requires one, does not match the contact type, or names an internal_sip extension that is missing or already taken.

---

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