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

# Update a candidate

> Updates the supplied hiring-team assignments and candidate profile fields. Omitted fields are preserved; nullable team IDs clear their assignment, clear_preferred_email clears only when true, and an empty conflict list removes all listed conflicts. Some writable fields are intentionally write-only because the candidate summary RPC does not return them.

<Note>**Beta**: this endpoint may change or be removed without notice while in beta. There is no compatibility promise until it reaches general availability.</Note>


## OpenAPI

````yaml /openapi.json patch /v1/candidates/{candidateId}
openapi: 3.1.0
info:
  title: ModernLoop Platform API
  version: 0.1.0
  description: The ModernLoop Platform API for managing recruiting workflows.
  contact:
    email: support@modernloop.io
servers:
  - url: https://api.modernloop.io
security: []
tags:
  - name: Application
  - name: Candidate
  - name: Interview Event
  - name: Interview Module
  - name: Interviewer
  - name: Job
  - name: Job Stage
  - name: Organization
  - name: Schedule
  - name: Scheduling Task
  - name: Task Queue
  - name: Template
paths:
  /v1/candidates/{candidateId}:
    patch:
      tags:
        - Candidate
      summary: Update a candidate
      description: >-
        Updates the supplied hiring-team assignments and candidate profile
        fields. Omitted fields are preserved; nullable team IDs clear their
        assignment, clear_preferred_email clears only when true, and an empty
        conflict list removes all listed conflicts. Some writable fields are
        intentionally write-only because the candidate summary RPC does not
        return them.
      operationId: updateCandidate
      parameters:
        - schema:
            type: string
            pattern: >-
              ^(?:can_)?(?:[0-9a-fA-F]{32}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$
            description: >-
              a candidate ID. Accepts the canonical prefixed compact UUID, a
              prefixed dashed UUID, a bare dashed UUID, or a bare compact UUID;
              input is case-insensitive.
            example: can_a1b2c3d4e5f64789a1b2c3d4e5f64789
          required: true
          name: candidateId
          in: path
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CandidatePatch'
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Candidate'
        '400':
          description: Bad request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '403':
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '404':
          description: Not found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '409':
          description: Conflict
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '410':
          description: Gone
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '500':
          description: Internal error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
      security:
        - bearerAuth: []
components:
  schemas:
    CandidatePatch:
      type: object
      properties:
        recruiter_id:
          type:
            - string
            - 'null'
          pattern: >-
            ^(?:emp_)?(?:[0-9a-fA-F]{32}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$
          description: >-
            an employee ID. Accepts the canonical prefixed compact UUID, a
            prefixed dashed UUID, a bare dashed UUID, or a bare compact UUID;
            input is case-insensitive.
          example: emp_a1b2c3d4e5f64789a1b2c3d4e5f64789
        coordinator_id:
          type:
            - string
            - 'null'
          pattern: >-
            ^(?:emp_)?(?:[0-9a-fA-F]{32}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$
          description: >-
            an employee ID. Accepts the canonical prefixed compact UUID, a
            prefixed dashed UUID, a bare dashed UUID, or a bare compact UUID;
            input is case-insensitive.
          example: emp_a1b2c3d4e5f64789a1b2c3d4e5f64789
        sourcer_id:
          type:
            - string
            - 'null'
          pattern: >-
            ^(?:emp_)?(?:[0-9a-fA-F]{32}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$
          description: >-
            an employee ID. Accepts the canonical prefixed compact UUID, a
            prefixed dashed UUID, a bare dashed UUID, or a bare compact UUID;
            input is case-insensitive.
          example: emp_a1b2c3d4e5f64789a1b2c3d4e5f64789
        clear_preferred_email:
          type: boolean
          description: True clears the preferred email; omit or false preserves it.
        timezone:
          type: string
          description: Replaces the timezone; omit to preserve.
        preferred_phone_number:
          type: string
          description: Replaces the preferred phone number; omit to preserve. Write-only.
        locale:
          type: string
          description: Replaces the locale; omit to preserve. Write-only.
        conflict_of_interest_employee_ids:
          type: array
          items:
            type: string
            pattern: >-
              ^(?:emp_)?(?:[0-9a-fA-F]{32}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$
            description: >-
              an employee ID. Accepts the canonical prefixed compact UUID, a
              prefixed dashed UUID, a bare dashed UUID, or a bare compact UUID;
              input is case-insensitive.
            example: emp_a1b2c3d4e5f64789a1b2c3d4e5f64789
          description: >-
            Replaces the full conflict-of-interest list; an empty array clears
            it and omission preserves it. Write-only.
      additionalProperties: false
    Candidate:
      type: object
      properties:
        id:
          type: string
          pattern: ^can_[0-9a-f]{32}$
          description: >-
            Canonical candidate ID (can_ followed by 32 lowercase hexadecimal
            UUID characters).
          example: can_a1b2c3d4e5f64789a1b2c3d4e5f64789
        name:
          type: object
          properties:
            full:
              type: string
            given:
              type:
                - string
                - 'null'
            family:
              type:
                - string
                - 'null'
          required:
            - full
            - given
            - family
        primary_email:
          type:
            - string
            - 'null'
          format: email
        additional_emails:
          type:
            - array
            - 'null'
          items:
            type: string
            format: email
          description: >-
            Additional candidate email addresses. Null means PII was redacted
            because the candidate is anonymized; an empty array means no
            additional email addresses.
        phone_numbers:
          type:
            - array
            - 'null'
          items:
            type: string
          description: >-
            Candidate phone numbers. Null means PII was redacted because the
            candidate is anonymized; an empty array means no phone numbers.
        timezone:
          type:
            - string
            - 'null'
        linkedin_url:
          type:
            - string
            - 'null'
          format: uri
        preferred_name:
          type:
            - string
            - 'null'
        recruiter:
          type:
            - object
            - 'null'
          properties:
            id:
              type: string
              pattern: ^emp_[0-9a-f]{32}$
              description: >-
                Canonical employee ID (emp_ followed by 32 lowercase hexadecimal
                UUID characters).
              example: emp_a1b2c3d4e5f64789a1b2c3d4e5f64789
            name:
              type: string
          required:
            - id
            - name
        coordinator:
          type:
            - object
            - 'null'
          properties:
            id:
              type: string
              pattern: ^emp_[0-9a-f]{32}$
              description: >-
                Canonical employee ID (emp_ followed by 32 lowercase hexadecimal
                UUID characters).
              example: emp_a1b2c3d4e5f64789a1b2c3d4e5f64789
            name:
              type: string
          required:
            - id
            - name
        ats:
          type:
            - object
            - 'null'
          properties:
            type:
              type: string
              enum:
                - GREENHOUSE
                - ASHBY
                - LEVER
                - WORKDAY
                - SMARTRECRUITERS
                - GEM
                - KOMBO
            id:
              type: string
          required:
            - type
            - id
        anonymized:
          type: boolean
        created_at:
          type: string
          format: date-time
          description: ISO 8601 timestamp.
        updated_at:
          type: string
          format: date-time
          description: ISO 8601 timestamp.
        app_url:
          type: string
          format: uri
      required:
        - id
        - name
        - primary_email
        - additional_emails
        - phone_numbers
        - timezone
        - linkedin_url
        - preferred_name
        - recruiter
        - coordinator
        - ats
        - anonymized
        - created_at
        - updated_at
        - app_url
    ErrorResponse:
      type: object
      properties:
        error:
          type: object
          properties:
            code:
              type: string
              enum:
                - UNAUTHENTICATED
                - API_ACCESS_DISABLED
                - SCOPE_MISSING
                - INSUFFICIENT_SCOPE
                - VALIDATION_FAILED
                - INVALID_CURSOR
                - PAYLOAD_TOO_LARGE
                - NOT_FOUND
                - NOT_FOUND_MAY_BE_SYNCING
                - CANDIDATE_ANONYMIZED
                - TASK_STAGE_NOT_SCHEDULABLE
                - DUPLICATE_REQUEST_OPEN
                - IDEMPOTENCY_KEY_REQUIRED
                - IDEMPOTENCY_KEY_REUSED
                - PREVIEW_EXPIRED
                - PREVIEW_STALE
                - RATE_LIMITED
                - CONFLICT
                - NOT_IMPLEMENTED
                - INTERNAL
                - UPSTREAM_TIMEOUT
            message:
              type: string
            docs_url:
              type: string
              format: uri
          required:
            - code
            - message
      required:
        - error
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
      description: API tokens are passed as Bearer tokens.

````