Contacts

Update a contact

Edits a contact.

PATCH /v1/contacts/:id

Permission

The key must be granted contacts.write

A key without it gets 403 insufficient_scope, with the missing permission named in details.

Path parameters

Field Type Description
id required string The contact to change.

Request body

Send only what changes; fields you omit are left alone. Sending emails or phones replaces that whole list rather than adding to it, so read the contact first if you mean to append.

Field Type Description
name required string The display name. Required when creating.
address_book_id string Which book to file it in. Defaults to the mailbox's own book.
given_name string
family_name string
emails object[] Replaces the whole list. Its fields are below.
phones object[] Replaces the whole list. Its fields are below.
organization string
title string
notes string

Each item in emails

Field Type Description
address required string
type string

Each item in phones

Field Type Description
number required string
type string

Request

curl https://api.veruapis.com/v1/contacts/:id \
  -X PATCH \
  -H "Authorization: Bearer vak_live_..." \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Content-Type: application/json" \
  -d '{
  "title": "Head of Buying",
  "emails": [
    { "address": "[email protected]", "type": "work" },
    { "address": "[email protected]", "type": "work" }
  ]
}'

Idempotency-Key is required on every write. Retrying with the same key returns the original response rather than repeating the operation, so a timeout is something you retry rather than something you investigate.

Response

Field Type Description
id string
address_book_id string Which book holds it.
name string The display name. Core calls this formatted_name; it is name here, because that is what every other resource in this API calls the human-readable string.
given_name string
family_name string
emails object[] Addresses, in stored order. The first is the one to compose to. Its fields are below.
phones object[] Numbers, in stored order. Its fields are below.
organization string
title string Their job title, not a name prefix.
notes string
created_at RFC 3339
updated_at RFC 3339

Each item in emails

Field Type Description
address required string
type string A label such as work or home. Free text, not a closed set.

Each item in phones

Field Type Description
number required string
type string A label such as cell or work.
{
  "data": {
  "id": "01918e4b-2101-7f11-b4a9-0242ac130003",
  "name": "Bob Smith",
  "title": "Head of Buying",
  "emails": [
    { "address": "[email protected]", "type": "work" },
    { "address": "[email protected]", "type": "work" }
  ],
  "updated_at": "2026-09-10T08:15:00Z"
},
  "meta": { "request_id": "req_01j8z9...", "timestamp": "2026-09-02T10:00:00Z" }
}
Worth knowing

Fields you leave out are left alone, but a list you do send replaces the whole list. Adding an address means sending the existing ones with it, which is why the example repeats [email protected].

Errors

Every failure uses the same shape, with a stable string code you can branch on. See the error reference.

Related

PATCH /v1/contacts/:id

id
Sends this body to your own workspace, for real. Edit it before running.