Prewave EUDR - Customers - DDS API

🆕 NEW - Allows you to manage customer Due Diligence Statements (DDS), including creating, updating, submitting, withdrawing customer DDS, and viewing supplier DDS associated with products.

OpenAPI Specification

prewave-eudr-customers-dds-api-openapi.yml Raw ↑
openapi: 3.0.1
info:
  title: Public Prewave Actions EUDR - Customers - DDS API
  description: 'Documentation of the Public Prewave API.


    ## What''s New


    ### Q1 2026 — Supplier Management, User Management, Actions and Feed


    This quarter introduces major v2 upgrades, expanded administrative capabilities, and the new Actions API.


    - **Core Releases:** Deployed Supplier Management API v2 and Feed API v2, alongside the all-new Actions API.

    - **Enhanced Functionality:** Added robust identifier management, granular user and role configuration, and endpoints for managing supplier connection contacts.

    - ⚠️ **Required Migration:** Legacy v1 endpoints for Suppliers and Sites Upsert have been deprecated. Developers must migrate existing integrations to v2 by **May 31, 2027** (original deadline was December 31, 2026).


    📖 **[Read the Q1 2026 changelog](https://docs.prewave.com/en/articles/699847-q1-2026-public-api-updates)**


    ### Q2 2026 — Supplier Screening and External Scores


    We have expanded our v2 documentation to include comprehensive integration guidance for supplier screening and validation workflows and identifier-based external score ingestion.


    - **New Capabilities:** Added support for optional post-onboarding screening and validation during the create event.

    - **External Scores:** Batch POST for multiple supplier sites, per-site history GET, and event-type discovery GET (`/public/v1/scores/externals` and `/public/v1/scores/externals/event-types`). Documented in OpenAPI when enabled for your organization.

    - **Developer Resources:** Published new integration examples and detailed identifier validation rules to streamline your implementation process.


    📖 **[Read the Q2 2026 changelog](https://docs.prewave.com/en/articles/699849-q2-2026-public-api-updates)**


    ### Q3 2026 — Scores Webhooks


    To support event-driven architectures and eliminate the need for continuous API polling, we are introducing webhooks for score state changes later this year.


    - **Event-Driven Architecture:** Register webhook URLs to receive real-time HTTP payloads whenever a supplier''s score updates, so you can drive immediate mitigation responses without polling the API.

    - **Availability:** Comprehensive OpenAPI specifications and payload schemas will be published closer to the release date.

    - **Note:** Schemas and behaviors are subject to refinement prior to general availability.


    Documentation updates will be provided prior to release.


    ### Q4 2026 — Feed V2


    We are enhancing Feed API v2 with additional capabilities on top of the existing `GET /public/v2/feed` contract (see Q1 changelog and OpenAPI for the current Feed v2 integration).


    - **Availability:** Details will be announced before release.

    - **Note:** Schemas and behaviors are subject to refinement prior to the official release.


    Documentation updates will be provided prior to release.


    ---


    ## Authentication

    Prewave’s public api uses *API tokens* to authenticate against our RESTful service. We’ll provide you an *API-token* that each

    endpoint needs present as a http header.


    To pass the token in a request, simply add it as a header-parameter with

    * key = X-Auth-Token

    * value = api-token


    See an example in curl below where the api-token would be 12345678-90ab-cdef-1234-567890abcdef

    ```

    curl --request GET \

    --url https://REPLACE_WITH_SERVER/public/v1/target/prewave/3975230/alerts \

    --header ''X-Auth-Token: 12345678-90ab-cdef-1234-567890abcdef''

    ```


    ---


    ## Manage API Tokens


    Before you can obtain your API token, you''ll need the credentials for your API user. These credentials will be

    sent to you as part of the company-onboarding. If you haven''t got your credentials yet, please reach out to

    your sales-contact at Prewave or contact us via info@prewave.ai


    To generate an API Token, navigate to https://www.prewave.com/management/api and log in with the

    credentials of your API user. Then click at the button "Create New" and use your new api-token authentication as a header parameter.


    You can create multiple API tokens and also remove existing API tokens on https://www.prewave.com/management/api.

    API tokens do not expire, therefore you have to maintain the list of API tokens you are using manually.


    ---


    ## Default Rate Limits


    We have two types of default rate limits. For increased access, please contact customer success.


    | Type                              | Requests per 10 seconds | Requests per Minute |

    |-----------------------------------|-------------------------|---------------------|

    | GET requests                      | 100                     | 500                 |

    | POST, PUT, PATCH, DELETE requests | 20                      | 100                 |


    '
  version: '1.0'
servers:
- url: https://api.prewave.com
  description: Production Environment
security:
- Token authentication: []
tags:
- name: EUDR - Customers - DDS
  description: 🆕 NEW - Allows you to manage customer Due Diligence Statements (DDS), including creating, updating, submitting, withdrawing customer DDS, and viewing supplier DDS associated with products.
paths:
  /public/v2/eudr/customers/customer-dds/{ddsId}:
    put:
      tags:
      - EUDR - Customers - DDS
      summary: Update a customer DDS for an inbound product
      description: "\nUpdates an existing customer Due Diligence Statement (DDS) identified by `ddsId`.\nThe payload must contain all required customer, activity, and product measure fields.\n\n**Use Cases**:\n- Update compliance statements\n- Modify due diligence information\n- Correct DDS data before submission\n\n**Required permission:** `access_public_products` and `UPDATE` on the DDS\n        "
      operationId: updateCustomerDDS
      parameters:
      - name: ddsId
        in: path
        description: ID of the customer DDS to update.
        required: true
        schema:
          type: integer
        example: 123
      requestBody:
        description: Updated customer DDS payload. Same shape as the create request.
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/PublicCustomerDDSPayload'
            examples:
              Update customer DDS:
                summary: Revised product measures and references
                description: Update customer DDS
                value: '{"eoriNumber":"EU123456789","customerName":"Acme GmbH","customerCity":"Vienna","customerPostalCode":"1010","customerStreet":"Main Street 1","customerCountryId":14,"activityType":"Import","countryOfActivityId":14,"originRequestReferences":[{"reference":["PO-2025-001","PO-2025-002"],"type":"PurchaseOrder"},{"reference":["SHP-2025-042"],"type":"ShipmentNumber"}],"netWeightInKg":1250.75,"quantity":10,"unit":"m3"}'
        required: true
      responses:
        '200':
          description: Customer DDS updated successfully.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PublicCustomerDDS'
              examples:
                Updated customer DDS:
                  summary: Customer DDS after a successful update
                  description: Updated customer DDS
                  value: '{"id":123,"active":true,"referenceNumber":"EU-REF-12345","verificationNumber":"VER-987654","date":{"date":"2025-09-30T12:00:00","_datetype_":"DateTime"},"archived":false,"archiveDate":null,"origins":[],"eoriNumber":"EU123456789","customerName":"Acme GmbH","customerCity":"Vienna","customerPostalCode":"1010","customerStreet":"Main Street 1","customerCountry":{"id":14,"name":"Austria","countryCode":"AT","bounds":null},"state":"Available","operatorType":"RepresentativeOperator","activityType":"Import","countryOfActivity":{"id":14,"name":"Austria","countryCode":"AT","bounds":null},"originRequestReferences":[{"ddsId":456,"reference":"PO-2025-001","type":"PurchaseOrder"},{"ddsId":457,"reference":"SHP-2025-042","type":"ShipmentNumber"}],"productName":"Oak Wood Planks","productDescription":"Sawn oak wood planks, 2 m length, kiln-dried","netWeightInKg":1250.75,"quantity":10,"unit":"m3","hsCode":"440799","submissionError":null}'
        '400':
          description: Invalid request payload (e.g. missing required fields, invalid values).
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorDTO'
              examples:
                Missing field:
                  description: Missing field
                  value:
                    code: invalid_payload
                    message: Field 'eoriNumber' is required
                Missing unit for HS code:
                  description: Missing unit for HS code
                  value:
                    code: invalid_payload
                    message: Unit is required for HS code 123456
                Missing quantity for HS code:
                  description: Missing quantity for HS code
                  value:
                    code: invalid_payload
                    message: Quanity is required for HS code 123456
                Unit not supported for HS code:
                  description: Unit not supported for HS code
                  value:
                    code: invalid_payload
                    message: Unit must be omitted because no unit definition exists for HS code 123456
                Quantity not supported for HS code:
                  description: Quantity not supported for HS code
                  value:
                    code: invalid_payload
                    message: Quantity must be omitted because no unit definition exists for HS code 123456
        '404':
          description: DDS not found.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorDTO'
        '403':
          description: '403 Forbidden - Authentication or authorization failure. This status code is returned when: (1) the request lacks valid authentication credentials (missing or invalid X-Auth-Token header), or (2) the authenticated user does not have the required permission to access this resource.'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AccessDeniedErrorDTO'
              examples:
                Access denied example:
                  summary: User lacks necessary permissions or authentication
                  value: "{\n        \"loggedIn\": true,\n        \"code\": \"access_denied\",\n        \"message\": \"Access denied: you don't have necessary permissions to access this resource\",\n        \"solution\": \"Contact support for appropriate permissions\"\n    }"
        '500':
          description: 500 Internal Server Error - An unexpected error occurred on the server. The request may or may not have been processed.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorDTO'
              examples:
                Error - Server Error:
                  summary: Unexpected server error
                  value: "{\n        \"code\": \"internal_error\",\n        \"message\": \"An unexpected error occurred\",\n        \"solution\": \"Please try again later or contact support\"\n    }"
        '429':
          description: '429 Too Many Requests - API rate limit exceeded. The request has been rejected because the rate limit for this endpoint has been exceeded. Default rate limits: GET requests - 100 per 10 seconds, 500 per minute; POST/PUT/PATCH/DELETE requests - 20 per 10 seconds, 100 per minute. For increased access, please contact customer success.'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ApiRateLimitResponse'
              examples:
                Rate limit exceeded example:
                  summary: API rate limit exceeded
                  value: "{\n        \"error\": \"API rate limit exceeded\",\n        \"message\": \"You have reached the maximum allowed requests. Please try again later or upgrade your plan for increased access\",\n        \"requestLimit\": 20,\n        \"requestCount\": 20,\n        \"limits\": [\n            {\n                \"requestLimit\": 20,\n                \"timeInSeconds\": 10\n            },\n            {\n                \"requestLimit\": 100,\n                \"timeInSeconds\": 60\n            }\n        ],\n        \"currentTime\": \"2026-01-15T10:30:00\",\n        \"nextResetAt\": \"2026-01-15T10:30:10\"\n    }"
    delete:
      tags:
      - EUDR - Customers - DDS
      summary: Delete a customer DDS before successful submission
      description: "\nDelete a customer Due Diligence Statement (DDS) while it is new or in submission-error state.\n\nThis endpoint permanently removes the specified customer DDS.\nIt cannot be used for DDS entries that have already been submitted or made available.\nUse with caution as this operation cannot be undone.\n\n**Required permission:** `access_public_products` and access to the DDS\n        "
      operationId: deleteCustomerDDS
      parameters:
      - name: ddsId
        in: path
        description: ID of the customer DDS to delete.
        required: true
        schema:
          type: integer
        example: 123
      responses:
        '204':
          description: Customer DDS deleted successfully.
          content: {}
        '400':
          description: Invalid request payload (e.g. missing required fields, invalid values).
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorDTO'
              examples:
                Missing field:
                  description: Missing field
                  value:
                    code: invalid_payload
                    message: Field 'eoriNumber' is required
                Missing unit for HS code:
                  description: Missing unit for HS code
                  value:
                    code: invalid_payload
                    message: Unit is required for HS code 123456
                Missing quantity for HS code:
                  description: Missing quantity for HS code
                  value:
                    code: invalid_payload
                    message: Quanity is required for HS code 123456
                Unit not supported for HS code:
                  description: Unit not supported for HS code
                  value:
                    code: invalid_payload
                    message: Unit must be omitted because no unit definition exists for HS code 123456
                Quantity not supported for HS code:
                  description: Quantity not supported for HS code
                  value:
                    code: invalid_payload
                    message: Quantity must be omitted because no unit definition exists for HS code 123456
        '404':
          description: DDS not found.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorDTO'
        '403':
          description: '403 Forbidden - Authentication or authorization failure. This status code is returned when: (1) the request lacks valid authentication credentials (missing or invalid X-Auth-Token header), or (2) the authenticated user does not have the required permission to access this resource.'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AccessDeniedErrorDTO'
              examples:
                Access denied example:
                  summary: User lacks necessary permissions or authentication
                  value: "{\n        \"loggedIn\": true,\n        \"code\": \"access_denied\",\n        \"message\": \"Access denied: you don't have necessary permissions to access this resource\",\n        \"solution\": \"Contact support for appropriate permissions\"\n    }"
        '500':
          description: 500 Internal Server Error - An unexpected error occurred on the server. The request may or may not have been processed.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorDTO'
              examples:
                Error - Server Error:
                  summary: Unexpected server error
                  value: "{\n        \"code\": \"internal_error\",\n        \"message\": \"An unexpected error occurred\",\n        \"solution\": \"Please try again later or contact support\"\n    }"
        '429':
          description: '429 Too Many Requests - API rate limit exceeded. The request has been rejected because the rate limit for this endpoint has been exceeded. Default rate limits: GET requests - 100 per 10 seconds, 500 per minute; POST/PUT/PATCH/DELETE requests - 20 per 10 seconds, 100 per minute. For increased access, please contact customer success.'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ApiRateLimitResponse'
              examples:
                Rate limit exceeded example:
                  summary: API rate limit exceeded
                  value: "{\n        \"error\": \"API rate limit exceeded\",\n        \"message\": \"You have reached the maximum allowed requests. Please try again later or upgrade your plan for increased access\",\n        \"requestLimit\": 20,\n        \"requestCount\": 20,\n        \"limits\": [\n            {\n                \"requestLimit\": 20,\n                \"timeInSeconds\": 10\n            },\n            {\n                \"requestLimit\": 100,\n                \"timeInSeconds\": 60\n            }\n        ],\n        \"currentTime\": \"2026-01-15T10:30:00\",\n        \"nextResetAt\": \"2026-01-15T10:30:10\"\n    }"
  /public/v2/eudr/customers/customer-dds/{ddsId}/submission:
    put:
      tags:
      - EUDR - Customers - DDS
      summary: Submit a customer DDS to TracesNT system
      description: "\nSubmits the specified customer Due Diligence Statement (DDS) to the TracesNT system for regulatory processing.\nReturns `202 Accepted` if the request is successfully queued for processing.\n\n**Use Cases**:\n- Submit DDS to regulatory system\n- Complete compliance workflow\n- Register DDS with authorities\n\n**Required permission:** `access_public_products` and `UPDATE` on the DDS\n        "
      operationId: submitCustomerDDS
      parameters:
      - name: ddsId
        in: path
        description: ID of the customer DDS to submit.
        required: true
        schema:
          type: integer
        example: 123
      responses:
        '202':
          description: Request accepted for processing.
          content: {}
        '400':
          description: Invalid request payload (e.g. missing required fields, invalid values).
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorDTO'
              examples:
                Missing field:
                  description: Missing field
                  value:
                    code: invalid_payload
                    message: Field 'eoriNumber' is required
                Missing unit for HS code:
                  description: Missing unit for HS code
                  value:
                    code: invalid_payload
                    message: Unit is required for HS code 123456
                Missing quantity for HS code:
                  description: Missing quantity for HS code
                  value:
                    code: invalid_payload
                    message: Quanity is required for HS code 123456
                Unit not supported for HS code:
                  description: Unit not supported for HS code
                  value:
                    code: invalid_payload
                    message: Unit must be omitted because no unit definition exists for HS code 123456
                Quantity not supported for HS code:
                  description: Quantity not supported for HS code
                  value:
                    code: invalid_payload
                    message: Quantity must be omitted because no unit definition exists for HS code 123456
        '404':
          description: DDS not found.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorDTO'
        '403':
          description: '403 Forbidden - Authentication or authorization failure. This status code is returned when: (1) the request lacks valid authentication credentials (missing or invalid X-Auth-Token header), or (2) the authenticated user does not have the required permission to access this resource.'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AccessDeniedErrorDTO'
              examples:
                Access denied example:
                  summary: User lacks necessary permissions or authentication
                  value: "{\n        \"loggedIn\": true,\n        \"code\": \"access_denied\",\n        \"message\": \"Access denied: you don't have necessary permissions to access this resource\",\n        \"solution\": \"Contact support for appropriate permissions\"\n    }"
        '500':
          description: 500 Internal Server Error - An unexpected error occurred on the server. The request may or may not have been processed.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorDTO'
              examples:
                Error - Server Error:
                  summary: Unexpected server error
                  value: "{\n        \"code\": \"internal_error\",\n        \"message\": \"An unexpected error occurred\",\n        \"solution\": \"Please try again later or contact support\"\n    }"
        '429':
          description: '429 Too Many Requests - API rate limit exceeded. The request has been rejected because the rate limit for this endpoint has been exceeded. Default rate limits: GET requests - 100 per 10 seconds, 500 per minute; POST/PUT/PATCH/DELETE requests - 20 per 10 seconds, 100 per minute. For increased access, please contact customer success.'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ApiRateLimitResponse'
              examples:
                Rate limit exceeded example:
                  summary: API rate limit exceeded
                  value: "{\n        \"error\": \"API rate limit exceeded\",\n        \"message\": \"You have reached the maximum allowed requests. Please try again later or upgrade your plan for increased access\",\n        \"requestLimit\": 20,\n        \"requestCount\": 20,\n        \"limits\": [\n            {\n                \"requestLimit\": 20,\n                \"timeInSeconds\": 10\n            },\n            {\n                \"requestLimit\": 100,\n                \"timeInSeconds\": 60\n            }\n        ],\n        \"currentTime\": \"2026-01-15T10:30:00\",\n        \"nextResetAt\": \"2026-01-15T10:30:10\"\n    }"
  /public/v2/eudr/customers/products/{productId}/customer-dds:
    get:
      tags:
      - EUDR - Customers - DDS
      summary: Fetch customer DDS entries for a product
      description: "\nReturns all customer Due Diligence Statements (DDS) associated with the given inbound or outbound product.\nOnly accessible if the caller has read permission for the product.\n\n**Use Cases**:\n- View all customer DDS entries for a product\n- Track compliance statements\n- Review DDS history and submission status\n\n**Required permission:** `access_public_products` and `READ` on the product\n        "
      operationId: findCustomerDDS
      parameters:
      - name: productId
        in: path
        description: ID of the product for which to fetch customer DDS entries.
        required: true
        schema:
          type: integer
        example: 301
      responses:
        '200':
          description: List of customer DDS entries for the product.
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/PublicCustomerDDS'
              examples:
                Customer DDS list:
                  summary: Multiple customer DDS entries including an available and a submission-error state
                  description: Customer DDS list
                  value: '[{"id":123,"active":true,"referenceNumber":"EU-REF-12345","verificationNumber":"VER-987654","date":{"date":"2025-09-30T12:00:00","_datetype_":"DateTime"},"archived":false,"archiveDate":null,"origins":[],"eoriNumber":"EU123456789","customerName":"Acme GmbH","customerCity":"Vienna","customerPostalCode":"1010","customerStreet":"Main Street 1","customerCountry":{"id":14,"name":"Austria","countryCode":"AT","bounds":null},"state":"Available","operatorType":"RepresentativeOperator","activityType":"Import","countryOfActivity":{"id":14,"name":"Austria","countryCode":"AT","bounds":null},"originRequestReferences":[{"ddsId":456,"reference":"PO-2025-001","type":"PurchaseOrder"},{"ddsId":457,"reference":"SHP-2025-042","type":"ShipmentNumber"}],"productName":"Oak Wood Planks","productDescription":"Sawn oak wood planks, 2 m length, kiln-dried","netWeightInKg":1250.75,"quantity":10,"unit":"m3","hsCode":"440799","submissionError":null},{"id":124,"active":true,"referenceNumber":null,"verificationNumber":null,"date":{"date":"2025-10-05T09:30:00","_datetype_":"DateTime"},"archived":false,"archiveDate":null,"origins":[],"eoriNumber":"EU987654321","customerName":"Beta Trading AG","customerCity":"Zurich","customerPostalCode":"8001","customerStreet":"Bahnhofstrasse 10","customerCountry":{"id":756,"name":"Switzerland","countryCode":"CH","bounds":null},"state":"SubmissionError","operatorType":"RepresentativeOperator","activityType":"Export","countryOfActivity":{"id":756,"name":"Switzerland","countryCode":"CH","bounds":null},"originRequestReferences":[],"productName":"Plywood Panels","productDescription":"Veneered plywood panels for furniture production","netWeightInKg":850.00,"quantity":25,"unit":"NAR","hsCode":"441510","submissionError":{"code":"INVALID_EORI","detail":"The EORI number could not be validated with the regulatory system.","reasons":["EORI number format is invalid","No matching operator record found"]}}]'
                No customer DDS entries:
                  summary: Product has no customer DDS yet
                  description: No customer DDS entries
                  value: []
        '403':
          description: '403 Forbidden - Authentication or authorization failure. This status code is returned when: (1) the request lacks valid authentication credentials (missing or invalid X-Auth-Token header), or (2) the authenticated user does not have the required permission to access this resource.'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AccessDeniedErrorDTO'
              examples:
                Access denied example:
                  summary: User lacks necessary permissions or authentication
                  value: "{\n        \"loggedIn\": true,\n        \"code\": \"access_denied\",\n        \"message\": \"Access denied: you don't have necessary permissions to access this resource\",\n        \"solution\": \"Contact support for appropriate permissions\"\n    }"
        '500':
          description: 500 Internal Server Error - An unexpected error occurred on the server. The request may or may not have been processed.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorDTO'
              examples:
                Error - Server Error:
                  summary: Unexpected server error
                  value: "{\n        \"code\": \"internal_error\",\n        \"message\": \"An unexpected error occurred\",\n        \"solution\": \"Please try again later or contact support\"\n    }"
        '429':
          description: '429 Too Many Requests - API rate limit exceeded. The request has been rejected because the rate limit for this endpoint has been exceeded. Default rate limits: GET requests - 100 per 10 seconds, 500 per minute; POST/PUT/PATCH/DELETE requests - 20 per 10 seconds, 100 per minute. For increased access, please contact customer success.'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ApiRateLimitResponse'
              examples:
                Rate limit exceeded example:
                  summary: API rate limit exceeded
                  value: "{\n        \"error\": \"API rate limit exceeded\",\n        \"message\": \"You have reached the maximum allowed requests. Please try again later or upgrade your plan for increased access\",\n        \"requestLimit\": 100,\n        \"requestCount\": 100,\n        \"limits\": [\n            {\n                \"requestLimit\": 100,\n                \"timeInSeconds\": 10\n            },\n            {\n                \"requestLimit\": 500,\n                \"timeInSeconds\": 60\n            }\n        ],\n        \"currentTime\": \"2026-01-15T10:30:00\",\n        \"nextResetAt\": \"2026-01-15T10:30:10\"\n    }"
    post:
      tags:
      - EUDR - Customers - DDS
      summary: Create a new customer DDS for an inbound product
      description: "\nCreates a new customer Due Diligence Statement (DDS) for the specified inbound product.\nThe payload must contain all required customer, activity, and product measure fields.\n\n**Use Cases**:\n- Create compliance statements for products\n- Document due diligence information\n- Prepare DDS data before regulatory submission\n\n**Required permission:** `access_public_products` and `UPDATE` on the product\n        "
      operationId: addCustomerDDS
      parameters:
      - name: productId
        in: path
        description: ID of the product for which to create the customer DDS.
        required: true
        schema:
          type: integer
        example: 301
      requestBody:
        description: Customer DDS payload with operator details, activity type, product measures, and optional references.
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/PublicCustomerDDSPayload'
            examples:
              Create customer DDS:
                summary: Import activity with purchase order and shipment references
                description: Create customer DDS
                value: '{"eoriNumber":"EU123456789","customerName":"Acme GmbH","customerCity":"Vienna","customerPostalCode":"1010","customerStreet":"Main Street 1","customerCountryId":14,"activityType":"Import","countryOfActivityId":14,"originRequestReferences":[{"reference":["PO-2025-001","PO-2025-002"],"type":"PurchaseOrder"},{"reference":["SHP-2025-042"],"type":"ShipmentNumber"}],"netWeightInKg":1250.75,"quantity":10,"unit":"m3"}'
        required: true
      responses:
        '200':
          description: Customer DDS created successfully.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PublicCustomerDDS'
              examples:
                Created customer DDS:
                  summary: Newly created DDS in Available state
                  description: Created customer DDS
                  value: '{"id":123,"active":true,"referenceNumber":"EU-REF-12345","verificationNumber":"VER-987654","date":{"date":"2025-09-30T12:00:00","_datetype_":"DateTime"},"archived":false,"archiveDate":null,"origins":[],"eoriNumber":"EU123456789","customerName":"Acme GmbH","customerCity":"Vienna","customerPostalCode":"1010","customerStreet":"Main Street 1","customerCountry":{"id":14,"name":"Austria","countryCode":"AT","bounds":null},"state":"Available","operatorType":"RepresentativeOperator","activityType":"Import","countryOfActivity":{"id":14,"name":"Austria","countryCode":"AT","bounds":null},"originRequestReferences":[{"ddsId":456,"reference":"PO-2025-001","type":"PurchaseOrder"},{"ddsId":457,"reference":"SHP-2025-042","type":"ShipmentNumber"}],"productName":"Oak Wood Planks","productDescription":"Sawn oak wood planks, 2 m length, kiln-dried","netWeightInKg":1250.75,"quantity":10,"unit":"m3","hsCode":"440799

# --- truncated at 32 KB (91 KB total) ---
# Full source: https://raw.githubusercontent.com/api-evangelist/prewave/refs/heads/main/openapi/prewave-eudr-customers-dds-api-openapi.yml