> ## Documentation Index
> Fetch the complete documentation index at: https://docs.goliathdata.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Update Contact

> Patch an existing contact by ID.

`POST …/contacts/update`

Synchronously update an existing contact. All fields are optional except `contact_id`. Only fields you provide are changed — this is a patch-style update, not a full replace.

This endpoint is **synchronous** — the response confirms the update inline.

***

## Request

```bash theme={null}
POST {WEBHOOK_BASE_URL}/{token}/contacts/update
Content-Type: application/json
```

```json theme={null}
{
  "contact_id": "a1b2c3d4-0000-0000-0000-000000000000",
  "phone_number": "5550000002",
  "contact_email": "john.new@example.com",
  "tags": ["follow-up"],
  "note": "Called on March 19 — interested in selling.",
  "contributors": ["Sarah Smith"]
}
```

***

## Body fields

| Field             | Type          | Required | Description                                                             |
| ----------------- | ------------- | -------- | ----------------------------------------------------------------------- |
| `contact_id`      | string (UUID) | Yes      | ID of the contact to update                                             |
| `full_name`       | string        | No       | Replaces the contact's name                                             |
| `phone_number`    | string        | No       | Adds the number or bumps an existing one to verified                    |
| `contact_email`   | string        | No       | Added if not already present                                            |
| `contact_address` | string        | No       | Added as a linked property                                              |
| `note`            | string        | No       | Creates a new note on the contact                                       |
| `tags`            | string\[]     | No       | Adds new tags — existing tags are not removed. Case-insensitive dedupe. |
| `source`          | string        | No       | Ensures the source option exists and sets it on the contact             |
| `contributors`    | string\[]     | No       | Adds users as participants — skips anyone already on the contact        |

<Note>
  `first_name` and `last_name` are supported but deprecated. Use `full_name` instead.
</Note>

<Note>
  This endpoint does not require the calling user to be an org admin or assigned contributor. Inbound webhooks bypass the standard ownership gate.
</Note>

***

## Behavior details

* **Phone** — if the number already exists on the contact, it is bumped to verified status. If it is new, it is added.
* **Email** — added only if not already present. No deduplication beyond exact match.
* **Tags** — only new tags are added. Existing tags are never removed.
* **Contributors** — users are resolved by full name within the org. Users already on the contact are skipped.
* **Address** — Goliath attempts to resolve the address to a known property (`tryToFindPropertyId: true`).

***

## Responses

**Success**

```json theme={null}
200 OK

{
  "success": true,
  "contact_id": "a1b2c3d4-0000-0000-0000-000000000000"
}
```

***

## Error responses

| Status | Cause                                        |
| ------ | -------------------------------------------- |
| `400`  | `contact_id` is missing                      |
| `401`  | Invalid or inactive token                    |
| `404`  | No contact found with the given `contact_id` |
