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

# Anexação de itens da biblioteca à proposta

> Vincula documentos existentes da biblioteca de documentos da Wegly e copia arquivos do Drive da biblioteca para a proposta. Aceita até 20 itens por requisição, somando `document_ids` e `file_ids`. Documentos já anexados são ignorados e devolvidos na resposta. Um documento sem visibilidade `COMPANY` só pode ser anexado se o usuário criador da chave puder compartilhá-lo. Exige `crm/proposal.update` e `crm/document.read` na chave; quando há `file_ids`, exige também `crm/file.create` na chave e no usuário criador. O lead ou negócio precisa estar aberto e não arquivado.



## OpenAPI

````yaml /openapi.json post /integrations/external/proposals/{id}/attachments/library
openapi: 3.0.3
info:
  title: >-
    Integração Externa - Leads, Oportunidades, Tarefas, Arquivos, Propostas,
    Chats, Satisfação e Campos Personalizados
  version: 1.0.0
  description: >
    Documentação oficial da API externa da Wegly para campos personalizados,
    leads, oportunidades, tarefas, arquivos, propostas, chats e satisfação
    (`/integrations/external/custom-fields`, `/integrations/external/files`,
    `/integrations/external/leads`, `/integrations/external/deals`,
    `/integrations/external/tasks`, `/integrations/external/proposals`,
    `/integrations/external/chats` e `/integrations/external/satisfaction`).
    Todas as descrições estão em português e refletem as regras aplicadas pelo
    serviço.
servers:
  - url: https://api.wegly.com.br
    description: Ambiente de produção Wegly
security:
  - bearerAuth: []
tags:
  - name: Campos Personalizados
    description: >-
      Consulta dos campos personalizados disponíveis para uso nas integrações
      externas.
  - name: Arquivos
    description: >-
      Upload e consulta de arquivos vinculados diretamente a leads ou
      oportunidades. Arquivos de proposta usam as rotas de anexos em Propostas.
  - name: Leads
    description: >-
      Operações de listagem, criação, consulta e atualização de leads via
      integração externa.
  - name: Oportunidades
    description: Operações de criação de oportunidades (deals) via integração externa.
  - name: Tarefas
    description: >-
      Operações de listagem, criação, consulta, atualização e remoção de tarefas
      vinculadas a leads, oportunidades, entregas, pessoas, organizações ou
      clientes.
  - name: Satisfação
    description: >-
      Geração de links públicos para formulários de satisfação via integração
      externa.
  - name: Propostas
    description: >-
      Operações de listagem, criação, consulta, atualização e remoção de
      propostas via integração externa, incluindo seus anexos (arquivos e
      documentos da biblioteca).
  - name: Chats
    description: >-
      Operações principais de listagem, criação, consulta e resumo de não lidas
      de chats via integração externa.
paths:
  /integrations/external/proposals/{id}/attachments/library:
    post:
      tags:
        - Propostas
      summary: Anexação de itens da biblioteca à proposta
      description: >-
        Vincula documentos existentes da biblioteca de documentos da Wegly e
        copia arquivos do Drive da biblioteca para a proposta. Aceita até 20
        itens por requisição, somando `document_ids` e `file_ids`. Documentos já
        anexados são ignorados e devolvidos na resposta. Um documento sem
        visibilidade `COMPANY` só pode ser anexado se o usuário criador da chave
        puder compartilhá-lo. Exige `crm/proposal.update` e `crm/document.read`
        na chave; quando há `file_ids`, exige também `crm/file.create` na chave
        e no usuário criador. O lead ou negócio precisa estar aberto e não
        arquivado.
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
            format: uuid
          description: UUID da proposta.
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/AttachProposalLibraryItems'
      responses:
        '201':
          description: >-
            Anexos correspondentes aos itens informados, incluindo documentos
            que já estavam anexados.
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/ProposalAttachment'
        '400':
          description: >-
            Nenhum item informado, lista inválida, mais de 20 itens, limite de
            50 anexos atingido ou lead ou negócio da proposta fechado ou
            arquivado.
        '401':
          description: >-
            Chave de integração ausente, inválida, inativa ou expirada, ou
            domínio de origem não autorizado para a chave.
        '403':
          description: >-
            Permissão `crm/proposal.update`, `crm/document.read` ou
            `crm/file.create` ausente, ou documento que o usuário criador da
            chave não pode compartilhar.
        '404':
          description: >-
            Proposta, documento ou arquivo da biblioteca não encontrado ou fora
            do alcance do usuário criador da chave.
        '409':
          description: O documento foi anexado à proposta por outra requisição simultânea.
        '429':
          description: Limite de requisições atingido.
          headers:
            Retry-After:
              description: Tempo de espera em segundos, quando enviado.
              schema:
                type: integer
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ExternalApiError'
components:
  schemas:
    AttachProposalLibraryItems:
      type: object
      description: >-
        Informe ao menos um item em `document_ids` ou `file_ids`, com até 20
        itens por requisição somando as duas listas.
      properties:
        document_ids:
          type: array
          maxItems: 20
          uniqueItems: true
          description: Documentos da biblioteca que serão vinculados à proposta.
          items:
            type: string
            format: uuid
        file_ids:
          type: array
          maxItems: 20
          uniqueItems: true
          description: Arquivos do Drive da biblioteca que serão copiados para a proposta.
          items:
            type: string
            format: uuid
    ProposalAttachment:
      type: object
      properties:
        id:
          type: string
          format: uuid
        proposal_id:
          type: string
          format: uuid
          nullable: true
        draft_token:
          type: string
          format: uuid
          nullable: true
          description: Sempre `null` na API externa.
        kind:
          type: string
          enum:
            - FILE
            - DOCUMENT
        status:
          type: string
          enum:
            - UPLOADING
            - READY
          description: Anexos criados pela API externa já nascem `READY`.
        position:
          type: integer
        created_at:
          type: string
          format: date-time
        updated_at:
          type: string
          format: date-time
        created_by_user:
          $ref: '#/components/schemas/ProposalAttachmentUserSummary'
        file:
          type: object
          allOf:
            - $ref: '#/components/schemas/ProposalAttachmentFile'
          nullable: true
        document:
          type: object
          allOf:
            - $ref: '#/components/schemas/ProposalAttachmentDocumentSummary'
          nullable: true
    ExternalApiError:
      type: object
      properties:
        statusCode:
          type: integer
        message:
          oneOf:
            - type: string
            - type: array
              items:
                type: string
        error:
          type: string
      description: >-
        Formato de erro do HTTP/NestJS; os campos presentes variam conforme a
        exceção.
    ProposalAttachmentUserSummary:
      type: object
      properties:
        id:
          type: string
          format: uuid
        name:
          type: string
        avatar:
          type: string
          nullable: true
    ProposalAttachmentFile:
      type: object
      description: Dados do arquivo; presente somente quando `kind = FILE`.
      properties:
        name:
          type: string
        extension:
          type: string
          nullable: true
          description: Extensão em minúsculas, sem o ponto.
        mime_type:
          type: string
          nullable: true
        size_bytes:
          type: integer
        can_preview:
          type: boolean
          description: >-
            Arquivo pronto, em formato com visualização rápida no CRM e com até
            50 MB.
        can_play_inline:
          type: boolean
          description: Arquivo pronto em MP3 ou MP4, reproduzível pelo player do CRM.
    ProposalAttachmentDocumentSummary:
      type: object
      description: >-
        Dados do documento da biblioteca; presente somente quando `kind =
        DOCUMENT`.
      properties:
        id:
          type: string
          format: uuid
        title:
          type: string
        summary:
          type: string
          nullable: true
        workflow_status:
          type: string
          enum:
            - DRAFT
            - PUBLISHED
        has_unpublished_changes:
          type: boolean
        published_version:
          type: integer
          nullable: true
        updated_at:
          type: string
          format: date-time
        last_edited_by_user:
          type: object
          allOf:
            - $ref: '#/components/schemas/ProposalAttachmentUserSummary'
          nullable: true
        is_available:
          type: boolean
          description: '`false` quando o documento está na lixeira da biblioteca.'
        access:
          type: object
          description: >-
            O que o usuário criador da chave pode fazer com o documento na
            biblioteca.
          properties:
            can_open:
              type: boolean
            can_edit:
              type: boolean
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
      bearerFormat: API key
      description: >-
        Chave de integração com prefixo wegly_, enviada em Authorization: Bearer
        <chave>. Não é JWT. A chave deve estar ativa, não excluída e dentro da
        validade. Com allowed_domain, Origin (ou Referer na ausência de Origin)
        precisa informar o hostname permitido. A empresa e as permissões são
        obtidas pela chave.

````

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