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

# Update a contact

> Update a contact's name, account, email address, linked projects, or custom field values. Omitted fields are left unchanged.



## OpenAPI

````yaml https://api.parley.so/openapi.json patch /contacts/{id}
openapi: 3.1.1
info:
  title: Parley API
  version: 1.0.0
  description: >-
    Manage Parley's projects (matters or cases), accounts (client
    organizations), contacts (people), tasks, custom fields, notes, files,
    activity, automations, and skills. Records refer to each other as { type,
    id, name } references; writes take IDs. Errors are { error: { code, message,
    details } }, where code names what went wrong and each operation lists the
    codes it can return. In a query string, write a timestamp's offset as Z or
    %2B, because a raw + arrives as a space. The MCP server at /mcp offers the
    same data as a smaller set of tools.
servers:
  - url: https://api.parley.so/v1
security:
  - bearerAuth: []
tags:
  - name: Projects
    description: >-
      A project is a matter or case: it groups the files, notes, activity, and
      tasks for one engagement, and links to the accounts and contacts it
      involves.
  - name: Accounts
    description: >-
      An account is a client organization. Contacts belong to it, and projects
      link to it.
  - name: Contacts
    description: >-
      A contact is a person, optionally belonging to one account and linked to
      projects.
  - name: Tasks
    description: >-
      A task is a to-do with a status, assignee, and due date, optionally about
      one project, account, or contact.
  - name: Fields
    description: >-
      Custom fields defined for projects, accounts, contacts, or tasks. Records
      carry their values in fields, keyed by field name.
  - name: Notes
    description: >-
      Markdown notes on a project, account, or contact. Updates take the version
      you last read, so concurrent edits fail with 409 VERSION_CONFLICT instead
      of overwriting.
  - name: Files
    description: >-
      Files and folders of a project, account, contact, or intake, or the
      organization's Library. Add a file by creating an upload, PUTting its
      bytes, and adding the upload to a location.
  - name: Activity
    description: >-
      What happened across the organization or on one record: changes, links,
      notes, files, USCIS case updates, and synced emails and meetings. Each
      item's kind says which details it carries.
  - name: Sessions
    description: >-
      Conversations with Parley's assistant, from the web app, Word, Outlook,
      automation runs, and the API. Start one with a message, follow up or steer
      it while it works, and read its replies.
  - name: Automations
    description: >-
      Instructions Parley's assistant carries out on a schedule, as the person
      who created them, with nobody present.
  - name: Skills
    description: >-
      Reusable playbooks for Parley's assistant: a SKILL.md plus optional
      bundled documents, addressed by slug.
  - name: Users
    description: The people in your organization, and the caller.
paths:
  /contacts/{id}:
    patch:
      tags:
        - Contacts
      summary: Update a contact
      description: >-
        Update a contact's name, account, email address, linked projects, or
        custom field values. Omitted fields are left unchanged.
      operationId: updateContact
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
            minLength: 1
            description: The contact ID.
      requestBody:
        required: false
        content:
          application/json:
            schema:
              type: object
              properties:
                firstName:
                  type: string
                  minLength: 1
                  description: First name.
                lastName:
                  type: string
                  minLength: 1
                  description: Last name.
                accountId:
                  anyOf:
                    - type: string
                      minLength: 1
                    - type: 'null'
                  description: >-
                    ID of the account the contact belongs to. null removes the
                    contact from its account.
                emails:
                  type: array
                  maxItems: 1
                  items:
                    type: string
                    format: email
                  description: >-
                    The contact's email address, as a list that replaces the
                    current one; [] removes it. A contact has at most one
                    address for now, and an address can belong to only one
                    contact.
                projectIds:
                  type: object
                  properties:
                    add:
                      type: array
                      maxItems: 100
                      items:
                        type: string
                        minLength: 1
                      description: >-
                        IDs of projects to link. IDs that are already linked are
                        ignored. At most 100.
                    remove:
                      type: array
                      maxItems: 100
                      items:
                        type: string
                        minLength: 1
                      description: >-
                        IDs of projects to unlink. IDs that aren't linked are
                        ignored. At most 100.
                  additionalProperties: false
                  description: >-
                    Links to projects to add or remove. Links you don't mention
                    are left unchanged. Each project must be one you can edit.
                    If the contact belongs to an account, that account must be
                    linked to each project too; a project with no accounts gets
                    it linked along with the contact.
                fields:
                  type: object
                  propertyNames:
                    type: string
                    minLength: 1
                  additionalProperties:
                    anyOf:
                      - type: string
                      - type: number
                      - type: boolean
                      - type: array
                        items:
                          type: string
                      - type: object
                        properties:
                          streetAddress:
                            anyOf:
                              - type: string
                              - type: 'null'
                          cityTown:
                            anyOf:
                              - type: string
                              - type: 'null'
                          state:
                            anyOf:
                              - type: string
                              - type: 'null'
                          country:
                            anyOf:
                              - type: string
                              - type: 'null'
                        additionalProperties: false
                      - type: 'null'
                  description: >-
                    Custom field values to set on the contact, keyed by field
                    name or ID. A value replaces the current one, null clears
                    it, and fields you don't mention are left alone. Each value
                    must match its field's type: a string for text, long_text,
                    email, url, single_select (one of the field's options), and
                    user (the id of an active user in the organization); a
                    number; true or false; an ISO 8601 date-time or YYYY-MM-DD
                    date; a list of strings for collection ([] clears it); or {
                    streetAddress, cityTown, state, country } for address. At
                    most 50 fields.
              additionalProperties: false
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Contact'
        '400':
          description: >-
            The request was invalid. VALIDATION_FAILED, INVALID_REFERENCE,
            LINK_CONFLICT, INVALID_FIELD_VALUES.
          content:
            application/json:
              schema:
                oneOf:
                  - $ref: '#/components/schemas/ValidationFailedError'
                  - $ref: '#/components/schemas/InvalidReferenceError'
                  - $ref: '#/components/schemas/LinkConflictError'
                  - $ref: '#/components/schemas/InvalidFieldValuesError'
        '401':
          description: Missing or invalid credentials. UNAUTHORIZED.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/UnauthorizedError'
        '403':
          description: You don't have permission. FORBIDDEN.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ForbiddenError'
        '404':
          description: Not found. NOT_FOUND.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/NotFoundError'
        '409':
          description: The request conflicts with the current state. EMAIL_TAKEN.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/EmailTakenError'
        '429':
          description: Too many requests, or a usage limit was reached. TOO_MANY_REQUESTS.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TooManyRequestsError'
components:
  schemas:
    Contact:
      type: object
      properties:
        id:
          type: string
          minLength: 1
          description: The contact ID.
        firstName:
          type: string
          description: First name. Empty for some contacts created from email.
        lastName:
          type: string
          description: Last name. Empty for some contacts created from email.
        emails:
          type: array
          items:
            type: string
          description: >-
            Email addresses, lowercased. A contact has at most one address for
            now.
        account:
          anyOf:
            - $ref: '#/components/schemas/AccountRef'
            - type: 'null'
          description: The account the contact belongs to, or null.
        projectCount:
          type: integer
          minimum: 0
          maximum: 9007199254740991
          description: >-
            How many projects you can see are linked to the contact. List them
            by filtering projects by contactId. Linking or unlinking a project
            doesn't change the contact's updatedAt.
        createdAt:
          type: string
          format: date-time
          description: When the contact was created.
        updatedAt:
          type: string
          format: date-time
          description: >-
            When the contact was last updated, including changes to its email
            address. Links to projects and field value changes do not change it.
        fields:
          type: object
          propertyNames:
            type: string
          additionalProperties:
            anyOf:
              - type: string
              - type: number
              - type: boolean
              - type: array
                items:
                  type: string
              - type: object
                properties:
                  streetAddress:
                    anyOf:
                      - type: string
                      - type: 'null'
                  cityTown:
                    anyOf:
                      - type: string
                      - type: 'null'
                  state:
                    anyOf:
                      - type: string
                      - type: 'null'
                  country:
                    anyOf:
                      - type: string
                      - type: 'null'
                required:
                  - streetAddress
                  - cityTown
                  - state
                  - country
                description: A postal address. Each part is a string or null.
              - type: 'null'
          description: >-
            Custom field values, keyed by field name, with a key for every field
            defined for contacts (null when unset). The value's shape follows
            the field's type.
      required:
        - id
        - firstName
        - lastName
        - emails
        - account
        - projectCount
        - createdAt
        - updatedAt
        - fields
      examples:
        - id: cmf2x7z3e0002abcd
          firstName: Ada
          lastName: Lovelace
          emails:
            - ada@acme.example
          account:
            type: account
            id: cmf2x7r1p0000abcd
            name: Acme Corp
          projectCount: 1
          createdAt: '2026-09-12T10:05:00.000Z'
          updatedAt: '2026-09-12T10:05:00.000Z'
          fields:
            Contact Type: Beneficiary
            Country of Birth: United Kingdom
    ValidationFailedError:
      type: object
      properties:
        error:
          type: object
          properties:
            code:
              type: string
              const: VALIDATION_FAILED
            message:
              type: string
              examples:
                - The request is invalid.
            details:
              type: object
              properties:
                issues:
                  type: array
                  items:
                    type: object
                    properties:
                      path:
                        type: string
                        description: >-
                          Where the problem is, as a dotted path into the input
                          such as accountIds.add.0 or reminder.remindAt. Empty
                          for the input as a whole.
                      message:
                        type: string
                        description: What is wrong with the value.
                    required:
                      - path
                      - message
                  description: Each problem with the input.
              required:
                - issues
          required:
            - code
            - message
            - details
      required:
        - error
    InvalidReferenceError:
      type: object
      properties:
        error:
          type: object
          properties:
            code:
              type: string
              const: INVALID_REFERENCE
            message:
              type: string
              examples:
                - >-
                  The request refers to a record or user that doesn't exist or
                  that you can't use.
            details:
              type: object
              properties:
                field:
                  type: string
                  description: The input that holds the reference, such as accountIds.
                ids:
                  type: array
                  items:
                    type: string
                  description: The IDs that could not be used.
              required:
                - field
                - ids
          required:
            - code
            - message
            - details
      required:
        - error
    LinkConflictError:
      type: object
      properties:
        error:
          type: object
          properties:
            code:
              type: string
              const: LINK_CONFLICT
            message:
              type: string
              examples:
                - >-
                  A contact's account must be linked to every project the
                  contact is linked to.
            details:
              type: object
              properties:
                reason:
                  enum:
                    - account_not_linked
                    - contacts_still_linked
                  type: string
                  description: >-
                    account_not_linked: a contact would be linked without its
                    account. contacts_still_linked: an account would be unlinked
                    while its contacts stay linked.
                conflicts:
                  type: array
                  items:
                    type: object
                    properties:
                      projectId:
                        type: string
                      contactId:
                        type: string
                      accountId:
                        type: string
                    required:
                      - projectId
                      - contactId
                      - accountId
              required:
                - reason
                - conflicts
          required:
            - code
            - message
            - details
      required:
        - error
    InvalidFieldValuesError:
      type: object
      properties:
        error:
          type: object
          properties:
            code:
              type: string
              const: INVALID_FIELD_VALUES
            message:
              type: string
              examples:
                - Some custom field values were not accepted.
            details:
              type: object
              properties:
                unknownFields:
                  type: array
                  items:
                    type: string
                  description: Keys that are not the name or ID of a field.
                readOnlyFields:
                  type: array
                  items:
                    type: string
                  description: Fields Parley maintains, which cannot be set.
                duplicateFields:
                  type: array
                  items:
                    type: string
                  description: Keys that set a field another key already sets.
                invalidValues:
                  type: array
                  items:
                    type: object
                    properties:
                      field:
                        type: string
                        description: The name or ID the value was given under.
                      expected:
                        type: string
                        description: What the field accepts.
                    required:
                      - field
                      - expected
              required:
                - unknownFields
                - readOnlyFields
                - duplicateFields
                - invalidValues
          required:
            - code
            - message
            - details
      required:
        - error
    UnauthorizedError:
      type: object
      properties:
        error:
          type: object
          properties:
            code:
              type: string
              const: UNAUTHORIZED
            message:
              type: string
              examples:
                - Missing or invalid credentials.
          required:
            - code
            - message
      required:
        - error
    ForbiddenError:
      type: object
      properties:
        error:
          type: object
          properties:
            code:
              type: string
              const: FORBIDDEN
            message:
              type: string
              examples:
                - You don't have permission to do this.
          required:
            - code
            - message
      required:
        - error
    NotFoundError:
      type: object
      properties:
        error:
          type: object
          properties:
            code:
              type: string
              const: NOT_FOUND
            message:
              type: string
              examples:
                - Not found.
          required:
            - code
            - message
      required:
        - error
    EmailTakenError:
      type: object
      properties:
        error:
          type: object
          properties:
            code:
              type: string
              const: EMAIL_TAKEN
            message:
              type: string
              examples:
                - This email address already belongs to another contact.
          required:
            - code
            - message
      required:
        - error
    TooManyRequestsError:
      type: object
      properties:
        error:
          type: object
          properties:
            code:
              type: string
              const: TOO_MANY_REQUESTS
            message:
              type: string
              examples:
                - Too many requests.
          required:
            - code
            - message
      required:
        - error
    AccountRef:
      type: object
      properties:
        type:
          const: account
        id:
          type: string
          description: Its ID.
        name:
          type: string
          description: The account name.
      required:
        - type
        - id
        - name
      description: The account's type, ID, and name.
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
      description: A Parley API key.

````

This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.