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

# Añadir documentos a una base existente

> Le añade archivos a una base que ya existe, sin rehacerla — rehacerla la desvincularía
de todos los agentes que la consultan.

**Cero bytes viajan aquí**, igual que en el alta: lo que se manda son los `uploadId` de
subidas ya confirmadas en el namespace `knowledge-sources`.

Responde `202` y no `200` porque cuando vuelve, los documentos están escritos pero el
proveedor todavía no lo sabe. La base pasa a `syncing` y el listado la ve volver a
`ready`.

**No pasa a `queued`**, y la diferencia importa si sondeas: `queued` significa que la
base no existe todavía en el proveedor, y ésta sí existe — lo que pasa es que está
recibiendo material nuevo.

**Es idempotente por `uploadIds`.** Un archivo se reclama exactamente una vez, así que
mandar el mismo lote dos veces —doble clic, o un reintento tras un timeout que sí
llegó— devuelve la base sin duplicar nada. Si esos archivos ya se los llevó **otra**
base, responde `422`: no se puede.

**El tope de 25 documentos es por base, no por lote.** Una base con 20 documentos
rechaza un lote de 10 aunque el lote quepa por sí solo. Para calcular el hueco antes de
pedir las firmas, usa `documentCount` del detalle: el hueco es `25 - documentCount`.
Ese número lo cuenta el proveedor, así que va un poco por detrás mientras algo se está
indexando — el `422` es la palabra final.




## OpenAPI

````yaml /openapi/public-api.yaml post /v1/knowledge-bases/{knowledgeBaseId}/documents
openapi: 3.1.0
info:
  title: Agents Studio API
  version: 1.0.0
  description: >
    API del backend de Agents Studio. Expone servicios multi-tenant para
    gestionar agentes

    (texto y voz), catálogo de herramientas, habilitación de workspaces y
    operaciones de

    telefonía. Todos los endpoints requieren autenticación Bearer y respetan los
    contratos

    documentados en `docs/modules`.
  license:
    name: Proprietary
    url: https://getsupervisor.ai/legal/terms
servers:
  - url: https://api-prod.studio.getsupervisor.ai
    description: Producción
  - url: https://sandbox.agents.studio.getsupervisor.ai
    description: Sandbox
security:
  - BearerAuth: []
tags:
  - name: Agents
    description: >
      Gestión general de agentes y sus metadatos.

      Scopes requeridos: `agents:read` para consultas y `agents:write` para
      creación, actualización y operaciones sobre teléfonos.
  - name: Agent Versions
    description: Versionado y mantenimiento de versiones publicadas de los agentes.
  - name: Agent Schedules
    description: >-
      Configuración de horarios regulares y excepciones puntuales para controlar
      la disponibilidad de los agentes.
  - name: Campaigns
    description: >
      Gestión de campañas masivas basadas en CSV para ejecutar agentes de forma
      batch.

      Scopes requeridos: `campaigns:read` para consultas y `campaigns:write`
      para creación.
  - name: Calls
    description: |
      Consultas de llamadas (Speech Analytics) disponibles para el workspace.
      Scopes requeridos: `calls:read`.
  - name: Agent Instructions
    description: >
      Operaciones sobre instrucciones (prompt) gestionadas por los usuarios
      finales para

      guiar y corregir el comportamiento del agente. Las instrucciones se
      aplican a la

      versión activa del agente, se mantienen como texto libre sin formato (1 a
      500

      caracteres) y su prioridad se controla mediante el campo `order`.

      Scopes requeridos: `agent-instructions:read` para consultas y
      `agent-instructions:write` para creación o edición.
  - name: Catalogs
    description: >
      Gestión centralizada de catálogos (idiomas, estilos de mensaje, tonos,
      etiquetas, voces y eventos de

      webhook) con alcance global o específico por workspace. Las voces del
      workspace se consultan aquí, con

      `GET /v1/catalogs/items?type=voice`. Scopes requeridos: `catalogs:read`
      para consultas y

      `catalogs:write` para creación y modificaciones.
  - name: Catalog Templates
    description: >
      Catálogo de plantillas de agente publicadas. Sirve para descubrir qué
      plantillas hay disponibles y con

      qué `agentVersionId` clonarlas mediante `POST /v1/agents/from-template`.

      Scopes requeridos: `catalogs:read`.
  - name: Agent Phones
    description: Conexión y desconexión de teléfonos asignados a agentes.
  - name: API Keys
    description: Gestión de credenciales de acceso programático y sus permisos.
  - name: Agent Blueprints
    description: >
      Gestión del blueprint (personalidad) asociado a cada versión de agente.

      Scopes requeridos: `agent-blueprints:read` para lectura y
      `agent-blueprints:write` para cambios en blueprint.
  - name: Blueprint Stages
    description: >
      Autoría de stages de un blueprint del agente, abarcando orden, prompts y
      validaciones previas a la

      publicación. Todas las rutas cuelgan del blueprint
      (`/v1/agents/{agentId}/blueprints/{blueprintId}/stages`),

      así que hay que resolver primero el `blueprintId` con `GET
      /v1/agents/{agentId}/blueprints`.

      Scopes requeridos: `blueprint-stages:read` para consultas y
      `blueprint-stages:write` para creación y edición.

      La validación del grafo se ejecuta automáticamente en cada mutación y la
      sincronización con el proveedor

      sucede mediante jobs internos tras los cambios.
  - name: Stage Triggers
    description: >
      Gestión detallada de triggers que conectan stages dentro del blueprint y
      definen las transiciones

      conversacionales. Scopes requeridos: `stage-triggers:read` y
      `stage-triggers:write`.
  - name: Workspaces
    description: Gestión multi-tenant y habilitación de credenciales por workspace.
  - name: Tools
    description: >
      Catálogo y ejecución de tools disponibles para los agentes.

      Scopes requeridos: `tools:read` para listar y `tools:execute` para
      ejecutar tools.
  - name: Webhooks
    description: >
      Gestión de webhooks por workspace para suscribirse a eventos del dominio y
      recibir notificaciones HTTP.

      Scopes requeridos: `webhooks:read` para consultas y `webhooks:write` para
      crear, actualizar o eliminar webhooks y suscripciones.
  - name: SIP Trunks
    description: >
      Provisionamiento y gestión de SIP trunks para conectar agentes de voz con
      carriers PSTN

      (Twilio, ccc2.uno, etc.) via Kamailio. Genera credenciales digest
      automaticamente.

      Scopes requeridos: `sip:read` para consultas y `sip:write` para creación,
      actualización y eliminación.
  - name: Documents
    description: >
      Gestión de documentos asociados al workspace. Permite obtener URLs
      presignadas

      para subir archivos que luego se referencian al crear o personalizar
      agentes.

      Scopes requeridos: `documents:write`.
  - name: Message Templates
    description: >
      Gestión de message templates de WhatsApp (Kapso). Permite crear, listar y
      eliminar templates,

      así como consultar el estado de la conexión con el número de teléfono
      configurado.

      Scopes requeridos: `agents:read` para consultas y `agents:write` para
      creación y eliminación.
  - name: Billing
    description: |
      Consulta del balance de consumo del workspace sobre el plan contratado.
      Scopes requeridos: `billing:read`.
  - name: Usage
    description: |
      Consultas de consumo de recursos agregado por agente.
      Scopes requeridos: `usage:read`.
  - name: Uploads
    description: >
      Subida de archivos por URL prefirmada: la API reserva el sitio y devuelve
      la URL, y

      el cliente sube contra el almacén sin que los bytes pasen por aquí.

      Toda escritura exige `uploads:write`, y la firma exige **además** el scope
      que decide el

      namespace de la ruta: `agent-briefs` y `avatars` exigen `agents:write`, y

      `knowledge-sources` exige `knowledge-bases:write`.


      Cada namespace declara además qué acepta. `avatars` sólo admite PNG, JPEG
      y WEBP —y

      **no** SVG: se sirven en línea, y un SVG es texto ejecutable—, con un
      archivo por

      lote y 1 MiB como máximo.
  - name: Health
    description: >
      Sonda de disponibilidad del servicio. No requiere autenticación ni
      `X-Workspace-Id`.
  - name: Knowledge Bases
    description: >
      Bases de conocimiento del workspace: el material que el agente consulta
      durante la

      conversación.


      El prefijo nombra el recurso y no la tool que lo implementa, así que
      renombrar la

      tool `knowledge` no mueve estas rutas.


      Las sirve un plugin instalable, y eso tiene una consecuencia visible: si
      la tool no

      está abierta para el workspace, **todas** responden `404` —no `403`—. Una
      feature

      que no está disponible para un cliente no existe para él.


      Scopes requeridos: `knowledge-bases:read` para consultas y
      `knowledge-bases:write`

      para el alta, la baja y el mantenimiento de sus documentos.
paths:
  /v1/knowledge-bases/{knowledgeBaseId}/documents:
    parameters:
      - $ref: '#/components/parameters/XWorkspaceId'
      - name: knowledgeBaseId
        in: path
        required: true
        description: Identificador de la base en Agents Studio.
        schema:
          type: string
          format: uuid
    post:
      tags:
        - Knowledge Bases
      summary: Añadir documentos a una base existente
      description: >
        Le añade archivos a una base que ya existe, sin rehacerla — rehacerla la
        desvincularía

        de todos los agentes que la consultan.


        **Cero bytes viajan aquí**, igual que en el alta: lo que se manda son
        los `uploadId` de

        subidas ya confirmadas en el namespace `knowledge-sources`.


        Responde `202` y no `200` porque cuando vuelve, los documentos están
        escritos pero el

        proveedor todavía no lo sabe. La base pasa a `syncing` y el listado la
        ve volver a

        `ready`.


        **No pasa a `queued`**, y la diferencia importa si sondeas: `queued`
        significa que la

        base no existe todavía en el proveedor, y ésta sí existe — lo que pasa
        es que está

        recibiendo material nuevo.


        **Es idempotente por `uploadIds`.** Un archivo se reclama exactamente
        una vez, así que

        mandar el mismo lote dos veces —doble clic, o un reintento tras un
        timeout que sí

        llegó— devuelve la base sin duplicar nada. Si esos archivos ya se los
        llevó **otra**

        base, responde `422`: no se puede.


        **El tope de 25 documentos es por base, no por lote.** Una base con 20
        documentos

        rechaza un lote de 10 aunque el lote quepa por sí solo. Para calcular el
        hueco antes de

        pedir las firmas, usa `documentCount` del detalle: el hueco es `25 -
        documentCount`.

        Ese número lo cuenta el proveedor, así que va un poco por detrás
        mientras algo se está

        indexando — el `422` es la palabra final.
      operationId: addKnowledgeBaseDocuments
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/AddKnowledgeBaseDocumentsRequest'
            examples:
              default:
                summary: Dos archivos que ya se subieron
                value:
                  uploadIds:
                    - 5f1c2d3e-4a5b-4c6d-8e7f-9a0b1c2d3e4f
                    - 6a2d3e4f-5b6c-4d7e-8f90-0b1c2d3e4f50
      responses:
        '202':
          description: >
            Aceptado. Los documentos están escritos y la base quedó en
            `syncing`; el indexado

            ocurre después.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/KnowledgeBase'
        '403':
          description: La llave no tiene el scope `knowledge-bases:write`.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '404':
          description: >
            La base no existe, no pertenece a este workspace, o la tool
            `knowledge` no está

            abierta para él. Los tres casos son indistinguibles a propósito.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '422':
          description: >
            Alguno de los archivos no se puede usar, y se dice cuál y por qué:
            no existe, no se

            ha confirmado, ya pertenece a otra base, o no se subió como fuente
            de conocimiento.

            También cuando el lote no cabe en lo que le queda a la base.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
components:
  parameters:
    XWorkspaceId:
      name: x-workspace-id
      in: header
      required: true
      description: Identificador del workspace multi-tenant.
      schema:
        type: string
        format: uuid
  schemas:
    AddKnowledgeBaseDocumentsRequest:
      type: object
      description: >
        Los archivos que se le añaden a una base que ya existe. **Cero bytes**,
        igual que en el

        alta: lo que viaja son referencias a objetos que ya están en el almacén
        y ya se

        verificaron.
      properties:
        uploadIds:
          type: array
          minItems: 1
          maxItems: 25
          uniqueItems: true
          items:
            type: string
            format: uuid
          description: >
            De 1 a 25 archivos confirmados, sin repetir. El máximo acota el
            lote; el tope de

            verdad es **por base** y se comprueba contra los documentos que ya
            tiene.
      required:
        - uploadIds
    KnowledgeBase:
      type: object
      properties:
        id:
          type: string
          format: uuid
          description: >
            Identificador de la base en Agents Studio. La referencia interna del
            proveedor no

            se publica.
        name:
          type: string
        description:
          type: string
        status:
          type: string
          enum:
            - queued
            - syncing
            - ready
            - error
          description: >
            `queued`: dada de alta, todavía no existe en el proveedor.
            `syncing`: el proveedor

            la está indexando. `ready`: el agente ya puede consultarla. `error`:
            el indexado

            falló, y `errorMessages` dice por qué.
        documentCount:
          type: integer
        totalSizeBytes:
          type: integer
        agentCount:
          type: integer
          description: >
            Cuántos **agentes** del workspace consultan esta base. Cuenta
            agentes, no

            conexiones: un agente con dos conexiones a la misma base suma uno.


            Cero significa que ninguno la consulta, y por tanto que retirarla no
            cambia el

            comportamiento de nadie.
        documents:
          type: array
          description: >
            **Vacío en el listado a propósito.** Los documentos los tiene el
            proveedor y

            traerlos costaría una llamada por elemento de la página. Vienen en
            el detalle.
          items:
            $ref: '#/components/schemas/KnowledgeBaseDocument'
        errorMessages:
          type: array
          description: Vacío salvo que `status` sea `error`.
          items:
            type: string
        createdAt:
          type: string
          format: date-time
        updatedAt:
          type: string
          format: date-time
      required:
        - id
        - name
        - description
        - status
        - agentCount
        - documentCount
        - totalSizeBytes
        - documents
        - errorMessages
        - createdAt
        - updatedAt
    ErrorResponse:
      type: object
      properties:
        code:
          type: string
          description: Código principal del error (alto nivel).
        message:
          type: string
          description: Mensaje legible para humanos.
        details:
          type: object
          description: >
            Información adicional específica del error.

            Cuando aplique, `details.subcode` provee un identificador estable
            para que el frontend decida qué UI mostrar.
          properties:
            subcode:
              type: string
              description: >-
                Identificador específico del error (p.ej.
                `WORKSPACE_NOT_PROVISIONED`).
            workspaceId:
              type: string
              format: uuid
              description: Identificador de workspace relacionado cuando aplica.
          additionalProperties: true
      required:
        - code
        - message
    KnowledgeBaseDocument:
      type: object
      properties:
        id:
          type: string
          description: Identificador del documento dentro de la base.
        name:
          type: string
          description: Nombre del archivo tal como se subió.
        sizeBytes:
          type: integer
          description: Tamaño del archivo en bytes.
        url:
          type: string
          nullable: true
          description: >
            Enlace de descarga, cuando el proveedor lo emite. `null` si no hay
            uno disponible.
      required:
        - id
        - name
        - sizeBytes
        - url
  securitySchemes:
    BearerAuth:
      type: http
      scheme: bearer
      bearerFormat: JWT

````