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

# Update Custom Property

> This endpoint updates the name, section or mandatory flag of a custom property

Provide any combination of the three fields - at least one is required. If the section does not exist yet, it is created automatically

Options for dropdown and picklist properties are managed separately via the Update Property Options endpoint

_`mandatory` is supported only for ticket properties. Passing `mandatory: true` for a chat property returns a validation error_

_If the same property name exists under both chat and ticket, pass the `type` query parameter to specify which one to update. Without it, the request is rejected as ambiguous_




## OpenAPI

````yaml POST /properties/{property_id}
openapi: 3.0.3
info:
  title: API - Local
  description: >-
    #### Welcome to the official Postman collection of Periskope API


    Periskope APIs enable you automate actions on your WhatsApp phone, and the
    Periskope platform


    - Read more about the APIs & webhooks here -
    [https://docs.periskope.app/api-reference/introduction](https://docs.periskope.app/api-reference/introduction)
        
    - We encourage responsible usage of the APIs. Follow these best practices
    and recommendations for safe actions on WhatsApp -
    [https://docs.periskope.app/get-started/best-practices](https://docs.periskope.app/get-started/best-practices)
        

    #### Getting Started


    ##### Pre-requisites:


    1. **Sign up for a free account on Periskope:** To use the Periskope API,
    you need to have an active Periskope account. If you don’t have one, you can
    sign up for a 7-day free trial [here](https://console.periskope.app).
        
    2. **Scan the QR code from WhatsApp to connect your phone:** A connected
    phone is required to use the APIs
        
    3. **Go to** [Settings &gt;
    API](https://console.periskope.app/settings/api), and generate an API key
    for your organization - The API key is used to authenticate every request.
    Please keep this secure
        

    ##### Using Postman:


    1. **Fork the collection so you can edit values and test the APIs in your
    own postman environment:** To fork the collection, click on the three dots
    next to v1. Then click on create a fork (_shortcut: Ctrl + Alt + F)._
        
    2. **Update the value of the variables in the collection:**  
        \- Update the API key with the key generated in Step 3  
        \- Update the phone number with your connected number. This number will be added to the `x-phone` header across requests
        
        It must be in the format of country code+number, with no special characters or spaces _e.g. +91 98745 32456 becomes 919874532456_
        

    For any help or feedback, please contact us at
    [support@periskope.app](https://mailto:support@periskope.app), or ping us on
    [WhatsApp](https://what.sapp.link/periskope)
  version: 1.0.0
  contact: {}
servers:
  - url: https://api.periskope.app/v1
security:
  - bearerAuth: []
tags:
  - name: contacts
  - name: tickets
  - name: tasks
  - name: phones
  - name: message
  - name: queue
  - name: chats
  - name: group
  - name: members
  - name: webhooks
  - name: custom properties
paths:
  /properties/{property_id}:
    post:
      tags:
        - custom properties
      summary: Update Custom Property
      description: >
        This endpoint updates the name, section or mandatory flag of a custom
        property


        Provide any combination of the three fields - at least one is required.
        If the section does not exist yet, it is created automatically


        Options for dropdown and picklist properties are managed separately via
        the Update Property Options endpoint


        _`mandatory` is supported only for ticket properties. Passing
        `mandatory: true` for a chat property returns a validation error_


        _If the same property name exists under both chat and ticket, pass the
        `type` query parameter to specify which one to update. Without it, the
        request is rejected as ambiguous_
      operationId: updateCustomProperty
      parameters:
        - name: property_id
          in: path
          required: true
          schema:
            type: string
          description: >-
            The property_id (e.g. property-xxxx) or the property_name of the
            custom property
        - name: type
          in: query
          required: false
          schema:
            type: string
            enum:
              - chat
              - ticket
          example: ticket
          description: >-
            Specifies whether to resolve the chat or the ticket property when
            the same name exists under both
      requestBody:
        content:
          application/json:
            schema:
              type: object
              properties:
                name:
                  type: string
                  example: Workspace ID
                  description: |-
                    - The new name of the property
                    - Must be unique within its type
                section:
                  type: string
                  example: Issue Details
                  description: |-
                    - The name of the section to move the property to
                    - Created automatically if it does not exist
                mandatory:
                  type: boolean
                  example: true
                  description: >-
                    - Whether the property is mandatory

                    - Supported only for ticket properties; rejected for chat
                    properties
      responses:
        '200':
          description: 200 OK
          content:
            application/json:
              schema:
                type: object
                properties:
                  success:
                    type: boolean
                    example: true
                  message:
                    type: string
                    example: Custom property updated
                  data:
                    type: object
                    properties:
                      property_id:
                        type: string
                        example: property-a1b2c3
                        description: The unique identifier of the property
                      property_name:
                        type: string
                        example: Workspace
                        description: The name of the property
                      type:
                        type: string
                        enum:
                          - chat
                          - ticket
                        example: ticket
                        description: The type the property belongs to
                      kind:
                        type: string
                        example: dropdown
                        description: >-
                          The value kind of the property - text, date, file,
                          dropdown or picklist
                      mandatory:
                        type: boolean
                        example: false
                        description: >-
                          Whether the property is mandatory. Applicable to
                          ticket properties only
                      section_id:
                        type: string
                        nullable: true
                        example: 3f8b6c1e-8f2a-4b6e-9c3d-2a1f0e9d8c7b
                        description: >-
                          The id of the section the property belongs to, or null
                          if it is not in a section
                      section_name:
                        type: string
                        nullable: true
                        example: Issue Details
                        description: >-
                          The name of the section the property belongs to, or
                          null if it is not in a section
                      options:
                        type: array
                        description: >-
                          The current option list. Present only for dropdown and
                          picklist kinds
                        items:
                          type: object
                          properties:
                            id:
                              type: string
                              example: '1712345678901'
                            label:
                              type: string
                              example: Acme Corp
                      created_at:
                        type: string
                        example: '2026-07-06T10:00:00.000Z'
                        description: When the property was created
        '404':
          description: No matching property
          content:
            application/json:
              schema:
                type: object
                properties:
                  code:
                    type: string
                    example: NOT_FOUND_ERROR
                  message:
                    type: string
                    example: No custom property found matching "Workspace"
                  status:
                    type: number
                    example: 404
              examples:
                No matching property:
                  value:
                    code: NOT_FOUND_ERROR
                    message: No custom property found matching "Workspace"
                    status: 404
        '409':
          description: New name already exists for this type
          content:
            application/json:
              schema:
                type: object
                properties:
                  code:
                    type: string
                    example: CONFLICT_ERROR
                  message:
                    type: string
                    example: >-
                      A ticket custom property named "Workspace ID" already
                      exists
                  status:
                    type: number
                    example: 409
              examples:
                New name already exists for this type:
                  value:
                    code: CONFLICT_ERROR
                    message: >-
                      A ticket custom property named "Workspace ID" already
                      exists
                    status: 409
        '422':
          description: Ambiguous name with no type given
          content:
            application/json:
              schema:
                type: object
                properties:
                  code:
                    type: string
                    example: VALIDATION_ERROR
                  message:
                    type: string
                    example: >-
                      "Workspace" matches multiple custom properties (chat and
                      ticket). Pass ?type=chat|ticket, or use the property_id,
                      to disambiguate.
                  status:
                    type: number
                    example: 422
                  fields:
                    type: object
                    properties:
                      property_id:
                        type: object
                        properties:
                          message:
                            type: string
                            example: >-
                              "Workspace" matches multiple custom properties
                              (chat and ticket). Pass ?type=chat|ticket, or use
                              the property_id, to disambiguate.
              examples:
                Ambiguous name with no type given:
                  value:
                    code: VALIDATION_ERROR
                    message: >-
                      "Workspace" matches multiple custom properties (chat and
                      ticket). Pass ?type=chat|ticket, or use the property_id,
                      to disambiguate.
                    status: 422
                    fields:
                      property_id:
                        message: >-
                          "Workspace" matches multiple custom properties (chat
                          and ticket). Pass ?type=chat|ticket, or use the
                          property_id, to disambiguate.
      x-codeSamples:
        - lang: TypeScript
          label: Node.js
          source: |-
            import { PeriskopeApi } from '@periskope/periskope-client';

            const client = new PeriskopeApi({
              authToken: 'YOUR_API_KEY',
              phone: 'YOUR_PHONE_NUMBER', // e.g., '919876543210'
            });

            async function updateCustomProperty() {
              const response = await client.property.update({
                property_id: 'Workspace',
                type: 'ticket',
                name: 'Workspace ID',
                section: 'Issue Details'
              });

              console.log(response);
            }

            updateCustomProperty();
        - lang: cURL
          label: cURL
          source: |-
            curl -X POST \
              https://api.periskope.app/v1/properties/Workspace?type=ticket \
              -H 'Authorization: Bearer <token>' \
              -H 'Content-Type: application/json' \
              -H 'x-phone: YOUR_PHONE_NUMBER' \
             -d '{
                "name": "Workspace ID",
                "section": "Issue Details"
              }'
components:
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer

````