Skip to the documentation
API

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`.

PATCH/contacts/{email}

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
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 }}'
Response
{  "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.

Reference