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

# Actualizar labels de las columnas



## OpenAPI

````yaml /es/openapi.json patch /v1/tables/{id}/columns
openapi: 3.0.0
info:
  title: Nuvia API - Empresa
  description: Documentación de la API para empresas
  version: '1.0'
  contact: {}
servers:
  - url: https://api.nuvia.ai
security: []
tags:
  - name: messages
    x-group: Mensagens
  - name: contacts
    x-group: Contatos
  - name: campaigns
    x-group: Campanhas
  - name: tables
    x-group: Tabelas e Listas
  - name: agents
    x-group: Agentes
  - name: conversations
    x-group: Conversas
  - name: inboxes
    x-group: Caixas de Entrada
  - name: knowledge
    x-group: Base de Conhecimento
  - name: Webhooks
    x-group: Webhooks
  - name: campaign-enrollments
    x-group: Inscrições em Campanha
  - name: custom-fields
    x-group: Campos Customizados
paths:
  /v1/tables/{id}/columns:
    patch:
      tags:
        - tables
      summary: Actualizar labels de las columnas
      operationId: TableController_updateColumns
      parameters:
        - name: x-company-id
          in: header
          description: >-
            Identificador de la empresa objetivo. Obligatorio solo para API keys
            globales (type=global). Se ignora para API keys de empresa y
            usuarios humanos.
          required: false
          schema:
            type: string
        - name: id
          required: true
          in: path
          description: ID de la tabla
          schema:
            type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/UpdateTableColumnsDto'
      responses:
        '200':
          description: ''
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TableEntity'
      security:
        - JWT-auth: []
components:
  schemas:
    UpdateTableColumnsDto:
      type: object
      properties:
        columns:
          description: Array de columnas con descriptions y settings actualizados
          type: array
          items:
            type: string
        viewId:
          type: string
          description: >-
            ID de la vista actual para agregar nuevas columnas (si no se
            informa, usa la vista predeterminada)
    TableEntity:
      type: object
      properties:
        _id:
          $ref: '#/components/schemas/ObjectId'
        name:
          type: string
        description:
          type: string
        file_url:
          type: string
        status:
          enum:
            - PROCESSING
            - READY
            - ERROR
            - PARTIAL
          type: string
        type:
          enum:
            - DEFAULT
            - FILE
          type: string
        table_kind:
          enum:
            - dataset
            - list
          type: string
        object_type:
          enum:
            - contact
            - business
          type: string
        file_metadata:
          type: object
        columns:
          type: array
          items:
            type: object
        stats:
          type: object
        import_errors:
          type: array
          items:
            type: object
        summary:
          type: string
        data:
          deprecated: true
          type: array
          items:
            type: object
        sync_key_column:
          type: string
          description: >-
            Key de la columna de negocio usada como clave en la sincronización
            por upload (diff).

            Sin ella, la sincronización por upload se rechaza.
        ranking_config:
          description: >-
            Criterios ordenados de ranking de negocio. La sincronización
            materializa el resultado

            en la columna interna _score (mayor = mejor).
          type: array
          items:
            type: object
        company:
          $ref: '#/components/schemas/CompanyEntity'
        createdAt:
          format: date-time
          type: string
        updatedAt:
          format: date-time
          type: string
      required:
        - _id
        - name
        - status
        - type
        - table_kind
        - columns
        - stats
        - company
    ObjectId:
      type: object
      properties: {}
    CompanyEntity:
      type: object
      properties:
        _id:
          $ref: '#/components/schemas/ObjectId'
        name:
          type: string
        channels:
          type: array
          items:
            type: string
            enum:
              - WAP_AUTO_CLOSER
              - WEB_V2
              - EVOLUTION_API
              - LINKEDIN
              - EMAIL
        agent_flows:
          type: array
          items:
            $ref: '#/components/schemas/AgentFlowEntity'
        description:
          type: string
          description: >-
            Opcional desde ISSUE-6330: las empresas creadas por self-service
            nacen

            sin descripción (las legadas anteriores a 2025-09-07 tampoco tienen
            el campo). La

            obligatoriedad se mantiene en las capas de ENTRADA del backoffice
            (DTOs Zod

            de create-company/create-internal-company y formularios) — intactas.
        domains:
          description: >-
            Dominios de correo que resuelven a ESTA company en el signup
            self-service

            (ISSUE-6330): 1 dominio → como máximo 1 company (índice único
            parcial

            más abajo). Solo el flujo self-service escribe; las companies
            antiguas del

            backoffice quedan SIN el campo (sin backfill — entran en la
            resolución por

            inferencia vía el correo de los users). Canonicalizado en
            lowercase/trim en

            el schema (molde de signup_leads.domain). `default: undefined` para
            que el

            campo nazca AUSENTE (un array default [] entraría en la semántica
            del índice

            parcial y cambiaría los docs del backoffice sin necesidad).
          type: array
          items:
            type: string
        site:
          type: string
          description: >-
            [ISSUE-6438] Sitio informado en el wizard. INFORMATIVO — no
            participa de la

            resolución por dominio y no tiene índice único.


            Existe debido al workspace de correo personal

            (SIGNUP_ALLOW_PERSONAL_EMAILS): allí el dominio no se puede derivar
            del

            correo, así que el usuario lo escribe. Colocarlo en `domains`
            reclamaría el

            dominio globalmente (el índice es único) y permitiría que alguien
            con @gmail

            registre "google.com" — por eso es un campo separado, con `domains:
            []`.
        general_config:
          type: object
        status:
          enum:
            - ACTIVE
            - INACTIVE
            - DELETED
          type: string
        agent_builder_mcp_enabled:
          type: boolean
          description: >-
            Habilita las tools del agent builder en el `/mcp` del cliente para
            ESTA empresa.

            Predeterminado `true`: el builder es GA — toda empresa lo tiene,
            salvo opt-OUT explícito

            (`false`). Es el interruptor por empresa de EXCLUSIÓN (ej.:
            desactivar a un

            cliente que hizo un desastre), no de inclusión. El gate de AUTORÍA
            sigue siendo

            el role (COMPANY_ADMIN); un usuario común solo lee/simula. Las
            empresas creadas antes

            del GA se activaron vía backfill
            (scripts/backfill-agent-builder-mcp-flag.ts).
        client_mcp_servers_enabled:
          type: boolean
          description: >-
            Habilita el feature de servidores MCP del cliente (SDD "MCP del
            cliente en las

            tools del agente", §8 rollout) para ESTA empresa. Ausente/false =
            flag

            OFF: las rutas de `/mcp-servers` responden 403 (excepto el callback
            OAuth,

            que es público) y las tools MCP ya materializadas quedan INERTES en
            el runtime

            (desaparecen del array del agente, sin borrar nada de la base de
            datos). Predeterminado deliberado

            `false`: es rollout gradual, no GA como `agent_builder_mcp_enabled`.
        auto_join_enabled:
          type: boolean
          description: >-
            [ISSUE-6432] Ingreso automático por dominio. Ausente/false =
            DESACTIVADO

            (valor predeterminado deliberado: activarlo es decisión del admin,
            no un estado inicial).


            Activado, quien se registra con un correo del dominio de esta
            company ingresa directamente

            como miembro, en lugar de generar una solicitud de acceso. Afecta
            SOLO a esta company:

            un dominio con varias companies sigue dejando que la persona elija,
            y entre las

            elegidas solo la que lo activó permite el ingreso directo.
        subscription:
          type: object
          description: >-
            Suscripción/trial (ISSUE-6334). Valor predeterminado
            `{status:'active'}` — la company

            creada por el backoffice nace ACTIVA (decisión de producto); el
            flujo

            self-service (ProvisionCompanyByDomainService) lo sobrescribe con

            `trialing` + fechas. Un documento legado sin el campo = activo (ver

            resolveSubscriptionStatus + script de backfill).
        onboarding:
          type: object
          description: >-
            [ISSUE-6438] Estado del wizard de onboarding. `default: undefined`
            para que el

            campo nazca AUSENTE (misma técnica que `domains`): la company del
            backoffice

            no recibe el subdocumento y se resuelve como completada en

            `resolveOnboardingStatus`.
        attribution:
          type: object
          description: >-
            Campaña que trajo esta company (`utm_*` de quien la creó).


            ── Por qué aquí, si el UTM ya vive en `signup_leads` ──


            Allí la clave es el CORREO, y el vínculo llega solo hasta el user.
            Cruzar la campaña con

            el trial, la activación o el ingreso exigía un join manual por
            correo del primer

            usuario — que se rompe en cuanto la persona cambia de correo o se
            va.


            Se copia en la CREACIÓN, y solo entonces. No hay backfill: una
            company que nació antes de esto

            queda sin el campo, y su ausencia significa "no lo sabemos", no
            "orgánico".


            `default: undefined` para nacer AUSENTE (misma técnica que
            `onboarding`):

            la company del backoffice no pasa por el flujo self-service y no
            debe recibir

            un subdocumento vacío.
      required:
        - _id
        - name
        - channels
        - agent_flows
        - description
        - status
    AgentFlowEntity:
      type: object
      properties:
        _id:
          $ref: '#/components/schemas/ObjectId'
        name:
          type: string
        url:
          type: string
        specialist_url:
          type: string
        type:
          enum:
            - N8N
            - API
            - INTERNAL
          type: string
      required:
        - _id
        - name
        - url
        - specialist_url
        - type
  securitySchemes:
    JWT-auth:
      scheme: bearer
      bearerFormat: JWT
      type: http
      description: Token JWT de autenticação

````