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

# Upsert contact meta

> Writes or removes one key of the contact's custom data (`contactMeta`).
Accepts an operator, the tenant's plugin connection or a plugin installed
on the tenant. Connected operators are notified in real time.



## OpenAPI

````yaml /api/services-api.yaml patch /v1/tenants/{tenantID}/contacts/{contactID}/meta
openapi: 3.0.3
info:
  description: >-
    Talqui is an omnichannel customer service platform that unifies
    conversations from WhatsApp, Instagram, Telegram, and many other channels
    into a single attendant panel, alongside a broader ecosystem of plugins and
    integrations. This API gives developers programmatic access to Talqui's
    services layer, exposing the operations needed to read and manage tenants,
    conversations, plugins, and related resources that power that platform.


    Authentication is available on behalf of an Operator (the default for this
    API), a Plugin Connection, or a Plugin — see the [Talqui authentication
    guide](https://docs.talqui.chat/guides/introduction/authentication/) for how
    each token is obtained and when to use it.


    Need help or have questions not covered here? Reach out to
    support@talqui.com.
  license:
    name: ISC
    url: https://opensource.org/license/isc-license-txt
  title: Talqui - Services API
  version: 0.84.1
servers:
  - description: Production
    url: https://services-api.talqui.chat
security: []
tags:
  - name: Tenants
  - name: Settings
  - name: Analytics/Reports
  - name: Analytics
  - name: Campaigns
  - name: Campaigns/Models
  - name: Contacts
  - name: Contacts/Imports
  - name: Handoff links
  - name: Inboxes
  - name: Messages
  - name: Notifications
  - name: Sessions
  - name: Operators/Shortcuts
  - name: Operators
  - name: Plugins
  - name: Setup
paths:
  /v1/tenants/{tenantID}/contacts/{contactID}/meta:
    patch:
      tags:
        - Contacts
      summary: Upsert contact meta
      description: >-
        Writes or removes one key of the contact's custom data (`contactMeta`).

        Accepts an operator, the tenant's plugin connection or a plugin
        installed

        on the tenant. Connected operators are notified in real time.
      operationId: UpsertContactMetaController
      parameters:
        - in: path
          name: tenantID
          required: true
          schema:
            description: The tenant the contact belongs to.
            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)$
            type: string
        - in: path
          name: contactID
          required: true
          schema:
            description: The contact whose data is written.
            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)$
            type: string
      requestBody:
        content:
          application/json:
            schema:
              additionalProperties: false
              properties:
                metaKey:
                  description: >-
                    Existing key, exactly as stored; or a new key, stored
                    lowercase (letters, digits, "_" and "-").
                  maxLength: 128
                  minLength: 1
                  type: string
                metaValue:
                  description: Value to store; null removes the key.
                  maxLength: 2000
                  nullable: true
                  type: string
              required:
                - metaKey
                - metaValue
              type: object
        required: true
      responses:
        '200':
          content:
            application/json:
              schema:
                additionalProperties: false
                properties:
                  contact:
                    additionalProperties: false
                    description: The contact as stored after the change.
                    properties:
                      contactBlock:
                        description: >-
                          Whether this contact is blocked from starting new
                          sessions.
                        type: boolean
                      contactChannels:
                        description: Channels this contact has interacted through.
                        items:
                          type: string
                        type: array
                      contactEmail:
                        description: Email address of the contact.
                        type: string
                      contactEmailVerified:
                        description: Whether the contact email address has been verified.
                        type: boolean
                      contactExternal:
                        additionalProperties:
                          type: string
                        description: >-
                          External identifiers for this contact, keyed by
                          channel.
                        type: object
                      contactFirstname:
                        description: First name of the contact.
                        type: string
                      contactID:
                        description: Unique identifier for this contact.
                        type: string
                      contactLastSessionID:
                        description: Identifier of the contact most recent session, if any.
                        nullable: true
                        type: string
                      contactLastname:
                        description: Last name of the contact.
                        type: string
                      contactMeta:
                        additionalProperties: {}
                        description: Arbitrary metadata attached to the contact.
                        type: object
                      contactNameVerified:
                        description: Whether the contact name has been verified.
                        type: boolean
                      contactPhone:
                        description: Phone number of the contact.
                        type: string
                      contactPhoneVerified:
                        description: Whether the contact phone number has been verified.
                        type: boolean
                      contactPhoto:
                        description: URL of the contact profile photo, if available.
                        nullable: true
                        type: string
                      contactSummary:
                        description: >-
                          AI-generated summary of the relationship/history with
                          this contact, if available.
                        nullable: true
                        type: string
                      contactTags:
                        description: Tags used for organizing/filtering contacts.
                        items:
                          type: string
                        type: array
                      createdAt:
                        description: When this contact was created.
                        format: date-time
                        type: string
                      organizationID:
                        description: The Talqui organization this contact belongs to.
                        type: string
                      tenantID:
                        description: The tenant this contact belongs to.
                        type: string
                      updatedAt:
                        description: When this contact was last updated.
                        format: date-time
                        type: string
                    required:
                      - organizationID
                      - tenantID
                      - contactID
                      - contactExternal
                      - contactFirstname
                      - contactLastname
                      - contactNameVerified
                      - contactPhone
                      - contactPhoneVerified
                      - contactEmail
                      - contactEmailVerified
                      - contactSummary
                      - contactChannels
                      - contactPhoto
                      - contactTags
                      - contactMeta
                      - contactLastSessionID
                      - contactBlock
                      - createdAt
                      - updatedAt
                    type: object
                required:
                  - contact
                type: object
          description: Response for status 200.
        '400':
          content:
            application/json:
              schema:
                properties:
                  errors:
                    items:
                      oneOf:
                        - $ref: '#/components/schemas/MissingTenantIDError'
                        - $ref: '#/components/schemas/RequestValidationError'
                        - $ref: '#/components/schemas/InvalidContactMetaKeyError'
                    maxItems: 1
                    minItems: 1
                    type: array
                required:
                  - errors
                type: object
          description: >-
            MissingTenantIDError (error_code 1001): tenantID absent from the
            URL. | RequestValidationError (error_code 1002): params or body fail
            schema validation. | InvalidContactMetaKeyError (error_code 1903):
            the key has an unsupported shape.
        '401':
          content:
            application/json:
              schema:
                properties:
                  errors:
                    items:
                      $ref: '#/components/schemas/UnauthorizedError'
                    maxItems: 1
                    minItems: 1
                    type: array
                required:
                  - errors
                type: object
          description: 'UnauthorizedError (error_code 1003): missing/invalid token.'
        '403':
          content:
            application/json:
              schema:
                properties:
                  errors:
                    items:
                      $ref: '#/components/schemas/ForbiddenError'
                    maxItems: 1
                    minItems: 1
                    type: array
                required:
                  - errors
                type: object
          description: >-
            ForbiddenError (error_code 1004): the caller does not work in this
            tenant, or the plugin is not installed on it.
        '404':
          content:
            application/json:
              schema:
                properties:
                  errors:
                    items:
                      oneOf:
                        - $ref: '#/components/schemas/ContactMetaKeyNotFoundError'
                        - $ref: '#/components/schemas/ContactNotFoundError'
                    maxItems: 1
                    minItems: 1
                    type: array
                required:
                  - errors
                type: object
          description: >-
            ContactMetaKeyNotFoundError (error_code 1902): removing a key the
            contact does not have. | ContactNotFoundError (error_code 1204): no
            contact matches for this tenant.
        '500':
          content:
            application/json:
              schema:
                properties:
                  errors:
                    items:
                      $ref: '#/components/schemas/UnknownError'
                    maxItems: 1
                    minItems: 1
                    type: array
                required:
                  - errors
                type: object
          description: >-
            UnknownError (error_code 5999): Unexpected internal error not
            otherwise documented for this endpoint.
components:
  schemas:
    MissingTenantIDError:
      additionalProperties: false
      properties:
        error:
          enum:
            - MissingTenantIDError
          type: string
        error_code:
          enum:
            - 1001
          type: number
        message:
          example: tenantID is required.
          type: string
        statusCode:
          enum:
            - 400
          type: number
      required:
        - statusCode
        - error
        - error_code
        - message
      type: object
    RequestValidationError:
      additionalProperties: false
      properties:
        error:
          enum:
            - RequestValidationError
          type: string
        error_code:
          enum:
            - 1002
          type: number
        fields:
          items:
            additionalProperties: false
            properties:
              allowed:
                type: string
              field:
                type: string
              received:
                type: string
            required:
              - field
              - received
              - allowed
            type: object
          type: array
        message:
          example: Invalid request data.
          type: string
        statusCode:
          enum:
            - 400
          type: number
      required:
        - statusCode
        - error
        - error_code
        - message
        - fields
      type: object
    InvalidContactMetaKeyError:
      additionalProperties: false
      properties:
        error:
          enum:
            - InvalidContactMetaKeyError
          type: string
        error_code:
          enum:
            - 1903
          type: number
        message:
          example: The contact data key is not valid.
          type: string
        statusCode:
          enum:
            - 400
          type: number
      required:
        - statusCode
        - error
        - error_code
        - message
      type: object
    UnauthorizedError:
      additionalProperties: false
      properties:
        error:
          enum:
            - UnauthorizedError
          type: string
        error_code:
          enum:
            - 1003
          type: number
        message:
          example: You are not authorized to perform this request.
          type: string
        statusCode:
          enum:
            - 401
          type: number
      required:
        - statusCode
        - error
        - error_code
        - message
      type: object
    ForbiddenError:
      additionalProperties: false
      properties:
        error:
          enum:
            - ForbiddenError
          type: string
        error_code:
          enum:
            - 1004
          type: number
        message:
          example: You do not have access to this resource.
          type: string
        statusCode:
          enum:
            - 403
          type: number
      required:
        - statusCode
        - error
        - error_code
        - message
      type: object
    ContactMetaKeyNotFoundError:
      additionalProperties: false
      properties:
        error:
          enum:
            - ContactMetaKeyNotFoundError
          type: string
        error_code:
          enum:
            - 1902
          type: number
        message:
          example: The contact has no data under this key.
          type: string
        statusCode:
          enum:
            - 404
          type: number
      required:
        - statusCode
        - error
        - error_code
        - message
      type: object
    ContactNotFoundError:
      additionalProperties: false
      properties:
        error:
          enum:
            - ContactNotFoundError
          type: string
        error_code:
          enum:
            - 1204
          type: number
        message:
          example: Contact not found.
          type: string
        statusCode:
          enum:
            - 404
          type: number
      required:
        - statusCode
        - error
        - error_code
        - message
      type: object
    UnknownError:
      additionalProperties: false
      properties:
        error:
          enum:
            - UnknownError
          type: string
        error_code:
          enum:
            - 5999
          type: number
        message:
          example: For some unknown reason your request has not succeeded.
          type: string
        statusCode:
          enum:
            - 500
          type: number
      required:
        - statusCode
        - error
        - error_code
        - message
      type: object

````

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