Update a contact
Edits a contact.
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" }
}
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].
Every failure uses the same shape, with a stable string code you can branch on. See the error reference.
Related
- POST Create a contact
- DELETE Delete a contact
- GET Get a contact
- GET List address books
- GET List contacts