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

> Correct a person’s display name, phone, email or WhatsApp user id while they are a candidate or parked. Use to fix bad data before the next send.

# Correct a person's name or the handles the sequence sends to



## OpenAPI

````yaml patch /sequences/{sequenceId}/contacts/{contactId}
openapi: 3.1.0
info:
  title: OpenCX API
  description: >

    OpenCX is an AI-powered, all-in-one platform for customer support and
    outbound communications.


    Use this API to manage your OpenCX organization's AI agents, actions,
    conversations, contacts, and more.


    To get started, generate a new API key from the dashboard.


    ## Authentication

    All API endpoints require authentication using a Bearer token. You can
    generate an API key from your OpenCX dashboard.


    ## Rate Limiting

    API requests are rate limited to ensure fair usage. The current limits are:

    - 100 requests per minute for standard endpoints

    - 1000 requests per minute for streaming endpoints


    ## Error Handling

    The API uses standard HTTP status codes and returns detailed error messages
    in the response body.
  version: 1.0-beta
  license:
    name: MIT
    url: https://opensource.org/licenses/MIT
servers:
  - url: http://localhost:8080
    description: Development
  - url: https://api.open.cx
    description: Production
security:
  - bearerAuth: []
paths:
  /sequences/{sequenceId}/contacts/{contactId}:
    patch:
      summary: Correct a person's name or the handles the sequence sends to
      description: >-
        Editable only while they are a candidate or parked — once someone is
        sending, a claim may already be addressed to the handle on the row.
        Handles are normalized the same way enrollment normalizes them, and a
        handle already held by someone else in this sequence is refused by name
        rather than surfacing a unique-index error.
      operationId: updateSequenceContact
      parameters:
        - schema:
            type: string
            format: uuid
            pattern: >-
              ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          in: path
          name: sequenceId
          required: true
          description: The unique identifier of the sequence
        - schema:
            type: string
            format: uuid
            pattern: >-
              ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
          in: path
          name: contactId
          required: true
          description: The person's contact id (from enroll results or the people list)
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/UpdateSequenceContactDto'
      responses:
        '200':
          description: Default Response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/SequenceContactDto'
        '500':
          description: Internal Server Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorDto'
components:
  schemas:
    UpdateSequenceContactDto:
      $schema: https://json-schema.org/draft/2020-12/schema
      $id: '#/components/schemas/UpdateSequenceContactDtoInput'
      type: object
      properties:
        display_name:
          anyOf:
            - type: string
              maxLength: 200
            - type: 'null'
        phone:
          anyOf:
            - type: string
              maxLength: 50
            - type: 'null'
        email:
          anyOf:
            - type: string
              maxLength: 320
            - type: 'null'
        whatsapp_user_id:
          anyOf:
            - type: string
              maxLength: 64
            - type: 'null'
    SequenceContactDto:
      $schema: https://json-schema.org/draft/2020-12/schema
      $id: '#/components/schemas/SequenceContactDto'
      type: object
      properties:
        contact_id:
          type: string
          format: uuid
          pattern: >-
            ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
        display_name:
          anyOf:
            - type: string
            - type: 'null'
        avatar_url:
          anyOf:
            - type: string
            - type: 'null'
        phone:
          anyOf:
            - type: string
            - type: 'null'
        email:
          anyOf:
            - type: string
            - type: 'null'
        whatsapp_user_id:
          anyOf:
            - type: string
            - type: 'null'
        status:
          type: string
          enum:
            - candidate
            - active
            - parked
            - exited
            - completed
        park_reason:
          anyOf:
            - type: string
            - type: 'null'
        exit_reason:
          anyOf:
            - type: string
            - type: 'null'
        fit:
          anyOf:
            - type: integer
              minimum: -9007199254740991
              maximum: 9007199254740991
            - type: 'null'
        fit_reason:
          anyOf:
            - type: string
            - type: 'null'
        batch_key:
          anyOf:
            - type: string
            - type: 'null'
        source:
          type: string
        next_step_index:
          type: integer
          minimum: -9007199254740991
          maximum: 9007199254740991
        journey:
          type: array
          items:
            type: object
            properties:
              step_index:
                type: integer
                minimum: -9007199254740991
                maximum: 9007199254740991
              channel:
                type: string
              state:
                type: string
                enum:
                  - not_reached
                  - waiting
                  - parked
                  - deferred
                  - skipped
                  - sent
                  - delivered
                  - read
                  - replied
                  - answered
                  - no_answer
                  - busy
                  - failed
              at:
                anyOf:
                  - type: string
                    format: date-time
                    pattern: >-
                      ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$
                  - type: 'null'
              session_id:
                anyOf:
                  - type: string
                  - type: 'null'
              session_ticket_number:
                anyOf:
                  - type: integer
                    minimum: -9007199254740991
                    maximum: 9007199254740991
                  - type: 'null'
              reason:
                type: string
            required:
              - step_index
              - channel
              - state
              - at
              - session_id
              - session_ticket_number
            additionalProperties: false
        created_at:
          type: string
          format: date-time
          pattern: >-
            ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$
        updated_at:
          type: string
          format: date-time
          pattern: >-
            ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$
        timezone:
          anyOf:
            - type: string
            - type: 'null'
        source_detail:
          anyOf:
            - type: string
            - type: 'null'
        qualification:
          anyOf:
            - type: object
              properties:
                run_id:
                  type: string
                  format: uuid
                  pattern: >-
                    ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
                judged_at:
                  type: string
                  format: date-time
                  pattern: >-
                    ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$
                input_hash:
                  type: string
                criteria:
                  type: object
                  properties:
                    must:
                      maxItems: 20
                      type: array
                      items:
                        type: object
                        properties:
                          label:
                            type: string
                            minLength: 2
                            maxLength: 60
                            description: >-
                              A few words naming this criterion, shown in the
                              dashboard — "Recent invoicing complaint",
                              "Business account". Not a sentence.
                          text:
                            type: string
                            minLength: 3
                            maxLength: 500
                            description: >-
                              The full instruction the judge reads. Name the
                              boundary explicitly — what counts and what does
                              not. Never shown in the table.
                        required:
                          - label
                          - text
                        additionalProperties: false
                    nice:
                      maxItems: 20
                      type: array
                      items:
                        type: object
                        properties:
                          label:
                            type: string
                            minLength: 2
                            maxLength: 60
                            description: >-
                              A few words naming this criterion, shown in the
                              dashboard — "Recent invoicing complaint",
                              "Business account". Not a sentence.
                          text:
                            type: string
                            minLength: 3
                            maxLength: 500
                            description: >-
                              The full instruction the judge reads. Name the
                              boundary explicitly — what counts and what does
                              not. Never shown in the table.
                          grade:
                            type: string
                            enum:
                              - high
                              - medium
                              - low
                        required:
                          - label
                          - text
                          - grade
                        additionalProperties: false
                  required:
                    - must
                    - nice
                  additionalProperties: false
                verdicts:
                  type: array
                  items:
                    type: object
                    properties:
                      kind:
                        type: string
                        enum:
                          - must
                          - nice
                      label:
                        type: string
                      text:
                        type: string
                      grade:
                        type: string
                        enum:
                          - high
                          - medium
                          - low
                      verdict:
                        type: string
                        enum:
                          - pass
                          - fail
                          - unsure
                      reasoning:
                        type: string
                      citations:
                        type: array
                        items:
                          type: object
                          properties:
                            enricher:
                              type: string
                            kind:
                              type: string
                            id:
                              type: string
                          required:
                            - enricher
                            - kind
                            - id
                          additionalProperties: false
                    required:
                      - kind
                      - label
                      - text
                      - verdict
                      - reasoning
                      - citations
                    additionalProperties: false
                counts:
                  type: object
                  properties:
                    must_total:
                      type: integer
                      minimum: -9007199254740991
                      maximum: 9007199254740991
                    must_passed:
                      type: integer
                      minimum: -9007199254740991
                      maximum: 9007199254740991
                    must_failed:
                      type: integer
                      minimum: -9007199254740991
                      maximum: 9007199254740991
                    must_unsure:
                      type: integer
                      minimum: -9007199254740991
                      maximum: 9007199254740991
                    nice_total:
                      type: integer
                      minimum: -9007199254740991
                      maximum: 9007199254740991
                    nice_weight_total:
                      type: integer
                      minimum: -9007199254740991
                      maximum: 9007199254740991
                    nice_weight_earned:
                      type: integer
                      minimum: -9007199254740991
                      maximum: 9007199254740991
                    nice_unsure:
                      type: integer
                      minimum: -9007199254740991
                      maximum: 9007199254740991
                  required:
                    - must_total
                    - must_passed
                    - must_failed
                    - must_unsure
                    - nice_total
                    - nice_weight_total
                    - nice_weight_earned
                    - nice_unsure
                  additionalProperties: false
              required:
                - run_id
                - judged_at
                - input_hash
                - criteria
                - verdicts
                - counts
              additionalProperties: false
            - type: 'null'
        enrichment:
          anyOf:
            - type: object
              propertyNames:
                type: string
              additionalProperties: {}
            - type: 'null'
        next_eligible_at:
          anyOf:
            - type: string
              format: date-time
              pattern: >-
                ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$
            - type: 'null'
        next_channel:
          anyOf:
            - type: string
            - type: 'null'
      required:
        - contact_id
        - display_name
        - avatar_url
        - phone
        - email
        - whatsapp_user_id
        - status
        - park_reason
        - exit_reason
        - fit
        - fit_reason
        - batch_key
        - source
        - next_step_index
        - journey
        - created_at
        - updated_at
        - timezone
        - source_detail
        - qualification
        - enrichment
        - next_eligible_at
        - next_channel
      additionalProperties: false
    ErrorDto:
      type: object
      properties:
        statusCode:
          type: integer
        message:
          type: string
        error:
          type: string
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
      bearerFormat: JWT

````