Update a contact
A partial update, never an upsert. A field you leave out keeps its stored value and an explicit `null` clears it, so `{"notes": null}` empties the notes while `{}` changes nothing. An address not in the book is a `404`.
Runs the real call on your workspace.
PATCH /contacts/{email}
A partial update, never an upsert. A field you leave out keeps its stored value and an explicit null clears it, so {"notes": null} empties the notes while {} changes nothing. An address not in the book is a 404.
Example
Needs contacts:write. URL-encode the @.
curl -X PATCH "$OE/contacts/grace%40example.com" -H "$AUTH" -H 'content-type: application/json' -d '{ "name": "Grace Hopper", "notes": null, "attributes": { "plan": "team", "trialEnds": null }}'{ "object": "contact", "email": "grace@example.com", "name": "Grace Hopper", "source": "manual", "notes": null, "attributes": { "plan": "team" }, "lastSeenAt": null, "createdAt": "2026-09-18T09:00:00.000Z", "updatedAt": "2026-09-18T09:04:00.000Z", "audiences": [ { "id": "aud_9f2c4b7e1a0d63d84c5f2e7b", "name": "All contacts", "builtin": "default" } ]}The address cannot be changed here. It is the identity, the path segment and the unique key of the book, so moving a contact to a new address is a delete and a create.
A contact recorded automatically stays auto after you give it a name. Naming it is not the same claim as somebody having saved it.
Audience membership is untouched. PUT /contacts/{email}/audiences sets it in one call, and the audience routes change one audience at a time.
In attributes a text value sets a custom field and null removes it. Fields you leave out keep what they hold.
Google Workspace