---
title: "Update an existing contact"
method: PATCH
path: "/contacts/{id}"
tags: ["contacts"]
---

# Update an existing contact

`PATCH /contacts/{id}`

Updates an existing contact. Only provided fields are modified.

**Rate limit:** 60 requests per minute

## Path parameters

- `id` string, required

## Request body

- UpdateContactRequestBody
  - `account_external_id` string — The external ID of the account to move the contact to. Cannot be used together with account_id.
  - `account_id` string — The account to move the contact to. If empty string is passed in, the contact will be removed from its account.
  - `avatar_url` string — The avatar URL of the contact. Must be a square .png, .jpg or .jpeg.
  - `custom_fields` CustomFieldValue[] — An array of custom fields to be applied to this contact.
    - `slug` string — The slug of the custom field.
    - `value` string — The value of the custom field. Only to be used for single-valued custom fields. If unset, the custom field will be unset. If the custom field is a select field, the value must be the select option slug, which you can find from the GET /custom-fields endpoint. If the custom field is a relationship field, the value must be the related object ID.
    - `values` string[] — The values of the custom field. Only to be used for multi-valued custom fields (ex. multiselect). If unset, the custom field will be unset. If the custom field is a multiselect field, the values must be the select option slugs which you can find from the GET /custom-fields endpoint.
  - `email` string — The email of the contact. Cannot be used together with the `emails` array field.
  - `emails` UpdateContactEmail[] — The emails of the contact as an array. Cannot be used together with the singular `email` field. Each entry must include an `email` string and an optional `is_primary` boolean. If no email is marked as primary, the first email becomes the primary.
    - `email` string, required — The email address.
    - `is_primary` boolean — Whether this is the primary email address.
  - `external_ids` ExternalID[] — An array of external IDs to be used on this contact. If provided, the contact's external IDs will be updated to the given external IDs.
    - `external_id` string — The external ID. Must be unique per object type (ex. account).
    - `label` string — The label of the external ID. Must be unique per object.
  - `name` string — in: body The name of the contact.
  - `phone_numbers` string[] — The phone numbers of the contact. Must contain only digits 0-9 and be 15 digits or less.
  - `portal_role` 'no_access' | 'member' | 'admin' — The portal role to assign to the contact. Can be one of `no_access`, `member`, or `admin`, or a custom role slug.
  - `portal_role_id` string — The ID of the custom portal role to assign to the contact. Takes precedence over portal_role if provided.
  - `primary_phone_number` string — The primary phone number. Must be in the list of phone_numbers. If there are any phone_numbers and this is not specified, the first phone number will be primary.

## Response `200`

- UpdateContactResponseBody
  - `data` Contact
    - `account` MiniAccount
      - `external_ids` ExternalID[] — External IDs associated with the account.
        - `external_id` string — The external ID. Must be unique per object type (ex. account).
        - `label` string — The label of the external ID. Must be unique per object.
      - `id` string — The ID of the account.
    - `avatar_url` string — Avatar URL of the contact.
    - `custom_fields` object — Custom field values associated with the issue.
    - `email` string — The primary email of the contact, if it exists.
    - `emails` string[] — The list of all emails of the contact.
    - `external_ids` ExternalID[] — External IDs associated with the contact.
      - `external_id` string — The external ID. Must be unique per object type (ex. account).
      - `label` string — The label of the external ID. Must be unique per object.
    - `id` string — The ID of the contact.
    - `integration_user_ids` IntegrationUserID[] — Integration user IDs linking this contact to external systems.
      - `id` string — The user ID in the external system.
      - `source` string — The integration source (e.g., "slack", "intercom", "hubspot").
    - `name` string — The name of the contact.
    - `phone_numbers` string[] — The list of all phone numbers of the contact.
    - `portal_role` 'no_access' | 'member' | 'admin' — Portal role slug assigned to the contact. For backwards compatibility.
    - `portal_role_id` string — The ID of the custom portal role assigned to the contact.
    - `primary_phone_number` string — The primary phone number of the contact, if it exists.
  - `request_id` string — The request ID for tracking.

## Other responses

- `400` — The request was invalid or could not be completed.
- `404`
- `500` — An unexpected internal error occurred.

---

[API](https://skmtc.net/usepylon/apis/pylon-api.md) · [All operations](https://skmtc.net/usepylon/apis/pylon-api/llms.txt) · [OpenAPI document](https://skmtc-service-staging.skmtc.workers.dev/v1/apis/usepylon/pylon-api/versions/999c51740b4e/schema)
