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

# Dokument an Einheit oder Komponente anhängen

> Step 2: attach the uploaded file to a packaging unit (`target.packagingSpecId`) or component (`target.componentId`) — exactly as the in-app "Nachweis hochladen": the document is accepted (`approved`) with the given `type`, and for an analysable type AI extraction is queued when your plan includes it (`extractionQueued`; otherwise `aiSkippedReason` says why). Target ids are UUIDs — resolve them with `GET /api/v1/ppwr/units?internalRef=…` or `GET /api/v1/ppwr/components`. A unit or component of another company, a deleted one, a `storageKey` not issued to your company, and a unit-only `type` (`technical_doc`, `declaration_of_conformity`, `marking`) on a component all answer `404 {"error": "target"}`. A `storageKey` that was already consumed by a successful attach (or has expired) answers `404 {"error": "upload_missing"}` — start again at step 1. Re-use-system targets are not supported (`400 {"error": "unsupported_target"}`); a `target` with more than one id is `400 {"error": "ambiguous_target"}`. Requires `packaging:write`; customer workspace with the PPWR module enabled — see the guide.



## OpenAPI

````yaml POST /api/v1/ppwr/documents
openapi: 3.1.0
info:
  title: Polygon One Compliance API
  description: >-
    REST API for connecting ERP and other business systems to Polygon One. It
    covers both compliance modules: **EUDR** (EU Deforestation Regulation) —
    articles, suppliers, plots, evidence, orders and Due Diligence Statements —
    and **PPWR** (EU Packaging and Packaging Waste Regulation) — packaging
    components and units, documents, Declarations of Conformity, the SKU
    quantity feed and volume reports.


    Authenticate every request with an API key created in Settings → API Keys,
    sent as `Authorization: Bearer <key>`. Each key carries scopes (e.g.
    `articles:read`, `packaging:write`) that limit what it may read and write.


    Versioning: `v1` changes only additively — new endpoints, new optional
    request fields and new response fields may appear, nothing documented is
    removed or changed in meaning. Ignore response fields you do not know.


    Guides and walkthroughs:
    https://help.polygon-one.com/api-reference/introduction
  version: 1.0.0
  contact:
    name: Polygon One Support
    email: help@polygon-one.eu
servers:
  - url: https://app.polygon-one.com
    description: Production Server
security:
  - bearerAuth: []
tags:
  - name: Articles
    description: >-
      EUDR articles: your products and purchased goods, their HS code, EUDR
      relevance and supplier links.
  - name: Suppliers
    description: EUDR suppliers and their links to articles.
  - name: Plots
    description: >-
      EUDR plots of land (geolocations): create, validate, link to supplier
      articles, read the geo analysis and its report.
  - name: Evidence
    description: >-
      EUDR evidence documents attached to a supplier article (legal compliance
      documents, questionnaires).
  - name: Orders
    description: >-
      Purchase and sale orders and their lines; the read-back of the DDS
      references linked to each order.
  - name: Import Jobs
    description: >-
      Status and result of an asynchronous batch import (articles, suppliers,
      orders, PPWR quantities).
  - name: Readiness
    description: Action-scoped readiness snapshots for owned EUDR and PPWR resources.
  - name: DDS Statements
    description: >-
      EUDR Due Diligence Statements: create, read, update the TRACES numbers,
      delete.
  - name: PPWR Packaging Data
    description: >-
      PPWR master data: packaging components, packaging units, their sizes,
      bills of materials and article links.
  - name: PPWR Documents
    description: >-
      Upload supporting documents (test reports, declarations, technical
      documentation) to a packaging unit or component.
  - name: PPWR Declarations of Conformity
    description: Read Declarations of Conformity and download their files.
  - name: PPWR Quantities & Volume Reports
    description: >-
      The SKU quantity feed, aggregate material tonnage and the generated volume
      reports (Mengenmeldung).
paths:
  /api/v1/ppwr/documents:
    post:
      tags:
        - PPWR Documents
      summary: Attach Document
      description: >-
        Step 2: attach the uploaded file to a packaging unit
        (`target.packagingSpecId`) or component (`target.componentId`) — exactly
        as the in-app "Nachweis hochladen": the document is accepted
        (`approved`) with the given `type`, and for an analysable type AI
        extraction is queued when your plan includes it (`extractionQueued`;
        otherwise `aiSkippedReason` says why). Target ids are UUIDs — resolve
        them with `GET /api/v1/ppwr/units?internalRef=…` or `GET
        /api/v1/ppwr/components`. A unit or component of another company, a
        deleted one, a `storageKey` not issued to your company, and a unit-only
        `type` (`technical_doc`, `declaration_of_conformity`, `marking`) on a
        component all answer `404 {"error": "target"}`. A `storageKey` that was
        already consumed by a successful attach (or has expired) answers `404
        {"error": "upload_missing"}` — start again at step 1. Re-use-system
        targets are not supported (`400 {"error": "unsupported_target"}`); a
        `target` with more than one id is `400 {"error": "ambiguous_target"}`.
        Requires `packaging:write`; customer workspace with the PPWR module
        enabled — see the guide.
      operationId: createPpwrDocument
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/PpwrDocumentInput'
            example:
              type: heavy_metals
              storageKey: >-
                pending/operator/3f6c2a8e-5b1d-4c7e-9a2f-6d8b1e4c0a17/1d5f9a3c-7e28-4b64-9c0a-3e8b6d2f4a19-heavy-metals-test-report-k1.pdf
              fileName: heavy-metals-test-report-k1.pdf
              target:
                componentId: e7b3c1a5-2d84-4f96-8c0e-4a9f6d2b7e13
      responses:
        '201':
          description: Document attached
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PpwrDocument'
              example:
                id: 5f9b3d7e-0a64-4c21-8e5f-2c8a4b6d0e71
                extractionQueued: true
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          $ref: '#/components/responses/NotFound'
        '409':
          description: >-
            A live document of your company already has these exact bytes —
            nothing was written. Re-send with `allowDuplicate: true` to attach a
            second copy anyway.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PpwrDocumentDuplicate'
              example:
                error: duplicate
                existing:
                  id: 5f9b3d7e-0a64-4c21-8e5f-2c8a4b6d0e71
                  fileName: heavy-metals-test-report-k1.pdf
                  anchor:
                    kind: component
                    ref: K-1
                    name: Folding box
        '429':
          $ref: '#/components/responses/TooManyRequests'
        '500':
          $ref: '#/components/responses/InternalError'
components:
  schemas:
    PpwrDocumentInput:
      type: object
      properties:
        type:
          type: string
          enum:
            - heavy_metals
            - pfas
            - recycled_content
            - technical_doc
            - declaration_of_conformity
            - other
            - technical_drawing
            - marking
            - supplier_statement
          description: >-
            Document type. `technical_doc`, `declaration_of_conformity` and
            `marking` can be attached to a packaging unit only.
        storageKey:
          type: string
          minLength: 1
          description: >-
            The `s3Key` from `POST /api/v1/ppwr/documents/upload-url`, after the
            file was uploaded. Usable for one attach.
        fileName:
          type:
            - string
            - 'null'
          minLength: 1
          description: File name to record for the document, or `null`.
        target:
          anyOf:
            - type: object
              properties:
                packagingSpecId:
                  type: string
                  format: uuid
                  description: >-
                    UUID of the packaging unit (`id` of `GET
                    /api/v1/ppwr/units`).
              required:
                - packagingSpecId
            - type: object
              properties:
                componentId:
                  type: string
                  format: uuid
                  description: >-
                    UUID of the packaging component (`id` of `GET
                    /api/v1/ppwr/components`).
              required:
                - componentId
          description: >-
            Where to attach the document: exactly one of `packagingSpecId` or
            `componentId`.
        allowDuplicate:
          type: boolean
          description: >-
            Send `true` to attach a second copy of a file that a `409` reported
            as a duplicate.
      required:
        - type
        - storageKey
        - fileName
        - target
      description: Attach an uploaded file as a document of a packaging unit or component.
    PpwrDocument:
      type: object
      properties:
        id:
          type: string
          format: uuid
          description: The new document's id.
        extractionQueued:
          type: boolean
          description: True when AI extraction was queued for this document.
        aiSkippedReason:
          type: string
          enum:
            - no_unit
            - quota
            - spend
            - enqueue
            - disabled
          description: >-
            Why an extractable document did NOT queue extraction; absent when it
            did, or when the type is not analysed.
      required:
        - id
        - extractionQueued
    PpwrDocumentDuplicate:
      type: object
      properties:
        error:
          type: string
          enum:
            - duplicate
          description: Always `duplicate`.
        existing:
          type: object
          properties:
            id:
              type: string
              format: uuid
              description: UUID of the existing document with the same bytes.
            fileName:
              type:
                - string
                - 'null'
              description: File name of the existing document, or `null`.
            anchor:
              type:
                - object
                - 'null'
              properties:
                kind:
                  type: string
                  enum:
                    - unit
                    - component
                  description: >-
                    Whether the existing copy is attached to a packaging unit or
                    a component.
                ref:
                  type: string
                  description: >-
                    Your reference of that unit (`internalRef`) or component
                    (`code`).
                name:
                  type: string
                  description: Name of that unit or component.
              required:
                - kind
                - ref
                - name
              description: >-
                The packaging unit or component the existing copy is attached
                to; null when it is on neither.
          required:
            - id
            - fileName
            - anchor
          description: >-
            The live document of your company that already has these exact
            bytes.
      required:
        - error
        - existing
    ErrorResponse:
      type: object
      properties:
        error:
          type: string
          description: >-
            Human-readable message, or a stable machine key (e.g.
            `batchTooLarge`, `overwriteRequired`, `duplicate`) on the batch,
            PPWR and upload endpoints.
        code:
          type: string
          description: >-
            Stable machine code on some `400` and `409` answers, e.g.
            `plot_geometry_invalid` or `FORK_HAS_ORDER`. Match on it rather than
            on `error`. Further flat keys may accompany it (e.g.
            `precisionDigits`, `field`).
        details:
          type: array
          items:
            $ref: '#/components/schemas/ValidationIssue'
          description: The validation issues on a `400` validation error.
        warnings:
          type: array
          items:
            type: object
            properties:
              type:
                type: string
                enum:
                  - duplicateName
                  - duplicateEan
                description: >-
                  `duplicateName`: a live article of your company already has
                  this name. `duplicateEan`: a live article already has this
                  EAN.
              existingInternalArticleNr:
                type: string
                description: >-
                  `duplicateName` only: internal article number of the existing
                  article.
              existingArticleName:
                type: string
                description: '`duplicateEan` only: name of the existing article.'
            required:
              - type
          description: >-
            `POST /articles` `409` only: soft duplicate warnings. Resend with
            `acknowledgeWarnings: true` to create the article anyway.
      required:
        - error
      additionalProperties: {}
      description: >-
        Error body of every endpoint except the `429` the edge answers. Some
        errors add flat machine-readable keys next to `error`, e.g.
        `maxBatchSize` on `413 batchTooLarge` or `confirmUpdateCount` on `409
        overwriteRequired`.
    RateLimitedResponse:
      type: object
      properties:
        error:
          type: object
          properties:
            code:
              type: string
              enum:
                - rate_limited
              description: Always `rate_limited`.
            message:
              type: string
              description: Human-readable explanation.
          required:
            - code
            - message
          description: Unlike every other error body, `error` is an object here.
      required:
        - error
    ValidationIssue:
      type: object
      properties:
        code:
          type: string
          description: >-
            Machine code of the issue, e.g. `invalid_type`, `too_small`,
            `custom`.
        path:
          type: array
          items:
            anyOf:
              - type: string
              - type: number
          description: >-
            Location of the offending value in the request: object keys and
            0-based array positions.
        message:
          type: string
          description: >-
            Human-readable English explanation. The wording may change; match on
            `code` and `path`.
      required:
        - code
        - path
        - message
      additionalProperties: {}
      description: >-
        One validation issue. Issue-specific keys (e.g. `expected`, `minimum`)
        may accompany the three listed.
  responses:
    BadRequest:
      description: Invalid request data
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorResponse'
          example:
            error: Validation failed
            details:
              - origin: string
                code: too_small
                minimum: 1
                inclusive: true
                path:
                  - address
                  - street
                message: Address is required.
    Unauthorized:
      description: Invalid or expired API key, or the key's user account is not active.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorResponse'
          example:
            error: Invalid or expired API key
    Forbidden:
      description: Insufficient permissions for this resource
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorResponse'
          example:
            error: Forbidden
    NotFound:
      description: Resource not found
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorResponse'
          example:
            error: Resource not found
    TooManyRequests:
      description: >-
        Rate limit exceeded: currently 1000 requests per 60 seconds per client
        IP across all `/api` paths. Issued by the edge before the application
        runs, so the JSON body differs from every other error: `error` is an
        object. A `429` with an HTML body instead of JSON means the request
        carried no API key.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/RateLimitedResponse'
          example:
            error:
              code: rate_limited
              message: …
    InternalError:
      description: Internal server error
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorResponse'
          example:
            error: Internal server error
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
      bearerFormat: API Key
      description: >-
        API key generated in Settings > API Keys. Include as `Authorization:
        Bearer <key>`.

````

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