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

# Editar un atributo personalizado

> Modifica nombre, descripción, opciones, valor predeterminado y configuración. dataType y entityType no se pueden cambiar. options reemplaza el catálogo; omitirla lo conserva. Las opciones distinguen mayúsculas y las usadas no se eliminan. Renombrar migra claves históricas al ID sin cambiar valores; los conflictos rechazan toda la edición. El guard de concurrencia se limita al tenant y tipo de entidad. Devuelve 409 ante conflictos y 503 si excede el límite de tiempo; no hay reintentos automáticos.



## OpenAPI

````yaml /openapi.json patch /custom-attributes/public/v1/{entityType}/{id}
openapi: 3.1.0
info:
  title: Revem API
  version: 1.0.0
  description: >-
    La API pública de Revem para integraciones de servidor a servidor:
    contactos, organizaciones, tickets, reuniones y el canal de webchat. Se
    autentica con la API key de tu organización.
  contact:
    name: Soporte Revem
    email: soporte@revem.ai
    url: https://revem.ai
servers:
  - url: https://api.revem.ai
    description: Producción
security:
  - apiKey: []
tags:
  - name: WhatsApp
    description: >-
      Envía plantillas aprobadas desde los números conectados de tu
      organización.
  - name: Organizaciones
    description: >-
      Sincroniza empresas por identificador tributario, con atributos
      personalizados por nombre.
  - name: Contactos
    description: >-
      Sincroniza tu base de clientes con Revem. Los contactos se identifican por
      teléfono al crearlos y por id después.
  - name: Tickets
    description: >-
      Crea, lee y actualiza los tickets de tu embudo desde tu sistema de
      gestión.
  - name: Atributos personalizados
    description: Administra definiciones para tickets, contactos y organizaciones.
  - name: Webchat
    description: >-
      Conecta el chat de tu sitio con Revem: registra lo que escribe el
      visitante y lee las respuestas del equipo o del agente.
  - name: Reuniones
    description: >-
      Requiere el módulo meetings. Reuniones independientes de las citas
      médicas, con responsable, capacidad y reservas por contacto y ocurrencia.
paths:
  /custom-attributes/public/v1/{entityType}/{id}:
    patch:
      tags:
        - Atributos personalizados
      summary: Editar un atributo personalizado
      description: >-
        Modifica nombre, descripción, opciones, valor predeterminado y
        configuración. dataType y entityType no se pueden cambiar. options
        reemplaza el catálogo; omitirla lo conserva. Las opciones distinguen
        mayúsculas y las usadas no se eliminan. Renombrar migra claves
        históricas al ID sin cambiar valores; los conflictos rechazan toda la
        edición. El guard de concurrencia se limita al tenant y tipo de entidad.
        Devuelve 409 ante conflictos y 503 si excede el límite de tiempo; no hay
        reintentos automáticos.
      operationId: editCustomAttribute
      parameters:
        - name: entityType
          in: path
          required: true
          description: ticket, contact_person o contact_org.
          schema:
            type: string
            enum:
              - ticket
              - contact_person
              - contact_org
        - name: id
          in: path
          required: true
          description: ID decimal de la definición.
          schema:
            type: string
            pattern: ^[1-9][0-9]{0,15}$
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/AttributeEditBody'
      responses:
        '200':
          description: Definición actualizada.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Attribute'
        '400':
          description: Campos inválidos o intento de cambiar el tipo.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AttributeError'
        '401':
          description: Sin credencial, o la API key no existe o fue revocada.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AuthError'
              example:
                error: Unauthorized
                message: Invalid API key
        '403':
          description: Sin permiso.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AttributeError'
        '404':
          description: Definición no encontrada.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AttributeError'
        '409':
          description: >-
            Opción en uso, nombre duplicado, valores históricos ambiguos o
            escritura concurrente.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AttributeError'
        '429':
          description: >-
            La key superó su presupuesto de unidades por minuto: una por
            solicitud individual o elemento de lote. El header `retry-after`
            indica cuánto esperar.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/RateLimitError'
              example:
                ok: false
                error: Too many requests. Retry in 60 seconds.
          headers:
            retry-after:
              description: Segundos que esperar antes de reintentar.
              schema:
                type: integer
            x-ratelimit-limit:
              description: >-
                Unidades permitidas por minuto: cada solicitud individual
                consume 1; cada elemento de un lote de organizaciones consume 1.
              schema:
                type: integer
            x-ratelimit-remaining:
              description: Unidades que quedan en la ventana actual.
              schema:
                type: integer
            x-ratelimit-reset:
              description: Segundos hasta que la ventana se reinicia.
              schema:
                type: integer
        '503':
          description: La operación de catálogo excedió el límite de tiempo.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AttributeError'
components:
  schemas:
    AttributeEditBody:
      type: object
      properties:
        name:
          type: string
          minLength: 1
          maxLength: 200
        description:
          anyOf:
            - type: string
              maxLength: 5000
            - type: 'null'
        options:
          maxItems: 10000
          type: array
          items:
            type: string
            minLength: 1
            maxLength: 200
            pattern: ^[^,]+$
          description: >-
            Reemplaza el catálogo completo. Una opción usada en registros
            (incluidos papelera y simulaciones) o en el valor predeterminado no
            puede eliminarse: devuelve 409. El valor predeterminado puede
            ajustarse en la misma solicitud.
        isRequired:
          type: boolean
        isFilterable:
          type: boolean
        isAgentVisible:
          type: boolean
        isUnique:
          type: boolean
        disabledFunnelIds:
          maxItems: 1000
          type: array
          items:
            type: string
            format: uuid
          description: >-
            Solo para tickets: IDs de embudos del tenant donde se oculta el
            atributo.
        defaultValue:
          $ref: 7bef8a65-e7a1-473d-ba59-2e5adb54c685
          description: >-
            Valor JSON; null lo borra. Arrays de hasta 10000 elementos. Se
            valida contra el tipo y las opciones resultantes.
      additionalProperties: false
      $defs:
        __schema0:
          anyOf:
            - type: string
            - type: number
            - type: boolean
            - type: 'null'
            - type: array
              items:
                $ref: '#/components/schemas/AttributeEditBody/$defs/__schema0'
            - type: object
              additionalProperties:
                $ref: '#/components/schemas/AttributeEditBody/$defs/__schema0'
    Attribute:
      type: object
      properties:
        id:
          type: string
          description: >-
            ID decimal como string; conservarlo como string para no perder
            precisión.
        entityType:
          type: string
          enum:
            - ticket
            - contact_person
            - contact_org
        name:
          type: string
        dataType:
          type: string
        description:
          anyOf:
            - type: string
            - type: 'null'
        options:
          maxItems: 5
          type: array
          items:
            type: string
          description: >-
            Vista previa de hasta cinco opciones. Consultar /options para
            obtener el catálogo paginado.
        optionCount:
          type: integer
          description: Cantidad total de opciones.
        isRequired:
          type: boolean
        isFilterable:
          type: boolean
        isAgentVisible:
          type: boolean
        isUnique:
          type: boolean
        disabledFunnelIds:
          type: array
          items:
            type: string
            format: uuid
        defaultValue: 4d3b2945-57a2-4133-8cf9-ff5ff1b1fa8f
      required:
        - id
        - entityType
        - name
        - dataType
        - description
        - options
        - optionCount
        - isRequired
        - isFilterable
        - isAgentVisible
        - isUnique
        - disabledFunnelIds
        - defaultValue
      additionalProperties: false
      $defs:
        __schema0:
          anyOf:
            - type: string
            - type: number
            - type: boolean
            - type: 'null'
            - type: array
              items:
                $ref: '#/components/schemas/Attribute/$defs/__schema0'
            - type: object
              additionalProperties:
                $ref: '#/components/schemas/Attribute/$defs/__schema0'
    AttributeError:
      type: object
      properties:
        ok:
          type: boolean
        error:
          type: string
      required:
        - ok
        - error
      additionalProperties: false
    AuthError:
      type: object
      properties:
        ok:
          type: boolean
          const: false
          description: Presente sólo en el `403`.
        error:
          type: string
        message:
          type: string
      required:
        - error
        - message
    RateLimitError:
      type: object
      properties:
        ok:
          type: boolean
          const: false
        error:
          type: string
          description: Incluye cuánto esperar antes de reintentar.
      required:
        - ok
        - error
  securitySchemes:
    apiKey:
      type: http
      scheme: bearer
      description: >-
        La API key de tu organización, con la forma `rvm_<prefijo>.<secreto>`,
        enviada como `Authorization: Bearer rvm_…`. Revem la emite y sólo se
        muestra una vez; si la pierdes se reemplaza, no se recupera.

````

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