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

# Update contact by ID

`PATCH /contacts/{id}`

Updates the contact with the specified ID.

**Scopes:**
`contacts.write`

## Path parameters

- `id` string, required

## Headers

- `Omnisend-Version` string, required

## Request body

- ContactRequest — Payload for creating or updating a contact.
  - `address` string — Street, house number, apartment number.
  - `birthdate` string — Contact birthdate in YYYY-MM-DD format
  - `city` string — City
  - `country` string — Country name. Used to derive ISO country code when countryCode is not provided
  - `countryCode` string — ISO 3166-1 alpha-2 country code. Takes priority over country when both are provided
  - `createdAt` string — Contact creation timestamp. If provided, stored as "externalCreated" custom property
  - `customProperties` object — You can add your own custom properties. Read more in https://api-docs.omnisend.com/reference/contacts#custom-properties
  - `firstName` string — Contact first name
  - `gender` 'm' | 'f' — Contact gender. m - male, f - female
  - `identifiers` ContactIdentifierRequest[] — Contact identifiers (email and/or phone)
    - `channels` object — Communication channels for this identifier
    - `consent` ContactConsentRequest — Consent record.
      - `createdAt` string — Consent collection timestamp in RFC3339 format. Defaults to current time if not provided
      - `ip` string — IP address at time of consent
      - `source` string — Source of consent
      - `userAgent` string — User agent at time of consent
    - `id` string, required — Identifier value. For email: a valid email address. For phone: full phone number in E.164 format with country code prefix (e.g. +1234567890)
    - `sendWelcomeMessage` boolean — Whether to send a welcome message for this identifier. Defaults to true. Takes effect only if the welcome workflow is enabled.
    - `source` string — Source of the identifier
    - `type` 'email' | 'phone', required — Identifier type
  - `lastName` string — Contact last name
  - `postalCode` string — Postal or zip code
  - `state` string — State or region
  - `tags` string[] — Labels assigned to the contact. When creating a contact, it is strongly advised to include a source tag, e.g. "source: shopify".

## Response `200`

OK

- ContactResponse — Contact resource representation.
  - `address` string — Contact Street, house number, apartment number
  - `birthdate` string — Contact birthdate in YYYY-MM-DD format
  - `city` string — Contact city
  - `consents` Consent[] — Consent records per channel, sorted by collection date (read-only)
    - `channel` 'email' | 'sms' — Channel type this consent applies to
    - `createdAt` string — Consent collection timestamp
    - `ip` string — IP address from which consent was collected
    - `source` string — Source through which consent was obtained (e.g. omnisend-form, api)
    - `userAgent` string — User agent string from the consent collection request
  - `country` string — Contact country name
  - `countryCode` string — ISO 3166-1 alpha-2 country code
  - `createdAt` string — Contact creation timestamp (read-only)
  - `customProperties` object — Custom contact properties defined for the brand
  - `email` string — Primary email address derived from the email identifier (read-only)
  - `firstName` string — Contact first name
  - `gender` 'm' | 'f' — Contact gender
  - `id` string — Contact unique identifier (read-only)
  - `identifiers` Identifier[] — Contact identifiers with channel subscription details
    - `channels` object — Subscription status per channel, keyed by channel name
    - `id` string — Identifier value (email address or phone number)
    - `type` 'email' | 'phone' — Identifier type
  - `lastName` string — Contact last name
  - `optIns` OptIn[] — Opt-in history per channel, sorted by date (read-only)
    - `channel` 'email' | 'sms' — Channel type
    - `optInAt` string — Timestamp when the opt-in was recorded
  - `phone` string[] — Phone numbers derived from phone identifiers (read-only)
  - `postalCode` string — Contact postal or ZIP code
  - `segments` string[] — IDs of segments the contact belongs to (read-only)
  - `state` string — State or province name
  - `status` 'subscribed' | 'unsubscribed' | 'nonSubscribed' — Email channel subscription status derived from the primary email identifier (read-only)
  - `statuses` ContactStatus[] — Most recent subscription status per channel, sorted by date (read-only)
    - `channel` 'email' | 'sms' — Channel type
    - `status` 'subscribed' | 'unsubscribed' | 'nonSubscribed' — Channel subscription status
    - `statusChangedAt` string — Timestamp when the status last changed
  - `tags` string[] — Labels assigned to the contact
  - `updatedAt` string — Contact last updated timestamp (read-only)

## Other responses

- `400` — Request contains invalid or missing fields
- `401` — Authentication is missing or invalid
- `403` — Insufficient permissions for this operation
- `404` — Contact not found
- `409` — Contact identifier already exists
- `410` — API version has been retired
- `429` — Rate limit exceeded
- `500` — Unexpected error occurred

---

[API](https://skmtc.dev/omnisend/apis/events-api.md) · [All operations](https://skmtc.dev/omnisend/apis/events-api/llms.txt) · [OpenAPI document](https://skmtc-service-production.skmtc.workers.dev/v1/apis/omnisend/events-api/revisions/50214fbc283f/schema)
