---
title: "Update a contact"
method: PATCH
path: "/v3/contacts/{id}"
tags: ["Contacts"]
---

# Update a contact

`PATCH /v3/contacts/{id}`

<small>_Requires the `contacts:write` scope (or a broader one that includes it)._</small>

Use this endpoint when you need to change specific fields on an existing contact without resending the whole record. Only the properties present in the request body are updated; omitted properties are left unchanged, while sending an explicit null clears a nullable field. Use it to correct profile data, reassign ownership, or set opt-out, call, and meeting status.

## Path parameters

- `id` integer, required

## Request body

- object — Request model for updating an existing contact. All fields are optional — only include the fields you want to change (PATCH semantics).
  - `email` string, email — Primary email address
  - `firstName` string — First name
  - `lastName` string — Last name
  - `phone` string — Phone number
  - `phone2` string — Secondary phone number
  - `title` string — Job title
  - `company` string — Organization name
  - `companySize` 'Empty' | 'SelfEmployed' | 'Ten' | 'Fifty' | 'TwoHundred' | 'FiveHundred' | 'OneThousand' | 'FiveThousand' | 'TenThousand' | 'OverTenThousand' — Organization employee count range
  - `industry` string — Business sector
  - `city` string — City of residence
  - `state` string — State/province
  - `country` string — Country
  - `timeZoneId` string — Timezone identifier
  - `linkedInUrl` string, uri — LinkedIn profile URL
  - `linkedInSalesNavigatorUrl` string, uri — Sales Navigator URL
  - `linkedInRecruiterUrl` string, uri — Recruiter URL
  - `notes` string — Additional information
  - `isOptedOut` boolean, nullable — Set or clear the contact's opted-out flag (suppresses all communications when `true`).
  - `callStatus` 'none' | 'toCall' | 'called', nullable — Contact-level call status. Set via `PATCH /v3/contacts/{id}` (`callStatus` field). Pass `none` to clear.
  - `meetingStatus` 'none' | 'meetingBooked', nullable — Contact-level meeting status. Set via `PATCH /v3/contacts/{id}` (`meetingStatus` field). Pass `none` to clear.
  - `ownerUserId` integer, nullable — Change the owner of this contact. The new owner must be a member of the caller's team; otherwise the request fails with `404`.
  - `accountId` integer, nullable — ID of the contact account to link this contact to
  - `customFields` object[] — Custom fields to update. Fields can be identified by `id` or `name`. Unlike the response model which uses `key`/`value`, the patch model accepts `id`, `name`, and `value`.
    - `id` integer, nullable — Custom field ID
    - `name` string, nullable — Custom field name (alternative to id)
    - `value` string, nullable — Field content

## Response `200`

Contact updated successfully

- object — Contact response model
  - `id` integer — Unique ID
  - `email` string, email — Primary email address
  - `domain` string — Email domain (derived from email)
  - `firstName` string — First name
  - `lastName` string — Last name
  - `phone` string — Phone number
  - `title` string — Job title
  - `company` string — Organization name
  - `companySize` 'empty' | 'selfEmployed' | 'ten' | 'fifty' | 'twoHundred' | 'fiveHundred' | 'oneThousand' | 'fiveThousand' | 'tenThousand' | 'overTenThousand' — Organization employee count range
  - `industry` string — Business sector
  - `city` string — City of residence
  - `state` string — State/province
  - `country` string — Country
  - `timeZoneId` string — Timezone identifier
  - `linkedInUrl` string, uri — LinkedIn profile URL
  - `linkedInSalesNavigatorUrl` string, uri — Sales Navigator URL
  - `linkedInRecruiterUrl` string, uri — Recruiter URL
  - `phoneStatus` 'pending' | 'invalid' | 'valid' | 'validationFailed' | 'notValidated' — Phone validation status
  - `notes` string — Additional information
  - `ownerUserId` integer — ID of the user who owns this contact
  - `accountId` integer, nullable — ID of the contact account this contact belongs to
  - `isOptedOut` boolean — Whether the contact has opted out of communications
  - `callStatus` 'none' | 'toCall' | 'called' — Contact-level call status. Set via `PATCH /v3/contacts/{id}` (`callStatus` field). Pass `none` to clear.
  - `meetingStatus` 'none' | 'meetingBooked' — Contact-level meeting status. Set via `PATCH /v3/contacts/{id}` (`meetingStatus` field). Pass `none` to clear.
  - `addingDate` string, date-time, nullable — Date the contact was added
  - `createdAt` string, date-time, nullable — Creation timestamp
  - `lastModifiedAt` string, date-time, nullable — Last modification timestamp
  - `customFields` object[] — User-defined fields
    - `key` string, required — Field identifier
    - `value` string, nullable — Field content

## Other responses

- `400` — Validation failure on the route parameter or request body, or a business rule rejection. When the request changes ownership and the supplied `ownerUserId` does not resolve to a member of the caller's team, a `contact.invalidInput` business rejection is returned (the contact itself exists — the invalid value is on the body, not the path).
- `401` — Unauthorized. The response body is empty; check the `WWW-Authenticate` header for the expected scheme.
- `403` — User lacks required feature scope to update this contact
- `404` — Contact not found.
- `429` — Too Many Requests

---

[API](https://skmtc.net/reply/apis/reply-api.md) · [All operations](https://skmtc.net/reply/apis/reply-api/llms.txt) · [OpenAPI document](https://skmtc-service-staging.skmtc.workers.dev/v1/apis/reply/reply-api/revisions/1c3d32eaf95e/schema)
