{"openapi":"3.0.1","info":{"title":"Public Prewave API","description":"Documentation of the Public Prewave API.\n\n## What's New\n\n### Q1 2026 — Supplier Management, User Management, Actions and Feed\n\nThis quarter introduces major v2 upgrades, expanded administrative capabilities, and the new Actions API.\n\n- **Core Releases:** Deployed Supplier Management API v2 and Feed API v2, alongside the all-new Actions API.\n- **Enhanced Functionality:** Added robust identifier management, granular user and role configuration, and endpoints for managing supplier connection contacts.\n- ⚠️ **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).\n\n📖 **[Read the Q1 2026 changelog](https://docs.prewave.com/en/articles/699847-q1-2026-public-api-updates)**\n\n### Q2 2026 — Supplier Screening and External Scores\n\nWe have expanded our v2 documentation to include comprehensive integration guidance for supplier screening and validation workflows and identifier-based external score ingestion.\n\n- **New Capabilities:** Added support for optional post-onboarding screening and validation during the create event.\n- **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.\n- **Developer Resources:** Published new integration examples and detailed identifier validation rules to streamline your implementation process.\n\n📖 **[Read the Q2 2026 changelog](https://docs.prewave.com/en/articles/699849-q2-2026-public-api-updates)**\n\n### Q3 2026 — Scores Webhooks\n\nTo support event-driven architectures and eliminate the need for continuous API polling, we are introducing webhooks for score state changes later this year.\n\n- **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.\n- **Availability:** Comprehensive OpenAPI specifications and payload schemas will be published closer to the release date.\n- **Note:** Schemas and behaviors are subject to refinement prior to general availability.\n\nDocumentation updates will be provided prior to release.\n\n### Q4 2026 — Feed V2\n\nWe 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).\n\n- **Availability:** Details will be announced before release.\n- **Note:** Schemas and behaviors are subject to refinement prior to the official release.\n\nDocumentation updates will be provided prior to release.\n\n---\n\n## Authentication\nPrewave’s public api uses *API tokens* to authenticate against our RESTful service. We’ll provide you an *API-token* that each\nendpoint needs present as a http header.\n\nTo pass the token in a request, simply add it as a header-parameter with\n* key = X-Auth-Token\n* value = api-token\n\nSee an example in curl below where the api-token would be 12345678-90ab-cdef-1234-567890abcdef\n```\ncurl --request GET \\\n--url https://REPLACE_WITH_SERVER/public/v1/target/prewave/3975230/alerts \\\n--header 'X-Auth-Token: 12345678-90ab-cdef-1234-567890abcdef'\n```\n\n---\n\n## Manage API Tokens\n\nBefore you can obtain your API token, you'll need the credentials for your API user. These credentials will be\nsent to you as part of the company-onboarding. If you haven't got your credentials yet, please reach out to\nyour sales-contact at Prewave or contact us via info@prewave.ai\n\nTo generate an API Token, navigate to https://www.prewave.com/management/api and log in with the\ncredentials of your API user. Then click at the button \"Create New\" and use your new api-token authentication as a header parameter.\n\nYou can create multiple API tokens and also remove existing API tokens on https://www.prewave.com/management/api.\nAPI tokens do not expire, therefore you have to maintain the list of API tokens you are using manually.\n\n---\n\n## Default Rate Limits\n\nWe have two types of default rate limits. For increased access, please contact customer success.\n\n| Type                              | Requests per 10 seconds | Requests per Minute |\n|-----------------------------------|-------------------------|---------------------|\n| GET requests                      | 100                     | 500                 |\n| POST, PUT, PATCH, DELETE requests | 20                      | 100                 |\n\n","version":"1.0"},"servers":[{"url":"https://api.prewave.com","description":"Production"}],"security":[{"Token authentication":[]}],"tags":[{"name":"Actions","description":"🆕 NEW - Retrieve actions (tasks/work items), action types, and action statuses for supplier relationships, compliance reviews, and operational activities. Available from February 2026."},{"name":"Alerts","description":"Endpoints for retrieving alert information from user feeds, disruption maps, and specific targets. Supports filtering by collections, dates, priorities, geographic regions, target identifiers, and other criteria."},{"name":"Collections - Management","description":"Public API for managing collections in Prewave's supply chain network. Collections are used to organize and group suppliers (targets) in your supply chain."},{"name":"Collections - Network","description":"Allows you to retrieve network information. Like tree-graph and commodity-graph."},{"name":"Collections - Network (deprecated)","description":"⚠️ **DEPRECATED** - This API is deprecated and will be removed on 31 May 2027. Use v2 commodity-graph or Collections Tier-N instead."},{"name":"Collections - Targets","description":"Public API for managing targets within collections in Prewave's supply chain network."},{"name":"Collections - Tier-N","description":"Public API for retrieving supplier relationship graphs from tier-n enabled collections."},{"name":"Collections - Tier-N (deprecated)","description":"⚠️ **DEPRECATED** - This API is deprecated and will be removed on 31 May 2027. Use GET /public/v1/collections/{collectionId}/tier-n/data instead."},{"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."},{"name":"EUDR - Customers - Origin Requests","description":"Allows you to manage customer origin requests for products, including creating, updating, closing requests, and viewing requests per product."},{"name":"EUDR - Customers - Products","description":"Allows you to manage customer inbound products, including creating, updating, and deactivating products."},{"name":"EUDR - Customers - Suppliers","description":"Allows you to search for suppliers, find suppliers by IDs or references, and manage supplier connection contacts."},{"name":"EUDR - Shared","description":"Shared reference data for EUDR, including countries, HS codes, and commodities. Available to both customers and suppliers."},{"name":"EUDR - Suppliers","description":"Allows suppliers to manage their origin requests, view their customers, and answer origin requests with supplier DDS."},{"name":"Exposure","description":"Get exposure analysis graph and targets"},{"name":"Infotags","description":"Allows you to retrieve information about infotags and groups."},{"name":"Scores - Enterprise Export","description":"Public API for managing enterprise export configurations and retrieving score data in Prewave's supply chain network."},{"name":"Scores - Externals","description":"Upload and read custom supplier scores from your systems (e.g. SAP). Bulk upload, list event types, and view history per supplier. Available from June 2026."},{"name":"Scores - Target","description":"\n⚠️ **DEPRECATED** - Target score endpoints. These endpoints are deprecated and will be removed on 31 May 2027. Use `/public/v1/enterprise-export/scores` instead.\n\n**Note**: Responses from these endpoints include a `Sunset` HTTP header (RFC 8594) indicating the removal date.\n    "},{"name":"Suppliers - Connection Contacts","description":"🆕 NEW - Supplier connection contact management endpoints. Available from February 2026."},{"name":"Suppliers - Industries","description":"🆕 NEW - List Prewave industries that can be associated with suppliers via public API create."},{"name":"Suppliers - Management","description":"Supplier management endpoints for listing, retrieving, updating supplier data, and bulk operations."},{"name":"Suppliers - Sites","description":"🆕 NEW - Supplier and site management endpoints. Available from January 2026."},{"name":"Suppliers - Sites Upsert","description":"⚠️ **DEPRECATED** - This API is deprecated and will be removed on 31 May 2027. Use /public/v2/suppliers/sites instead."},{"name":"Suppliers - Supplier Graph","description":"⚠️ **DEPRECATED** - This API is deprecated and will be removed on 31 May 2027."},{"name":"Users","description":"🆕 NEW - API to manage users in the public network. Available from February 2026."},{"name":"Users - Roles","description":"🆕 NEW - API to manage user roles in the public network. Available from February 2026."}],"paths":{"/public/v2/eudr/customers/products/inbound/{productId}":{"put":{"tags":["EUDR - Customers - Products"],"summary":"Update an existing inbound product","description":"\nUpdate an existing inbound product's information.\n\nAll product fields in the payload can be updated; changes are persisted immediately.\n\n**Required permission:** `access_public_products` and `UPDATE` on the product\n        ","operationId":"updateInboundProduct","parameters":[{"name":"productId","in":"path","description":"The ID of the product.","required":true,"schema":{"type":"integer","format":"int32"},"example":301}],"requestBody":{"description":"Updated inbound product payload.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicInboundProductPayload"},"examples":{"Update inbound product":{"summary":"Revised name, reference, HS code, and supplier","description":"Update inbound product","value":"{\"name\":\"Oak Wood Planks\",\"scientificName\":\"Quercus robur\",\"reference\":\"INB-2025-001\",\"hsCode\":\"440799\",\"annualSpend\":null,\"annualQuantity\":null,\"unit\":null,\"supplierId\":102006215}"}}}},"required":true},"responses":{"200":{"description":"Product updated successfully."},"400":{"description":"Errors if related data not found or invalid","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorDTO"},"examples":{"HS Code not found":{"description":"HS Code not found","value":{"code":"hs_code_not_found","message":"HS code not found: HSCode=123456","solution":"Check if the identifier provided is correct or create the record first"}},"Supplier not found":{"description":"Supplier not found","value":{"code":"supplier_not_found","message":"Supplier not found: ID=123456","solution":"Check if the identifier provided is correct or create the record first"}},"Missing product scientific name":{"description":"Missing product scientific name","value":{"code":"missing_wooden_product_scientific_name","message":"Missing product scientific name for wooden product","solution":"Provide a scientific name for wooden products"}}}}}},"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/origin-requests/{originRequestId}":{"put":{"tags":["EUDR - Customers - Origin Requests"],"summary":"Update origin request","description":"\n\nUpdate an existing origin request. Only requests in `Requested` status can be updated.\nAt least one of `requestedWeight` or `endDate` must be provided.\n- `requestedWeight` — update the requested weight for the origin request.\n- `endDate` — update the end date for the origin request.\n\n\n**Required permission:** `access_public_products`\n        ","operationId":"updateOriginRequest","parameters":[{"name":"originRequestId","in":"path","description":"The ID of the origin request.","required":true,"schema":{"type":"integer","format":"int32"},"example":1001}],"requestBody":{"description":"Updated end date and/or requested weight. At least one field must be provided.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicUpdateOriginRequestPayload"},"examples":{"Update weight and end date":{"summary":"Extend deadline and increase requested weight","description":"Update weight and end date","value":"{\"endDate\":{\"date\":\"2025-10-31\",\"_datetype_\":\"Date\"},\"requestedWeight\":1500.00}"}}}},"required":true},"responses":{"200":{"description":"Origin request updated successfully."},"400":{"description":"Origin request cannot be updated.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorDTO"},"examples":{"Missing update fields":{"description":"Missing update fields","value":{"code":"invalid_request","message":"At least one of 'requestedWeight' or 'endDate' must be provided for update.","solution":"Fix the request"}},"Negative weight":{"description":"Negative weight","value":{"code":"invalid_request","message":"Requested weight can not be zero or negative.","solution":"Fix the request"}},"End date in the past":{"description":"End date in the past","value":{"code":"invalid_request","message":"End date must be in the future.","solution":"Fix the request"}}}}}},"404":{"description":"Origin request not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorDTO"},"examples":{"Origin request not found":{"description":"Origin request not found","value":{"code":"resource_not_found","message":"Origin request #123 not found"}}}}}},"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/origin-requests/{originRequestId}/close":{"put":{"tags":["EUDR - Customers - Origin Requests"],"summary":"Close origin request","description":"\n\nThe request can be closed only if it is in `Requested` or `Delayed` status.\nClosing the request prevents any further updates or actions on it.\nOnce closed, the request status is set to `Answered` or `Canceled`:\n- **Answered** — at least one origin has been provided for the request.\n- **Canceled** — no origins have been provided for the request.\n\n\n**Required permission:** `access_public_products`\n        ","operationId":"closeOriginRequest","parameters":[{"name":"originRequestId","in":"path","description":"The ID of the origin request.","required":true,"schema":{"type":"integer","format":"int32"},"example":1001}],"responses":{"200":{"description":"Origin request closed successfully."},"400":{"description":"Origin request has already been answered or cancelled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorDTO"},"examples":{"Already answered":{"description":"Already answered","value":{"code":"invalid_request","message":"Origin request with id 6 has already been answered.","solution":"Fix the request"}},"Already cancelled":{"description":"Already cancelled","value":{"code":"invalid_request","message":"Origin request with id 6 has already been cancelled.","solution":"Fix the request"}}}}}},"404":{"description":"Origin request not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorDTO"},"examples":{"Origin request not found":{"description":"Origin request not found","value":{"code":"resource_not_found","message":"Origin request #6 not found"}}}}}},"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}":{"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/v1/target/{systemId}/{targetId}/data":{"put":{"tags":["Suppliers - Management"],"summary":"Update target data.","description":"\nUpdate spend data and Code of Conduct status for the specified target.\n\n**Required Permission**: `update_supplier_data`\n    ","operationId":"updateEdgeData","parameters":[{"name":"systemId","in":"path","description":"The system ID is an identifier to determine from which the targetId might originate from. Supported systemIds are \"prewave\", \"customer\", \"supplier\", \"own\".","required":true,"schema":{"type":"string"},"example":"prewave"},{"name":"targetId","in":"path","description":"The target ID can be the target's prewaveId or an external id (edge number) representing the site in another system.","required":true,"schema":{"type":"string"},"example":10422185}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicUpdateEdgeDataPayload"}}},"required":true},"responses":{"200":{"description":"Target data updated successfully. Returns the full updated target payload.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicTargetDTO"},"examples":{"Updated target example":{"summary":"Target payload after a successful update","description":"Updated target example","value":"{\"id\":102006215,\"name\":\"Acme Manufacturing Inc\",\"sname\":\"4990729\",\"logo\":\"/images/company-img/acme-manufacturing-logo.svg\",\"backgroundPicture\":\"/images/company-img/acme-manufacturing-bg.jpg\",\"description\":\"Automotive parts manufacturer specializing in electric vehicle components and battery assemblies.\",\"website\":\"https://www.acme-manufacturing.example.com\",\"location\":\"Detroit, MI, US\",\"yearFounded\":1987,\"size\":\"Large\",\"screened\":true,\"screenedStatus\":\"Screened\",\"linkedInId\":\"acme-manufacturing\",\"type\":{\"id\":5195261,\"type\":\"organization\",\"displayName\":\"Site Group\",\"pluralName\":\"Site Groups\",\"ordering\":0,\"scoring\":\"Alert\"},\"ctype\":{\"id\":972417,\"ctype\":\"company\",\"targetTypeId\":5195261,\"displayName\":\"Site Group\",\"pluralName\":\"Site Groups\",\"icon\":\"fas fa-building\",\"ordering\":0,\"priority\":0,\"connectable\":true,\"bgColor\":\"#E8F4FD\",\"textColor\":\"#1A365D\"},\"geo\":{\"geometry\":null,\"properties\":{\"name\":\"Detroit\",\"countryCode\":\"US\",\"alertCount\":null,\"boundingBox\":null},\"type\":\"Feature\"},\"geoShape\":{\"geometry\":null,\"properties\":{\"name\":null,\"countryCode\":null,\"alertCount\":null,\"boundingBox\":null},\"type\":\"Feature\"},\"parents\":[],\"organization\":{\"id\":987654321,\"name\":\"Acme Corporation\",\"sname\":\"6252001\",\"logo\":\"/images/company-img/acme-corporation-logo.svg\",\"backgroundPicture\":\"/images/company-img/acme-corporation-bg.jpg\",\"description\":\"Global automotive supplier and parent organization of Acme Manufacturing Inc.\",\"website\":\"https://www.acme-corporation.example.com\",\"location\":\"Stuttgart, DE\",\"yearFounded\":1962,\"size\":\"Very large\",\"screened\":true,\"screenedStatus\":\"Screened\",\"linkedInId\":\"acme-corporation\",\"type\":{\"id\":5195261,\"type\":\"organization\",\"displayName\":\"Site Group\",\"pluralName\":\"Site Groups\",\"ordering\":0,\"scoring\":\"Alert\"},\"ctype\":{\"id\":972417,\"ctype\":\"company\",\"targetTypeId\":5195261,\"displayName\":\"Site Group\",\"pluralName\":\"Site Groups\",\"icon\":\"fas fa-building\",\"ordering\":0,\"priority\":0,\"connectable\":true,\"bgColor\":\"#E8F4FD\",\"textColor\":\"#1A365D\"},\"geo\":{\"geometry\":null,\"properties\":{\"name\":\"Stuttgart\",\"countryCode\":\"DE\",\"alertCount\":null,\"boundingBox\":null},\"type\":\"Feature\"},\"geoShape\":{\"geometry\":null,\"properties\":{\"name\":null,\"countryCode\":null,\"alertCount\":null,\"boundingBox\":null},\"type\":\"Feature\"},\"parents\":[],\"organization\":null,\"industries\":[],\"monitoredSince\":{\"date\":\"2018-01-10T09:00:00\",\"_datetype_\":\"DateTime\"},\"earliestAlert\":{\"date\":\"2019-04-12T14:30:00\",\"_datetype_\":\"DateTime\"},\"ordering\":0,\"disruptionStatusUpdate\":null,\"own\":true,\"managed\":true,\"isPublic\":true,\"connectionContactsCount\":12,\"population\":null,\"following\":true,\"collectionFollowing\":true,\"tier\":null,\"path\":[],\"collectionLevel\":1,\"collectionPath\":[{\"id\":42,\"name\":\"Tier-1 Suppliers\"}],\"collectionPaths\":[[{\"id\":42,\"name\":\"Tier-1 Suppliers\"}]],\"foreignSystems\":[{\"system\":\"customer\",\"id\":\"ACME-CORP-001\",\"source\":\"SAP\"}],\"scoreAvail\":\"Alert\",\"revenue\":8500000000,\"impact\":\"Low\",\"hsCode\":[{\"code\":\"870810\",\"nshipments\":128}],\"merged_targets\":[]},\"industries\":[{\"id\":554433221,\"name\":\"Automotive Manufacturing\",\"sname\":null,\"logo\":null,\"backgroundPicture\":null,\"description\":\"Industry classification for automotive parts and vehicle component manufacturing.\",\"website\":null,\"location\":\"Global\",\"yearFounded\":null,\"size\":null,\"screened\":true,\"screenedStatus\":\"Screened\",\"linkedInId\":null,\"type\":{\"id\":5195261,\"type\":\"organization\",\"displayName\":\"Site Group\",\"pluralName\":\"Site Groups\",\"ordering\":0,\"scoring\":\"Alert\"},\"ctype\":{\"id\":1122334,\"ctype\":\"industry\",\"targetTypeId\":5195261,\"displayName\":\"Industry\",\"pluralName\":\"Industries\",\"icon\":\"fas fa-industry\",\"ordering\":10,\"priority\":1,\"connectable\":false,\"bgColor\":\"#F0F0F0\",\"textColor\":\"#333333\"},\"geo\":{\"geometry\":null,\"properties\":{\"name\":null,\"countryCode\":null,\"alertCount\":null,\"boundingBox\":null},\"type\":\"Feature\"},\"geoShape\":{\"geometry\":null,\"properties\":{\"name\":null,\"countryCode\":null,\"alertCount\":null,\"boundingBox\":null},\"type\":\"Feature\"},\"parents\":[],\"organization\":null,\"industries\":[],\"monitoredSince\":null,\"ordering\":null,\"disruptionStatusUpdate\":null,\"own\":false,\"managed\":false,\"isPublic\":null,\"connectionContactsCount\":null,\"population\":null,\"following\":false,\"collectionFollowing\":false,\"tier\":null,\"path\":[],\"collectionLevel\":null,\"collectionPath\":[],\"collectionPaths\":[],\"foreignSystems\":[],\"scoreAvail\":\"None\",\"revenue\":123.456,\"impact\":\"Low\",\"hsCode\":[],\"merged_targets\":[]}],\"monitoredSince\":{\"date\":\"2020-03-15T10:30:00\",\"_datetype_\":\"DateTime\"},\"earliestAlert\":{\"date\":\"2021-06-01T08:00:00\",\"_datetype_\":\"DateTime\"},\"ordering\":1,\"disruptionStatusUpdate\":null,\"own\":true,\"managed\":true,\"isPublic\":false,\"connectionContactsCount\":3,\"population\":null,\"following\":true,\"collectionFollowing\":true,\"tier\":null,\"path\":[{\"id\":987654321,\"name\":\"Acme Corporation\",\"customName\":null,\"latestRequest\":null,\"foreignSystems\":[{\"number\":\"ACME-CORP-001\",\"source\":\"SAP\",\"existingEdgeId\":null}]},{\"id\":102006215,\"name\":\"Acme Manufacturing Inc\",\"customName\":null,\"latestRequest\":null,\"foreignSystems\":[{\"number\":\"SUPPLIER001\",\"source\":\"SAP\",\"existingEdgeId\":null}]}],\"collectionLevel\":2,\"collectionPath\":[{\"id\":42,\"name\":\"Tier-1 Suppliers\"},{\"id\":108,\"name\":\"Automotive\"}],\"collectionPaths\":[[{\"id\":42,\"name\":\"Tier-1 Suppliers\"},{\"id\":108,\"name\":\"Automotive\"}],[{\"id\":55,\"name\":\"North America\"},{\"id\":108,\"name\":\"Automotive\"}]],\"foreignSystems\":[{\"system\":\"customer\",\"id\":\"SUPPLIER001\",\"source\":\"SAP\"},{\"system\":\"supplier\",\"id\":\"ACME-MFG-42\",\"source\":\"Excel\"}],\"scoreAvail\":\"Peer\",\"revenue\":1250000000,\"impact\":\"Low\",\"hsCode\":[{\"code\":\"870899\",\"nshipments\":42},{\"code\":\"401110\",\"nshipments\":15}],\"merged_targets\":[102001100]}"}}}}},"404":{"description":"Target not found or no permission to access it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorDTO"},"examples":{"Target not found":{"description":"Target not found","value":"{\"code\":\"resource_not_found\",\"message\":\"Target not found: systemId=customer, targetId=INVALID_ID\",\"solution\":\"Verify target ID and system ID are correct\"}"}}}}},"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/v1/collections/{collectionId}":{"get":{"tags":["Collections - Management"],"summary":"Get collection by ID","description":"\nRetrieve a specific collection by its unique identifier.\n\nThe collection must be accessible to the authenticated user and must be active (not deactivated). This includes:\n- Collections owned by the user\n- Collections shared with the user's teams\n- Organization-wide collections (if user has appropriate permissions)\n\n**Note**: Inactive (deactivated) collections will return `404 Not Found`, even if you have `READ` permission on them.\n\n**Response:**\nReturns a collection object with full details including nested child collections. The response includes the same fields as the list endpoint, but with the complete collection tree structure recursively populated. See the `PublicCollectionDTO` schema for complete field definitions.\n\n**Response Details:**\n- The response includes the full collection tree structure with all child collections recursively populated\n- Child collections have the same structure as the parent collection, allowing for nested hierarchies\n- Only active collections are returned (inactive/deactivated collections are filtered out)\n- Fields with null values (`parentId`, `updatedAt`) are omitted from the JSON response. This is standard JSON serialization behavior.\n\n**Required Permissions**: `ACCESS_COLLECTION` and `READ` on the collection.\n        ","operationId":"getCollectionById","parameters":[{"name":"collectionId","in":"path","description":"The unique identifier (ID) of the collection to retrieve. This is the same identifier returned in the `id` field when retrieving collections via GET /public/v1/collections.","required":true,"schema":{"type":"integer","format":"int32"},"example":123}],"responses":{"200":{"description":"200 OK - Collection found and returned successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicCollectionDTO"},"examples":{"Collection - Single Result":{"summary":"Sample collection response","description":"Note: Fields with null values (such as `updatedAt`) are omitted from the JSON response. The `parentId` field is included when it has a value.","value":"{\"id\":123,\"uuid\":\"550e8400-e29b-41d4-a716-446655440000\",\"scope\":\"User\",\"type\":\"Default\",\"name\":\"European Suppliers\",\"count\":15,\"lanes\":true,\"tiersEnabled\":true,\"parentId\":100,\"children\":[{\"id\":124,\"uuid\":\"660e8400-e29b-41d4-a716-446655440001\",\"scope\":\"Customer\",\"type\":\"Default\",\"name\":\"Tier 1 Suppliers\",\"count\":8,\"lanes\":false,\"tiersEnabled\":true,\"parentId\":123,\"children\":[],\"updatedAt\":null}],\"updatedAt\":null}"},"Collection - No Children":{"summary":"Collection without child collections","description":"Note: Fields with null values (such as `parentId` and `updatedAt`) are omitted from the JSON response.","value":"{\"id\":125,\"uuid\":\"770e8400-e29b-41d4-a716-446655440002\",\"scope\":\"Customer\",\"type\":\"Default\",\"name\":\"My Suppliers\",\"count\":45,\"lanes\":false,\"tiersEnabled\":false,\"parentId\":null,\"children\":[],\"updatedAt\":null}"}}}}},"404":{"description":"404 Not Found - The collection with the specified ID was not found, is inactive (deactivated), or is not accessible to your organization. This may occur if: (1) the collection ID doesn't exist, (2) the collection was deactivated (soft-deleted), (3) the collection was never accessible to your organization, or (4) the collection is inactive and filtered out by the system.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorDTO"},"examples":{"Collection not found":{"summary":"Collection ID does not exist or is not accessible","description":"Collection not found","value":"{\"code\":\"resource_not_found\",\"message\":\"Collection with id 123 not found\",\"solution\":\"Verify the collection ID and ensure it belongs to your organization\"}"}}}}},"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    }"}}}}}}},"put":{"tags":["Collections - Management"],"summary":"Update an existing collection","description":"\nUpdate an existing collection's name and lanes settings.\n\nOnly active collections that the user has update permissions for can be modified. Only the collection name and lanes setting can be updated through this endpoint. Other properties like `scope` and `tiersEnabled` cannot be changed after creation.\n\n**Note**: Inactive (deactivated) collections will return `404 Not Found`, even if you have `UPDATE` permission on them.\n\n**Request:**\nOnly `name` (required) and `lanes` (optional) fields can be updated. All other fields (`scope`, `tiersEnabled`, `parentId`) cannot be changed through this endpoint. See the `PublicCollectionUpdatePayload` schema for complete field definitions.\n\n**Validation Rules:**\n- Collection names must be unique within the user's scope (duplicate names will result in `409 Conflict`)\n- The collection must exist, be active (not deactivated), and be accessible to the user\n- The user must have `UPDATE` permission on the collection\n- The user must be the collection creator OR have been granted access to the collection\n\n**What happens when you update a collection:**\n\n1. **Collection Update**: The collection's name and/or lanes setting are updated\n2. **Audit Trail**: The update is recorded in the audit log with:\n   - The user who updated the collection\n   - Timestamp of the operation\n   - Previous and new values for changed fields\n   - Reference to the public API endpoint used\n   - Audit comment: \"Collection name and lanes updated via Public API\"\n\n**Important Notes:**\n\n- Collection names must be unique within the user's scope - attempting to use a duplicate name will result in `409 Conflict`\n- Only `name` and `lanes` can be updated through this endpoint - all other fields (`scope`, `type`, `tiersEnabled`, `parentId`) are preserved from the existing collection\n- The `scope` and `tiersEnabled` fields are immutable after creation\n- Inactive (deactivated) collections cannot be updated and will return `404 Not Found`\n- All collection operations are audited for compliance and tracking purposes\n\n**Required Permissions**: `MANAGE_COLLECTION` and `UPDATE` on the collection.\n        ","operationId":"updateCollection","parameters":[{"name":"collectionId","in":"path","description":"The unique identifier (ID) of the collection to update. This is the same identifier returned in the `id` field when retrieving collections via GET /public/v1/collections.","required":true,"schema":{"type":"integer","format":"int32"},"example":123}],"requestBody":{"description":"Collection update payload. Content-Type must be `application/json`. Only `name` and `lanes` fields can be updated. All other fields (`scope`, `tiersEnabled`, `parentId`) cannot be changed through this endpoint.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicCollectionUpdatePayload"},"examples":{"Update Collection - Name and Lanes":{"summary":"Example updating both name and lanes","description":"Update Collection - Name and Lanes","value":"{\"name\":\"Updated Supplier Collection\",\"lanes\":false}"},"Update Collection - Name Only":{"summary":"Example updating only the name","description":"Update Collection - Name Only","value":"{\"name\":\"Renamed Collection\",\"lanes\":false}"},"Update Collection - Lanes Only":{"summary":"Example updating only lanes setting","description":"Update Collection - Lanes Only","value":"{\"name\":\"My Suppliers\",\"lanes\":true}"}}}},"required":true},"responses":{"200":{"description":"200 OK - Collection updated successfully. The update has been audited with the comment 'Collection name and lanes updated via Public API'.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicCollectionDTO"},"examples":{"Updated collection response":{"summary":"Example of an updated collection","description":"Note: Fields with null values (such as `updatedAt`) are omitted from the JSON response. The `parentId` field is included when it has a value.","value":"{\"id\":123,\"uuid\":\"550e8400-e29b-41d4-a716-446655440000\",\"scope\":\"User\",\"type\":\"Default\",\"name\":\"Updated Supplier Collection\",\"count\":15,\"lanes\":false,\"tiersEnabled\":true,\"parentId\":100,\"children\":[],\"updatedAt\":null}"}}}}},"400":{"description":"400 Bad Request - Invalid request payload or validation errors. The request body is malformed or contains invalid data.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorDTO"},"examples":{"Missing required field":{"summary":"Required field is missing","description":"Missing required field","value":"{\"code\":\"invalid_request\",\"message\":\"Name is required\",\"solution\":\"Fix the request\"}"},"Blank field validation":{"summary":"Required field is blank or contains only whitespace","description":"Blank field validation","value":"{\"code\":\"invalid_request\",\"message\":\"Name is required\",\"solution\":\"Fix the request\"}"},"Invalid JSON":{"summary":"Request body is not valid JSON","description":"Invalid JSON","value":"{\"code\":\"invalid_request\",\"message\":\"Name is required\",\"solution\":\"Fix the request\"}"}}}}},"404":{"description":"404 Not Found - The collection with the specified ID was not found, is inactive (deactivated), or is not accessible to your organization. This may occur if: (1) the collection ID doesn't exist, (2) the collection was deactivated (soft-deleted), (3) the collection was never accessible to your organization, (4) you don't have update access (you must be the collection creator OR have been granted access), or (5) the collection is inactive and filtered out by the system.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorDTO"},"examples":{"Collection not found":{"summary":"Collection ID does not exist or is not accessible","description":"Collection not found","value":"{\"code\":\"resource_not_found\",\"message\":\"Collection with id 123 not found or access denied\",\"solution\":\"Verify the collection ID and ensure you have the required permission on the collection\"}"}}}}},"409":{"description":"409 Conflict - A collection with the same name already exists in the user's scope. Collection names must be unique within each scope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorDTO"},"examples":{"Duplicate collection name":{"summary":"Collection name already exists in scope","description":"Duplicate collection name","value":"{\"code\":\"duplicate_resource\",\"message\":\"Collection with name 'New Supplier Collection' already exists in Customer scope\",\"solution\":\"Use a different collection name or a different scope\"}"}}}}},"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":["Collections - Management"],"summary":"Deactivate a collection","description":"\nDeactivate (soft delete) an existing collection.\n\nThis operation performs a **soft deletion** by marking the collection as inactive. The collection data remains in the database but is no longer accessible through the API.\n\n**Parameter:**\n- `{collectionId}` (path parameter): The unique identifier of the collection to deactivate.\n\n**What happens when you deactivate a collection:**\n\n1. **Collection Deactivation**: The collection is soft-deleted (marked as inactive)\n2. **API Visibility**: The collection will no longer appear in collection list queries (`GET /public/v1/collections`) or be accessible via `GET /public/v1/collections/{collectionId}`\n3. **Target Relationships**: Target-collection relationships remain in the database, but since the collection is inactive, targets linked to this collection become inaccessible through the API. The targets themselves are not deleted.\n4. **Cleanup**: Collection filters and tree filters associated with the collection are removed\n5. **User Default Collection**: If this collection was set as the user's default collection, it will be cleared\n6. **Audit Trail**: The deactivation is recorded in the audit log with:\n   - The user who deactivated the collection\n   - Timestamp of the operation\n   - Collection details (name, scope, type, ID)\n   - Reference to the public API endpoint used\n   - Audit comment: \"Collection deleted via Public API\"\n\n**Important Notes:**\n\n- This is a **soft delete** - the collection is marked as inactive but data remains in the database\n- Deactivated collections are filtered out from all API queries automatically\n- **Only the creator of the collection can deactivate it** - even if you have `DELETE` permission through a role, you must be the collection creator\n- Target-collection relationships remain in the database, but targets become inaccessible through the API since the collection is inactive\n- The targets themselves are not deleted - only the collection becomes inactive\n- The collection cannot be reactivated through this API (no reactivation endpoint is available)\n- All collection operations are audited for compliance and tracking purposes\n\n**Required Permissions**:\n- `MANAGE_COLLECTION` permission\n- `DELETE` permission on the collection\n- **You must be the creator of the collection** (collection.userId must match your user ID)\n        ","operationId":"deleteCollection","parameters":[{"name":"collectionId","in":"path","description":"The unique identifier (ID) of the collection to deactivate. This is the same identifier returned in the `id` field when retrieving collections via GET /public/v1/collections.","required":true,"schema":{"type":"integer","format":"int32"},"example":123}],"responses":{"204":{"description":"204 No Content - Collection deactivated successfully. The collection has been soft-deleted (marked as inactive), and the deactivation has been audited with the comment 'Collection deleted via Public API'. The collection will no longer appear in API queries. Target-collection relationships remain in the database but become inaccessible since the collection is inactive.","content":{"application/json":{"examples":{"Success response":{"summary":"Collection successfully deactivated","description":"The response body is empty (204 No Content). The collection has been soft-deleted (marked as inactive) and all changes have been audited. The collection will no longer be accessible through the API.","value":null}}}}},"400":{"description":"400 Bad Request - Invalid request. This status code is returned when the request is malformed or validation fails. This may occur if: (1) the collection cannot be deleted due to validation constraints, (2) the request parameters are invalid, or (3) there are other validation errors preventing the deletion.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorDTO"},"examples":{"Invalid request":{"summary":"Request validation failed","description":"Invalid request","value":"{\"message\":\"Invalid request\",\"code\":\"invalid_request\",\"solution\":\"Fix the request\"}"}}}}},"404":{"description":"404 Not Found - The collection with the specified ID was not found, is inactive (deactivated), or is not accessible to your organization. This may occur if: (1) the collection ID doesn't exist, (2) the collection was deactivated (soft-deleted), (3) the collection was never accessible to your organization, or (4) you don't have read access to the collection.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorDTO"},"examples":{"Collection not found":{"summary":"Collection ID does not exist or is not accessible","description":"Collection not found","value":"{\"code\":\"resource_not_found\",\"message\":\"Collection with id 123 not found or access denied\",\"solution\":\"Verify the collection ID and ensure you have the required permission on the collection\"}"}}}}},"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/v1/collections/{collectionId}/tier-n/settings":{"get":{"tags":["Collections - Tier-N"],"summary":"Get tier-n collection settings","description":"\n### Overview\nRetrieve tier-n configuration for a collection. These settings are used as defaults when calling `GET .../tier-n/data` and can be overridden via query parameters there.\n\n### Related Operations\n- **Data**: [GET /public/v1/collections/{collectionId}/tier-n/data](#operations-Collections_-_Tier-N-getTierNCollectionGraph)\n- **Update**: [PUT /public/v1/collections/{collectionId}/tier-n/settings](#operations-Collections_-_Tier-N-updateTierNCollectionSettings)\n\n### Required Permission\n`access_public_supplier_graph`, `access_collection`, and `read` on the collection.\n    ","operationId":"getTierNCollectionSettings","parameters":[{"name":"collectionId","in":"path","description":"Unique identifier of the tier-n collection. Same as the `id` from GET /public/v1/collections. The collection must have tiersEnabled=true.","required":true,"schema":{"type":"integer","format":"int32"},"example":123}],"responses":{"200":{"description":"Successfully retrieved tier-n collection settings.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicTierNCollectionSettings"},"examples":{"Tier-N Settings - Complete":{"description":"Tier-N Settings - Complete","value":"{\"collectionId\":123,\"collectionName\":\"Electronics Supply Chain\",\"maxTier\":3,\"targetIds\":[101,102,103],\"scopePrivate\":true,\"scopeShared\":true,\"scopePublic\":false,\"sourceCustomer\":true,\"sourceCustoms\":true,\"sourceMedia\":false,\"sourcePrewavePrediction\":true,\"minShipments\":5,\"probability\":75,\"shipmentsPeriodFrom\":{\"date\":\"2024-01-01\",\"_datetype_\":\"Date\"},\"shipmentsPeriodTo\":{\"date\":\"2024-12-31\",\"_datetype_\":\"Date\"},\"suspectedSuppliers\":false,\"logisticsProvider\":false,\"commodityFilterTargetIds\":[201,202]}"},"Tier-N Settings - Minimal":{"description":"Tier-N Settings - Minimal","value":"{\"collectionId\":456,\"collectionName\":\"Basic Collection\",\"maxTier\":1,\"targetIds\":[501],\"scopePrivate\":false,\"scopeShared\":false,\"scopePublic\":true,\"sourceCustomer\":false,\"sourceCustoms\":true,\"sourceMedia\":false,\"sourcePrewavePrediction\":false,\"minShipments\":null,\"probability\":null,\"shipmentsPeriodFrom\":null,\"shipmentsPeriodTo\":null,\"suspectedSuppliers\":false,\"logisticsProvider\":false,\"commodityFilterTargetIds\":[]}"}}}}},"400":{"description":"Collection is not tier-n enabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorDTO"},"examples":{"Not tier-n collection":{"description":"Not tier-n collection","value":"{\"code\":\"INVALID_REQUEST\",\"message\":\"Only tier-n collections can be used by this endpoint. Collection 123 does not have tiers enabled.\",\"solution\":\"Use a collection with tiersEnabled=true\"}"}}}}},"404":{"description":"Collection not found, inactive, not tier-n enabled, or not accessible.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorDTO"},"examples":{"Collection not found":{"description":"Collection not found","value":"{\"code\":\"RESOURCE_NOT_FOUND\",\"message\":\"Collection not found: ID=123\",\"solution\":\"Check collection ID or verify access permissions\"}"}}}}},"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    }"}}}}}}},"put":{"tags":["Collections - Tier-N"],"summary":"Update tier-n collection settings","description":"\n### Overview\nUpdate tier-n configuration for a collection. All request fields are optional (partial update). Updated settings become defaults for `GET .../tier-n/data`.\n\n### Validation\n- Collection must exist, be active, and have `tiersEnabled=true`.\n- `maxTier` 1–9 if provided; `probability` 0–100 if provided; dates in YYYY-MM-DD; `shipmentsPeriodFrom` ≤ `shipmentsPeriodTo`.\n\n### Audit\nThe update is recorded with comment \"Tier-n collection settings updated via Public API\".\n\n### Required Permission\n`manage_collection` and `update` on the collection.\n    ","operationId":"updateTierNCollectionSettings","parameters":[{"name":"collectionId","in":"path","description":"Unique identifier of the tier-n collection. Same as the `id` from GET /public/v1/collections. The collection must have tiersEnabled=true.","required":true,"schema":{"type":"integer","format":"int32"},"example":123}],"requestBody":{"description":"Tier-n settings update. Content-Type: application/json. All fields optional.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicTierNCollectionSettingsUpdateRequest"},"examples":{"Update max tier":{"description":"Update max tier","value":"{\"maxTier\":4,\"scopePrivate\":null,\"scopeShared\":null,\"scopePublic\":null,\"sourceCustomer\":null,\"sourceCustoms\":null,\"sourceMedia\":null,\"sourcePrewavePrediction\":null,\"minShipments\":null,\"probability\":null,\"shipmentsPeriodFrom\":null,\"shipmentsPeriodTo\":null,\"suspectedSuppliers\":null,\"logisticsProvider\":null}"},"Update data sources":{"description":"Update data sources","value":"{\"maxTier\":null,\"scopePrivate\":null,\"scopeShared\":null,\"scopePublic\":null,\"sourceCustomer\":null,\"sourceCustoms\":null,\"sourceMedia\":true,\"sourcePrewavePrediction\":false,\"minShipments\":null,\"probability\":null,\"shipmentsPeriodFrom\":null,\"shipmentsPeriodTo\":null,\"suspectedSuppliers\":null,\"logisticsProvider\":null}"},"Update filters":{"description":"Update filters","value":"{\"maxTier\":null,\"scopePrivate\":null,\"scopeShared\":null,\"scopePublic\":null,\"sourceCustomer\":null,\"sourceCustoms\":null,\"sourceMedia\":null,\"sourcePrewavePrediction\":null,\"minShipments\":10,\"probability\":85,\"shipmentsPeriodFrom\":{\"date\":\"2024-06-01\",\"_datetype_\":\"Date\"},\"shipmentsPeriodTo\":{\"date\":\"2024-11-30\",\"_datetype_\":\"Date\"},\"suspectedSuppliers\":null,\"logisticsProvider\":null}"},"Remove filters":{"description":"Remove filters","value":"{\"minShipments\":null,\"probability\":null}"}}}},"required":true},"responses":{"200":{"description":"Tier-n collection settings updated successfully.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicTierNCollectionSettings"},"examples":{"Updated settings":{"description":"Updated settings","value":"{\"collectionId\":123,\"collectionName\":\"My Tier-N Collection\",\"maxTier\":3,\"targetIds\":[101,102,103],\"scopePrivate\":true,\"scopeShared\":true,\"scopePublic\":false,\"sourceCustomer\":true,\"sourceCustoms\":true,\"sourceMedia\":false,\"sourcePrewavePrediction\":true,\"minShipments\":5,\"probability\":75,\"shipmentsPeriodFrom\":{\"date\":\"2024-01-01\",\"_datetype_\":\"Date\"},\"shipmentsPeriodTo\":{\"date\":\"2024-12-31\",\"_datetype_\":\"Date\"},\"suspectedSuppliers\":false,\"logisticsProvider\":false,\"commodityFilterTargetIds\":[201,202]}"}}}}},"400":{"description":"Not tier-n enabled, invalid payload, maxTier/probability out of range, or invalid dates.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorDTO"},"examples":{"Not tier-n collection":{"description":"Not tier-n collection","value":"{\"code\":\"INVALID_REQUEST\",\"message\":\"Only tier-n collections can be used by this endpoint. Collection 123 does not have tiers enabled.\",\"solution\":\"Use a collection with tiersEnabled=true\"}"},"Invalid maxTier":{"description":"Invalid maxTier","value":"{\"code\":\"INVALID_REQUEST\",\"message\":\"maxTier must be between 1 and 9, got: 10\",\"solution\":\"Provide a valid maxTier value between 1 and 9\"}"}}}}},"404":{"description":"Collection not found, inactive, not tier-n enabled, or no UPDATE permission.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorDTO"},"examples":{"Collection not found":{"description":"Collection not found","value":"{\"code\":\"RESOURCE_NOT_FOUND\",\"message\":\"Collection not found: ID=123\",\"solution\":\"Verify the collection ID and ensure you have UPDATE permission on the collection\"}"}}}}},"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/v1/alpha/exposure/target/{targetId}/graph":{"put":{"tags":["Exposure"],"summary":"Get exposure graph by target id","description":"**Performance impact**: Medium","operationId":"getExposureGraphByTargetId","parameters":[{"name":"targetId","in":"path","required":true,"schema":{"type":"integer","format":"int32"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseExposurePayload"}}},"required":true},"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ExplorerGraph"}}}},"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/v1/alpha/exposure/target/{systemId}/{targetId}/graph":{"put":{"tags":["Exposure"],"summary":"Get exposure graph by foreign system target id","description":"**Performance impact**: Medium","operationId":"getExposureGraphByForeignSystemTargetId","parameters":[{"name":"systemId","in":"path","required":true,"schema":{"type":"string"}},{"name":"targetId","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseExposurePayload"}}},"required":true},"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ExplorerGraph"}}}},"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/suppliers/sites":{"get":{"tags":["Suppliers - Sites"],"summary":"Get all suppliers","description":"\nRetrieve all supplier sites accessible to the authenticated user with pagination support.\n\nThis endpoint returns a list of supplier sites (physical locations/branches with addresses), not site-groups (general company owners). Each site represents a specific physical location where the supplier operates.\n\n**Related Endpoints:**\n- To find suppliers by specific identifiers, use `GET /public/v2/suppliers/sites/find-by-identifier`.\n- To create a new supplier, use `POST /public/v2/suppliers/sites`.\n- To check pending supplier creation requests, use `GET /public/v2/suppliers/sites/pending`.\n- To deactivate a supplier, use `DELETE /public/v2/suppliers/sites`.\n\nReturns supplier sites that the user has access to with simplified information:\n- Prewave Target ID\n- Name\n- Address (physical address of the site, if available)\n- City\n- Country Code\n- Supplier IDs\n\n**Ordering:**\n- Supplier sites are ordered alphabetically by name (case-insensitive), then by ID for deterministic pagination\n- Supplier IDs within each supplier site are ordered alphabetically by number, with null sources appearing last\n\n**Pagination:**\n- Results are paginated for efficient data retrieval\n- Use query parameters to control pagination:\n  - `page`: Page number (0-indexed, default: 0)\n  - `size`: Number of items per page (default: 10)\n- Ordering is fixed (alphabetically by name, then by ID) to ensure consistent results across pagination requests\n\n**Required Permission**: `ACCESS_PUBLIC_SUPPLIERS`\n    ","operationId":"getAllSuppliers","parameters":[{"name":"page","in":"query","description":"Zero-based page index (0..N)","required":false,"schema":{"minimum":0,"type":"integer","default":0}},{"name":"size","in":"query","description":"The size of the page to be returned","required":false,"schema":{"minimum":1,"type":"integer","default":10}},{"name":"sort","in":"query","description":"Sorting criteria in the format: property,(asc|desc). Default sort order is ascending. Multiple sort criteria are supported.","required":false,"schema":{"type":"array","items":{"type":"string"}}}],"responses":{"200":{"description":"Successfully retrieved suppliers","content":{"application/json":{"schema":{"type":"object","properties":{"content":{"type":"array","items":{"$ref":"#/components/schemas/PublicSupplierV2DTO"}},"size":{"type":"integer","format":"int32"},"number":{"type":"integer","format":"int32"},"totalElements":{"type":"integer","format":"int32"},"totalPages":{"type":"integer","format":"int32"},"numberOfElements":{"type":"integer","format":"int32"},"first":{"type":"boolean"},"last":{"type":"boolean"},"empty":{"type":"boolean"}}},"examples":{"Supplier - Multiple Results":{"summary":"Sample paginated supplier response","description":"Supplier - Multiple Results","value":{"content":[{"prewaveTargetId":102006215,"name":"Acme Corporation","address":"123 Main St, Vienna, Austria","city":"Vienna","countryCode":"AT","supplierIds":[{"id":"SUP-12345","source":"SAP"},{"id":"BNOID-67890"}]},{"prewaveTargetId":102006216,"name":"Beta Industries Ltd","address":"456 Business Ave, Berlin, Germany","city":"Berlin","countryCode":"DE","supplierIds":[{"id":"SUP-54321","source":"Oracle"}]}],"size":20,"number":0,"totalElements":57,"totalPages":3,"numberOfElements":2}}}}}},"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":["Suppliers - Sites"],"summary":"Create a new supplier","description":"\nCreate a new supplier with the specified properties.\n\nThe supplier will be created and automatically added to the user's supplier connections.\nAll required fields must be provided and will be validated.\n\n**Asynchronous Processing:**\n- Supplier creation is an asynchronous process that may take a few hours to complete.\n- The endpoint returns immediately with a `202 Accepted` status and a UUID for tracking.\n- The `202 Accepted` status indicates that the request has been accepted for processing but the resource is not yet fully created.\n- Use the returned UUID to track the request status via `GET /public/v2/suppliers/sites/pending?uuid={UUID}` (the Location header also points to this endpoint with the UUID query parameter).\n- Once processing is complete, the supplier will be available via `GET /public/v2/suppliers/sites` (get all suppliers) or `GET /public/v2/suppliers/sites/find-by-identifier` (find by identifier).\n\n**Request:**\nThe request body includes required fields (name, countryCode, city, address, supplierId) and optional fields (postalCode, industries, screeningPeriodInYears, requestValidationOnCreate). See the `PublicSupplierCreatePayloadV2` schema for complete field definitions, validation rules, and formatting requirements.\n\n**Industries:**\n- Optional `industries` accepts Prewave industry **names** from `GET /public/v1/industries` (case-insensitive match).\n- Resolved industries are stored as Prewave industry IDs with canonical catalog names.\n- Unknown or ambiguous names return `400 Bad Request`. Commodities are not accepted.\n\n**Optional post-init screening and validation:**\n- **`screeningPeriodInYears`** (optional): If set to **2**, **5**, or **10**, a history screening for that many years is scheduled automatically after the supplier is created and onboarding completes. Requires `ACCESS_PUBLIC_SCREENING_REQUEST` in addition to `ACCESS_PUBLIC_CONNECT_TARGET`. Omit or null to skip. Invalid values (e.g. 3) return `400 Bad Request` (`Failed to map screening period …`). After onboarding, poll `GET /public/v2/suppliers/sites/screening` with the same supplier identifiers.\n- **`requestValidationOnCreate`** (optional): If `true`, a validation (discovery) request is scheduled automatically after onboarding completes. Requires `ACCESS_PUBLIC_VALIDATION_REQUEST` in addition to `ACCESS_PUBLIC_CONNECT_TARGET`. Omit, null, or `false` to skip. After onboarding, poll `GET /public/v2/suppliers/sites/validation` with the same supplier identifiers.\n\n**Validation Rules:**\n- The combination of `supplierId.id` + `supplierId.source` must be unique within your organization.\n- A supplier creation request cannot be created if there's already a pending request with the same `supplierId.id` + `supplierId.source` combination (returns `409 Conflict`).\n- The `supplierId.id` must not already exist as a supplier ID for another supplier in your organization (returns `409 Conflict`).\n- All string fields are automatically trimmed of leading/trailing whitespace.\n\n**Idempotency:**\nThis endpoint is not idempotent. Multiple requests with the same data will create multiple pending requests unless a duplicate is detected (which returns `409 Conflict`).\n\n**Use Case Example: Creating a Supplier and Adding a Supplier ID from SAP Ariba**\n\nThis example demonstrates the complete workflow of creating a new supplier, waiting for it to be processed, and then adding an additional supplier ID from SAP Ariba.\n\n**Step 1: Create the Supplier**\n\n```http\nPOST /public/v2/suppliers/sites\nContent-Type: application/json\n\n{\n  \"name\": \"Acme Manufacturing Corp\",\n  \"countryCode\": \"AT\",\n  \"city\": \"Vienna\",\n  \"address\": \"123 Industrial Park, Vienna, Austria\",\n  \"postalCode\": \"1010\",\n  \"supplierId\": {\n    \"id\": \"SUP-ACME-001\",\n    \"source\": \"PUBLIC_API\"\n  },\n  \"industries\": [\"Manufacturing\", \"Electronics\"]\n}\n```\n\n**Response (202 Accepted):**\n```json\n{\n  \"uuid\": \"550e8400-e29b-41d4-a716-446655440000\",\n  \"message\": \"Supplier creation request submitted successfully\",\n  \"pendingEndpoint\": \"GET /public/v2/suppliers/sites/pending\"\n}\n```\n\nThe `202 Accepted` status indicates that the request has been accepted for processing but the supplier resource is not yet fully created. Use the returned UUID or the Location header to track the request status.\n\n**Step 2: Wait for Supplier Creation to Complete**\n\nPoll the pending suppliers endpoint until the supplier is no longer in the pending list:\n\n```http\nGET /public/v2/suppliers/sites/pending?uuid=550e8400-e29b-41d4-a716-446655440000\n```\n\n**While pending, you'll see:**\n```json\n[\n  {\n    \"uuid\": \"550e8400-e29b-41d4-a716-446655440000\",\n    \"supplierId\": {\n      \"id\": \"SUP-ACME-001\",\n      \"source\": \"PUBLIC_API\"\n    },\n    \"name\": \"Acme Manufacturing Corp\",\n    \"countryCode\": \"AT\",\n    \"city\": \"Vienna\",\n    \"address\": \"123 Industrial Park, Vienna, Austria\",\n    \"status\": \"Pending\",\n    \"reason\": null\n  }\n]\n```\n\n**Once processed, the supplier will no longer appear in the pending list** (the array will be empty or won't contain this UUID).\n\n**Step 3: Find the Supplier by Supplier ID**\n\nAfter processing is complete, find the supplier using the supplier ID you provided during creation:\n\n```http\nGET /public/v2/suppliers/sites/find-by-identifier?supplierId=SUP-ACME-001&source=Public_API\n```\n\n**Response:**\n```json\n[\n  {\n    \"prewaveTargetId\": 102006215,\n    \"name\": \"Acme Manufacturing Corp\",\n    \"address\": \"123 Industrial Park, Vienna, Austria\",\n    \"city\": \"Vienna\",\n    \"countryCode\": \"AT\",\n    \"supplierIds\": [\n      {\n        \"id\": \"SUP-ACME-001\",\n        \"source\": \"PUBLIC_API\"\n      }\n    ]\n  }\n]\n```\n\n**Step 4: Add Supplier ID from SAP Ariba**\n\nNow that you have the `prewaveTargetId` (102006215), add the SAP Ariba ERP vendor ID using the create identifier endpoint:\n\n```http\nPOST /public/v2/suppliers/sites/identifiers?prewaveId=102006215\nContent-Type: application/json\n\n{\n  \"type\": \"supplierId\",\n  \"id\": \"0000123456\",\n  \"source\": \"SAP_ARIBA_ERP_VENDOR_ID\"\n}\n```\n\n**Response (201 Created):**\n```json\n{\n  \"type\": \"supplierId\",\n  \"id\": \"0000123456\",\n  \"source\": \"SAP_ARIBA_ERP_VENDOR_ID\",\n  \"prewaveTargetId\": 102006215\n}\n```\n\n**Step 5: Verify the Supplier ID Was Added**\n\nVerify that both supplier IDs are now associated with the supplier by finding the supplier again:\n\n```http\nGET /public/v2/suppliers/sites/find-by-identifier?prewaveId=102006215\n```\n\n**Response:**\n```json\n[\n  {\n    \"prewaveTargetId\": 102006215,\n    \"name\": \"Acme Manufacturing Corp\",\n    \"address\": \"123 Industrial Park, Vienna, Austria\",\n    \"city\": \"Vienna\",\n    \"countryCode\": \"AT\",\n    \"supplierIds\": [\n      {\n        \"id\": \"SUP-ACME-001\",\n        \"source\": \"PUBLIC_API\"\n      },\n      {\n        \"id\": \"0000123456\",\n        \"source\": \"SAP_ARIBA_ERP_VENDOR_ID\"\n      }\n    ]\n  }\n]\n```\n\n**Alternative: Find Supplier by SAP Ariba Supplier ID**\n\nYou can now also find the supplier using the SAP Ariba ERP vendor ID:\n\n```http\nGET /public/v2/suppliers/sites/find-by-identifier?supplierId=0000123456&source=SAP_ARIBA_ERP_VENDOR_ID\n```\n\n**Notes:**\n- Supplier creation is asynchronous and may take a few hours. Poll `GET /public/v2/suppliers/sites/pending` periodically until the supplier is processed.\n- You can add multiple supplier IDs to the same supplier from different systems (SAP Ariba ERP vendor IDs, Coupa, DNB, etc.) using `POST /public/v2/suppliers/sites/identifiers`.\n- To find suppliers by their identifiers, use `GET /public/v2/suppliers/sites/find-by-identifier`.\n- To remove identifiers from suppliers, use `DELETE /public/v2/suppliers/sites/identifiers`.\n- To deactivate a supplier, use `DELETE /public/v2/suppliers/sites`.\n- Supplier IDs allow you to map suppliers in Prewave to identifiers used in your external systems.\n- SAP Ariba ERP vendor IDs typically follow a 10-digit format (e.g., \"0000123456\").\n- The `prewaveTargetId` is stable once the supplier is created, but may change in rare cases due to target merges.\n\n**Required permissions:** `ACCESS_PUBLIC_CONNECT_TARGET`.\n        ","operationId":"createSupplier","requestBody":{"description":"Supplier creation payload. Content-Type must be `application/json`. All required fields must be provided and will be validated. The `supplierId` field contains the supplier ID object with `id` (required) and `source` (optional, defaults to 'PUBLIC_API'). Optional `screeningPeriodInYears` (2, 5, or 10) and `requestValidationOnCreate` schedule post-init screening/validation after onboarding. String values are automatically trimmed of leading/trailing whitespace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicSupplierCreatePayloadV2"},"examples":{"Supplier Create - SAP Source":{"summary":"Example with SAP as the supplier ID source","description":"Supplier Create - SAP Source","value":{"name":"Acme Corporation","countryCode":"AT","city":"Vienna","address":"123 Main St, Vienna, Austria","supplierId":{"id":"SUP-12345","source":"SAP"},"postalCode":"1010","industries":["Manufacturing","Technology"]}},"Supplier Create - No Source":{"summary":"Example without supplier ID source (defaults to 'PUBLIC_API')","description":"Supplier Create - No Source","value":{"name":"Acme Corporation","countryCode":"AT","city":"Vienna","address":"123 Main St, Vienna, Austria","supplierId":{"number":"SUP-12345"}}},"Supplier Create - Coupa Source":{"summary":"Example with Coupa as the supplier ID source","description":"Supplier Create - Coupa Source","value":{"name":"Beta Industries Ltd","countryCode":"DE","city":"Berlin","address":"456 Business Ave, Berlin, Germany","supplierId":{"id":"COUPA-67890","source":"Coupa"},"postalCode":"10115","industries":["Automotive","Electronics"]}},"Supplier Create - DNB Source":{"summary":"Example with DNB as the supplier ID source","description":"Supplier Create - DNB Source","value":{"name":"Gamma Manufacturing Inc","countryCode":"US","city":"New York","address":"789 Industrial Blvd, New York, NY 10001","supplierId":{"id":"DNB-98765","source":"DNB"}}},"Supplier Create - Screening on create":{"summary":"Schedule 2-year history screening after onboarding (requires ACCESS_PUBLIC_SCREENING_REQUEST)","description":"Supplier Create - Screening on create","value":{"name":"Acme Corporation","countryCode":"AT","city":"Vienna","address":"123 Main St, Vienna, Austria","supplierId":{"id":"SUP-12345","source":"PUBLIC_API"},"screeningPeriodInYears":2}},"Supplier Create - Validation on create":{"summary":"Schedule validation after onboarding (requires ACCESS_PUBLIC_VALIDATION_REQUEST)","description":"Supplier Create - Validation on create","value":{"name":"Acme Corporation","countryCode":"AT","city":"Vienna","address":"123 Main St, Vienna, Austria","supplierId":{"id":"SUP-12345","source":"PUBLIC_API"},"requestValidationOnCreate":true}}}}},"required":true},"responses":{"202":{"description":"Accepted - Supplier creation request has been accepted for asynchronous processing. The request is being processed asynchronously and the resource is not yet fully created. Use the Location header or the returned UUID to track the request status via the pending suppliers endpoint.","headers":{"Location":{"description":"Absolute URL to the pending suppliers endpoint where the request status can be monitored. The URL includes the UUID query parameter to filter for this specific pending supplier. Follow this header to check the status of the pending request.","required":true,"style":"simple","schema":{"type":"string","format":"uri"},"example":"https://api.example.com/public/v2/suppliers/sites/pending?uuid=550e8400-e29b-41d4-a716-446655440000"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicSupplierCreateResponseV2"},"examples":{"Success response":{"summary":"Supplier creation request accepted for processing","description":"The request has been accepted for asynchronous processing. The UUID can be used to track this specific request in the pending suppliers endpoint. The Location header also points to the pending endpoint for status monitoring.","value":{"uuid":"550e8400-e29b-41d4-a716-446655440000","message":"Supplier creation request submitted successfully","pendingEndpoint":"GET /public/v2/suppliers/sites/pending"}}}}}},"400":{"description":"400 Bad Request - Invalid request payload or validation errors. The request body is malformed or contains invalid data.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorDTO"},"examples":{"Missing required field":{"summary":"Required field is missing","description":"Missing required field","value":{"code":"invalid_request","message":"Name is required","solution":"Fix the request"}},"Blank field validation":{"summary":"Required field is blank or contains only whitespace","description":"Blank field validation","value":{"code":"invalid_request","message":"Supplier ID is required","solution":"Fix the request"}},"Invalid JSON":{"summary":"Request body is not valid JSON","description":"Invalid JSON","value":{"code":"invalid_request","message":"JSON parse error: Unexpected character","solution":"Fix the request"}}}}}},"403":{"description":"Forbidden — the API token does not have the permissions required for supplier creation (`ACCESS_PUBLIC_CONNECT_TARGET`), or optional post-init screening (`ACCESS_PUBLIC_SCREENING_REQUEST` when `screeningPeriodInYears` is set) or validation (`ACCESS_PUBLIC_VALIDATION_REQUEST` when `requestValidationOnCreate` is true).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorDTO"}}}},"409":{"description":"409 Conflict - A resource with the same identifier already exists. This occurs when: (1) a pending supplier creation request with the same `supplierId.id` + `supplierId.source` combination already exists, or (2) the `supplierId.id` already exists as a supplier ID for another supplier in your organization.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorDTO"},"examples":{"Duplicate pending supplier":{"summary":"Pending request already exists with same supplier ID","description":"Another supplier creation request with the same supplier ID and source is already pending. Wait for it to be processed or check the pending suppliers endpoint.","value":{"code":"invalid_request","message":"A supplier creation request with supplier ID 'SUP-12345' and source 'SAP' is already pending. Please wait for the existing request to be processed or check pending suppliers at GET /public/v2/suppliers/sites/pending","solution":"Fix the request"}},"Duplicate supplier ID":{"summary":"Supplier ID already exists for another supplier","description":"The supplier ID already exists for a different supplier in your organization.","value":{"code":"duplicate_supplier_id","message":"Duplicate supplier IDs - id=SUP-12345, others_found=1, source=SAP","solution":"Please provide unique supplier IDs"}}}}}},"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":["Suppliers - Sites"],"summary":"Deactivate a supplier by identifier","description":"\nDeactivate (disconnect) a supplier from your organization using any identifier (supplier ID, customer ID, own site ID, or Prewave ID).\n\nThis unified endpoint allows you to deactivate suppliers using any type of identifier. You can search by one or more ID types, but **exactly one supplier must be found** for the deletion to proceed.\n\n**Related Endpoints:**\n- To find suppliers by identifier before deactivating, use `GET /public/v2/suppliers/sites/find-by-identifier`.\n- To create a new supplier, use `POST /public/v2/suppliers/sites`.\n- To manage supplier identifiers, use `POST /public/v2/suppliers/sites/identifiers` or `DELETE /public/v2/suppliers/sites/identifiers`.\n\n**Search Parameters:**\n- `supplierId` (optional): Search by supplier ID\n- `customerId` (optional): Search by customer ID\n- `ownId` (optional): Search by own site ID\n- `prewaveId` (optional): Search by Prewave ID\n- `source` (optional): Filter by source system (applies to supplierId, customerId, ownId only)\n\n**Search Behavior:**\n- **Multiple ID types**: If you provide multiple ID parameters, the endpoint searches for suppliers matching **ANY** of the provided IDs (OR logic)\n- **Exactly one match required**: The supplier must be uniquely identified. Returns `400 Bad Request` if zero or multiple suppliers are found\n- **Source filtering**: If `source` is provided, only IDs with that exact source are matched\n\n**What happens when you deactivate a supplier:**\n\n1. **Identifier Deactivation**: All supplier identifier connections are deactivated\n2. **Collection Management**: The supplier target is moved to an inactive collection\n3. **Audit Trail**: All changes are recorded with user information and timestamps\n\n**Important Notes:**\n- At least one ID parameter must be provided\n- Exactly one supplier must match the search criteria\n- This is a soft deletion (data is preserved but marked inactive)\n- The operation can be reversed using the reactivate endpoint\n\n**Required Permission**: `ACCESS_PUBLIC_REMOVE_TARGET`\n        ","operationId":"deleteSupplierByIdentifier","parameters":[{"name":"supplierId","in":"query","description":"Supplier ID to search for. Can be combined with customerId, ownId, and/or prewaveId.","required":false,"schema":{"type":"string"},"example":"SAP-12345"},{"name":"customerId","in":"query","description":"Customer ID to search for. Can be combined with supplierId, ownId, and/or prewaveId.","required":false,"schema":{"type":"string"},"example":"CRM-67890"},{"name":"ownId","in":"query","description":"Own site ID to search for. Can be combined with supplierId, customerId, and/or prewaveId.","required":false,"schema":{"type":"string"},"example":"OWN-SITE-01"},{"name":"prewaveId","in":"query","description":"Prewave ID to search for. Can be combined with supplierId, customerId, and/or ownId.","required":false,"schema":{"type":"integer","format":"int32"},"example":12345},{"name":"source","in":"query","description":"Optional source system to filter by. Applies to supplierId, customerId, and ownId (not prewaveId).","required":false,"schema":{"type":"string"},"example":"SAP"}],"responses":{"204":{"description":"Supplier successfully deactivated (No Content)"},"400":{"description":"400 Bad Request - Invalid request. Either no ID parameters provided, or multiple suppliers found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorDTO"},"examples":{"No ID parameters":{"summary":"No identifier provided","description":"No ID parameters","value":{"code":"invalid_request","message":"At least one ID parameter (supplierId, customerId, ownId, or prewaveId) must be provided","solution":"Fix the request"}},"Multiple suppliers found":{"summary":"Search criteria matches multiple suppliers","description":"Multiple suppliers found","value":{"code":"invalid_request","message":"Multiple suppliers found matching the provided identifiers. Found 2 suppliers with prewaveTargetIds: 102006215, 102006216. Please provide more specific identifiers or use the source parameter.","solution":"Fix the request"}}}}}},"404":{"description":"404 Not Found - No supplier found matching the provided identifiers.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorDTO"},"examples":{"Supplier not found":{"summary":"No supplier matches the identifiers","description":"Supplier not found","value":{"code":"resource_not_found","message":"No supplier found matching the provided identifiers","solution":"Verify the identifiers and ensure the supplier exists in your organization"}}}}}},"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/suppliers/sites/validation":{"get":{"tags":["Suppliers - Sites"],"summary":"Get validation status for a supplier","description":"\nRetrieve the status of the **most recent** validation request for a supplier site, using the same identifier query parameters as `GET /public/v2/suppliers/sites/find-by-identifier`.\n\n**Resolution:**\n- At least one of `supplierId`, `customerId`, `ownId`, or `prewaveId` must be provided.\n- **Exactly one** supplier must match (same rules as `DELETE /public/v2/suppliers/sites` and `POST /public/v2/suppliers/sites/validation`). If multiple suppliers match, `400` is returned.\n- The response reflects the latest validation request **you** created for that target.\n\n**Status values:**\n- `PENDING`: The validation request has been submitted and is being processed.\n- `COMPLETED`: The validation was successful. The `outcomeTargetId` field contains the Prewave target ID of the validated site (may differ from the original if a master record was identified).\n- `REJECTED`: The validation could not be completed. The `rejectionReason` and `rejectionReasonNotes` fields provide details.\n\n**Example:**\n```\nGET /public/v2/suppliers/sites/validation?prewaveId=102006215\n```\n\n**Required Permission**: `ACCESS_PUBLIC_VALIDATION_REQUEST`\n    ","operationId":"getValidationStatus","parameters":[{"name":"supplierId","in":"query","description":"Supplier ID to search for. Can be combined with customerId, ownId, and/or prewaveId.","required":false,"schema":{"type":"string"},"example":"SAP-12345"},{"name":"customerId","in":"query","description":"Customer ID to search for. Can be combined with supplierId, ownId, and/or prewaveId.","required":false,"schema":{"type":"string"},"example":"CRM-67890"},{"name":"ownId","in":"query","description":"Own site ID to search for. Can be combined with supplierId, customerId, and/or prewaveId.","required":false,"schema":{"type":"string"},"example":"OWN-SITE-01"},{"name":"prewaveId","in":"query","description":"Prewave ID to search for. Can be combined with supplierId, customerId, and/or ownId.","required":false,"schema":{"type":"integer","format":"int32"},"example":12345},{"name":"source","in":"query","description":"Optional source system to filter by. If not provided, matches IDs with any source or without a source. Applies to all provided ID parameters.","required":false,"schema":{"type":"string"},"example":"SAP"}],"responses":{"200":{"description":"Validation status returned","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicValidationStatusV2DTO"},"examples":{"Pending":{"summary":"Validation request is still being processed","description":"Pending","value":{"requestId":"550e8400-e29b-41d4-a716-446655440000","status":"PENDING","prewaveTargetId":102006215,"outcomeTargetId":null,"rejectionReason":null,"rejectionReasonNotes":null,"createdAt":"2026-01-01T12:00:00","resolvedAt":null}},"Completed":{"summary":"Validation request was completed successfully","description":"Completed","value":{"requestId":"550e8400-e29b-41d4-a716-446655440000","status":"COMPLETED","prewaveTargetId":102006215,"outcomeTargetId":102006220,"rejectionReason":null,"rejectionReasonNotes":null,"createdAt":"2026-01-01T12:00:00","resolvedAt":"2026-01-03T09:30:00"}},"Rejected":{"summary":"Validation request was rejected","description":"Rejected","value":{"requestId":"550e8400-e29b-41d4-a716-446655440000","status":"REJECTED","prewaveTargetId":102006215,"outcomeTargetId":null,"rejectionReason":"The address could not be validated.","rejectionReasonNotes":"No matching location found for the provided address.","createdAt":"2026-01-01T12:00:00","resolvedAt":"2026-01-03T09:30:00"}}}}}},"400":{"description":"Bad Request - No identifier provided, or multiple suppliers match","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorDTO"},"examples":{"Missing ID parameters":{"summary":"No identifier query parameters","description":"Missing ID parameters","value":{"code":"invalid_request","message":"At least one ID parameter (supplierId, customerId, ownId, or prewaveId) must be provided","solution":"Fix the request"}},"Multiple suppliers found":{"summary":"Search criteria matches multiple suppliers","description":"Multiple suppliers found","value":{"code":"invalid_request","message":"Multiple suppliers found matching the provided identifiers. Found 2 suppliers with prewaveTargetIds: 102006215, 102006216. Please provide more specific identifiers or use the source parameter.","solution":"Fix the request"}}}}}},"404":{"description":"Not Found - No supplier matches the identifiers, or no validation request exists for that supplier (for your user)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorDTO"},"examples":{"Supplier not found":{"summary":"No supplier matches the identifiers","description":"Supplier not found","value":{"code":"resource_not_found","message":"No supplier found matching the provided identifiers","solution":"Verify the identifiers and ensure the supplier exists in your organization"}},"No validation request":{"summary":"Supplier exists but you have no validation request for it","description":"No validation request","value":{"code":"resource_not_found","message":"No validation request found for this supplier","solution":"Submit validation with POST /public/v2/suppliers/sites/validation first"}}}}}},"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":["Suppliers - Sites"],"summary":"Request validation for a supplier","description":"\nRequest a validation (discovery) for an existing supplier site. Validation is the process of verifying and enriching a supplier's data. Both endpoints (`POST` and `GET`) require the `ACCESS_PUBLIC_VALIDATION_REQUEST` permission.\n\n**Request body shape (OpenAPI schema: `PublicValidationRequestPayloadV2`):**\n```json\n{\n  \"identifier\": {\n    \"supplierId\": null,\n    \"customerId\": null,\n    \"ownId\": null,\n    \"prewaveId\": 102006215,\n    \"source\": null\n  }\n}\n```\n- **`identifier`:** At least one of `supplierId`, `customerId`, `ownId`, or `prewaveId` must be non-empty / non-null. Optional `source` applies to the string IDs only.\n- **Exactly one supplier must match** (same rules as `DELETE /public/v2/suppliers/sites`). If your criteria match zero suppliers, `404` is returned; if more than one, `400` with a multiple-suppliers error.\n\n**Preconditions (enforced with 4xx responses):**\n- The target must be of type POI (not a site-group or freelancer).\n- The target must not already be at a fully-validated level (level 5, 2L, or 5L).\n- There must be no pending validation or screening request for this supplier.\n\n**Asynchronous Processing:**\n- The endpoint returns `202 Accepted` immediately with a `requestId` UUID.\n- Poll status with the **same** supplier identifiers you used in `identifier`, e.g. `GET /public/v2/suppliers/sites/validation?prewaveId=...` (see get validation status).\n\n**Required Permission**: `ACCESS_PUBLIC_VALIDATION_REQUEST`\n    ","operationId":"requestValidation","requestBody":{"description":"JSON object with required `identifier` (how to find the supplier site).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicValidationRequestPayloadV2"},"examples":{"By prewaveId":{"summary":"Request validation by Prewave target id","description":"By prewaveId","value":{"identifier":{"prewaveId":102006215}}},"By supplierId and source":{"summary":"Request validation by external supplier id","description":"By supplierId and source","value":{"identifier":{"supplierId":"SAP-12345","source":"SAP"}}}}}},"required":true},"responses":{"202":{"description":"Validation request accepted","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicValidationRequestResponseV2"},"examples":{"Validation request accepted":{"summary":"Successful validation request","description":"Validation request accepted","value":{"requestId":"550e8400-e29b-41d4-a716-446655440000","message":"Validation request submitted successfully"}}}}}},"400":{"description":"Bad request — missing identifier, supplier not eligible for validation (wrong type, level already reached), a pending validation/screening request already exists, or multiple suppliers matched the identifiers","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorDTO"},"examples":{"Missing identifiers":{"summary":"No identifier field values provided","description":"Missing identifiers","value":{"code":"invalid_request","message":"At least one identifier (supplierId, customerId, ownId, prewaveId) must be provided","solution":"Fix the request"}},"Multiple suppliers found":{"summary":"Search criteria matches multiple suppliers","description":"Multiple suppliers found","value":{"code":"invalid_request","message":"Multiple suppliers found matching the provided identifiers. Found 2 suppliers with prewaveTargetIds: 102006215, 102006216. Please provide more specific identifiers or use the source parameter.","solution":"Fix the request"}}}}}},"404":{"description":"No supplier found matching the provided identifiers","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorDTO"},"examples":{"Supplier not found":{"summary":"No supplier matches the identifiers","description":"Supplier not found","value":{"code":"resource_not_found","message":"No supplier found matching the provided identifiers","solution":"Verify the identifiers and ensure the supplier exists in your organization"}}}}}},"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/suppliers/sites/screening":{"get":{"tags":["Suppliers - Sites"],"summary":"Get screening status for a supplier","description":"\nRetrieve the status of the **most recent** screening request for a supplier site, using the same identifier query parameters as `GET /public/v2/suppliers/sites/find-by-identifier`.\n\nThis applies to screening started via `POST /public/v2/suppliers/sites/screening` and, once the target exists, to screening that was scheduled with `screeningPeriodInYears` on `POST /public/v2/suppliers/sites` (batch post-init screening is still attributed to your user when it runs).\n\n**Resolution:**\n- At least one of `supplierId`, `customerId`, `ownId`, or `prewaveId` must be provided.\n- **Exactly one** supplier must match (same rules as `DELETE /public/v2/suppliers/sites` and `POST /public/v2/suppliers/sites/screening`). If multiple suppliers match, `400` is returned.\n- The response reflects the latest screening request **you** created for that target (by request id). Use the same identifiers as in `POST /public/v2/suppliers/sites/screening` to track that request.\n\n**Status values:**\n- `New` — The request is still in progress.\n- `Finished` — Screening completed; findings were found.\n- `NoFindings` — Screening completed; no findings were found.\n- `Aborted` — The request was rejected or an error occurred.\n\n**Example:**\n```\nGET /public/v2/suppliers/sites/screening?prewaveId=102006215\n```\n\n**Required Permission**: `ACCESS_PUBLIC_SCREENING_REQUEST`\n    ","operationId":"getScreeningStatus","parameters":[{"name":"supplierId","in":"query","description":"Supplier ID to search for. Can be combined with customerId, ownId, and/or prewaveId.","required":false,"schema":{"type":"string"},"example":"SAP-12345"},{"name":"customerId","in":"query","description":"Customer ID to search for. Can be combined with supplierId, ownId, and/or prewaveId.","required":false,"schema":{"type":"string"},"example":"CRM-67890"},{"name":"ownId","in":"query","description":"Own site ID to search for. Can be combined with supplierId, customerId, and/or prewaveId.","required":false,"schema":{"type":"string"},"example":"OWN-SITE-01"},{"name":"prewaveId","in":"query","description":"Prewave ID to search for. Can be combined with supplierId, customerId, and/or ownId.","required":false,"schema":{"type":"integer","format":"int32"},"example":12345},{"name":"source","in":"query","description":"Optional source system to filter by. If not provided, matches IDs with any source or without a source. Applies to all provided ID parameters.","required":false,"schema":{"type":"string"},"example":"SAP"}],"responses":{"200":{"description":"Screening status returned","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicScreeningStatusResponseV2"},"examples":{"In progress":{"summary":"Screening still running","description":"In progress","value":{"id":10042,"status":"New","periodInYears":2}},"Finished":{"summary":"Screening completed with findings","description":"Finished","value":{"id":10042,"status":"Finished","periodInYears":2}}}}}},"400":{"description":"Bad Request - No identifier provided, or multiple suppliers match","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorDTO"},"examples":{"Missing ID parameters":{"summary":"No identifier query parameters","description":"Missing ID parameters","value":{"code":"invalid_request","message":"At least one ID parameter (supplierId, customerId, ownId, or prewaveId) must be provided","solution":"Fix the request"}},"Multiple suppliers found":{"summary":"Search criteria matches multiple suppliers","description":"Multiple suppliers found","value":{"code":"invalid_request","message":"Multiple suppliers found matching the provided identifiers. Found 2 suppliers with prewaveTargetIds: 102006215, 102006216. Please provide more specific identifiers or use the source parameter.","solution":"Fix the request"}}}}}},"403":{"description":"Forbidden - Missing ACCESS_PUBLIC_SCREENING_REQUEST permission","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorDTO"}}}},"404":{"description":"Not Found - No supplier matches the identifiers, or no screening request exists for that supplier (for your user)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorDTO"},"examples":{"Supplier not found":{"summary":"No supplier matches the identifiers","description":"Supplier not found","value":{"code":"resource_not_found","message":"No supplier found matching the provided identifiers","solution":"Verify the identifiers and ensure the supplier exists in your organization"}},"No screening request":{"summary":"Supplier exists but you have no screening request for it","description":"No screening request","value":{"code":"resource_not_found","message":"No screening request found for this supplier","solution":"Submit screening with POST /public/v2/suppliers/sites/screening first"}}}}}},"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":["Suppliers - Sites"],"summary":"Request screening for a supplier","description":"\nRequest a history screening for a supplier site. The body has two parts: `identifier` (how to find the site) and `options` (screening parameters).\n\n**Request body shape (OpenAPI schema: `PublicScreeningRequestPayloadV2`):**\n```json\n{\n  \"identifier\": {\n    \"supplierId\": null,\n    \"customerId\": null,\n    \"ownId\": null,\n    \"prewaveId\": 102006215,\n    \"source\": null\n  },\n  \"options\": {\n    \"periodInYears\": 2\n  }\n}\n```\n- **`identifier`:** At least one of `supplierId`, `customerId`, `ownId`, or `prewaveId` must be non-empty / non-null (same semantics as query params on `find-by-identifier`). Optional `source` applies to the string IDs only.\n- **`options.periodInYears`:** Required. Must be **2**, **5**, or **10** (years).\n\n**Asynchronous Processing:**\n- Screening is an asynchronous process that may take several hours to complete.\n- The endpoint returns immediately with `202 Accepted` and the created screening request ID(s).\n- Poll status with the **same** supplier identifiers you used in `identifier`, e.g. `GET /public/v2/suppliers/sites/screening?prewaveId=...` (see get screening status).\n\n**Supplier Identification (`identifier`):**\n- At least one of supplierId, customerId, ownId, or prewaveId must be provided inside `identifier`.\n- **Exactly one supplier must match** (same rules as `DELETE /public/v2/suppliers/sites` and `POST /public/v2/suppliers/sites/identifiers`). If your criteria match zero suppliers, `404` is returned; if more than one, `400` with a multiple-suppliers error.\n- If the matched target is already screened or otherwise ineligible, it may be skipped (reflected by an empty `screeningRequestIds` list in the response).\n\n**Costs:**\n- Screening requests may incur additional costs or consume quota. Ensure your plan supports screening before calling this endpoint.\n\n**Required Permission**: `ACCESS_PUBLIC_SCREENING_REQUEST`\n    ","operationId":"requestScreening","requestBody":{"description":"JSON object with required `identifier` and `options` (`options.periodInYears` = 2, 5, or 10).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicScreeningRequestPayloadV2"},"examples":{"By prewaveId":{"summary":"Screen 2 years by Prewave target id","description":"By prewaveId","value":{"identifier":{"prewaveId":102006215},"options":{"periodInYears":2}}},"By supplierId and source":{"summary":"Screen 5 years by external supplier id","description":"By supplierId and source","value":{"identifier":{"supplierId":"SAP-12345","source":"SAP"},"options":{"periodInYears":5}}}}}},"required":true},"responses":{"202":{"description":"Screening request accepted for processing","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicScreeningCreatedResponseV2"},"examples":{"Screening request accepted":{"summary":"Successfully submitted screening request","description":"Screening request accepted","value":{"screeningRequestIds":[10042],"message":"Screening request submitted successfully"}}}}}},"400":{"description":"Bad Request - Invalid payload (e.g. missing identifier/options, periodInYears out of range, or multiple suppliers match)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorDTO"},"examples":{"Missing identifiers":{"summary":"No identifier field values provided","description":"Missing identifiers","value":{"code":"invalid_request","message":"At least one identifier (supplierId, customerId, ownId, prewaveId) must be provided","solution":"Fix the request"}},"Multiple suppliers found":{"summary":"Search criteria matches multiple suppliers","description":"Multiple suppliers found","value":{"code":"invalid_request","message":"Multiple suppliers found matching the provided identifiers. Found 2 suppliers with prewaveTargetIds: 102006215, 102006216. Please provide more specific identifiers or use the source parameter.","solution":"Fix the request"}}}}}},"403":{"description":"Forbidden - Missing ACCESS_PUBLIC_SCREENING_REQUEST permission","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorDTO"}}}},"404":{"description":"Not Found - No supplier found matching the provided identifiers","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorDTO"},"examples":{"Supplier not found":{"summary":"No supplier matches the identifiers","description":"Supplier not found","value":{"code":"resource_not_found","message":"No supplier found matching the provided identifiers","solution":"Verify the identifiers and ensure the supplier exists in your organization"}}}}}},"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/suppliers/sites/identifiers":{"post":{"tags":["Suppliers - Sites"],"summary":"Create an identifier for a supplier","description":"\nCreate a new identifier (supplier ID, customer ID, or own site ID) for a supplier using flexible search parameters.\n\n**Related Endpoints:**\n- To find suppliers by identifier, use `GET /public/v2/suppliers/sites/find-by-identifier`.\n- To delete an identifier, use `DELETE /public/v2/suppliers/sites/identifiers`.\n- To create a new supplier, use `POST /public/v2/suppliers/sites`.\n- To get all suppliers, use `GET /public/v2/suppliers/sites`.\n\n**How It Works:**\n\n1. **Find the Supplier**: Provide one or more search parameters to identify the supplier:\n   - `supplierId` (optional): Search by supplier ID\n   - `customerId` (optional): Search by customer ID\n   - `ownId` (optional): Search by own site ID\n   - `prewaveId` (optional): Search by Prewave ID\n   - `source` (optional): Filter by source system (applies to supplierId, customerId, and ownId)\n\n2. **Create the Identifier**: In the request body, specify:\n   - `type`: The type of identifier to create (`supplierId`, `customerId`, or `ownId`)\n   - `id`: The identifier value\n   - `source`: Optional source system (defaults to `PUBLIC_API` if not provided)\n\n**Search Parameters:**\n- `supplierId` (optional): Search by supplier ID\n- `customerId` (optional): Search by customer ID\n- `ownId` (optional): Search by own site ID\n- `prewaveId` (optional): Search by Prewave ID\n- `source` (optional): Filter by source system\n\n**Search Behavior:**\n- Parameters are combined with **OR** logic - suppliers matching ANY of the provided identifiers will be found\n- At least one search parameter must be provided\n- If multiple suppliers match, an error is returned (use `source` parameter to narrow down)\n- If no suppliers match, a 404 error is returned\n\n**Request Body:**\nThe request body specifies what identifier to create:\n- `type`: Must be one of: `supplierId`, `customerId`, `ownId`\n- `id`: The identifier value (e.g., \"SUP-12345\")\n- `source`: Optional source system (e.g., \"SAP\", \"Coupa\")\n\n**Examples:**\n\n1. **Create a supplier ID by searching with prewaveId:**\n   ```\n   POST /public/v2/suppliers/sites/identifiers?prewaveId=102006215\n   Body: {\"type\": \"supplierId\", \"id\": \"SUP-12345\", \"source\": \"SAP\"}\n   ```\n\n2. **Create a customer ID by searching with existing supplier ID:**\n   ```\n   POST /public/v2/suppliers/sites/identifiers?supplierId=SUP-12345&source=SAP\n   Body: {\"type\": \"customerId\", \"id\": \"CUST-67890\", \"source\": \"SAP\"}\n   ```\n\n3. **Create an own site ID by searching with customer ID:**\n   ```\n   POST /public/v2/suppliers/sites/identifiers?customerId=CUST-67890\n   Body: {\"type\": \"ownId\", \"id\": \"OWN-SITE-01\", \"source\": \"SAP\"}\n   ```\n\n**Important Notes:**\n- The combination of identifier value and source must be unique within your organization\n- If the identifier already exists for this supplier, a 409 Conflict error is returned\n- If the identifier exists for a different supplier, a 409 Conflict error is returned\n- All identifier changes are automatically audited\n\n**Required Permission**: `MANAGE_PUBLIC_SUPPLIER_IDS`\n        ","operationId":"createIdentifier","parameters":[{"name":"supplierId","in":"query","description":"Supplier ID to search for. Can be combined with customerId, ownId, and/or prewaveId.","required":false,"schema":{"type":"string"},"example":"SAP-12345"},{"name":"customerId","in":"query","description":"Customer ID to search for. Can be combined with supplierId, ownId, and/or prewaveId.","required":false,"schema":{"type":"string"},"example":"CRM-67890"},{"name":"ownId","in":"query","description":"Own site ID to search for. Can be combined with supplierId, customerId, and/or prewaveId.","required":false,"schema":{"type":"string"},"example":"OWN-SITE-01"},{"name":"prewaveId","in":"query","description":"Prewave ID to search for. Can be combined with supplierId, customerId, and/or ownId.","required":false,"schema":{"type":"integer","format":"int32"},"example":12345},{"name":"source","in":"query","description":"Optional source system to filter by. Applies to supplierId, customerId, and ownId (not prewaveId).","required":false,"schema":{"type":"string"},"example":"SAP"}],"requestBody":{"description":"Identifier creation payload","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicIdentifierCreatePayloadV2"},"examples":{"Create Supplier ID":{"summary":"Create a supplier ID","description":"Create Supplier ID","value":{"type":"supplierId","id":"SUP-12345","source":"SAP"}},"Create Customer ID":{"summary":"Create a customer ID","description":"Create Customer ID","value":{"type":"customerId","id":"CUST-67890","source":"SAP"}},"Create Own Site ID":{"summary":"Create an own site ID","description":"Create Own Site ID","value":{"type":"ownId","id":"OWN-SITE-01","source":"SAP"}}}}},"required":true},"responses":{"201":{"description":"Created - Identifier created successfully.","headers":{"Location":{"description":"URI of the supplier that the identifier was added to","required":true,"style":"simple","schema":{"type":"string","format":"uri"},"example":"https://api.example.com/public/v2/suppliers/sites/101266998"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicIdentifierResponseV2"},"examples":{"Success response":{"summary":"Successful identifier creation","description":"Success response","value":{"type":"supplierId","id":"SUP-12345","source":"SAP","prewaveTargetId":101266998}}}}}},"400":{"description":"400 Bad Request - Invalid request. This can occur if: (1) no search parameters provided, (2) invalid identifier type, (3) missing required fields in request body, or (4) multiple suppliers found (use source parameter to narrow down).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorDTO"},"examples":{"No search parameters":{"summary":"No search parameters provided","description":"No search parameters","value":{"code":"invalid_request","message":"At least one ID parameter (supplierId, customerId, ownId, or prewaveId) must be provided","solution":"Fix the request"}},"Invalid identifier type":{"summary":"Invalid identifier type","description":"Invalid identifier type","value":{"code":"invalid_request","message":"Invalid identifier type 'invalidType'. Must be one of: 'supplierId', 'customerId', 'ownId'","solution":"Fix the request"}},"Multiple suppliers found":{"summary":"Multiple suppliers match the search criteria","description":"Multiple suppliers found","value":{"code":"invalid_request","message":"Multiple suppliers found matching the provided identifiers. Found 2 suppliers with prewaveTargetIds: 102006215, 102006216. Please provide more specific identifiers or use the source parameter.","solution":"Fix the request"}}}}}},"404":{"description":"404 Not Found - No supplier found matching the provided search parameters.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorDTO"},"examples":{"Supplier not found":{"summary":"No supplier matches the search criteria","description":"Supplier not found","value":{"code":"resource_not_found","message":"No supplier found matching the provided identifiers"}}}}}},"409":{"description":"409 Conflict - The identifier already exists. This occurs when: (1) the identifier already exists for this supplier, or (2) the identifier exists for a different supplier in your organization.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorDTO"},"examples":{"Duplicate identifier":{"summary":"Identifier already exists","description":"Duplicate identifier","value":{"code":"duplicate_supplier_id","message":"Duplicate supplier IDs - id=SUP-12345, others_found=1, source=SAP","solution":"Please provide unique supplier IDs"}}}}}},"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":["Suppliers - Sites"],"summary":"Delete an identifier for a supplier","description":"\nDelete an identifier (supplier ID, customer ID, or own site ID) from all suppliers in your organization.\n\n**Related Endpoints:**\n- To create an identifier, use `POST /public/v2/suppliers/sites/identifiers`.\n- To find suppliers by identifier, use `GET /public/v2/suppliers/sites/find-by-identifier`.\n- To get all suppliers, use `GET /public/v2/suppliers/sites`.\n\n**How It Works:**\n\nThis endpoint deletes a specific identifier across all suppliers that have it. You specify:\n- `type`: The type of identifier to delete (`supplierId`, `customerId`, or `ownId`)\n- `id`: The identifier value to delete\n- `source`: Optional source system of the identifier to delete\n\n**Query Parameters:**\n- `type` (required): Must be one of: `supplierId`, `customerId`, `ownId`\n- `id` (required): The identifier value (e.g., \"SUP-12345\")\n- `source` (optional): Source system (e.g., \"SAP\", \"Coupa\"). If not provided, will search for identifiers without a source or with the default source.\n\n**Examples:**\n\n1. **Delete a supplier ID:**\n   ```\n   DELETE /public/v2/suppliers/sites/identifiers?type=supplierId&id=SUP-12345&source=SAP\n   ```\n\n2. **Delete a customer ID:**\n   ```\n   DELETE /public/v2/suppliers/sites/identifiers?type=customerId&id=CUST-67890&source=SAP\n   ```\n\n3. **Delete an own site ID:**\n   ```\n   DELETE /public/v2/suppliers/sites/identifiers?type=ownId&id=OWN-SITE-01&source=SAP\n   ```\n\n**Important Notes:**\n- The identifier must exist for at least one supplier\n- If the identifier doesn't exist, a 404 Not Found error is returned\n- All identifier changes are automatically audited\n- If `source` is not provided, the system will search for identifiers without a source or with the default source\n\n**Required Permission**: `MANAGE_PUBLIC_SUPPLIER_IDS`\n        ","operationId":"deleteIdentifier","parameters":[{"name":"type","in":"query","description":"The type of identifier to delete","required":true,"schema":{"$ref":"#/components/schemas/IdentifierType"},"example":"SUPPLIER_ID"},{"name":"id","in":"query","description":"The identifier value to delete","required":true,"schema":{"type":"string"},"example":"SUP-12345"},{"name":"source","in":"query","description":"Optional source system of the identifier to delete. If not provided, will search for identifiers without a source or with the default source.","required":false,"schema":{"type":"string"},"example":"SAP"}],"responses":{"204":{"description":"No Content - Identifier deleted successfully.","content":{"application/json":{"examples":{"Success response":{"summary":"Successful identifier deletion","description":"The response body is empty (204 No Content). The identifier has been deleted.","value":null}}}}},"400":{"description":"400 Bad Request - Invalid request. This can occur if: (1) required parameters are missing, (2) invalid identifier type.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorDTO"},"examples":{"Missing required parameters":{"summary":"Required parameters are missing","description":"Missing required parameters","value":{"code":"invalid_request","message":"Required parameters 'type' and 'id' must be provided","solution":"Fix the request"}},"Invalid identifier type":{"summary":"Invalid identifier type","description":"Invalid identifier type","value":{"code":"invalid_request","message":"Invalid identifier type 'invalidType'. Must be one of: 'supplierId', 'customerId', 'ownId'","solution":"Fix the request"}}}}}},"404":{"description":"404 Not Found - The identifier doesn't exist in your organization.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorDTO"},"examples":{"Identifier not found":{"summary":"Identifier doesn't exist","description":"Identifier not found","value":{"code":"resource_not_found","message":"Supplier ID 'SUP-12345' with source 'SAP' not found"}}}}}},"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/suppliers/connection-contacts":{"get":{"tags":["Suppliers - Connection Contacts"],"summary":"Find supplier connection contacts by identifier","description":"\n### Overview\nRetrieve all connection contacts for a supplier identified by any of its identifiers (supplierId, customerId, ownId, or prewaveId).\n\nConnection contacts are contact persons associated with suppliers that can be used for communication and relationship management. This endpoint returns contacts that are accessible to your organization.\n\n### Search Behavior\n- Provide at least one identifier parameter.\n- The identifiers must resolve to **exactly one** supplier.\n- If multiple suppliers are found, a `400 Bad Request` is returned.\n\n### Related Operations\n- **Create Contact**: [POST /public/v2/suppliers/connection-contacts](#operations-Suppliers_-_Connection_Contacts-createConnectionContactByIdentifier)\n- **Delete Contact**: [DELETE /public/v2/suppliers/connection-contacts/{contactId}](#operations-Suppliers_-_Connection_Contacts-deleteConnectionContact)\n- **Find Suppliers**: [GET /public/v2/suppliers/sites/find-by-identifier](#operations-Suppliers_-_Sites-findSuppliers)\n\n### Required Permission\n`access_public_suppliers` and `access_public_conn_contacts`\n        ","operationId":"findConnectionContactsByIdentifier","parameters":[{"name":"supplierId","in":"query","description":"Supplier ID to search for. Can be combined with customerId, ownId, and/or prewaveId.","required":false,"schema":{"type":"string"},"example":"SAP-12345"},{"name":"customerId","in":"query","description":"Customer ID to search for. Can be combined with supplierId, ownId, and/or prewaveId.","required":false,"schema":{"type":"string"},"example":"CRM-67890"},{"name":"ownId","in":"query","description":"Own site ID to search for. Can be combined with supplierId, customerId, and/or prewaveId.","required":false,"schema":{"type":"string"},"example":"OWN-SITE-01"},{"name":"prewaveId","in":"query","description":"Prewave ID to search for. Can be combined with supplierId, customerId, and/or ownId.","required":false,"schema":{"type":"integer","format":"int32"},"example":12345},{"name":"source","in":"query","description":"Optional source system to filter by. If not provided, matches IDs with any source or without a source. Applies to all provided ID parameters.","required":false,"schema":{"type":"string"},"example":"SAP"}],"responses":{"200":{"description":"Successfully retrieved connection contacts","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/PublicSupplierConnectionContact"}},"examples":{"Contacts List":{"summary":"Sample response with connection contacts","description":"Contacts List","value":"[{\"id\":42,\"email\":\"contact@supplier.com\"},{\"id\":43,\"email\":\"support@supplier.com\"}]"}}}}},"400":{"description":"400 Bad Request - Invalid request or multiple suppliers found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorDTO"},"examples":{"Multiple suppliers found":{"summary":"Search criteria matches multiple suppliers","description":"Multiple suppliers found","value":"{\"code\":\"invalid_request\",\"message\":\"Multiple suppliers found matching the provided identifiers. Found 2 suppliers with prewaveTargetIds: 102006215, 102006216. Please provide more specific identifiers.\",\"solution\":\"Provide more specific identifiers or use the source parameter.\"}"}}}}},"404":{"description":"404 Not Found - Supplier not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorDTO"},"examples":{"Supplier not found":{"summary":"No supplier matches the identifiers","description":"Supplier not found","value":"{\"code\":\"resource_not_found\",\"message\":\"No supplier found matching the provided identifiers\",\"solution\":\"Verify the identifiers and ensure the supplier exists in your organization\"}"}}}}},"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":["Suppliers - Connection Contacts"],"summary":"Create connection contact for a supplier by identifier","description":"\n### Overview\nCreate a new connection contact for a supplier identified by any of its identifiers (supplierId, customerId, ownId, or prewaveId).\n\nThis endpoint allows you to add contact persons to suppliers for relationship management. If your organization is not yet connected to the identified target, it will be automatically connected as a supplier.\n\n### Auto-Connection Logic\n- If the identified target is not yet connected to your organization, an edge of type 'Supplier' will be created automatically.\n- This requires the additional internal permission `access_public_mng_customer_conn`.\n\n### Related Operations\n- **List Contacts**: [GET /public/v2/suppliers/connection-contacts](#operations-Suppliers_-_Connection_Contacts-findConnectionContactsByIdentifier)\n- **Delete Contact**: [DELETE /public/v2/suppliers/connection-contacts/{contactId}](#operations-Suppliers_-_Connection_Contacts-deleteConnectionContact)\n\n### Required Permission\n`access_public_suppliers` and `access_public_mng_conn_contacts`\n        ","operationId":"createConnectionContactByIdentifier","parameters":[{"name":"supplierId","in":"query","description":"Supplier ID to search for. Can be combined with customerId, ownId, and/or prewaveId.","required":false,"schema":{"type":"string"},"example":"SAP-12345"},{"name":"customerId","in":"query","description":"Customer ID to search for. Can be combined with supplierId, ownId, and/or prewaveId.","required":false,"schema":{"type":"string"},"example":"CRM-67890"},{"name":"ownId","in":"query","description":"Own site ID to search for. Can be combined with supplierId, customerId, and/or prewaveId.","required":false,"schema":{"type":"string"},"example":"OWN-SITE-01"},{"name":"prewaveId","in":"query","description":"Prewave ID to search for. Can be combined with supplierId, customerId, and/or ownId.","required":false,"schema":{"type":"integer","format":"int32"},"example":12345},{"name":"source","in":"query","description":"Optional source system to filter by. If not provided, matches IDs with any source or without a source. Applies to all provided ID parameters.","required":false,"schema":{"type":"string"},"example":"SAP"}],"requestBody":{"description":"Connection contact payload","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicConnectionContactPayload"},"examples":{"Create Contact":{"summary":"Example payload to create a connection contact","description":"Create Contact","value":"{\"email\":\"new.contact@supplier.com\"}"}}}},"required":true},"responses":{"201":{"description":"Connection contact created successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicSupplierConnectionContact"},"examples":{"Contact Created":{"summary":"Sample response for successful contact creation","description":"Contact Created","value":"{\"id\":44,\"email\":\"new.contact@supplier.com\"}"}}}}},"400":{"description":"400 Bad Request - Invalid request, multiple suppliers found, or target not connectable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorDTO"},"examples":{"Not Connectable":{"summary":"Target is not connectable","description":"Not Connectable","value":"{\"code\":\"invalid_request\",\"message\":\"Supplier is not connectable\",\"solution\":\"Ensure the target type supports connections.\"}"}}}}},"404":{"description":"404 Not Found - Supplier not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorDTO"},"examples":{"Supplier not found":{"description":"Supplier not found","value":"{\"code\":\"resource_not_found\",\"message\":\"No supplier found matching the provided identifiers\",\"solution\":\"Verify the identifiers and ensure the supplier exists in your organization\"}"}}}}},"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/suppliers/origin-requests/{originRequestId}/supplier-dds":{"post":{"tags":["EUDR - Suppliers"],"summary":"Answer supplier origin request with supplier DDS","description":"\nAnswer an origin request by providing supplier Due Diligence Statement (DDS) information.\n\nThis endpoint allows suppliers to respond to origin requests by submitting one or more supplier DDS\nentries. Each payload must contain the reference number, verification number, HS code, and product\ndescription as stated in the TracesNT system.\n\n**Use Cases**:\n- Respond to customer origin requests\n- Provide origin information via supplier DDS\n- Submit compliance data for requested products\n\n**Required permission:** `access_public_eudr_suppliers`\n        ","operationId":"answerOriginRequestWithDDS","parameters":[{"name":"originRequestId","in":"path","description":"The ID of the origin request.","required":true,"schema":{"type":"integer","format":"int32"},"example":1001}],"requestBody":{"description":"List of supplier DDS payloads to answer the origin request.","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/PublicSupplierDDSPayload"}},"examples":{"Single supplier DDS":{"summary":"Answer with one supplier DDS entry","description":"Single supplier DDS","value":"[{\"referenceNumber\":\"EU-SUP-67890\",\"verificationNumber\":\"VER-987654\",\"hsCode\":\"440799\",\"productDescription\":\"Wood sawn or chipped lengthwise, sliced or peeled, of oak\"}]"},"Multiple supplier DDS entries":{"summary":"Answer with multiple supplier DDS entries","description":"Multiple supplier DDS entries","value":"[{\"referenceNumber\":\"EU-SUP-67890\",\"verificationNumber\":\"VER-987654\",\"hsCode\":\"440799\",\"productDescription\":\"Wood sawn or chipped lengthwise, sliced or peeled, of oak\"},{\"referenceNumber\":\"EU-SUP-67891\",\"verificationNumber\":\"VER-123456\",\"hsCode\":\"441510\",\"productDescription\":\"Plywood, veneered panels and similar laminated wood\"}]"}}}},"required":true},"responses":{"204":{"description":"Origin request answered successfully."},"400":{"description":"Invalid request payload or origin request cannot be answered.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorDTO"},"examples":{"Missing required fields":{"summary":"Required fields missing in DDS payload","description":"Missing required fields","value":{"code":"invalid_request","message":"Reference number is required","solution":"Provide all required fields in the DDS payload"}},"Invalid origin request":{"summary":"Origin request cannot be answered","description":"Invalid origin request","value":{"code":"invalid_request","message":"Origin request is not in a state that allows answering","solution":"Check the origin request status"}}}}}},"404":{"description":"Origin request not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorDTO"},"examples":{"Origin request not found":{"summary":"The specified origin request does not exist","description":"Origin request not found","value":{"code":"not_found","message":"Origin request with ID 1001 not found","solution":"Verify the origin request ID"}}}}}},"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/suppliers/{supplierId}/connection-contacts":{"get":{"tags":["EUDR - Customers - Suppliers"],"summary":"Find supplier connection contacts","description":"\nRetrieve connection contacts for a supplier, including contacts added by your organization and contacts added by connected customers.\n\nConnection contacts are contact persons associated with suppliers that can be used for communication\nand relationship management. This endpoint returns all available contacts for the specified supplier,\nregardless of which organization added them.\n\n**Use Cases**:\n- Retrieve contact information for supplier communication\n- View contacts added by other connected customers\n- Manage supplier relationship contacts\n\n**Required permissions:** `access_public_products`, `access_public_conn_contacts`, and `READ` on the target\n        ","operationId":"findConnectionContacts","parameters":[{"name":"supplierId","in":"path","description":"Supplier target ID for which connection contacts are to be retrieved.","required":true,"schema":{"type":"integer","format":"int32"},"example":102006215}],"responses":{"200":{"description":"Successfully retrieved connection contacts.","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/PublicSupplierConnectionContact"}},"examples":{"Connection contacts":{"summary":"Contacts available for the supplier","description":"Connection contacts","value":"[{\"id\":42,\"email\":\"procurement@acme.example.com\"},{\"id\":43,\"email\":\"sustainability@acme.example.com\"},{\"id\":44,\"email\":null}]"},"No contacts":{"summary":"Supplier has no connection contacts yet","description":"No contacts","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 - Suppliers"],"summary":"Create connection contact for own or connected supplier","description":"\nCreate a new connection contact for a supplier.\n\nThis endpoint allows you to add contact persons to suppliers for relationship management.\nIf the specified target is not currently a supplier, it will be automatically connected as one.\n\n**Use Cases**:\n- Add contact persons to suppliers\n- Maintain supplier contact information\n- Enable supplier communication\n\n**Required permissions:** `access_public_products`, `access_public_mng_conn_contacts`, and `READ` on the target\n        ","operationId":"createConnectionContact","parameters":[{"name":"supplierId","in":"path","description":"Supplier target ID for whom new contacts will be created. If the given target is not a supplier, it will be automatically created as one.","required":true,"schema":{"type":"integer","format":"int32"},"example":102006215}],"requestBody":{"description":"Connection contact email address.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicConnectionContactPayload"},"examples":{"Create connection contact":{"summary":"Add a contact by email address","description":"Create connection contact","value":"{\"email\":\"new.contact@example.com\"}"}}}},"required":true},"responses":{"200":{"description":"Connection contact created successfully.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicSupplierConnectionContact"},"examples":{"Created connection contact":{"summary":"Newly created contact with assigned ID","description":"Created connection contact","value":"{\"id\":45,\"email\":\"new.contact@example.com\"}"}}}}},"400":{"description":"Invalid payload (e.g., missing required fields or invalid email format).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorDTO"},"examples":{"Missing required fields":{"summary":"Required fields missing in payload","description":"Missing required fields","value":{"code":"invalid_request","message":"Email is required","solution":"Provide all required fields in the payload"}},"Invalid email format":{"summary":"Email format is invalid","description":"Invalid email format","value":{"code":"invalid_request","message":"Invalid email format","solution":"Provide a valid email address"}}}}}},"404":{"description":"Supplier not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorDTO"},"examples":{"Supplier not found":{"summary":"The specified supplier does not exist","description":"Supplier not found","value":{"code":"not_found","message":"Supplier with ID 102006215 not found","solution":"Verify the supplier ID"}}}}}},"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\",\"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    }"}}}}}}}},"/public/v2/eudr/customers/products/inbound":{"get":{"tags":["EUDR - Customers - Products"],"summary":"Get a list of inbound products","description":"\nRetrieve a paginated list of inbound products for EUDR compliance.\n\nInbound products are products that your organization receives from suppliers.\nUse `includeOrigins=true` (default) to include origin information on each product.\n\n**Use Cases**:\n- List all inbound products\n- Filter products by various criteria\n- Review supplier, DDS status, and origin data per product\n\n**Pagination**:\n- Results are paginated (default: 10 items per page)\n- Use `page` and `size` query parameters to control pagination\n\n**Required permission:** `access_public_products`\n        ","operationId":"findInboundProducts","parameters":[{"name":"ids","in":"query","description":"Filter by product IDs. When set, other filters are ignored.","required":false,"schema":{"type":"array","description":"Filter by product IDs. When set, other filters are ignored.","example":[1,2,3],"items":{"type":"integer","description":"Filter by product IDs. When set, other filters are ignored.","format":"int32"}},"example":[1,2,3]},{"name":"q","in":"query","description":"Full text search query for product names, suppliers  or product references.","required":false,"schema":{"type":"string","description":"Full text search query for product names, suppliers  or product references.","example":"soy oil"},"example":"soy oil"},{"name":"refs","in":"query","description":"Filter by product references.","required":false,"schema":{"type":"array","description":"Filter by product references.","example":["Ref123","Ref456"],"items":{"type":"string","description":"Filter by product references.","example":"[\"Ref123\",\"Ref456\"]"}},"example":["Ref123","Ref456"]},{"name":"las","in":"query","description":"Filter by legality assessment status.","required":false,"schema":{"type":"array","description":"Filter by legality assessment status.","example":["Negligible","NotRequired"],"items":{"$ref":"#/components/schemas/LAStatus"}},"example":["Negligible","NotRequired"]},{"name":"dfs","in":"query","description":"Filter by DF status.","required":false,"schema":{"type":"array","description":"Filter by DF status.","example":["Negligible","NotRequired"],"items":{"$ref":"#/components/schemas/DFStatus"}},"example":["Negligible","NotRequired"]},{"name":"dd","in":"query","description":"Filter by DDS status, including active withdrawn customer DDS records.","required":false,"schema":{"type":"array","description":"Filter by DDS status, including active withdrawn customer DDS records.","example":["Blocked","Allowed","WaitingForOrigins","Draft","Withdrawn"],"items":{"$ref":"#/components/schemas/PublicFilterCustomerDDSStatus"}},"example":["Blocked","Allowed","WaitingForOrigins","Draft","Withdrawn"]},{"name":"os","in":"query","description":"Filter by origin status.","required":false,"schema":{"$ref":"#/components/schemas/FilterOriginStatus"},"example":"Active"},{"name":"ors","in":"query","description":"Filter by origin request status.","required":false,"schema":{"type":"array","description":"Filter by origin request status.","example":["Requested","Answered"],"items":{"$ref":"#/components/schemas/PublicFilterOriginRequestStatus"}},"example":["Requested","Answered"]},{"name":"orso","in":"query","description":"Operator for origin request status filtering. Can be used in combination with 'ors' parameter.","required":false,"schema":{"type":"string","description":"Operator for origin request status filtering. Can be used in combination with 'ors' parameter.","example":"in"},"example":"in"},{"name":"sccas","in":"query","description":"Filter by SCCA status.","required":false,"schema":{"type":"array","description":"Filter by SCCA status.","example":["Pending","Derisked"],"items":{"$ref":"#/components/schemas/SCCAStatus"}},"example":["Pending","Derisked"]},{"name":"includeOrigins","in":"query","description":"Url encoded query parameter for controlling if origins will be included in the response. It allows lighter response in case they are not needed.","required":false,"schema":{"type":"boolean","default":true},"example":false},{"name":"page","in":"query","description":"Page number (0-based)","required":false,"schema":{"type":"integer","default":0},"example":0},{"name":"size","in":"query","description":"Page size","required":false,"schema":{"type":"integer","default":10},"example":10}],"responses":{"200":{"description":"Paginated list of inbound products.","content":{"application/json":{"schema":{"type":"object","properties":{"content":{"type":"array","items":{"$ref":"#/components/schemas/PublicInboundProduct"}},"size":{"type":"integer","format":"int32"},"number":{"type":"integer","format":"int32"},"totalElements":{"type":"integer","format":"int32"},"totalPages":{"type":"integer","format":"int32"},"numberOfElements":{"type":"integer","format":"int32"},"first":{"type":"boolean"},"last":{"type":"boolean"},"empty":{"type":"boolean"}}},"examples":{"Inbound products page":{"summary":"Inbound products with supplier and DDS status details","description":"Inbound products page","value":"{\"content\":[{\"id\":201,\"customerId\":100,\"orgId\":200,\"name\":\"Oak Wood Planks\",\"scientificName\":\"Quercus robur\",\"reference\":\"INB-2025-001\",\"commodity\":{\"id\":1,\"name\":\"Timber\"},\"hsCode\":{\"code\":\"440799\",\"description\":\"Wood sawn or chipped lengthwise, sliced or peeled, of oak\",\"commodityId\":1},\"annualSpend\":null,\"annualQuantity\":null,\"unit\":null,\"countryRisk\":\"Low\",\"origins\":[],\"hasPendingOriginRequest\":false,\"pendingDFRequest\":null,\"supplier\":{\"id\":101,\"name\":\"Acme Manufacturing Inc\",\"type\":\"Manufacturer\",\"location\":\"Vienna\",\"countryId\":14,\"references\":[{\"id\":\"ERP-12345\",\"source\":\"erp\"}]},\"supplierDDS\":[],\"dfAssessment\":null,\"ddsStatus\":{\"status\":\"Allowed\",\"reason\":null},\"customerDDS\":null,\"supplierMaturity\":null,\"legalityAssessment\":null,\"active\":true,\"creatorType\":\"Customer\"},{\"id\":202,\"customerId\":100,\"orgId\":200,\"name\":\"Teak Wood Beams\",\"scientificName\":\"Tectona grandis\",\"reference\":\"INB-2025-002\",\"commodity\":{\"id\":1,\"name\":\"Timber\"},\"hsCode\":{\"code\":\"440711\",\"description\":\"Wood sawn or chipped lengthwise, of teak\",\"commodityId\":1},\"annualSpend\":null,\"annualQuantity\":null,\"unit\":null,\"countryRisk\":\"Mid\",\"origins\":[],\"hasPendingOriginRequest\":true,\"pendingDFRequest\":null,\"supplier\":{\"id\":102,\"name\":\"Beta Timber Ltd\",\"type\":\"Manufacturer\",\"location\":\"London\",\"countryId\":826,\"references\":[{\"id\":\"ERP-12345\",\"source\":\"erp\"}]},\"supplierDDS\":[],\"dfAssessment\":null,\"ddsStatus\":{\"status\":\"WaitingForOrigins\",\"reason\":\"PendingOriginRequest\"},\"customerDDS\":null,\"supplierMaturity\":null,\"legalityAssessment\":null,\"active\":true,\"creatorType\":\"Customer\"}],\"pageable\":{\"pageNumber\":0,\"pageSize\":10,\"sort\":{\"empty\":true,\"sorted\":false,\"unsorted\":true},\"offset\":0,\"paged\":true,\"unpaged\":false},\"totalPages\":1,\"totalElements\":2,\"last\":true,\"size\":10,\"number\":0,\"numberOfElements\":2,\"sort\":{\"empty\":true,\"sorted\":false,\"unsorted\":true},\"first\":true,\"empty\":false}"}}}}},"400":{"description":"Invalid pagination or filter parameters.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorDTO"},"examples":{"Invalid page number":{"description":"Invalid page number","value":{"code":"invalid_request","message":"Page number must be non-negative","solution":"Provide a valid page number (0 or greater)"}},"Invalid page size":{"description":"Invalid page size","value":{"code":"invalid_request","message":"Page size must be between 1 and 100","solution":"Provide a valid page size"}}}}}},"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 - Products"],"summary":"Create a new inbound product","description":"\nCreate a new inbound product for EUDR compliance.\n\nInbound products represent products that your organization receives from suppliers.\nProvide `name`, `hsCode`, and `supplierId` at minimum.\n\n**Required permission:** `access_public_products`\n        ","operationId":"addInboundProduct","requestBody":{"description":"Inbound product creation payload.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicInboundProductPayload"},"examples":{"Full product":{"summary":"Inbound product with scientific name, reference, and supplier","description":"Full product","value":"{\"name\":\"Oak Wood Planks\",\"scientificName\":\"Quercus robur\",\"reference\":\"INB-2025-001\",\"hsCode\":\"440799\",\"annualSpend\":null,\"annualQuantity\":null,\"unit\":null,\"supplierId\":102006215}"},"Basic product":{"summary":"Minimum required fields","description":"Basic product","value":"{\"name\":\"Oak Wood Planks\",\"scientificName\":null,\"reference\":null,\"hsCode\":\"440799\",\"annualSpend\":null,\"annualQuantity\":null,\"unit\":null,\"supplierId\":102006215}"}}}},"required":true},"responses":{"200":{"description":"Inbound product created successfully. Returns the ID of the newly created product.","content":{"application/json":{"schema":{"type":"integer","description":"ID of newly created product"},"examples":{"Created product ID":{"description":"Created product ID","value":"301"}}}}},"400":{"description":"Errors if related data not found or invalid","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorDTO"},"examples":{"HS Code not found":{"description":"HS Code not found","value":{"code":"hs_code_not_found","message":"HS code not found: HSCode=123456","solution":"Check if the identifier provided is correct or create the record first"}},"Supplier not found":{"description":"Supplier not found","value":{"code":"supplier_not_found","message":"Supplier not found: ID=123456","solution":"Check if the identifier provided is correct or create the record first"}},"Missing product scientific name":{"description":"Missing product scientific name","value":{"code":"missing_wooden_product_scientific_name","message":"Missing product scientific name for wooden product","solution":"Provide a scientific name for wooden products"}}}}}},"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/origin-requests":{"post":{"tags":["EUDR - Customers - Origin Requests"],"summary":"Bulk request origins for products","description":"\n\nSend origin requests for products to suppliers. Suppliers are notified by in-app notification and email.\nAdditional email CCs and a comment can be provided in the payload.\nEvery supplier must have at least one contact to be notified.\nTo manage and fetch contacts, use the connection-contact endpoints.\n\n\n**Required permission:** `access_public_products`\n        ","operationId":"requestOrigins","requestBody":{"description":"Origin request creation payload with one or more product items.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicCreateOriginRequestPayload"},"examples":{"Single product":{"summary":"Full request with weight, contacts, and references","description":"Single product","value":"{\"items\":[{\"productId\":123,\"endDate\":{\"date\":\"2025-09-30\",\"_datetype_\":\"Date\"},\"requestedWeight\":1000.50,\"connectionContactIds\":[1,2],\"comment\":\"Please provide origin information for this shipment\",\"references\":[{\"reference\":\"PO-2025-001\",\"referenceType\":\"PurchaseOrder\"},{\"reference\":\"SHP-2025-042\",\"referenceType\":\"ShipmentNumber\"}]}]}"},"Multiple products":{"summary":"Bulk request for two products in one call","description":"Multiple products","value":"{\"items\":[{\"productId\":123,\"endDate\":{\"date\":\"2025-09-30\",\"_datetype_\":\"Date\"},\"requestedWeight\":1000.50,\"connectionContactIds\":[1],\"comment\":\"Urgent request for product origin\",\"references\":null},{\"productId\":456,\"endDate\":{\"date\":\"2025-10-15\",\"_datetype_\":\"Date\"},\"requestedWeight\":500.25,\"connectionContactIds\":[2,3],\"comment\":null,\"references\":[{\"reference\":\"PO-2025-002\",\"referenceType\":\"PurchaseOrder\"}]}]}"},"Minimal":{"summary":"Only required field (productId)","description":"Minimal","value":"{\"items\":[{\"productId\":123,\"endDate\":null,\"requestedWeight\":null,\"connectionContactIds\":null,\"comment\":null,\"references\":null}]}"}}}},"required":true},"responses":{"200":{"description":"Origin requests processed. Check `succeeded` and `failed` for per-item results.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicOriginRequestResult"},"examples":{"All succeeded":{"summary":"Every origin request was created","description":"All succeeded","value":"{\"succeeded\":[{\"id\":1001,\"productId\":123,\"createdAt\":{\"date\":\"2025-09-01T10:00:00\",\"_datetype_\":\"DateTime\"},\"status\":\"Requested\",\"references\":[{\"reference\":\"PO-2025-001\",\"referenceType\":\"PurchaseOrder\"}]},{\"id\":1002,\"productId\":456,\"createdAt\":{\"date\":\"2025-09-01T10:00:00\",\"_datetype_\":\"DateTime\"},\"status\":\"Requested\",\"references\":[]}],\"failed\":[],\"status\":\"Succeeded\"}"},"Partial success":{"summary":"Some requests succeeded; failed items include error messages","description":"Partial success","value":"{\"succeeded\":[{\"id\":1001,\"productId\":123,\"createdAt\":{\"date\":\"2025-09-01T10:00:00\",\"_datetype_\":\"DateTime\"},\"status\":\"Requested\",\"references\":[{\"reference\":\"PO-2025-001\",\"referenceType\":\"PurchaseOrder\"}]}],\"failed\":[{\"value\":{\"productId\":789,\"endDate\":{\"date\":\"2025-09-30\",\"_datetype_\":\"Date\"},\"requestedWeight\":200.00,\"connectionContactIds\":[4],\"comment\":null,\"references\":null},\"message\":\"Product is inactive or not an inbound product\"}],\"status\":\"PartlySucceeded\"}"}}}}},"422":{"description":"Origin request product unsupported, e.g. product inactive or not inbound.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OriginRequestProductUnsupportedErrorDTO"},"examples":{"Product unsupported":{"summary":"Product is inactive or not an inbound product","description":"Product unsupported","value":{"code":"origin_request_product_unsupported","message":"Product with id 789 is inactive or not an inbound product","solution":"Ensure the product is active and is an inbound product"}}}}}},"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}/withdraw":{"post":{"tags":["EUDR - Customers - DDS"],"summary":"Withdraw a submitted customer DDS","description":"\nWithdraws a customer Due Diligence Statement (DDS) from the regulatory system.\nThe DDS must be in `Available` state, and the withdrawal must be requested no later than 72 hours after it becomes available.\nThe withdrawal is completed synchronously; a successful response means both the regulatory withdrawal and local state update completed.\n\n**Required permission:** `access_public_products`\nProduct ownership is checked in the service (including inactive Available DDS superseded by a clone).\n        ","operationId":"withdrawCustomerDDS","parameters":[{"name":"ddsId","in":"path","description":"The ID of the DDS statement.","required":true,"schema":{"type":"integer","format":"int32"},"example":123}],"responses":{"204":{"description":"Customer DDS withdrawn successfully.","content":{}},"400":{"description":"The DDS ID path parameter is invalid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorDTO"},"examples":{"Invalid DDS ID":{"description":"Invalid DDS ID","value":{"code":"invalid_request","message":"Invalid request","solution":"Fix the request"}}}}}},"404":{"description":"The customer DDS is missing or inaccessible in Dashboard, or its submission is missing in the regulatory service.","content":{"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/ErrorDTO"},{"$ref":"#/components/schemas/TracesNtDDSErrorDTO"}]},"examples":{"DDS unavailable in Dashboard":{"description":"DDS unavailable in Dashboard","value":"{\"code\":\"resource_not_found\",\"message\":\"Active customer DDS #123 was not found\",\"solution\":null}"},"DDS submission unavailable in regulatory service":{"description":"DDS submission unavailable in regulatory service","value":"{\"message\":\"DDS submission not found for withdrawal: 123\",\"reasons\":[],\"solution\":\"Please try again later.\",\"code\":\"tracesnt_dds_error\"}"}}}}},"409":{"description":"The customer DDS is not in `Available` state in Dashboard.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CodeErrorDTO"},"examples":{"DDS is not available":{"description":"DDS is not available","value":"{\"code\":\"customer_dds_withdrawal_not_allowed\",\"message\":\"Customer DDS #123 cannot be withdrawn from state Submitted\",\"solution\":null}"}}}}},"422":{"description":"The regulatory service rejected the withdrawal, for example because the withdrawal window elapsed, the regulatory status is not withdrawable, or required submission identifiers are missing.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TracesNtDDSErrorDTO"},"examples":{"Withdrawal rejected":{"description":"Withdrawal rejected","value":"{\"message\":\"The regulatory service rejected the DDS withdrawal\",\"reasons\":[\"EUDR-WITHDRAW-ACTIVE-CHECK\"],\"solution\":\"Please try again later.\",\"code\":\"tracesnt_dds_error\"}"}}}}},"502":{"description":"The regulatory system failed to process the withdrawal or returned an invalid response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TracesNtDDSErrorDTO"},"examples":{"Unexpected regulatory response":{"description":"Unexpected regulatory response","value":"{\"message\":\"Traces NT returned an unexpected customer DDS withdrawal response\",\"reasons\":[\"Expected id=123 and tracesNtStatus=WITHDRAWN\"],\"solution\":\"Please try again later.\",\"code\":\"tracesnt_dds_error\"}"}}}}},"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/v1/users":{"get":{"tags":["Users"],"summary":"Search and list users","description":"\n### Overview\nRetrieve a comprehensive list of all users within your customer's scope. This endpoint is ideal for auditing, synchronization, or building user-management dashboards.\n\n### Use Cases\n- **Auditing**: Regularly export user lists to verify access levels.\n- **Synchronization**: Keep an external user directory in sync with Prewave.\n- **Management**: Build custom internal dashboards for your organization.\n\n### Filtering\nRefine your results using the following optional parameters:\n- **Search**: Matches against name or email (fuzzy matching).\n- **Active**: Filter by account status (active/deactivated).\n- **Confirmed**: Filter by whether the user has verified their account via email.\n\n### Pagination\nThis endpoint returns a paginated result. You can control the page size and offset using the `page` and `size` parameters.\n- **Default Size**: 100\n- **Max Size**: 1000\n\n    ### Related Operations\n    - **Retrieve Detail**: [GET /public/v1/users/{userId}](#operations-Users-getById)\n    - **Onboard User**: [POST /public/v1/users](#operations-Users-create)\n    - **Manage Roles**: [GET /public/v1/users/{userId}/roles](#operations-Users_-_Roles-read)\n    - **Update User**: [PATCH /public/v1/users/{userId}](#operations-Users-update)\n\n### Required Permission\n`access_public_users`\n    ","operationId":"get","parameters":[{"name":"search","in":"query","description":"Fuzzy search against **first name**, **last name**, or **email**.","required":false,"schema":{"type":"string"},"example":"john"},{"name":"active","in":"query","description":"Filter by account status. `true` for active users, `false` for deactivated ones.","required":false,"schema":{"type":"boolean"},"example":true},{"name":"confirmed","in":"query","description":"Filter by confirmation status. `true` for users who have verified their email.","required":false,"schema":{"type":"boolean"},"example":false},{"name":"page","in":"query","description":"Zero-based page index (0..N)","required":false,"schema":{"minimum":0,"type":"integer","default":0}},{"name":"size","in":"query","description":"The size of the page to be returned","required":false,"schema":{"minimum":1,"type":"integer","default":100}}],"responses":{"200":{"description":"Successfully retrieved the paginated list of users.","content":{"application/json":{"schema":{"type":"object","properties":{"content":{"type":"array","items":{"$ref":"#/components/schemas/PublicUserResponse"}},"size":{"type":"integer","format":"int32"},"number":{"type":"integer","format":"int32"},"totalElements":{"type":"integer","format":"int32"},"totalPages":{"type":"integer","format":"int32"},"numberOfElements":{"type":"integer","format":"int32"},"first":{"type":"boolean"},"last":{"type":"boolean"},"empty":{"type":"boolean"}}},"examples":{"Paginated User List":{"summary":"Example of a successful paginated response","description":"Paginated User List","value":"{\"content\":[{\"id\":123,\"active\":true,\"confirmed\":true,\"firstname\":\"John\",\"lastname\":\"Doe\",\"email\":\"john.doe@company.com\",\"customer\":{\"id\":8797983,\"name\":\"Prewave\"},\"organization\":{\"id\":64573456,\"name\":\"Prewave\"},\"plan\":{\"id\":34345453,\"name\":\"Admin\",\"validFrom\":1614616305.000000000},\"teams\":[],\"roles\":[{\"id\":1829,\"name\":\"GRANT_USER_MANAGER_ACCESS\",\"description\":null}]}],\"totalElements\":1,\"totalPages\":1,\"size\":500,\"number\":0,\"numberOfElements\":1,\"first\":true,\"last\":true,\"empty\":false}"}}}}},"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":["Users"],"summary":"Invite and onboard a new user","description":"\n### Overview\nOnboard a new member to your organization. This action triggers an automated invitation email.\n\n### Use Cases\n- **New Employee**: Onboard a new team member with their required access level.\n- **External Partner**: Invite a stakeholder to collaborate with specific roles.\n- **Automation**: Programmatically create users as part of your internal onboarding flow.\n\n### Invitation Lifecycle\n1. **Request**: You provide the user's email and initial configuration.\n2. **Created**: The user account is initialized with `confirmed: false`.\n3. **Activation**: The user receives an email to set their password and log in.\n4. **Completion**: Once logged in, the user's status changes to `confirmed: true`.\n\n### Workflow Tip\n- Use the `Location` header in the response to immediately access the new user's resource URI.\n- You can pre-assign **teams** and **roles** during the invitation to ensure the user has access from their first login.\n\n### Related Operations\n- **List Users**: [GET /public/v1/users](#operations-Users-get)\n- **Discover Roles**: [GET /public/v1/users/roles/available](#operations-Users_-_Roles-getAvailableRoles)\n- **Assign Roles**: [POST /public/v1/users/{userId}/roles](#operations-Users_-_Roles-add)\n\n### Required Permission\n`manage_public_users`\n    ","operationId":"invite","requestBody":{"description":"User configuration for invitation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicCreateUserRequest"},"examples":{"Basic Invitation":{"summary":"Minimum required data to invite a user","description":"Basic Invitation","value":"{\"email\":\"new.user@company.com\",\"firstname\":\"New\",\"lastname\":\"User\",\"teamIds\":[1,2],\"roleNames\":[\"ROLE_USER_MANAGER\"],\"planId\":5}"}}}},"required":true},"responses":{"201":{"description":"Created - Invitation sent successfully. See Location header.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicUserResponse"},"examples":{"Created User Response":{"description":"Created User Response","value":"{\"id\":4523345,\"active\":true,\"confirmed\":false,\"firstname\":\"New\",\"lastname\":\"User\",\"email\":\"new.user@company.ai\",\"customer\":{\"id\":8797983,\"name\":\"Prewave\"},\"organization\":{\"id\":64573456,\"name\":\"Prewave\"},\"plan\":{\"id\":5,\"name\":\"Admin\",\"validFrom\":1614616305.000000000},\"teams\":[],\"roles\":[{\"id\":1829,\"name\":\"ROLE_USER_MANAGER\",\"description\":null}]}"}}}}},"400":{"description":"Bad Request - Validation error (e.g., invalid email format).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorDTO"},"examples":{"Validation Error":{"description":"Validation Error","value":"{\"code\":\"invalid_request\",\"message\":\"Email must be a valid email address.\"}"}}}}},"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/v1/users/{userId}/roles":{"get":{"tags":["Users - Roles"],"summary":"Retrieve roles assigned to a specific user","description":"\n### Overview\nRetrieve all roles currently assigned to a specific user.\n\n### Use Cases\n- **Security Audits**: Verify that users only have the permissions necessary for their current function.\n- **Troubleshooting**: Check if a user's lack of access to a feature is due to missing roles.\n\n### Identification\nThe `{userId}` is a unique numerical identifier.\n\n### Getting User ID\n- To find users and their numerical IDs, use the Users Management API:\n  - `GET /public/v1/users` - Retrieve all users with their `id` field.\n- The `id` field in the user response is the `{userId}` used in this endpoint's path parameter.\n\n### Related Operations\n- **Discover Valid Roles**: [GET /public/v1/users/roles/available](#operations-Users_-_Roles-getAvailableRoles)\n- **Add Roles to User**: [POST /public/v1/users/{userId}/roles](#operations-Users_-_Roles-add)\n- **Remove Specific Role**: [DELETE /public/v1/users/{userId}/roles/{roleName}](#operations-Users_-_Roles-delete)\n\n### Required Permission\n`access_public_users`\n    ","operationId":"read","parameters":[{"name":"userId","in":"path","description":"The unique numerical identifier of the target user. If you do not have this ID, you can find it by searching for the user via `GET /public/v1/users`.","required":true,"schema":{"type":"integer","format":"int32"},"example":4523345}],"responses":{"200":{"description":"User roles retrieved successfully.","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/PublicUserRoleDTO"}},"examples":{"Assigned Roles":{"description":"Assigned Roles","value":"[{\"id\":1,\"name\":\"GRANT_USER_MANAGER_ACCESS\",\"description\":\"User management role\"},{\"id\":2,\"name\":\"GRANT_TEAM_MANAGER_ACCESS\",\"description\":\"Team management role\"}]"}}}}},"404":{"description":"Not Found - The specified user does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorDTO"},"examples":{"User Not Found":{"description":"User Not Found","value":"{\"code\":\"user_not_found\",\"message\":\"User with ID 4523345 could not be found.\"}"}}}}},"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":["Users - Roles"],"summary":"Assign new roles to a user","description":"\n### Overview\nAssign one or more roles to an existing user.\n\n### Use Cases\n- **Privilege Escalation**: Grant a user additional management permissions.\n- **Onboarding**: Finalize a user's access setup by adding specific functional roles.\n\n### Identification\nThe `{userId}` is a unique numerical identifier.\n\n### Getting User ID\n- To find users and their numerical IDs, use the Users Management API:\n  - `GET /public/v1/users` - Retrieve all users with their `id` field.\n- The `id` field in the user response is the `{userId}` used in this endpoint's path parameter.\n\n### Behavior\n- **Additive**: This operation only adds new roles. It will **not** remove or overwrite existing roles.\n- **Validation**: Every role name provided must be valid and assigned to your organization. If even one role name is invalid, the entire request will fail (atomic operation).\n\n### Workflow Tip\nCall [List Available Roles](#operations-Users_-_Roles-getAvailableRoles) first to ensure you are using correct role names.\n\n### Related Operations\n- **List Current Roles**: [GET /public/v1/users/{userId}/roles](#operations-Users_-_Roles-read)\n- **Remove Role**: [DELETE /public/v1/users/{userId}/roles/{roleName}](#operations-Users_-_Roles-delete)\n\n### Required Permission\n`manage_public_users`\n    ","operationId":"add","parameters":[{"name":"userId","in":"path","description":"The unique numerical identifier of the target user. If you do not have this ID, you can find it by searching for the user via `GET /public/v1/users`.","required":true,"schema":{"type":"integer","format":"int32"},"example":4523345}],"requestBody":{"description":"List of role identifiers to assign.","content":{"application/json":{"schema":{"type":"array","items":{"type":"string"}},"examples":{"Batch Role Assignment":{"summary":"Adding multiple roles in a single request","description":"Batch Role Assignment","value":"[\"GRANT_USER_MANAGER_ACCESS\",\"GRANT_TEAM_MANAGER_ACCESS\"]"}}}},"required":true},"responses":{"201":{"description":"Created - Roles successfully added. Returns the full, updated list of user roles.","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/PublicUserRoleDTO"}},"examples":{"Updated Role List":{"description":"Updated Role List","value":"[{\"id\":1,\"name\":\"GRANT_USER_MANAGER_ACCESS\",\"description\":\"User management role\"},{\"id\":2,\"name\":\"GRANT_TEAM_MANAGER_ACCESS\",\"description\":\"Team management role\"},{\"id\":3,\"name\":\"GRANT_ACTIONS_ACCESS\",\"description\":\"Action management role\"}]"}}}}},"404":{"description":"Not Found - Either the user ID is invalid or one of the role names provided does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorDTO"},"examples":{"Role Not Found":{"summary":"Occurs when a role name is misspelled or invalid","description":"Role Not Found","value":"{\"code\":\"role_not_found\",\"message\":\"Role 'UNKNOWN_ROLE' does not exist.\"}"}}}}},"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/v1/target/targets/bulk-fetch":{"post":{"tags":["Suppliers - Management"],"summary":"Bulk fetch detailed target information by target IDs","description":"Fetch detailed information for multiple targets at once, including name, supplier identifiers, and other target details.\nThis endpoint supports both Prewave internal target IDs and foreign system mappings for maximum flexibility.\n\n**Required Permission**: `access_public_target`\n\n**Performance impact**: Medium (depends on batch size)\n\n**Use cases**:\n- Get target details for multiple suppliers at once\n- Resolve foreign system IDs to Prewave target information\n- Bulk data synchronization and integration\n\n**Request format**:\n- Use `targetIds` for Prewave internal target IDs: `[101, 102, 103]`\n- Use `foreignTargets` for foreign system mappings: `[{\"systemId\": \"customer\", \"targetId\": \"SUPPLIER001\"}]`\n- Both fields are optional, but at least one must be provided\n\n**Response format**:\n- `targets`: Successfully fetched targets with full details (same as individual target endpoint)\n- `errors`: Failed lookups with specific error reasons (NOT_FOUND, ACCESS_DENIED, etc.)\n\n**Error handling**:\n- Individual target errors are returned in the `errors` field, not as HTTP errors\n- Empty results are valid (empty `targets` list)\n- Permission checks are performed per target","operationId":"bulkFetchTargets","requestBody":{"description":"Request payload containing target IDs to fetch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicBulkFetchTargetsRequest"},"examples":{"Internal IDs only":{"summary":"Fetch targets using Prewave internal IDs","description":"Internal IDs only","value":{"targetIds":[101,102,103]}},"Foreign system mappings":{"summary":"Fetch targets using foreign system IDs","description":"Foreign system mappings","value":{"foreignTargets":[{"systemId":"customer","targetId":"SUPPLIER001"},{"systemId":"prewave","targetId":"12345"}]}},"Mixed request":{"summary":"Fetch targets using both internal and foreign IDs","description":"Mixed request","value":"{\"targetIds\":[101,102,103],\"foreignTargets\":[{\"systemId\":\"customer\",\"targetId\":\"SUPPLIER001\"},{\"systemId\":\"prewave\",\"targetId\":\"102006215\"}],\"isValid\":true}"}}}},"required":true},"responses":{"200":{"description":"Bulk fetch completed successfully. Check the response for successful targets and any errors.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicBulkFetchTargetsResponse"},"examples":{"Successful response":{"summary":"Response with successful targets and errors","description":"Successful response","value":"{\"targets\":[{\"id\":102006215,\"name\":\"Acme Manufacturing Inc\",\"sname\":\"4990729\",\"logo\":\"/images/company-img/acme-manufacturing-logo.svg\",\"backgroundPicture\":\"/images/company-img/acme-manufacturing-bg.jpg\",\"description\":\"Automotive parts manufacturer specializing in electric vehicle components and battery assemblies.\",\"website\":\"https://www.acme-manufacturing.example.com\",\"location\":\"Detroit, MI, US\",\"yearFounded\":1987,\"size\":\"Large\",\"screened\":true,\"screenedStatus\":\"Screened\",\"linkedInId\":\"acme-manufacturing\",\"type\":{\"id\":5195261,\"type\":\"organization\",\"displayName\":\"Site Group\",\"pluralName\":\"Site Groups\",\"ordering\":0,\"scoring\":\"Alert\"},\"ctype\":{\"id\":972417,\"ctype\":\"company\",\"targetTypeId\":5195261,\"displayName\":\"Site Group\",\"pluralName\":\"Site Groups\",\"icon\":\"fas fa-building\",\"ordering\":0,\"priority\":0,\"connectable\":true,\"bgColor\":\"#E8F4FD\",\"textColor\":\"#1A365D\"},\"geo\":{\"geometry\":null,\"properties\":{\"name\":\"Detroit\",\"countryCode\":\"US\",\"alertCount\":null,\"boundingBox\":null},\"type\":\"Feature\"},\"geoShape\":{\"geometry\":null,\"properties\":{\"name\":null,\"countryCode\":null,\"alertCount\":null,\"boundingBox\":null},\"type\":\"Feature\"},\"parents\":[],\"organization\":{\"id\":987654321,\"name\":\"Acme Corporation\",\"sname\":\"6252001\",\"logo\":\"/images/company-img/acme-corporation-logo.svg\",\"backgroundPicture\":\"/images/company-img/acme-corporation-bg.jpg\",\"description\":\"Global automotive supplier and parent organization of Acme Manufacturing Inc.\",\"website\":\"https://www.acme-corporation.example.com\",\"location\":\"Stuttgart, DE\",\"yearFounded\":1962,\"size\":\"Very large\",\"screened\":true,\"screenedStatus\":\"Screened\",\"linkedInId\":\"acme-corporation\",\"type\":{\"id\":5195261,\"type\":\"organization\",\"displayName\":\"Site Group\",\"pluralName\":\"Site Groups\",\"ordering\":0,\"scoring\":\"Alert\"},\"ctype\":{\"id\":972417,\"ctype\":\"company\",\"targetTypeId\":5195261,\"displayName\":\"Site Group\",\"pluralName\":\"Site Groups\",\"icon\":\"fas fa-building\",\"ordering\":0,\"priority\":0,\"connectable\":true,\"bgColor\":\"#E8F4FD\",\"textColor\":\"#1A365D\"},\"geo\":{\"geometry\":null,\"properties\":{\"name\":\"Stuttgart\",\"countryCode\":\"DE\",\"alertCount\":null,\"boundingBox\":null},\"type\":\"Feature\"},\"geoShape\":{\"geometry\":null,\"properties\":{\"name\":null,\"countryCode\":null,\"alertCount\":null,\"boundingBox\":null},\"type\":\"Feature\"},\"parents\":[],\"organization\":null,\"industries\":[],\"monitoredSince\":{\"date\":\"2018-01-10T09:00:00\",\"_datetype_\":\"DateTime\"},\"earliestAlert\":{\"date\":\"2019-04-12T14:30:00\",\"_datetype_\":\"DateTime\"},\"ordering\":0,\"disruptionStatusUpdate\":null,\"own\":true,\"managed\":true,\"isPublic\":true,\"connectionContactsCount\":12,\"population\":null,\"following\":true,\"collectionFollowing\":true,\"tier\":null,\"path\":[],\"collectionLevel\":1,\"collectionPath\":[{\"id\":42,\"name\":\"Tier-1 Suppliers\"}],\"collectionPaths\":[[{\"id\":42,\"name\":\"Tier-1 Suppliers\"}]],\"foreignSystems\":[{\"system\":\"customer\",\"id\":\"ACME-CORP-001\",\"source\":\"SAP\"}],\"scoreAvail\":\"Alert\",\"revenue\":8500000000,\"impact\":\"Low\",\"hsCode\":[{\"code\":\"870810\",\"nshipments\":128}],\"merged_targets\":[]},\"industries\":[{\"id\":554433221,\"name\":\"Automotive Manufacturing\",\"sname\":null,\"logo\":null,\"backgroundPicture\":null,\"description\":\"Industry classification for automotive parts and vehicle component manufacturing.\",\"website\":null,\"location\":\"Global\",\"yearFounded\":null,\"size\":null,\"screened\":true,\"screenedStatus\":\"Screened\",\"linkedInId\":null,\"type\":{\"id\":5195261,\"type\":\"organization\",\"displayName\":\"Site Group\",\"pluralName\":\"Site Groups\",\"ordering\":0,\"scoring\":\"Alert\"},\"ctype\":{\"id\":1122334,\"ctype\":\"industry\",\"targetTypeId\":5195261,\"displayName\":\"Industry\",\"pluralName\":\"Industries\",\"icon\":\"fas fa-industry\",\"ordering\":10,\"priority\":1,\"connectable\":false,\"bgColor\":\"#F0F0F0\",\"textColor\":\"#333333\"},\"geo\":{\"geometry\":null,\"properties\":{\"name\":null,\"countryCode\":null,\"alertCount\":null,\"boundingBox\":null},\"type\":\"Feature\"},\"geoShape\":{\"geometry\":null,\"properties\":{\"name\":null,\"countryCode\":null,\"alertCount\":null,\"boundingBox\":null},\"type\":\"Feature\"},\"parents\":[],\"organization\":null,\"industries\":[],\"monitoredSince\":null,\"ordering\":null,\"disruptionStatusUpdate\":null,\"own\":false,\"managed\":false,\"isPublic\":null,\"connectionContactsCount\":null,\"population\":null,\"following\":false,\"collectionFollowing\":false,\"tier\":null,\"path\":[],\"collectionLevel\":null,\"collectionPath\":[],\"collectionPaths\":[],\"foreignSystems\":[],\"scoreAvail\":\"None\",\"revenue\":123.456,\"impact\":\"Low\",\"hsCode\":[],\"merged_targets\":[]}],\"monitoredSince\":{\"date\":\"2020-03-15T10:30:00\",\"_datetype_\":\"DateTime\"},\"earliestAlert\":{\"date\":\"2021-06-01T08:00:00\",\"_datetype_\":\"DateTime\"},\"ordering\":1,\"disruptionStatusUpdate\":null,\"own\":true,\"managed\":true,\"isPublic\":false,\"connectionContactsCount\":3,\"population\":null,\"following\":true,\"collectionFollowing\":true,\"tier\":null,\"path\":[{\"id\":987654321,\"name\":\"Acme Corporation\",\"customName\":null,\"latestRequest\":null,\"foreignSystems\":[{\"number\":\"ACME-CORP-001\",\"source\":\"SAP\",\"existingEdgeId\":null}]},{\"id\":102006215,\"name\":\"Acme Manufacturing Inc\",\"customName\":null,\"latestRequest\":null,\"foreignSystems\":[{\"number\":\"SUPPLIER001\",\"source\":\"SAP\",\"existingEdgeId\":null}]}],\"collectionLevel\":2,\"collectionPath\":[{\"id\":42,\"name\":\"Tier-1 Suppliers\"},{\"id\":108,\"name\":\"Automotive\"}],\"collectionPaths\":[[{\"id\":42,\"name\":\"Tier-1 Suppliers\"},{\"id\":108,\"name\":\"Automotive\"}],[{\"id\":55,\"name\":\"North America\"},{\"id\":108,\"name\":\"Automotive\"}]],\"foreignSystems\":[{\"system\":\"customer\",\"id\":\"SUPPLIER001\",\"source\":\"SAP\"},{\"system\":\"supplier\",\"id\":\"ACME-MFG-42\",\"source\":\"Excel\"}],\"scoreAvail\":\"Peer\",\"revenue\":1250000000,\"impact\":\"Low\",\"hsCode\":[{\"code\":\"870899\",\"nshipments\":42},{\"code\":\"401110\",\"nshipments\":15}],\"merged_targets\":[102001100]},{\"id\":101,\"name\":\"Beta Components Ltd\",\"sname\":\"2643743\",\"logo\":\"/images/company-img/beta-components-logo.svg\",\"backgroundPicture\":null,\"description\":\"Supplier of precision machined metal components.\",\"website\":\"https://www.beta-components.example.com\",\"location\":\"London, GB\",\"yearFounded\":2005,\"size\":\"Medium\",\"screened\":true,\"screenedStatus\":\"Pending\",\"linkedInId\":\"beta-components\",\"type\":{\"id\":5195261,\"type\":\"organization\",\"displayName\":\"Site Group\",\"pluralName\":\"Site Groups\",\"ordering\":0,\"scoring\":\"Alert\"},\"ctype\":{\"id\":972417,\"ctype\":\"company\",\"targetTypeId\":5195261,\"displayName\":\"Site Group\",\"pluralName\":\"Site Groups\",\"icon\":\"fas fa-building\",\"ordering\":0,\"priority\":0,\"connectable\":true,\"bgColor\":\"#E8F4FD\",\"textColor\":\"#1A365D\"},\"geo\":{\"geometry\":null,\"properties\":{\"name\":\"London\",\"countryCode\":\"GB\",\"alertCount\":null,\"boundingBox\":null},\"type\":\"Feature\"},\"geoShape\":{\"geometry\":null,\"properties\":{\"name\":null,\"countryCode\":null,\"alertCount\":null,\"boundingBox\":null},\"type\":\"Feature\"},\"parents\":[],\"organization\":null,\"industries\":[],\"monitoredSince\":null,\"ordering\":null,\"disruptionStatusUpdate\":null,\"own\":false,\"managed\":false,\"isPublic\":false,\"connectionContactsCount\":1,\"population\":null,\"following\":false,\"collectionFollowing\":false,\"tier\":null,\"path\":[],\"collectionLevel\":null,\"collectionPath\":[],\"collectionPaths\":[],\"foreignSystems\":[{\"system\":\"customer\",\"id\":\"BETA-101\",\"source\":\"SAP\"}],\"scoreAvail\":\"SSA\",\"revenue\":45000000,\"impact\":\"Low\",\"hsCode\":[{\"code\":\"732690\",\"nshipments\":8}],\"merged_targets\":[]}],\"errors\":[{\"targetId\":102,\"systemId\":null,\"systemTargetId\":null,\"reason\":\"ACCESS_DENIED\"},{\"targetId\":null,\"systemId\":\"customer\",\"systemTargetId\":\"UNKNOWN_SUPPLIER\",\"reason\":\"NOT_FOUND\"}]}"}}}}},"400":{"description":"Invalid request - neither targetIds nor foreignTargets provided","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/v1/sites-upsert/process":{"post":{"tags":["Suppliers - Sites Upsert"],"summary":"Force the processing of all pending site upsert requests.","description":"\n\n⚠️ **DEPRECATED** - This endpoint is deprecated and will be removed on 31 May 2027.\n\n**Migration:** `POST /public/v2/suppliers/sites` to create sites, `GET /public/v2/suppliers/sites/pending` to track processing.\n\nTrigger processing of all queued site upsert requests. Intended for administrative use.\n\n**Required permission:** `sites_upsert_admin`\n\n**Performance impact:** Medium\n    ","operationId":"forceProcessing","responses":{"200":{"description":"Processing triggered successfully"},"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    }"}}}}}},"deprecated":true}},"/public/v1/sites-upsert/full":{"get":{"tags":["Suppliers - Sites Upsert"],"summary":"List all site upsert requests for your organisation.","description":"\n\n⚠️ **DEPRECATED** - This endpoint is deprecated and will be removed on 31 May 2027.\n\n**Migration:** `POST /public/v2/suppliers/sites` to create sites, `GET /public/v2/suppliers/sites/pending` to track processing.\n\nList all site upsert requests for your organisation. The organisation is determined by your API user or API token.\n\n**Required permission:** `create_sites_upsert_requests`\n\n**Performance impact:** Low\n","operationId":"listRequests","responses":{"200":{"description":"Successfully retrieved site upsert requests","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/PublicSitesUpsertRequestEntry"}},"examples":{"Site upsert request list":{"summary":"Requests in progress and completed","description":"Site upsert request list","value":"[{\"requestId\":\"550e8400-e29b-41d4-a716-446655440001\",\"status\":\"Work in progress\",\"created\":\"2026-01-15T10:30:00Z\"},{\"requestId\":\"550e8400-e29b-41d4-a716-446655440002\",\"status\":\"Done\",\"created\":\"2026-01-10T14:00:00Z\"}]"},"No requests":{"summary":"Organisation has no site upsert requests yet","description":"No requests","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    }"}}}}}},"deprecated":true},"post":{"tags":["Suppliers - Sites Upsert"],"summary":"Upsert suppliers and their desired collections with a full load.","description":"\n\n⚠️ **DEPRECATED** - This endpoint is deprecated and will be removed on 31 May 2027.\n\n**Migration:** `POST /public/v2/suppliers/sites` to create sites, `GET /public/v2/suppliers/sites/pending` to track processing.\n\nFull load means that all sites need to exist in the request payload.\nExisting sites not part of the payload will be removed from the managed collections in this request.\n\n**Required permission:** `create_sites_upsert_requests`\n\n**Performance impact:** Medium\n","operationId":"fullLoad","requestBody":{"description":"Full load payload containing all sites that should remain active","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicFullSitesUpsertPayload"},"examples":{"Full load request":{"summary":"Replace managed sites with the supplied list","description":"Full load request","value":"{\"siteData\":[{\"name\":\"Acme Manufacturing Inc\",\"countryCode\":\"DE\",\"locality\":\"Stuttgart\",\"addressLine\":\"Industriestrasse 42\",\"postalCode\":\"70376\",\"industries\":[{\"industry\":\"I_AUTOMOTIVE\",\"industryStandard\":\"MOCK-ISO-42\"}],\"website\":\"https://www.acme-manufacturing.example.com\",\"contact\":[\"procurement@acme-manufacturing.example.com\"],\"yourReference\":{\"id\":\"ERP-12345\",\"source\":\"erp\"},\"additionalReferences\":[{\"id\":\"ACME-VIE-001\",\"source\":\"erp\"}],\"connectionType\":\"Supplier\",\"diImpact\":\"Mid\",\"biImpact\":\"Low\",\"priority\":\"Mid\",\"spendData\":500000.0,\"collectionNames\":[\"Tier-1 Suppliers\",\"Automotive\",\"Europe\"],\"externalReferences\":[{\"externalId\":\"123456789\",\"system\":\"duns\"}],\"postInitScreeningPeriod\":3,\"impactData\":{\"year\":2025,\"bi12MlnEuro\":20.0,\"grossMttrEMonths\":2,\"grossMttrIMonths\":4,\"cocSigned\":true,\"additionalInformation\":\"Primary battery assembly supplier\"},\"safetyStock\":{\"onPremiseStockLevelMonths\":2,\"atSupplierLocation\":\"SameBuilding\",\"atSupplierDeviation\":\"OnTarget\",\"atSupplierStockLevelMonths\":4,\"atSupplierLastConfirmedDate\":{\"date\":\"2025-11-23\",\"_datetype_\":\"Date\"},\"inLogisticChainDaysOnHand\":40}},{\"name\":\"Global Parts GmbH\",\"countryCode\":\"AT\",\"locality\":\"Vienna\",\"addressLine\":\"Industriepark 7\",\"postalCode\":\"1220\",\"industries\":null,\"website\":null,\"contact\":[],\"yourReference\":{\"id\":\"ERP-67890\",\"source\":\"erp\"},\"additionalReferences\":[],\"connectionType\":\"Supplier\",\"diImpact\":\"Low\",\"biImpact\":\"Low\",\"priority\":null,\"spendData\":null,\"collectionNames\":[\"Tier-2 Suppliers\"],\"externalReferences\":[],\"postInitScreeningPeriod\":null,\"impactData\":null,\"safetyStock\":null}],\"purgeOld\":true,\"dryRun\":false}"},"Full load dry run":{"summary":"Validate the payload without persisting changes","description":"Full load dry run","value":"{\"siteData\":[{\"name\":\"Acme Manufacturing Inc\",\"countryCode\":\"DE\",\"locality\":\"Stuttgart\",\"addressLine\":\"Industriestrasse 42\",\"postalCode\":\"70376\",\"industries\":[{\"industry\":\"I_AUTOMOTIVE\",\"industryStandard\":\"MOCK-ISO-42\"}],\"website\":\"https://www.acme-manufacturing.example.com\",\"contact\":[\"procurement@acme-manufacturing.example.com\"],\"yourReference\":{\"id\":\"ERP-12345\",\"source\":\"erp\"},\"additionalReferences\":[{\"id\":\"ACME-VIE-001\",\"source\":\"erp\"}],\"connectionType\":\"Supplier\",\"diImpact\":\"Mid\",\"biImpact\":\"Low\",\"priority\":\"Mid\",\"spendData\":500000.0,\"collectionNames\":[\"Tier-1 Suppliers\",\"Automotive\",\"Europe\"],\"externalReferences\":[{\"externalId\":\"123456789\",\"system\":\"duns\"}],\"postInitScreeningPeriod\":3,\"impactData\":{\"year\":2025,\"bi12MlnEuro\":20.0,\"grossMttrEMonths\":2,\"grossMttrIMonths\":4,\"cocSigned\":true,\"additionalInformation\":\"Primary battery assembly supplier\"},\"safetyStock\":{\"onPremiseStockLevelMonths\":2,\"atSupplierLocation\":\"SameBuilding\",\"atSupplierDeviation\":\"OnTarget\",\"atSupplierStockLevelMonths\":4,\"atSupplierLastConfirmedDate\":{\"date\":\"2025-11-23\",\"_datetype_\":\"Date\"},\"inLogisticChainDaysOnHand\":40}},{\"name\":\"Global Parts GmbH\",\"countryCode\":\"AT\",\"locality\":\"Vienna\",\"addressLine\":\"Industriepark 7\",\"postalCode\":\"1220\",\"industries\":null,\"website\":null,\"contact\":[],\"yourReference\":{\"id\":\"ERP-67890\",\"source\":\"erp\"},\"additionalReferences\":[],\"connectionType\":\"Supplier\",\"diImpact\":\"Low\",\"biImpact\":\"Low\",\"priority\":null,\"spendData\":null,\"collectionNames\":[\"Tier-2 Suppliers\"],\"externalReferences\":[],\"postInitScreeningPeriod\":null,\"impactData\":null,\"safetyStock\":null}],\"purgeOld\":true,\"dryRun\":true}"}}}},"required":true},"responses":{"200":{"description":"Request created successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SitesUpsertRequestCreatedResponse"},"examples":{"Request created":{"summary":"Use the request ID to poll status and dry-run results","description":"Request created","value":"{\"requestId\":\"550e8400-e29b-41d4-a716-446655440001\"}"}}}}},"429":{"description":"API rate limit exceeded","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SitesUpsertRequestCreatedResponse"}}}},"400":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SitesUpsertValidationFailedResponse"},"examples":{"Validation errors":{"summary":"Per-site validation failures","description":"Validation errors","value":"{\"validationErrors\":[{\"yourReference\":\"ERP-12345\",\"error\":\"locality must have more than 3 characters\"},{\"yourReference\":\"ERP-INVALID\",\"error\":\"countryCode must be a valid ISO 3166-1 alpha-2 code\"}]}"}}}}},"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    }"}}}}}},"deprecated":true}},"/public/v1/sites-upsert/delta":{"post":{"tags":["Suppliers - Sites Upsert"],"summary":"Upsert suppliers and their desired collections with a delta load.","description":"\n\n⚠️ **DEPRECATED** - This endpoint is deprecated and will be removed on 31 May 2027.\n\n**Migration:** `POST /public/v2/suppliers/sites` to create sites, `GET /public/v2/suppliers/sites/pending` to track processing.\n\nIn contrast to the full load, the delta load only updates the sites in the payload.\nExisting sites not part of the payload will not be removed from managed collections.\n\n**Required permission:** `create_sites_upsert_requests`\n\n**Performance impact:** Medium\n","operationId":"deltaLoad","requestBody":{"description":"Delta load payload containing sites to create or update","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicDeltaSitesUpsertPayload"},"examples":{"Delta load request":{"summary":"Create or update selected sites without removing others","description":"Delta load request","value":"{\"siteData\":[{\"name\":\"Acme Manufacturing Inc\",\"countryCode\":\"DE\",\"locality\":\"Stuttgart\",\"addressLine\":\"Industriestrasse 42\",\"postalCode\":\"70376\",\"industries\":[{\"industry\":\"I_AUTOMOTIVE\",\"industryStandard\":\"MOCK-ISO-42\"}],\"website\":\"https://www.acme-manufacturing.example.com\",\"contact\":[\"procurement@acme-manufacturing.example.com\"],\"yourReference\":{\"id\":\"ERP-12345\",\"source\":\"erp\"},\"additionalReferences\":[{\"id\":\"ACME-VIE-001\",\"source\":\"erp\"}],\"connectionType\":\"Supplier\",\"diImpact\":\"Mid\",\"biImpact\":\"Low\",\"priority\":\"Mid\",\"spendData\":500000.0,\"collectionNames\":[\"Tier-1 Suppliers\",\"Automotive\",\"Europe\"],\"externalReferences\":[{\"externalId\":\"123456789\",\"system\":\"duns\"}],\"postInitScreeningPeriod\":3,\"impactData\":{\"year\":2025,\"bi12MlnEuro\":20.0,\"grossMttrEMonths\":2,\"grossMttrIMonths\":4,\"cocSigned\":true,\"additionalInformation\":\"Primary battery assembly supplier\"},\"safetyStock\":{\"onPremiseStockLevelMonths\":2,\"atSupplierLocation\":\"SameBuilding\",\"atSupplierDeviation\":\"OnTarget\",\"atSupplierStockLevelMonths\":4,\"atSupplierLastConfirmedDate\":{\"date\":\"2025-11-23\",\"_datetype_\":\"Date\"},\"inLogisticChainDaysOnHand\":40}}],\"dryRun\":false}"}}}},"required":true},"responses":{"200":{"description":"Request created successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SitesUpsertRequestCreatedResponse"},"examples":{"Request created":{"description":"Request created","value":"{\"requestId\":\"550e8400-e29b-41d4-a716-446655440001\"}"}}}}},"429":{"description":"API rate limit exceeded","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SitesUpsertRequestCreatedResponse"}}}},"400":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SitesUpsertValidationFailedResponse"},"examples":{"Validation errors":{"description":"Validation errors","value":"{\"validationErrors\":[{\"yourReference\":\"ERP-12345\",\"error\":\"locality must have more than 3 characters\"},{\"yourReference\":\"ERP-INVALID\",\"error\":\"countryCode must be a valid ISO 3166-1 alpha-2 code\"}]}"}}}}},"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    }"}}}}}},"deprecated":true},"delete":{"tags":["Suppliers - Sites Upsert"],"summary":"Disable edges to suppliers and remove them from managed collections.","description":"\n\n⚠️ **DEPRECATED** - This endpoint is deprecated and will be removed on 31 May 2027.\n\n**Migration:** `POST /public/v2/suppliers/sites` to create sites, `GET /public/v2/suppliers/sites/pending` to track processing.\n\nDeactivate supplier edges identified by your references.\n\n**Required permission:** `create_sites_upsert_requests`\n\n**Performance impact:** Low\n    ","operationId":"deactivateEdges","parameters":[{"name":"dryRun","in":"query","description":"If set to true, the request will be processed without actually writing to the database.This is useful for testing purposes.\n            |Use endpoints `{requestId}/dry-runs` and `dry-run/{id}` to get the status and the results of your dry-runs.","required":false,"schema":{"type":"boolean"}}],"requestBody":{"description":"List of your references to deactivate","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/SitesUpsertYourReference"}},"examples":{"References to deactivate":{"summary":"Supplier references from your ERP or internal systems","description":"References to deactivate","value":"[{\"id\":\"ERP-12345\",\"source\":\"erp\"},{\"id\":\"ERP-LEGACY-99\",\"source\":\"erp\"}]"}}}},"required":true},"responses":{"200":{"description":"Request created successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SitesUpsertRequestCreatedResponse"},"examples":{"Request created":{"description":"Request created","value":"{\"requestId\":\"550e8400-e29b-41d4-a716-446655440001\"}"}}}}},"429":{"description":"API rate limit exceeded","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SitesUpsertRequestCreatedResponse"}}}},"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    }"}}}}}},"deprecated":true}},"/public/v1/scores/externals":{"get":{"tags":["Scores - Externals"],"summary":"Get external score history for one supplier","description":"\nReturns score history per event type for one supplier. Identify the supplier using query parameters such as supplier ID, customer ID, own site ID, or Prewave ID — the same identifiers you use elsewhere in the public supplier APIs.\n\n**When to use this**\n- Auditing what scores are stored for one supplier after an integration run.\n- Showing score history in a customer-facing report or internal dashboard.\n- Verifying that an upload landed as expected for a given supplier.\n\n**Optional filters**\n- `perspectiveId` — limit results to a specific perspective (defaults to your account’s default).\n- `groupId` — narrow results to a score group when needed.\n\n**If something goes wrong**\n- **400** — No supplier identifier was provided, or more than one supplier matched. Add or refine identifiers (for example include `source`).\n- **404** — No supplier matched the identifiers you sent.\n\n**Required permission:** `access_public_internal_score`\n        ","operationId":"getExternalScoresForTargetByIdentifier","parameters":[{"name":"supplierId","in":"query","description":"Supplier ID of the target. Can be combined with customerId, ownId, and/or prewaveId.","required":false,"schema":{"type":"string","description":"Supplier ID of the target. Can be combined with customerId, ownId, and/or prewaveId.","example":"SAP-12345"},"example":"SAP-12345"},{"name":"customerId","in":"query","description":"Customer ID of the target. Can be combined with supplierId, ownId, and/or prewaveId.","required":false,"schema":{"type":"string","description":"Customer ID of the target. Can be combined with supplierId, ownId, and/or prewaveId.","example":"CRM-67890"},"example":"CRM-67890"},{"name":"ownId","in":"query","description":"Own site ID of the target. Can be combined with supplierId, customerId, and/or prewaveId.","required":false,"schema":{"type":"string","description":"Own site ID of the target. Can be combined with supplierId, customerId, and/or prewaveId.","example":"OWN-SITE-01"},"example":"OWN-SITE-01"},{"name":"prewaveId","in":"query","description":"Prewave ID of the target. Can be combined with supplierId, customerId, and/or ownId.","required":false,"schema":{"type":"integer","description":"Prewave ID of the target. Can be combined with supplierId, customerId, and/or ownId.","format":"int32","example":102006215},"example":102006215},{"name":"source","in":"query","description":"Optional source system to filter by. Applies to supplierId, customerId, and ownId (not prewaveId).","required":false,"schema":{"type":"string","description":"Optional source system to filter by. Applies to supplierId, customerId, and ownId (not prewaveId).","example":"SAP"},"example":"SAP"},{"name":"perspectiveId","in":"query","description":"Optional. Perspective to filter scores by. If omitted, your account default is used.","required":false,"schema":{"type":"integer","format":"int32"},"example":1},{"name":"groupId","in":"query","description":"Optional. Score group to filter results by.","required":false,"schema":{"type":"integer","format":"int32"},"example":10}],"responses":{"200":{"description":"Score history for the supplier that matched your identifiers.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicExternalScoreResponse"},"examples":{"Score history for one supplier":{"summary":"Multiple event types with revision history","description":"Score history for one supplier","value":"{\"identifier\":{\"supplierId\":\"SAP-12345\",\"customerId\":null,\"ownId\":null,\"prewaveId\":null,\"source\":\"SAP\"},\"scores\":[{\"group\":{\"id\":10,\"name\":\"Environmental\",\"sname\":\"env\"},\"eventTypeKey\":\"carbon\",\"score\":{\"value\":85,\"risk\":\"Low\"},\"comment\":\"Q1 2026 sustainability review — improved emissions tracking\",\"updatedAt\":\"2026-01-15T10:30:00Z\",\"validFrom\":\"2026-01-15T00:00:00Z\",\"validTo\":null,\"history\":[{\"group\":{\"id\":10,\"name\":\"Environmental\",\"sname\":\"env\"},\"eventTypeKey\":\"carbon\",\"score\":{\"value\":78,\"risk\":\"Mid\"},\"comment\":\"Initial Q4 2025 assessment\",\"updatedAt\":\"2025-10-01T09:00:00Z\",\"validFrom\":\"2025-10-01T00:00:00Z\",\"validTo\":\"2025-12-31T23:59:59Z\",\"history\":[]},{\"group\":{\"id\":10,\"name\":\"Environmental\",\"sname\":\"env\"},\"eventTypeKey\":\"carbon\",\"score\":{\"value\":82,\"risk\":\"Low\"},\"comment\":\"Revised after on-site supplier audit\",\"updatedAt\":\"2025-12-15T14:00:00Z\",\"validFrom\":\"2026-01-01T00:00:00Z\",\"validTo\":\"2026-01-14T23:59:59Z\",\"history\":[]}]},{\"group\":{\"id\":20,\"name\":\"Physical Risk\",\"sname\":\"physical\"},\"eventTypeKey\":\"flood\",\"score\":{\"value\":42,\"risk\":\"Mid\"},\"comment\":\"Primary site located in a medium flood-risk zone\",\"updatedAt\":\"2026-02-01T08:00:00Z\",\"validFrom\":\"2026-02-01T00:00:00Z\",\"validTo\":null,\"history\":[]},{\"group\":{\"id\":30,\"name\":\"Financial Risk\",\"sname\":\"financial\"},\"eventTypeKey\":\"credit_risk\",\"score\":{\"value\":72,\"risk\":\"Mid\"},\"comment\":\"Credit rating imported from external risk platform\",\"updatedAt\":\"2026-01-20T16:45:00Z\",\"validFrom\":\"2026-01-20T00:00:00Z\",\"validTo\":\"2026-07-19T23:59:59Z\",\"history\":[]}]}"}}}}},"400":{"description":"Supplier could not be identified uniquely — provide at least one identifier or narrow the match (for example with `source`).","content":{"application/json":{}}},"404":{"description":"No supplier found for the identifiers provided, or you do not have access to that supplier.","content":{"application/json":{}}},"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":["Scores - Externals"],"summary":"Upload external scores for one or more suppliers","description":"\nUploads scores per supplier and event type. Event types are the risk dimensions you score for a supplier (e.g. Carbon, Flood).\n\n**What you send**\n- A list of suppliers, each with how to find that supplier in Prewave and one or more scores.\n- At most 100 supplier entries in `data` per request.\n- At most 50 score rows per supplier in `scores` (one per event type).\n- Each score needs an event type key (`eventTypeKey`), a value from 1 to 100, and an optional comment.\n\n**Recommended workflow**\n1. Call **List event types for a perspective** to see which event type keys are set up for your perspective.\n2. Send this request with those keys where possible.\n3. Review the response: if `success` is false, open `errors` to see which suppliers or scores failed and why.\n\n**How to read the response**\n- The request is accepted even when some rows fail. Check `success` for an all-clear result.\n- Counters show how many suppliers were received, matched, and saved (`totalCount`, `validCount`, `resolvedCount`, `writtenCount`, `skippedCount`).\n- Problems (unknown supplier, unknown event type key, and similar) are listed in `errors`, not only as an HTTP error.\n\n**Required permission:** `access_public_internal_score`\n        ","operationId":"createExternalScoresBulk","requestBody":{"description":"List of suppliers and their scores. Limits are enforced at validation time: at most 100 suppliers and at most 50 scores per supplier. See the request schema and examples for the expected shape.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicExternalScoreCreationRequest"},"examples":{"Multiple suppliers":{"summary":"Three suppliers with multiple scores and identifier types","description":"Multiple suppliers","value":"{\"data\":[{\"identifier\":{\"supplierId\":\"SAP-12345\",\"customerId\":null,\"ownId\":null,\"prewaveId\":null,\"source\":\"SAP\"},\"scores\":[{\"eventTypeKey\":\"carbon\",\"scoreValue\":24,\"comment\":\"Scope 1 and 2 emissions review — Q1 2026\"},{\"eventTypeKey\":\"flood\",\"scoreValue\":5,\"comment\":\"Low flood exposure at primary manufacturing site\"}]},{\"identifier\":{\"supplierId\":null,\"customerId\":null,\"ownId\":null,\"prewaveId\":102006215,\"source\":null},\"scores\":[{\"eventTypeKey\":\"credit_risk\",\"scoreValue\":72,\"comment\":\"Credit rating imported from external risk platform\"}]},{\"identifier\":{\"supplierId\":null,\"customerId\":\"CRM-67890\",\"ownId\":null,\"prewaveId\":null,\"source\":\"SAP\"},\"scores\":[{\"eventTypeKey\":\"carbon\",\"scoreValue\":55,\"comment\":null}]}]}"}}}},"required":true},"responses":{"200":{"description":"Upload finished. Check `success`, the counters, and `errors` to see whether every supplier and score was saved.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicExternalScoreCreationResponse"},"examples":{"Bulk write result — all succeeded":{"summary":"Every supplier and score was saved","description":"Bulk write result — all succeeded","value":"{\"success\":true,\"totalCount\":3,\"validCount\":3,\"resolvedCount\":3,\"writtenCount\":4,\"skippedCount\":0,\"errors\":[]}"},"Bulk write result — partial success":{"summary":"Some scores saved; check errors for failed rows","description":"Bulk write result — partial success","value":"{\"success\":false,\"totalCount\":3,\"validCount\":3,\"resolvedCount\":2,\"writtenCount\":3,\"skippedCount\":1,\"errors\":[{\"entryIndex\":2,\"scoreIndex\":0,\"identifier\":{\"supplierId\":null,\"customerId\":\"CRM-UNKNOWN\",\"ownId\":null,\"prewaveId\":null,\"source\":\"SAP\"},\"eventTypeKey\":\"carbon\",\"reason\":\"TARGET_NOT_FOUND\",\"message\":\"No supplier found matching customerId=CRM-UNKNOWN, source=SAP\"},{\"entryIndex\":0,\"scoreIndex\":1,\"identifier\":{\"supplierId\":\"SAP-12345\",\"customerId\":null,\"ownId\":null,\"prewaveId\":null,\"source\":\"SAP\"},\"eventTypeKey\":\"unknown_event\",\"reason\":\"UNKNOWN_EVENT_TYPE\",\"message\":\"Event type key 'unknown_event' is not configured\"}]}"}}}}},"400":{"description":"The request could not be processed — for example the supplier list was empty, more than 100 suppliers were sent, more than 50 scores were sent for one supplier, a score was outside 1–100, or an event type key was missing.","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/v1/enterprise-export/scores/config":{"get":{"tags":["Scores - Enterprise Export"],"summary":"Get Export Configuration","description":"\nRetrieve the current export configuration for the authenticated user.\n\nThis endpoint returns the user's active export job configuration, which determines:\n- Which collections, targets, and perspectives to include\n- How frequently the export job runs (interval)\n- Whether the job is currently enabled\n- Whether to include detailed score components and subcomponents\n\n**Configuration Behavior:**\n\n*Run Intervals:*\n- `SIX_HOURS`: Job runs every 6 hours (minimum interval)\n- `TWELVE_HOURS`: Job runs every 12 hours\n- `DAILY`: Job runs once every 24 hours\n- `WEEKLY`: Job runs once every 168 hours (7 days)\n- The scheduler checks for due executions periodically, so actual execution may occur shortly after the interval elapses\n\n*Enabled State:*\n- When `enabled` is `true`, the job will automatically run based on the configured `runInterval`\n- When `enabled` is `false`, the job will not execute, even if the interval has elapsed\n- Jobs only run if they are both enabled AND due based on the last execution time\n\n*Collections and Targets:*\n- `collectionIds`: List of Prewave Collection IDs. All targets within these collections will be included in the export\n- `targetIds`: List of specific Target IDs to include. These are combined with targets from collections (union operation)\n- Targets from collections and individual target IDs are merged together (no duplicates)\n- If a collection is empty or contains no accessible targets, it will be skipped during execution\n- **To get collection IDs**: Use endpoints from the Collections API:\n  - `GET /public/v1/collections` - List all accessible collections (returns `id` field for each collection)\n  - `GET /public/v1/collections/{collectionId}` - Get a specific collection by ID\n- **To get target IDs**: Use endpoints from the Suppliers API:\n  - `GET /public/v2/suppliers/sites` - List all supplier sites (returns `prewaveTargetId` field for each supplier)\n  - `GET /public/v2/suppliers/sites/find-by-identifier?prewaveId={targetId}` - Get a specific supplier by ID\n\n*Perspectives:*\n- `perspectiveIds`: List of Perspective IDs for which scores should be calculated\n- **Required for active configurations** - must contain at least one perspective ID when creating or updating a configuration\n- ⚠️ **Important**: If `perspectiveIds` is empty, the endpoint will accept the configuration but **no scores will be generated** during execution\n- In the default response (when no configuration exists), `perspectiveIds` will be empty (`[]`), indicating an incomplete/disabled configuration\n- Scores are calculated for each combination of (target × perspective)\n- All specified perspectives must be accessible to the user\n- Example: If you have 10 targets and 2 perspectives, 20 score calculations will be performed\n\n*Components:*\n- `includeComponents`: When `true`, the export results will include detailed score components and subcomponents\n- When `false`, only top-level scores and risk levels are included\n- Enabling components increases the response size but provides more granular score breakdowns\n\n**Response Format:**\n- If no configuration exists, a default configuration will be returned with:\n  - Empty `collectionIds` and `targetIds` lists\n  - Empty `perspectiveIds` list\n  - `enabled` set to `false`\n  - `runInterval` set to `WEEKLY`\n  - `includeComponents` set to `false`\n- ⚠️ **Note**: While the default configuration shows `perspectiveIds` as empty, this is not a valid configuration for generating scores. You must provide at least one perspective ID when creating or updating the configuration, otherwise no scores will be generated during execution.\n- All configuration fields are returned as specified in the response schema\n- The `runInterval` field defaults to `WEEKLY` if not explicitly set\n\n**Using the Configuration:**\n\n1. **Check Configuration**: Use this endpoint to verify your current export configuration\n2. **Update Configuration**: Use `POST /public/v1/enterprise-export/scores/config` to create or update the configuration\n3. **Retrieve Results**: After a job executes, use `GET /public/v1/enterprise-export/scores` to retrieve score results\n4. **Check Errors**: Use `GET /public/v1/enterprise-export/scores/errors` to view any errors that occurred during execution\n\n**Important Notes:**\n- The configuration is user-specific - each user has their own export configuration\n- Jobs run asynchronously - execution may take time depending on the number of targets and perspectives\n- Results are only available after at least one successful execution has completed\n- If no results are available yet, `GET /public/v1/enterprise-export/scores` will return an empty page\n- Collection access is validated before execution - if you lack access to specified collections, the execution will fail\n- The last successful execution's results are always available via the scores endpoint\n\n**Required Permission**: `ACCESS_ENTERPRISE_EXPORT_API`\n        ","operationId":"getExportConfiguration","responses":{"200":{"description":"Configuration successfully retrieved","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicScoreExecutionConfig"},"examples":{"Active configuration":{"summary":"Sample active export configuration","description":"An active configuration with collections, targets, and perspectives configured. The job will run automatically based on the WEEKLY interval.","value":{"runInterval":"WEEKLY","enabled":true,"collectionIds":[123,456,789],"targetIds":[102006215,101641243,10422185],"perspectiveIds":[1,2,3],"includeComponents":false}},"Disabled configuration":{"summary":"Configuration with job disabled","description":"A configuration that exists but is disabled. The job will not run even if the interval has elapsed.","value":{"runInterval":"DAILY","enabled":false,"collectionIds":[123,456],"targetIds":[102006215],"perspectiveIds":[1],"includeComponents":true}},"Default configuration":{"summary":"Default configuration when none exists","description":"The default configuration returned when no configuration has been created yet. The empty `perspectiveIds` array (`[]`) indicates an incomplete/disabled configuration. You must provide at least one perspective ID when creating or updating a configuration, otherwise no scores will be generated during execution.","value":{"runInterval":"WEEKLY","enabled":false,"collectionIds":[],"targetIds":[],"perspectiveIds":[],"includeComponents":false}},"High-frequency configuration":{"summary":"Configuration with frequent execution","description":"A configuration set to run every 6 hours with components enabled for detailed score breakdowns.","value":{"runInterval":"SIX_HOURS","enabled":true,"collectionIds":[123],"targetIds":[102006215,101641243],"perspectiveIds":[1,2],"includeComponents":true}}}}}},"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":["Scores - Enterprise Export"],"summary":"Create or Update Export Configuration","description":"\nCreate a new export configuration or update the existing one for the authenticated user.\n\nThis endpoint allows you to configure automated score export jobs that will calculate and export scores for your specified collections, targets, and perspectives at regular intervals.\n\n**Upsert Behavior:**\n- If no configuration exists for the user, a new configuration will be created\n- If a configuration already exists, it will be completely replaced with the new values\n- This is an idempotent operation - calling it multiple times with the same data produces the same result\n- Each user can have only one export configuration at a time\n\n**Configuration Fields:**\n\n*Run Interval (`runInterval`):*\n- **Optional field** - defaults to `WEEKLY` if not specified\n- Valid values: `SIX_HOURS`, `TWELVE_HOURS`, `DAILY`, `WEEKLY`\n- Determines how frequently the export job executes:\n  - `SIX_HOURS`: Every 6 hours (minimum interval)\n  - `TWELVE_HOURS`: Every 12 hours\n  - `DAILY`: Once every 24 hours\n  - `WEEKLY`: Once every 168 hours (7 days)\n- The scheduler checks periodically, so execution may occur shortly after the interval elapses\n\n*Enabled State (`enabled`):*\n- **Required field** - must be explicitly set to `true` or `false`\n- When `true`: Job will automatically run based on the configured `runInterval`\n- When `false`: Job will not execute, even if the interval has elapsed\n- You can disable a job without deleting the configuration\n\n*Collections (`collectionIds`):*\n- **Required field** - must be provided (can be empty array `[]`)\n- List of Prewave Collection IDs to include in the export\n- All targets within these collections will be included in the export\n- Collections are validated for user access when the job executes (not at configuration time)\n- Empty collections or collections with no accessible targets will be skipped during execution\n- **To get collection IDs**: Use endpoints from the Collections API:\n  - `GET /public/v1/collections` - List all accessible collections (returns `id` field for each collection)\n  - `GET /public/v1/collections/{collectionId}` - Get a specific collection by ID\n\n*Targets (`targetIds`):*\n- **Required field** - must be provided (can be empty array `[]`)\n- List of specific Target IDs to include in addition to collection targets\n- Targets from collections and individual target IDs are combined (union operation) with no duplicates\n- Useful for including specific targets that may not be in any collection\n- Target access is validated when the job executes\n- **To get target IDs**: Use endpoints from the Suppliers API:\n  - `GET /public/v2/suppliers/sites` - List all supplier sites (returns `prewaveTargetId` field for each supplier)\n  - `GET /public/v2/suppliers/sites/find-by-identifier?prewaveId={targetId}` - Get a specific supplier by ID\n\n*Perspectives (`perspectiveIds`):*\n- **Required field** - must be provided and **must contain at least one perspective ID** (cannot be empty array `[]`)\n- List of Perspective IDs for which scores should be calculated\n- ⚠️ **Critical**: If `perspectiveIds` is empty, the configuration will be saved successfully, but **no scores will be generated** during job execution. The endpoint will not return an error, but the export job will produce no results.\n- Scores are calculated for each combination of (target × perspective)\n- All specified perspectives must be accessible to the user (validated at execution time)\n- Example: If you have 10 targets and 2 perspectives, 20 score calculations will be performed\n\n*Components (`includeComponents`):*\n- **Required field** - must be explicitly set to `true` or `false`\n- When `true`: Export results include detailed score components and subcomponents\n- When `false`: Only top-level scores and risk levels are included\n- Enabling components increases response size but provides granular score breakdowns\n- Affects the structure of data returned by `GET /public/v1/enterprise-export/scores`\n\n**Validation and Execution:**\n\n*Configuration-Time Validation:*\n- Basic request validation (JSON format, field types)\n- Run interval must be one of the valid enum values\n- All required fields must be present\n\n*Execution-Time Validation:*\n- Collection access is validated when the job runs (not when configuration is saved)\n- Target access is validated during execution\n- Perspective access is validated during execution\n- If validation fails during execution, the job will fail and errors will be available via `GET /public/v1/enterprise-export/scores/errors`\n\n**After Configuration:**\n\n1. **Immediate Effect**: Configuration is saved immediately upon successful request\n2. **Job Scheduling**: If `enabled` is `true`, the job will be scheduled based on:\n   - The configured `runInterval`\n   - The time since the last execution (if any)\n3. **First Execution**: If this is a new configuration or the first time enabling:\n   - The job will run when the scheduler next checks (typically within an hour)\n   - Or immediately if the interval has already elapsed\n4. **Results Availability**: After successful execution:\n   - Use `GET /public/v1/enterprise-export/scores` to retrieve score results\n   - Use `GET /public/v1/enterprise-export/scores/errors` to check for any errors\n5. **Configuration Updates**: Use `GET /public/v1/enterprise-export/scores/config` to verify your configuration\n\n**Best Practices:**\n\n- **Start Small**: Begin with a small set of collections/targets and perspectives to test the configuration\n- **Monitor Results**: Check the scores endpoint after the first execution to verify everything works\n- **Check Errors**: Regularly review the errors endpoint to identify any issues\n- **Frequency**: Choose an appropriate `runInterval` based on your data freshness requirements\n- **Components**: Only enable `includeComponents` if you need detailed score breakdowns (increases data size)\n- **Empty Lists**: You can provide empty arrays for `collectionIds` or `targetIds` if you only want to use one type. However, **`perspectiveIds` must contain at least one ID** - if empty, no scores will be generated.\n\n**Important Notes:**\n- The configuration is user-specific - each user manages their own export configuration\n- Jobs run asynchronously - execution may take time depending on the number of targets and perspectives\n- Previous configuration is completely replaced - all fields are updated, not merged\n- Validation happens at execution time, not configuration time - invalid IDs will cause execution failures\n- If a job fails due to access issues, fix the configuration and the next scheduled run will attempt again\n\n**Required Permission**: `ACCESS_ENTERPRISE_EXPORT_API`\n        ","operationId":"createOrUpdateExportConfiguration","requestBody":{"description":"Request payload containing the export job configuration.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicScoreExecutionConfig"}}},"required":true},"responses":{"200":{"description":"Configuration successfully created or updated. The response contains the complete configuration that was saved, including any default values applied (e.g., runInterval defaults to WEEKLY if not specified).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicScoreExecutionConfig"},"examples":{"Created configuration":{"summary":"Successfully created new configuration","description":"Response after creating a new configuration. All fields are returned as saved.","value":{"runInterval":"WEEKLY","enabled":true,"collectionIds":[123,456],"targetIds":[102006215,101641243],"perspectiveIds":[1,2],"includeComponents":false}},"Updated configuration":{"summary":"Successfully updated existing configuration","description":"Response after updating an existing configuration. The previous configuration was completely replaced.","value":{"runInterval":"DAILY","enabled":true,"collectionIds":[789,101],"targetIds":[10422185],"perspectiveIds":[1,2,3],"includeComponents":true}},"Configuration with default interval":{"summary":"Configuration with default WEEKLY interval","description":"When runInterval is omitted, it defaults to WEEKLY in the response.","value":{"runInterval":"WEEKLY","enabled":true,"collectionIds":[123],"targetIds":[],"perspectiveIds":[1],"includeComponents":false}}}}}},"400":{"description":"400 Bad Request - Invalid request payload or validation errors. The request body is malformed, contains invalid data types, or has validation errors.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorDTO"},"examples":{"Invalid run interval":{"summary":"Invalid runInterval enum value","description":"The runInterval value must be one of the valid enum values.","value":{"code":"validation_error","message":"Invalid run interval. Must be one of: SIX_HOURS, TWELVE_HOURS, DAILY, WEEKLY","details":{"field":"runInterval","value":"INVALID_INTERVAL"}}},"Missing required field":{"summary":"Required field is missing","description":"All required fields must be present in the request.","value":{"code":"validation_error","message":"Required field 'enabled' is missing","solution":"Include all required fields in the request"}},"Invalid JSON":{"summary":"Request body is not valid JSON","description":"The request body must be valid JSON format.","value":{"code":"invalid_request","message":"JSON parse error: Unexpected character","solution":"Fix the JSON format"}},"Invalid field type":{"summary":"Field has wrong data type","description":"Fields must have the correct data types (e.g., enabled must be boolean, not string).","value":{"code":"validation_error","message":"Invalid type for field 'enabled'. Expected boolean, got string","details":{"field":"enabled","expectedType":"boolean","actualType":"string"}}}}}}},"404":{"description":"404 Not Found - One or more collections, targets, or perspectives specified in the configuration were not found or are not accessible to the authenticated user. Note: This validation typically occurs during job execution, not at configuration time. However, if immediate validation is performed and resources are not accessible, this error will be returned.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorDTO"},"examples":{"Collection not found":{"summary":"Collection ID not found or not accessible","description":"One of the specified collection IDs does not exist or the user does not have access to it.","value":{"code":"resource_not_found","message":"Collection with ID 999 not found or not accessible","details":{"resourceType":"Collection","resourceId":999},"solution":"Verify the collection ID and ensure you have access to it"}},"Target not found":{"summary":"Target ID not found or not accessible","description":"One of the specified target IDs does not exist or the user does not have access to it.","value":{"code":"resource_not_found","message":"Target with ID 999999 not found or not accessible","details":{"resourceType":"Target","resourceId":999999},"solution":"Verify the target ID and ensure it belongs to your organization"}},"Perspective not found":{"summary":"Perspective ID not found or not accessible","description":"One of the specified perspective IDs does not exist or the user does not have access to it.","value":{"code":"resource_not_found","message":"Perspective with ID 99 not found or not accessible","details":{"resourceType":"Perspective","resourceId":99},"solution":"Verify the perspective ID and ensure it is available in your organization"}}}}}},"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/v1/collections":{"get":{"tags":["Collections - Management"],"summary":"List all collections","description":"\nRetrieve all active collections accessible to the authenticated user with pagination support.\n\nThis endpoint returns collections that the user has read access to, including:\n- User-owned collections (`scope: User`)\n- Customer collections (`scope: Customer`) - organization-wide collections accessible to the user\n- Team-shared collections (via collection roles)\n\n**Note**:\n- Only active (non-deactivated) collections are returned\n- Featured collections (`scope: Featured`) are excluded from this endpoint\n- Inactive (deactivated) collections are automatically filtered out\n\n**Response:**\nReturns a paginated list of collection objects. Each collection includes basic information such as id, uuid, scope, type, name, count, lanes, tiersEnabled, and optional parentId and children fields. See the `PublicCollectionDTO` schema for complete field definitions.\n\n**Note**: Fields with null values (`parentId`, `updatedAt`) are omitted from the JSON response. This is standard JSON serialization behavior. In the list endpoint, `children` arrays are typically empty - use `GET /public/v1/collections/{collectionId}` to retrieve a collection with its full children tree populated.\n\n        **Pagination:**\n        - Results are paginated for efficient data retrieval\n        - Use query parameters to control pagination:\n  - `page`: Page number (0-indexed, default: 0)\n  - `size`: Number of items per page (default: 500)\n        - Results are sorted alphabetically by collection name\n        - Only active collections are included in pagination (inactive/deactivated collections are filtered out)\n\n**Access Control:**\n- Collections are filtered to include only those accessible to you:\n  - Collections owned by you (`scope: User`)\n  - Customer collections accessible to your organization (`scope: Customer`)\n  - Collections where you have been granted access (via collection roles)\n- Featured collections are excluded from this endpoint\n- Inactive (deactivated) collections are automatically excluded\n\n**Required Permission**: `ACCESS_COLLECTION`\n        ","operationId":"getAllCollections","parameters":[{"name":"page","in":"query","description":"Zero-based page index (0..N)","required":false,"schema":{"minimum":0,"type":"integer","default":0}},{"name":"size","in":"query","description":"The size of the page to be returned","required":false,"schema":{"minimum":1,"type":"integer","default":500}},{"name":"sort","in":"query","description":"Sorting criteria in the format: property,(asc|desc). Default sort order is ascending. Multiple sort criteria are supported.","required":false,"schema":{"type":"array","items":{"type":"string"}}}],"responses":{"200":{"description":"200 OK - Successfully retrieved collections","content":{"application/json":{"schema":{"type":"object","properties":{"content":{"type":"array","items":{"$ref":"#/components/schemas/PublicCollectionDTO"}},"size":{"type":"integer","format":"int32"},"number":{"type":"integer","format":"int32"},"totalElements":{"type":"integer","format":"int32"},"totalPages":{"type":"integer","format":"int32"},"numberOfElements":{"type":"integer","format":"int32"},"first":{"type":"boolean"},"last":{"type":"boolean"},"empty":{"type":"boolean"}}},"examples":{"Collections - Multiple Results":{"summary":"Sample paginated collection response","description":"Note: Fields with null values (such as `parentId` and `updatedAt`) are omitted from the JSON response.","value":"{\"content\":[{\"id\":123,\"uuid\":\"550e8400-e29b-41d4-a716-446655440000\",\"scope\":\"User\",\"type\":\"Default\",\"name\":\"My Suppliers\",\"count\":45,\"lanes\":true,\"tiersEnabled\":false,\"parentId\":null,\"children\":[],\"updatedAt\":null},{\"id\":124,\"uuid\":\"660e8400-e29b-41d4-a716-446655440001\",\"scope\":\"Customer\",\"type\":\"Default\",\"name\":\"Tier 1 Suppliers\",\"count\":12,\"lanes\":false,\"tiersEnabled\":true,\"parentId\":100,\"children\":[],\"updatedAt\":null}],\"size\":20,\"number\":0,\"totalElements\":2,\"totalPages\":1,\"numberOfElements\":2}"},"Collections - Empty Page":{"summary":"No collections found","description":"When there are no collections accessible to the user, an empty content array is returned.","value":"{\"content\":[],\"size\":20,\"number\":0,\"totalElements\":0,\"totalPages\":0,\"numberOfElements\":0}"}}}}},"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":["Collections - Management"],"summary":"Create a new collection","description":"\nCreate a new collection with the specified properties.\n\nThe collection will be created with \"Customer\" scope by default unless explicitly specified otherwise. All required fields must be provided and will be validated.\n\n**Note**: The collection will be automatically subscribed to your account upon creation, and you will become the collection owner.\n\n**Request:**\nThe request body includes collection name (required) and optional fields for scope, lanes, tiersEnabled, and parentId. See the `PublicCollectionPayload` schema for complete field definitions and validation rules.\n\n**Validation Rules:**\n- Collection names must be unique within the specified scope\n- The `tiersEnabled` field cannot be changed after collection creation\n- The `parentId` field is accepted but currently not used - collection hierarchy is managed internally\n\n**What happens when you create a collection:**\n\n1. **Collection Creation**: A new active collection is created with the specified properties\n2. **User Subscription**: You are automatically subscribed to the collection and become its owner\n3. **User Activity**: For Customer scope collections, the creation is logged in your user activity\n4. **Audit Trail**: The creation is recorded in the audit log with:\n   - The user who created the collection\n   - Timestamp of the operation\n   - Collection details (name, scope, type)\n   - Reference to the public API endpoint used\n   - Audit comment: \"Collection created via Public API\"\n\n**Important Notes:**\n\n- Collection names must be unique within the specified scope - attempting to use a duplicate name will result in `409 Conflict`\n- Once created, the `scope` and `tiersEnabled` fields cannot be changed\n- The collection will be empty (no targets) initially - use the Collection Targets API (`POST /public/v1/collections/{collectionId}/targets`) to add suppliers to the collection\n- You automatically become the owner of the collection upon creation\n- All collection operations are audited for compliance and tracking purposes\n\n**Required Permission**: `CREATE_COLLECTION`\n        ","operationId":"createCollection","requestBody":{"description":"Collection creation payload. Content-Type must be `application/json`. All required fields must be provided and will be validated. The `scope` field defaults to `Customer` if not provided.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicCollectionPayload"},"examples":{"Create Collection - Default Scope":{"summary":"Example with default Customer scope","description":"Create Collection - Default Scope","value":"{\"scope\":\"Customer\",\"name\":\"New Supplier Collection\",\"lanes\":true,\"tiersEnabled\":false,\"parentId\":null}"},"Create Collection - User Scope":{"summary":"Example with User scope explicitly set","description":"Create Collection - User Scope","value":"{\"scope\":\"User\",\"name\":\"My Personal Suppliers\",\"lanes\":false,\"tiersEnabled\":false,\"parentId\":null}"},"Create Collection - Minimal":{"summary":"Minimal example with only required fields","description":"Create Collection - Minimal","value":"{\"name\":\"Basic Collection\"}"}}}},"required":true},"responses":{"201":{"description":"201 Created - Collection created successfully. The creation has been audited with the comment 'Collection created via Public API'.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicCollectionDTO"},"examples":{"Created collection response":{"summary":"Example of a newly created collection","description":"Note: Fields with null values (such as `parentId` and `updatedAt`) are omitted from the JSON response.","value":"{\"id\":124,\"uuid\":\"a1b2c3d4-e5f6-7890-1234-567890abcdef\",\"scope\":\"Customer\",\"type\":\"Default\",\"name\":\"New Supplier Collection\",\"count\":0,\"lanes\":true,\"tiersEnabled\":false,\"parentId\":null,\"children\":[],\"updatedAt\":null}"}}}}},"400":{"description":"400 Bad Request - Invalid request payload or validation errors. The request body is malformed or contains invalid data.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorDTO"},"examples":{"Missing required field":{"summary":"Required field is missing","description":"Missing required field","value":"{\"code\":\"invalid_request\",\"message\":\"Name is required\",\"solution\":\"Fix the request\"}"},"Blank field validation":{"summary":"Required field is blank or contains only whitespace","description":"Blank field validation","value":"{\"code\":\"invalid_request\",\"message\":\"Name is required\",\"solution\":\"Fix the request\"}"},"Invalid JSON":{"summary":"Request body is not valid JSON","description":"Invalid JSON","value":"{\"code\":\"invalid_request\",\"message\":\"Name is required\",\"solution\":\"Fix the request\"}"}}}}},"409":{"description":"409 Conflict - A collection with the same name already exists in the specified scope. Collection names must be unique within each scope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorDTO"},"examples":{"Duplicate collection name":{"summary":"Collection name already exists in scope","description":"Duplicate collection name","value":"{\"code\":\"duplicate_resource\",\"message\":\"Collection with name 'New Supplier Collection' already exists in Customer scope\",\"solution\":\"Use a different collection name or a different scope\"}"}}}}},"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/v1/collections/{collectionId}/targets":{"get":{"tags":["Collections - Targets"],"summary":"Get targets in collection","description":"\nRetrieve all targets that are currently part of a collection with pagination support.\n\nReturns paginated target references with basic information about each target (ID and name).\nTo get detailed target information, use the targets API with these target IDs.\n\n**Getting Collection ID:**\n- To find available collections and their IDs, use the Collections Management API:\n  - `GET /public/v1/collections` - List all collections accessible to you (returns collections with `id` field)\n  - `GET /public/v1/collections/{collectionId}` - Get a specific collection by ID\n- The `id` field in collection responses is the `collectionId` used in this endpoint's path parameter\n\n**Fetching Full Supplier Information:**\n- The `id` field in each target reference is the `prewaveTargetId` (target's `infotag_id`)\n- To fetch comprehensive supplier details, use the Supplier Sites API endpoints:\n  - `GET /public/v2/suppliers/sites/find-by-identifier?prewaveId={prewaveTargetId}` - Get detailed supplier information by `prewaveTargetId`\n  - `GET /public/v2/suppliers/sites` - List all suppliers and match by `prewaveTargetId` or supplier identifiers\n- These endpoints provide full supplier information including address, supplier identifiers, screening status, monitoring dates, and more\n\n**Pagination Parameters**:\n- `page` (optional): Page number (0-indexed). Default: 0\n- `size` (optional): Number of items per page. Default: 10\n- `sort` (optional): Sort criteria in the format `property,direction` (e.g., `name,asc` or `id,desc`). Multiple sort criteria can be specified.\n\nThe collection must be accessible to the authenticated user.\n\n**Important: Target ID Stability**\n\n⚠️ **The target `id` (prewaveTargetId) may change** due to target merges or data consolidation. When this happens:\n- The target's collection memberships are automatically moved to the new target\n- **This endpoint will always return the current, correct target `id`** - if a target ID changes, this endpoint will show the new ID, not the old one\n- If you have stored target IDs from previous calls to this endpoint, those IDs may have changed, but calling this endpoint again will return the updated target IDs\n\n💡 **Tip for Integrations:**\n- This endpoint always reflects the current state of target IDs in the collection\n- If you need to track target IDs over time, periodically call this endpoint to get the latest target IDs\n- To find a target by its supplier identifier when the ID has changed, use `GET /public/v2/suppliers/sites` and match by supplier identifiers\n\n**Required Permissions**: `access_collection` and `read` on the collection.\n        ","operationId":"getCollectionTargets","parameters":[{"name":"collectionId","in":"path","description":"Unique identifier of the collection","required":true,"schema":{"type":"integer","format":"int32"},"example":123},{"name":"page","in":"query","description":"Zero-based page index (0..N)","required":false,"schema":{"minimum":0,"type":"integer","default":0}},{"name":"size","in":"query","description":"The size of the page to be returned","required":false,"schema":{"minimum":1,"type":"integer","default":10}},{"name":"sort","in":"query","description":"Sorting criteria in the format: property,(asc|desc). Default sort order is ascending. Multiple sort criteria are supported.","required":false,"schema":{"type":"array","items":{"type":"string"}}}],"responses":{"200":{"description":"Successfully retrieved paginated target references","content":{"application/json":{"schema":{"type":"object","properties":{"content":{"type":"array","items":{"$ref":"#/components/schemas/PublicTargetRef"}},"size":{"type":"integer","format":"int32"},"number":{"type":"integer","format":"int32"},"totalElements":{"type":"integer","format":"int32"},"totalPages":{"type":"integer","format":"int32"},"numberOfElements":{"type":"integer","format":"int32"},"first":{"type":"boolean"},"last":{"type":"boolean"},"empty":{"type":"boolean"}}},"examples":{"Paginated target references example":{"summary":"Sample paginated list of target references in collection","description":"Paginated target references example","value":"{\"content\":[{\"id\":10422185,\"name\":\"Inter Cars SA\"},{\"id\":101641243,\"name\":\"Asmet Sp. z o.o.\"}],\"size\":10,\"number\":0,\"totalElements\":57,\"totalPages\":6,\"numberOfElements\":2}"},"Empty collection example":{"summary":"Collection with no targets","description":"When a collection has no targets, an empty content array is returned.","value":"{\"content\":[],\"size\":10,\"number\":0,\"totalElements\":0,\"totalPages\":0,\"numberOfElements\":0}"}}}}},"404":{"description":"Collection not found or not accessible to the user","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorDTO"},"examples":{"Collection not found":{"summary":"Collection does not exist or is not accessible","description":"Collection not found","value":"{\"code\":\"collection_not_found\",\"message\":\"Collection not found: ID=99999999\"}"}}}}},"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":["Collections - Targets"],"summary":"Add targets to collection","description":"\nAdd multiple targets (suppliers, customers, etc.) to a collection.\n\nTargets are identified by their unique `prewaveTargetId` (target's `infotag_id`). If a target is already in the collection,\nit will be ignored (no duplicate entries). All target IDs must be valid and accessible to the user.\n\nThis operation is atomic - either all targets are added successfully, or none are added.\n\n**Getting Collection ID:**\n- To find available collections and their IDs, use the Collections Management API:\n  - `GET /public/v1/collections` - List all collections accessible to you (returns collections with `id` field)\n  - `GET /public/v1/collections/{collectionId}` - Get a specific collection by ID\n- The `id` field in collection responses is the `collectionId` used in this endpoint's path parameter\n\n**Getting Target IDs (prewaveTargetId):**\n- To get current target IDs, use the Supplier Sites API:\n  - `GET /public/v2/suppliers/sites` - List all suppliers with their current `prewaveTargetId` values\n  - `GET /public/v2/suppliers/sites/find-by-identifier?prewaveId={prewaveTargetId}` - Get a specific supplier by `prewaveTargetId`\n- The `prewaveTargetId` field in supplier responses is the target ID used in the request body\n\n**Important: Target ID Stability**\n\n⚠️ **The target `id` (prewaveTargetId) may change** due to target merges or data consolidation. When this happens:\n- The target's edge numbers, edge data, and collection memberships are automatically moved to a new target\n- Using an outdated target ID will result in a `404 Not Found` error\n\n💡 **Best Practice for Integrations:**\n- **Always refresh target IDs** before adding targets to a collection by calling `GET /public/v2/suppliers/sites` to get the latest `prewaveTargetId` values\n- Match suppliers by supplier identifiers (your external system identifiers) rather than storing `prewaveTargetId` values long-term\n- If you receive a `404 Not Found` error, use `GET /public/v2/suppliers/sites` to find the current `prewaveTargetId` by matching your supplier identifiers\n\n**Audit Trail:**\n- All changes are audited for compliance and tracking purposes\n- Every action is recorded in the audit log with:\n  - The user who performed the operation\n  - Timestamp of the operation\n  - Details about which targets were added to the collection\n  - Reference to the public API endpoint used\n\n**Required Permissions**: `manage_collection` and `update` on the collection.\n        ","operationId":"addTargetsToCollection","parameters":[{"name":"collectionId","in":"path","description":"Unique identifier of the collection","required":true,"schema":{"type":"integer","format":"int32"},"example":123}],"requestBody":{"description":"Array of target IDs (prewaveTargetId values) to add to the collection. Each ID must be a valid `prewaveTargetId` (target's `infotag_id`) accessible to the user. Target IDs can be obtained from `GET /public/v2/suppliers/sites`.","content":{"application/json":{"schema":{"type":"array","items":{"type":"integer","format":"int32"}},"examples":{"Add targets example":{"summary":"Sample request to add targets","description":"Add targets example","value":"[101,102,103,104]"},"Add single target":{"summary":"Adding a single target to collection","description":"Add single target","value":"[10422185]"}}}},"required":true},"responses":{"200":{"description":"Targets added to collection successfully. All changes have been audited.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicCollectionDTO"},"examples":{"Updated collection example":{"summary":"Collection after adding targets","description":"Updated collection example","value":"{\"id\":123,\"uuid\":\"550e8400-e29b-41d4-a716-446655440000\",\"scope\":\"User\",\"type\":\"Default\",\"name\":\"My Suppliers\",\"count\":49,\"lanes\":true,\"tiersEnabled\":false,\"parentId\":null,\"children\":[],\"updatedAt\":{\"date\":\"2025-08-25T10:30:00\",\"_datetype_\":\"DateTime\"}}"},"Collection with existing targets":{"summary":"Some targets were already in collection","description":"If some target IDs were already in the collection, they are ignored and the collection count reflects only newly added targets.","value":"{\"id\":124,\"uuid\":\"660e8400-e29b-41d4-a716-446655440001\",\"scope\":\"Customer\",\"type\":\"Default\",\"name\":\"Tier 1 Suppliers\",\"count\":15,\"lanes\":false,\"tiersEnabled\":true,\"parentId\":100,\"children\":[],\"updatedAt\":{\"date\":\"2025-08-25T14:20:00\",\"_datetype_\":\"DateTime\"}}"}}}}},"400":{"description":"Invalid request - Invalid target IDs, empty request body, or malformed JSON","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorDTO"},"examples":{"Empty request":{"summary":"Request body is empty or contains no target IDs","description":"Empty request","value":"{\"code\":\"invalid_request\",\"message\":\"Request body cannot be empty\",\"solution\":\"Provide an array of target IDs\"}"},"Invalid JSON":{"summary":"Request body is not valid JSON","description":"Invalid JSON","value":"{\"code\":\"invalid_request\",\"message\":\"JSON parse error: Unexpected character\",\"solution\":\"Fix the request body format\"}"}}}}},"404":{"description":"Collection not found or some target IDs are invalid or not accessible. This may occur if: (1) the collection doesn't exist or is not accessible to your organization, (2) one or more target IDs don't exist, (3) one or more target IDs are not accessible to your organization, or (4) a target ID has changed due to a target merge (in which case, use GET /public/v2/suppliers/sites to find the new ID by matching supplier identifiers).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorDTO"},"examples":{"Collection not found":{"summary":"Collection does not exist or is not accessible","description":"Collection not found","value":"{\"code\":\"collection_not_found\",\"message\":\"Collection not found: ID={collectionId}\"}"},"Target ID not found":{"summary":"One or more target IDs are invalid or have changed","description":"If a target ID has changed due to a merge, use GET /public/v2/suppliers/sites to find the current prewaveTargetId by matching your supplier identifiers.","value":"{\"code\":\"resource_not_found\",\"message\":\"Collection with id {collectionId} not found or access denied\"}"}}}}},"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/v1/users/{userId}":{"get":{"tags":["Users"],"summary":"Retrieve detailed user profile","description":"\n### Overview\nFetch the complete profile of a specific user. This includes organizational details, active subscriptions (plans), and assigned access controls.\n\n### Use Cases\n- **Profile Inspection**: Verify the current configuration of a specific user.\n- **Pre-Update Check**: Retrieve the current state before performing a partial update.\n- **Identity Verification**: Confirm the email and name associated with a numerical ID.\n\n### Identification\nThe `{userId}` is a unique numerical identifier.\n\n### Getting User ID\n- To find users and their numerical IDs, use the Users Management API:\n  - `GET /public/v1/users` - Retrieve all users with their `id` field.\n- The `id` field in the user response is the `{userId}` used in this endpoint's path parameter.\n\n    ### Related Operations\n    - **Update Profile**: [PATCH /public/v1/users/{userId}](#operations-Users-update)\n    - **Manage Roles**: [POST /public/v1/users/{userId}/roles](#operations-Users_-_Roles-add)\n\n### Required Permission\n`access_public_users`\n    ","operationId":"getById","parameters":[{"name":"userId","in":"path","description":"The unique numerical identifier of the target user. If you do not have this ID, you can find it by searching for the user via `GET /public/v1/users`.","required":true,"schema":{"type":"integer","format":"int32"},"example":4523345}],"responses":{"200":{"description":"User details retrieved successfully.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicUserResponse"},"examples":{"Full User Profile":{"description":"Full User Profile","value":"{\"id\":4523345,\"active\":true,\"confirmed\":true,\"firstname\":\"Max\",\"lastname\":\"Mustermann\",\"email\":\"max.mustermann@prewave.ai\",\"customer\":{\"id\":8797983,\"name\":\"Prewave\"},\"organization\":{\"id\":64573456,\"name\":\"Prewave\"},\"plan\":{\"id\":34345453,\"name\":\"Admin\",\"validFrom\":1614616305.000000000},\"teams\":[],\"roles\":[{\"id\":1829,\"name\":\"ROLE_USER_MANAGER\",\"description\":null},{\"id\":98790,\"name\":\"GRANT_TEAM_MANAGER_ACCESS\",\"description\":null}]}"}}}}},"404":{"description":"Not Found - User not found or outside organization scope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorDTO"},"examples":{"User Not Found":{"description":"User Not Found","value":"{\"code\":\"user_not_found\",\"message\":\"User with ID 4523345 could not be found.\"}"}}}}},"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    }"}}}}}}},"patch":{"tags":["Users"],"summary":"Update user profile and status","description":"\n### Overview\nModify profile details, subscription levels, or account status for an existing user.\n\n### Use Cases\n- **Profile Correction**: Correct a user's name or contact details.\n- **Plan Management**: Upgrade or downgrade a user's subscription (e.g., Enterprise vs. Basic).\n- **Status Management**: Activate or deactivate user access.\n- **Access Refinement**: Update team associations.\n\n### Identification\nThe `{userId}` is a unique numerical identifier.\n\n### Getting User ID\n- To find users and their numerical IDs, use the Users Management API:\n  - `GET /public/v1/users` - Retrieve all users with their `id` field.\n- The `id` field in the user response is the `{userId}` used in this endpoint's path parameter.\n\n### Partial Updates\nThis endpoint supports **partial updates**. Only the fields provided in the request body will be changed; omitted fields and fields set to null will retain their current values.\n\n### Related Operations\n- **Get Detail**: [GET /public/v1/users/{userId}](#operations-Users-getById)\n- **Manage Roles**: [POST /public/v1/users/{userId}/roles](#operations-Users_-_Roles-add)\n\n### Required Permission\n`manage_public_users`\n    ","operationId":"update","parameters":[{"name":"userId","in":"path","description":"The unique numerical identifier of the target user. If you do not have this ID, you can find it by searching for the user via `GET /public/v1/users`.","required":true,"schema":{"type":"integer","format":"int32"},"example":4523345}],"requestBody":{"description":"Fields to update. Omit fields to keep current values.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicUpdateUserRequest"},"examples":{"Profile, Plan & Status Update":{"summary":"Update multiple fields including status","description":"Profile, Plan & Status Update","value":"{\"firstname\":\"Updated\",\"lastname\":\"User\",\"planId\":1234,\"active\":true}"},"Deactivate User":{"summary":"Disable user access","description":"Deactivate User","value":"{\"firstname\":null,\"lastname\":null,\"planId\":null,\"active\":false}"}}}},"required":true},"responses":{"200":{"description":"User profile and status successfully updated.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicUserResponse"},"examples":{"Updated User Profile":{"description":"Updated User Profile","value":"{\"id\":4523345,\"active\":true,\"confirmed\":true,\"firstname\":\"Updated\",\"lastname\":\"User\",\"email\":\"user@company.ai\",\"customer\":{\"id\":8797983,\"name\":\"Prewave\"},\"organization\":{\"id\":64573456,\"name\":\"Prewave\"},\"plan\":{\"id\":1234,\"name\":\"Enterprise\",\"validFrom\":1614616305.000000000},\"teams\":[],\"roles\":[]}"}}}}},"404":{"description":"Not Found - The specified user does not exist.","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/v3/alpha/suppliers/collection/{collectionId}/supplier-graph":{"get":{"tags":["Collections - Tier-N (deprecated)"],"summary":"Get a tree-structure of suppliers of the given collection","description":"\n⚠️ **DEPRECATED** - This endpoint is deprecated and will be removed on 31 May 2027.\n\n**Note**: Responses include a `Sunset` HTTP header (RFC 8594) indicating the removal date.\n\n---\n\n## Migration Required\n\nThis endpoint has been replaced by the v1 Collections Tier-N API. Please migrate to the new endpoint:\n\n### Replacement Endpoint\n\n| Old Endpoint | New Endpoint | Purpose |\n|--------------|--------------|---------|\n| `GET /public/v3/alpha/suppliers/collection/{collectionId}/supplier-graph` | `GET /public/v1/collections/{collectionId}/tier-n/data` | Get collection-based supplier graphs |\n\n---\n\n## Why Migrate?\n\nThe v1 Collections Tier-N API provides significant improvements:\n\n### 1. Enhanced Functionality\n- **v3**: Basic supplier graph with format options\n- **v1**: Advanced filtering through collection settings and query parameters\n- **v1**: Configurable data sources (customs, media, predictions)\n- **v1**: Better control over scope (private, shared, public targets)\n\n### 2. Better Performance\n- **v1**: Optimized queries for large collections\n- **v1**: More efficient data retrieval\n\n### 3. Improved Documentation\n- Comprehensive examples for all endpoints\n- Detailed error response documentation\n- Clear parameter descriptions\n\n---\n\n## Quick Migration Guide\n\n### Step 1: Update Endpoint URL\n\n**Before:**\n```http\nGET /public/v3/alpha/suppliers/collection/123/supplier-graph?format=JSON&tier=2\n```\n\n**After:**\n```http\nGET /public/v1/collections/123/tier-n/data?tier=2\n```\n\n### Step 2: Update Response Parsing\n\n**Before:** Parse `PublicSupplierGraphEntry` structure (v3 format)\n\n**After:** Parse `PublicTierNCollectionGraphEntry` structure (v1 format)\n\n### Step 3: Handle Format Options\n\n**v3**: Supports JSON and CSV via `format` parameter\n\n**v1**: Returns JSON by default. For CSV export, use the response format directly or contact support for CSV export options.\n\n---\n\n**Required Permission**: `ACCESS_PUBLIC_SUPPLIER_GRAPH`\n\n**Performance Impact**: High\n\nFor detailed API reference and examples, see the v1 Collections Tier-N API documentation.\n","operationId":"findSupplierGraph","parameters":[{"name":"collectionId","in":"path","description":"Collection identifier","required":true,"schema":{"type":"integer","format":"int32"},"example":987},{"name":"format","in":"query","description":"Output format: JSON (default) or CSV","required":false,"schema":{"$ref":"#/components/schemas/PublicOutputFormat"},"example":"JSON"},{"name":"includeHeaderMetadata","in":"query","description":"Include metadata as response headers","required":false,"schema":{"type":"boolean"},"example":false},{"name":"includeCommodityFilter","in":"query","description":"Include commodity filter in the response metadata","required":false,"schema":{"type":"boolean"},"example":true},{"name":"includeMediaSources","in":"query","description":"Include media source URLs for MEDIA edges","required":false,"schema":{"type":"boolean"},"example":false},{"name":"includeShipmentDetails","in":"query","description":"Include shipment details where applicable","required":false,"schema":{"type":"boolean"},"example":false},{"name":"tier","in":"query","description":"Restrict to a specific tier (1..n)","required":false,"schema":{"type":"integer","format":"int32"},"example":2},{"name":"source","in":"query","description":"Restrict to a specific edge source","required":false,"schema":{"$ref":"#/components/schemas/EdgeSource"},"example":"MEDIA"},{"name":"lastShipment","in":"query","description":"Only include suppliers with shipments since this date (YYYY-MM-DD)","required":false,"schema":{"type":"string","format":"date"},"example":"2024-01-01"},{"name":"hsCodes","in":"query","description":"Filter by HS codes","required":false,"schema":{"uniqueItems":true,"type":"array","items":{"type":"string"}},"example":["847330","940161"]}],"responses":{"200":{"description":"Successful response.","headers":{"X-Collection-Id":{"description":"The collection ID","style":"simple"},"X-Commodity-Filter-Logistics-Provider":{"description":"Whether logistics providers are included in the commodity filter","style":"simple"},"X-Max-Tier":{"description":"The maximum tier included in the result","style":"simple"},"X-Commodity-Filter-Suspected-Suppliers":{"description":"Whether suspected suppliers are included in the commodity filter","style":"simple"},"X-Shipments-Period-To":{"description":"Shipment period end date (YYYY-MM-DD)","style":"simple"},"X-Target-Ids":{"description":"Comma-separated list of target IDs included in the export","style":"simple"},"X-Min-Probability":{"description":"Minimum probability threshold applied","style":"simple"},"X-Min-Shipments":{"description":"Minimum number of shipments considered","style":"simple"},"X-Collection-Name":{"description":"The collection name","style":"simple"},"X-Commodity-Filter-Target-Ids":{"description":"Comma-separated target IDs to which the commodity filter applies","style":"simple"},"X-Shipments-Period-From":{"description":"Shipment period start date (YYYY-MM-DD)","style":"simple"}},"content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/PublicSupplierGraphEntry"}}},"text/csv":{"schema":{"type":"string"}}}},"400":{"description":"Bad Request – invalid parameters","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorDTO"},"examples":{"Invalid collection ID":{"summary":"Collection not found or not accessible","description":"Invalid collection ID","value":{"code":"invalid_request","message":"Collection not found or you don't have access to it","solution":"Verify the collection ID and your permissions"}},"Invalid tier parameter":{"summary":"Tier value out of valid range","description":"Invalid tier parameter","value":{"code":"invalid_request","message":"Tier must be a positive integer","solution":"Provide a valid tier value"}},"Invalid date format":{"summary":"Invalid date format for lastShipment","description":"Invalid date format","value":{"code":"invalid_request","message":"Invalid date format for lastShipment. Expected format: YYYY-MM-DD","solution":"Use the correct date format (YYYY-MM-DD)"}}}}}},"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    }"}}}}}},"deprecated":true}},"/public/v2/suppliers/{systemId}/{targetId}/supplier-graph":{"get":{"tags":["Suppliers - Supplier Graph"],"summary":"Get a tree-structure of suppliers of the given target","description":"\n⚠️ **DEPRECATED** - This endpoint is deprecated and will be removed on 31 May 2027.\n\n---\n\n## Migration Required\n\nThis endpoint has been replaced by the v1 Collections Tier-N API. Please migrate to the new endpoint:\n\n### Replacement Endpoint\n\n| Old Endpoint | New Endpoint | Purpose |\n|--------------|--------------|---------|\n| `GET /public/v2/suppliers/{systemId}/{targetId}/supplier-graph` | `GET /public/v1/collections/{collectionId}/tier-n/data` | Get collection-based supplier graphs |\n\n---\n\n## Why Migrate?\n\nThe v1 Collections Tier-N API provides significant improvements:\n\n### 1. Collection-Based Approach\n- **v2**: Works with individual target IDs\n- **v1**: Works with collections, allowing you to analyze multiple suppliers together\n- **v1**: Better integration with collection management workflows\n- **v1**: Collection-level configuration for consistent analysis settings\n\n### 2. Enhanced Functionality\n- **v2**: Basic supplier graph with limited configuration\n- **v1**: Advanced filtering through collection settings\n- **v1**: Configurable data sources (customs, media, predictions)\n- **v1**: Better control over scope (private, shared, public targets)\n\n### 3. Improved Consistency\n- **v2**: Target-specific endpoint\n- **v1**: Aligned with collection-based API design\n- **v1**: Consistent with other collection management endpoints\n\n### 4. Better Documentation\n- Comprehensive examples for all endpoints\n- Detailed error response documentation\n- Clear parameter descriptions\n- Migration guidance and best practices\n\n---\n\n## Quick Migration Guide\n\n### Step 1: Identify Collection ID\n\n**Important**: The v1 endpoint requires a collection ID instead of a target ID. If you don't have a collection yet:\n\n1. Create a collection using `POST /public/v1/collections`\n2. Add your target to the collection using `POST /public/v1/collections/{collectionId}/targets`\n3. Ensure the collection has tier-n enabled (`tiersEnabled: true`)\n\n### Step 2: Update Endpoint Call\n\n**Before:**\n```http\nGET /public/v2/suppliers/prewave/102006215/supplier-graph?tierLevel=3&commodityIds=101,102&filter={...}\n```\n\n**After:**\n```http\nGET /public/v1/collections/123/tier-n/data?tierLevel=3&commodityIds=101,102\n```\n\n### Step 3: Update Request Parameters\n\n**v2 Parameters:**\n- `systemId`: System identifier (path parameter)\n- `targetId`: Target identifier (path parameter)\n- `tierLevel`: Maximum tier level (query parameter, max 4)\n- `commodityIds`: List of commodity IDs (query parameter)\n- `filter`: Complex filter object (query parameter)\n- `commodityTreeId`: Commodity tree ID (query parameter)\n- `fetchParents`: Include parents (query parameter, default: true)\n\n**v1 Parameters:**\n- `collectionId`: Collection identifier (path parameter)\n- `tierLevel`: Maximum tier level (query parameter, max 4)\n- `commodityIds`: List of commodity IDs (query parameter)\n- `commodityTreeId`: Commodity tree ID (query parameter)\n- `fetchParents`: Include parents (query parameter, default: true)\n- Filter options can be configured in collection settings using `PUT /public/v1/collections/{collectionId}/tier-n/settings`\n\n### Step 4: Configure Collection Settings (Optional)\n\nFor advanced filtering, configure collection settings:\n\n```http\nPUT /public/v1/collections/123/tier-n/settings\n{\n  \"maxTier\": 3,\n  \"scopePrivate\": true,\n  \"scopeShared\": true,\n  \"sourceCustoms\": true,\n  \"sourceMedia\": true,\n  \"minShipments\": 5,\n  \"probability\": 75\n}\n```\n\n---\n\n## Breaking Changes\n\n1. **Endpoint Path**: Changed from `/public/v2/suppliers/{systemId}/{targetId}/supplier-graph` to `/public/v1/collections/{collectionId}/tier-n/data`\n2. **Path Parameters**:\n   - **v2**: Requires `systemId` and `targetId`\n   - **v1**: Requires `collectionId` (collection-based approach)\n3. **Filter Configuration**:\n   - **v2**: Filter passed as query parameter object\n   - **v1**: Filter options configured in collection settings or passed as separate query parameters\n4. **Response Structure**: May differ slightly - review response format\n5. **Collection Requirement**: v1 requires targets to be part of a collection\n\n---\n\n## Important Notes\n\n### Collection Requirement\n- The v1 endpoint requires targets to be part of a collection\n- If you're currently using this endpoint with individual targets, you'll need to:\n  1. Create or identify a collection containing your target\n  2. Ensure the collection has tier-n enabled (`tiersEnabled: true`)\n  3. Use the collection ID instead of target ID\n\n### Filter Migration\n- Complex filter objects from v2 should be migrated to collection settings\n- Use `GET /public/v1/collections/{collectionId}/tier-n/settings` to view current settings\n- Use `PUT /public/v1/collections/{collectionId}/tier-n/settings` to configure filters\n\n---\n\n**Performance Impact**: High\n\nFor detailed API reference and examples, see the v1 Collections Tier-N API documentation.\n","operationId":"findSupplierGraph_1","parameters":[{"name":"systemId","in":"path","description":"The system ID is an identifier to determine from which the targetId might originate from. Supported systemIds are \"prewave\", \"customer\", \"supplier\", \"own\".","required":true,"schema":{"type":"string"},"example":"prewave"},{"name":"targetId","in":"path","description":"The target ID can be the target's prewaveId or an external id (edge number) representing the site in another system.","required":true,"schema":{"type":"string"},"example":10422185},{"name":"tierLevel","in":"query","description":"Defines the maximum limit of tiers that should be fetched. Must be <=4","required":false,"schema":{"maximum":4,"type":"integer","format":"int32"},"example":3},{"name":"commodityIds","in":"query","description":"List of commodity ids to filter the supplier graph","required":false,"schema":{"type":"array","items":{"type":"integer","format":"int32"}},"example":"101, 102, 103"},{"name":"filter","in":"query","description":"Filter object used for specifying limiting criteria for retrieving targets, affects both the targets and edge data in relation to the affected organization which queries the data.\n\n - **q**                     *[TARGET & EDGE]* - a query term by which target details (target name or existing edge details\n                                             (edge number WITHOUT edge number source are used as condition)\n\n - **collections**           *[TARGET]* - a list of collection ids to filter in any which the target needs to exist\n\n - **commodityIds**          *[TARGET & EDGE]* - a list of commodity infotag ids by which the target needs to be associated with any\n\n - **tt**                    *[TARGET]* - a list of target types the target needs to be assigned\n\n - **tier**                  *[EDGE]* - a list of tiers by which to filter the targets by, in relation to the organization as a supplier\n\n - **scope**                 *[EDGE]* - defines the visibilities of edge connections to the affected target\n                                    (if an edge is restricted to the affected customer it's 'Private',\n                                    otherwise it's 'Shared' if the edge is shared to the organization by\n                                    a different organization)\n\n - **source**                *[EDGE]* - determines edge source that should be considered (either 'Customer', 'Customs', 'Media' or 'PrewavePrediction')\n\n - **country**               *[TARGET]* - a list of infotag ids for countries which the target is assigned to any\n                                      (`country_id` column in the target, generally only for POI targets)\n\n - **hscode**                *[EDGE]* - a list of codes by which the target is associated to via an edge's HS code\n\n - **ods**                    *[TARGET]* - only direct suppliers (true/false)\n\n - **lastShipment**           *[EDGE]* - a date which determines a cut-off point after which the latest shipment must have happened regardless of HS Codes\n                                    (if `hscodes` are supplied it's already taken care of by the time this filter is applied, otherwise filters over all HS Codes)","required":true,"schema":{"$ref":"#/components/schemas/TargetSuppliersFilter"}},{"name":"commodityTreeId","in":"query","description":"Represents a collection of commodityIds","required":false,"schema":{"type":"integer","format":"int32"},"example":456},{"name":"fetchParents","in":"query","description":"Defines whether the parents of the targets should be included in the result.","required":false,"schema":{"type":"boolean","default":true},"example":true}],"responses":{"200":{"description":"Successfully retrieved supplier graph","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/PublicTreeTargetV2"}},"examples":{"Supplier graph example":{"summary":"Sample supplier tree structure","description":"Supplier graph example","value":[{"target":10422185,"suppliers":[{"target":101641243,"suppliers":[],"targetInfo":{"tier":1,"path":[10422185],"collectionLevel":1,"collectionPath":[123],"collectionPaths":[[123]]},"edgeSource":"Shared","edgeInfo":{"hsCodes":[{"code":"847330","nShipments":15}],"probability":85.0},"merged_targets":[]}],"targetInfo":{"tier":0,"path":[],"collectionLevel":0,"collectionPath":[],"collectionPaths":[]},"edgeSource":"Public Media","edgeInfo":null,"merged_targets":[]}]}}}}},"400":{"description":"Invalid request parameters (e.g., tier level > 4)","content":{"application/json":{}}},"404":{"description":"Target not found or not accessible to the user","content":{"application/json":{}}},"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    }"}}}}}},"deprecated":true}},"/public/v2/suppliers/sites/pending":{"get":{"tags":["Suppliers - Sites"],"summary":"Get pending suppliers","description":"\nRetrieve all pending supplier creation requests for the authenticated user.\n\nThis endpoint returns supplier creation requests that are currently pending processing. These are suppliers that have been submitted via `POST /public/v2/suppliers/sites` (create supplier endpoint) but have not yet been processed and made available in the main suppliers list.\n\n**Status Values:**\n- `New`: The supplier creation request has been submitted and is awaiting initial processing\n- `Pending`: The supplier creation request is being processed and is awaiting completion\n\nOnce processing is complete, suppliers will transition to a resolved state and become available via `GET /public/v2/suppliers/sites` (get all suppliers) or `GET /public/v2/suppliers/sites/find-by-identifier` (find by identifier). Pending suppliers are automatically removed from this endpoint once they are processed.\n\n**Query Parameters:**\n- `uuid` (optional): Filter results by the UUID of a specific pending supplier. When provided, only the pending supplier with the matching UUID will be returned. This is useful for tracking a specific supplier creation request returned from `POST /public/v2/suppliers/sites`.\n\n**Response:**\nReturns an array of pending supplier objects. Each entry includes the UUID (returned when creating a supplier), supplier ID information, supplier name, location details (countryCode, city, address), and status information. See the `PublicPendingSupplierV2DTO` schema for complete field definitions.\n\n**Pagination:**\nThis endpoint returns all pending suppliers for the authenticated user without pagination.\n\n**Required Permission**: `ACCESS_PUBLIC_SUPPLIERS`\n        ","operationId":"getPendingSuppliers","parameters":[{"name":"uuid","in":"query","description":"Optional UUID to filter pending suppliers. When provided, only the pending supplier with the matching UUID will be returned.","required":false,"schema":{"type":"string","format":"uuid"},"example":"550e8400-e29b-41d4-a716-446655440000"}],"responses":{"200":{"description":"Successfully retrieved pending suppliers","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/PublicPendingSupplierV2DTO"}},"examples":{"Pending Supplier - Multiple Results":{"summary":"Sample response with multiple pending suppliers","description":"Pending Supplier - Multiple Results","value":[{"uuid":"550e8400-e29b-41d4-a716-446655440000","supplierId":{"id":"SUP-12345","source":"SAP"},"name":"Acme Corporation","countryCode":"AT","city":"Vienna","address":"123 Main St, Vienna, Austria","status":"Pending","reason":null},{"uuid":"660e8400-e29b-41d4-a716-446655440001","supplierId":{"id":"COUPA-67890","source":"Coupa"},"name":"Beta Industries Ltd","countryCode":"DE","city":"Berlin","address":"456 Business Ave, Berlin, Germany","status":"New","reason":null},{"uuid":"770e8400-e29b-41d4-a716-446655440002","supplierId":{"id":"DNB-98765","source":"DNB"},"name":"Gamma Manufacturing Inc","countryCode":"US","city":"New York","address":"789 Industrial Blvd, New York, NY 10001","status":"Pending","reason":"Awaiting data enrichment"}]},"Pending Supplier - Empty List":{"summary":"No pending suppliers","description":"When there are no pending suppliers, an empty array is returned.","value":[]},"Pending Supplier - Single Result":{"summary":"Response with one pending supplier","description":"Pending Supplier - Single Result","value":[{"uuid":"550e8400-e29b-41d4-a716-446655440000","supplierId":{"id":"SUP-12345","source":"PUBLIC_API"},"name":"Acme Corporation","countryCode":"AT","city":"Vienna","address":"123 Main St, Vienna, Austria","status":"Pending","reason":null}]}}}}},"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    }"}}}}}}}},"/public/v2/suppliers/sites/find-by-identifier":{"get":{"tags":["Suppliers - Sites"],"summary":"Find suppliers by ID","description":"\nFind suppliers/sites by their identifiers (supplier ID, customer ID, own site ID, or Prewave ID) with optional source.\n\nThis unified endpoint allows you to search for suppliers using any type of identifier from external systems (e.g., SAP, Coupa, DNB). You can search by one or more ID types simultaneously.\n\n**Related Endpoints:**\n- To get all suppliers with pagination, use `GET /public/v2/suppliers/sites`.\n- To create a new supplier, use `POST /public/v2/suppliers/sites`.\n- To create an identifier for a supplier, use `POST /public/v2/suppliers/sites/identifiers`.\n- To delete an identifier, use `DELETE /public/v2/suppliers/sites/identifiers`.\n- To deactivate a supplier, use `DELETE /public/v2/suppliers/sites`.\n\n**Search Parameters:**\n- `supplierId` (optional): Search by supplier ID\n- `customerId` (optional): Search by customer ID\n- `ownId` (optional): Search by own site ID\n- `prewaveId` (optional): Search by Prewave ID\n- `source` (optional): Filter by source system (e.g., \"SAP\", \"Coupa\", \"PUBLIC_API\")\n\n**Search Behavior:**\n- **Multiple ID types**: If you provide multiple ID parameters (e.g., both `supplierId` and `customerId`), the endpoint returns suppliers that match **ANY** of the provided IDs (OR logic).\n- **Source filtering**: If `source` is provided, only IDs with that exact source are matched. If `source` is not provided, IDs with any source or without a source (legacy IDs) are matched. Note: `source` does not apply to `prewaveId` searches.\n- **Multiple results**: The same ID can be associated with multiple suppliers/sites in your organization, so the endpoint returns a list.\n- **Empty results**: Returns an empty list if no suppliers match the search criteria.\n\n**Response Format:**\nReturns a list of `PublicSupplierDetailV2DTO` objects with complete supplier information including:\n- Basic identification (Prewave Target ID, name, LinkedIn ID)\n- Location details (address, city, country code, postal code)\n- Company information (website, description, logo, year founded, size)\n- All supplier IDs, customer IDs, and own site IDs\n- Screening status and monitoring dates\n- Site-group reference\n- Connection contacts count\n\n**Use Cases:**\n\n1. **Find by single ID type:**\n   ```\n   GET /suppliers/sites/find-by-identifier?supplierId=SAP-12345&source=SAP\n   ```\n\n2. **Find by multiple ID types (returns suppliers matching ANY):**\n   ```\n   GET /suppliers/sites/find-by-identifier?supplierId=SAP-12345&customerId=CRM-67890&source=SAP\n   ```\n\n3. **Find without source filter (matches any source):**\n   ```\n   GET /suppliers/sites/find-by-identifier?supplierId=SUP-12345\n   ```\n\n4. **Find by Prewave ID:**\n   ```\n   GET /suppliers/sites/find-by-identifier?prewaveId=12345\n   ```\n\n**Important Notes:**\n- At least one ID parameter (supplierId, customerId, ownId, or prewaveId) must be provided\n- The endpoint returns full supplier details (PublicSupplierDetailV2DTO), not just basic info\n- All IDs for each supplier are included in the response (not just the matching ones)\n- Results are ordered alphabetically by name, then by ID for deterministic ordering\n\n**Required Permission**: `ACCESS_PUBLIC_SUPPLIERS`\n        ","operationId":"findSuppliers","parameters":[{"name":"supplierId","in":"query","description":"Supplier ID to search for. Can be combined with customerId, ownId, and/or prewaveId.","required":false,"schema":{"type":"string"},"example":"SAP-12345"},{"name":"customerId","in":"query","description":"Customer ID to search for. Can be combined with supplierId, ownId, and/or prewaveId.","required":false,"schema":{"type":"string"},"example":"CRM-67890"},{"name":"ownId","in":"query","description":"Own site ID to search for. Can be combined with supplierId, customerId, and/or prewaveId.","required":false,"schema":{"type":"string"},"example":"OWN-SITE-01"},{"name":"prewaveId","in":"query","description":"Prewave ID to search for. Can be combined with supplierId, customerId, and/or ownId.","required":false,"schema":{"type":"integer","format":"int32"},"example":12345},{"name":"source","in":"query","description":"Optional source system to filter by. If not provided, matches IDs with any source or without a source. Applies to all provided ID parameters.","required":false,"schema":{"type":"string"},"example":"SAP"}],"responses":{"200":{"description":"Successfully found suppliers. Returns empty list if no matches found.","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/PublicSupplierDetailV2DTO"}},"examples":{"Single Supplier Found":{"summary":"Response with one supplier","description":"Single Supplier Found","value":[{"prewaveTargetId":102006215,"name":"Acme Manufacturing","sname":"Vienna Industrial District","linkedInId":"acme-manufacturing","address":"123 Main St, Vienna, Austria","city":"Vienna","countryCode":"AT","postalCode":"1010","website":"https://www.acme-corp.com","description":"Leading manufacturer of electronic components","logo":"/images/company-img/acme-logo.jpg","yearFounded":1999,"size":"Medium","supplierIds":[{"id":"SAP-12345","source":"SAP"},{"id":"COUPA-67890","source":"Coupa"}],"customerIds":[{"id":"CRM-ABC-001","source":"Salesforce"}],"ownIds":[],"screened":true,"screenedStatus":"Screened","monitoredSince":"2023-01-01T12:00:00Z","earliestAlert":"2023-02-15T10:30:00Z","siteGroup":{"id":500001,"name":"Acme Corporation Group"},"connectionContactsCount":5}]},"Multiple Suppliers Found":{"summary":"Response with multiple suppliers matching different IDs","description":"Multiple Suppliers Found","value":[{"prewaveTargetId":102006215,"name":"Acme Manufacturing","address":"123 Main St, Vienna, Austria","city":"Vienna","countryCode":"AT","supplierIds":[{"id":"SAP-12345","source":"SAP"}],"customerIds":[],"ownIds":[],"screened":true,"connectionContactsCount":3},{"prewaveTargetId":102006216,"name":"Beta Industries","address":"456 Business Ave, Berlin, Germany","city":"Berlin","countryCode":"DE","supplierIds":[],"customerIds":[{"id":"CRM-67890","source":"Salesforce"}],"ownIds":[],"screened":false,"connectionContactsCount":1}]},"No Suppliers Found":{"summary":"Empty list when no suppliers match","description":"No Suppliers Found","value":[]}}}}},"400":{"description":"400 Bad Request - Invalid request. At least one ID parameter must be provided.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorDTO"},"examples":{"Missing ID parameters":{"summary":"No ID parameters provided","description":"Missing ID parameters","value":{"code":"invalid_request","message":"At least one ID parameter (supplierId, customerId, or ownId) must be provided","solution":"Fix the request"}}}}}},"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    }"}}}}}}}},"/public/v2/suppliers/connection-contacts/{contactId}":{"get":{"tags":["Suppliers - Connection Contacts"],"summary":"Get a connection contact","description":"\n### Overview\nRetrieve a connection contact by its unique Prewave identifier.\n\n### Identification\nThe `{contactId}` is a unique numerical identifier of the connection contact.\n\n### Getting contactId\n- From the list of contacts returned by `GET /public/v2/suppliers/connection-contacts`.\n- From the response body or `Location` header when creating a contact via `POST /public/v2/suppliers/connection-contacts`.\n\n### Required Permission\n`access_public_suppliers` and `access_public_conn_contacts`\n        ","operationId":"getConnectionContact","parameters":[{"name":"contactId","in":"path","description":"Unique identifier of the connection contact. You can obtain this ID from the list endpoint (GET) or from the creation response (POST).","required":true,"schema":{"type":"integer","format":"int32"},"example":42}],"responses":{"200":{"description":"Successfully retrieved connection contact","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicSupplierConnectionContact"},"examples":{"Single Contact":{"summary":"Sample response for a single contact","description":"Single Contact","value":"{\"id\":42,\"email\":\"contact@supplier.com\"}"}}}}},"404":{"description":"404 Not Found - Contact not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorDTO"},"examples":{"Contact Not Found":{"summary":"The specified contact ID does not exist","description":"Contact Not Found","value":"{\"code\":\"resource_not_found\",\"message\":\"Connection contact with ID 999 not found\",\"solution\":\"Verify the contact ID.\"}"}}}}},"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    }"}}}}}}},"delete":{"tags":["Suppliers - Connection Contacts"],"summary":"Delete a connection contact","description":"\n### Overview\nDelete a connection contact by its unique Prewave identifier.\n\n### Identification\nThe `{contactId}` is a unique numerical identifier of the connection contact.\n\n### Getting contactId\n- From the list of contacts returned by `GET /public/v2/suppliers/connection-contacts`.\n- From the response body or `Location` header when creating a contact via `POST /public/v2/suppliers/connection-contacts`.\n\n### Required Permission\n`access_public_suppliers` and `access_public_mng_conn_contacts`\n        ","operationId":"deleteConnectionContact","parameters":[{"name":"contactId","in":"path","description":"Unique identifier of the connection contact. You can obtain this ID from the list endpoint (GET) or from the creation response (POST).","required":true,"schema":{"type":"integer","format":"int32"},"example":42}],"responses":{"204":{"description":"Connection contact deleted successfully"},"404":{"description":"404 Not Found - Contact not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorDTO"},"examples":{"Contact Not Found":{"summary":"The specified contact ID does not exist","description":"Contact Not Found","value":"{\"code\":\"resource_not_found\",\"message\":\"Connection contact with ID 999 not found\",\"solution\":\"Verify the contact ID.\"}"}}}}},"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/network/{collectionId}/tree-graph":{"get":{"tags":["Collections - Network"],"summary":"Get tree graph for a collection","description":"\n⚠️ **DEPRECATED** - This endpoint is deprecated and will be removed on 31 May 2027.\n\n**Note**: Responses include a `Sunset` HTTP header (RFC 8594) indicating the removal date.\n\n---\n\n## Migration Required\n\nThis endpoint has been replaced by the v1 Collections Tier-N API. Please migrate to the new endpoint:\n\n### Replacement Endpoint\n\n| Old Endpoint | New Endpoint | Purpose |\n|--------------|--------------|---------|\n| `GET /public/v2/network/{collectionId}/tree-graph` | `GET /public/v1/collections/{collectionId}/tier-n/data` | Get collection-based supplier graphs |\n\n---\n\n## Why Migrate?\n\nThe v1 Collections Tier-N API provides significant improvements:\n\n### 1. Enhanced Functionality\n- **v2**: Basic tree graph with limited configuration\n- **v1 Tier-N**: Advanced filtering through collection settings\n- **v1 Tier-N**: Configurable data sources (customs, media, predictions)\n- **v1 Tier-N**: Better control over scope (private, shared, public targets)\n\n### 2. Better Performance\n- **v1 Tier-N**: Optimized queries for large collections\n- **v1 Tier-N**: More efficient data retrieval\n\n### 3. Improved Documentation\n- Comprehensive examples for all endpoints\n- Detailed error response documentation\n- Clear parameter descriptions\n\n---\n\n## Quick Migration Guide\n\n### Step 1: Update Endpoint URL\n\n**Before:**\n```http\nGET /public/v2/network/123/tree-graph?tierLevel=3\n```\n\n**After:**\n```http\nGET /public/v1/collections/123/tier-n/data?tierLevel=3\n```\n\n### Step 2: Update Response Parsing\n\n**Before:** Parse `PublicTreeTargetV2` structure\n\n**After:** Parse `PublicTierNCollectionGraphEntry` structure (different format)\n\n---\n\n**Required Permissions**: `ACCESS_PUBLIC_TREE_GRAPH` and `READ` on the collection\n\n**Performance Impact**: High\n\nFor detailed API reference and examples, see the v1 Collections Tier-N API documentation.\n        ","operationId":"treeGraph","parameters":[{"name":"collectionId","in":"path","required":true,"schema":{"type":"integer","format":"int32"}},{"name":"commodityIds","in":"query","required":false,"schema":{"type":"array","items":{"type":"integer","format":"int32"}}},{"name":"commodityTreeId","in":"query","required":false,"schema":{"type":"integer","format":"int32"}},{"name":"fetchParents","in":"query","required":false,"schema":{"type":"boolean","default":true}},{"name":"tierLevel","in":"query","required":false,"schema":{"maximum":4,"type":"integer","format":"int32"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/PublicTreeTargetV2"}}}}},"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    }"}}}}}},"deprecated":true}},"/public/v2/network/{collectionId}/targets":{"get":{"tags":["Collections - Network"],"summary":"Get targets for a collection","description":"\n⚠️ **DEPRECATED** - This endpoint is deprecated and will be removed on 31 May 2027.\n\n**Note**: Responses include a `Sunset` HTTP header (RFC 8594) indicating the removal date.\n\n---\n\n## Migration Required\n\nThis endpoint has been replaced by the v1 Collections API. Please migrate to the new endpoint:\n\n### Replacement Endpoint\n\n| Old Endpoint | New Endpoint | Purpose |\n|--------------|--------------|---------|\n| `GET /public/v2/network/{collectionId}/targets` | `GET /public/v1/collections/{collectionId}/targets` | Get targets in a collection |\n\n---\n\n## Why Migrate?\n\nThe v1 Collections API provides better consistency and alignment with the rest of the Collections API:\n\n### 1. Consistent API Structure\n- **v2**: Uses `/public/v2/network/{collectionId}/targets` which mixes network and collection concepts\n- **v1**: Uses `/public/v1/collections/{collectionId}/targets` which is more intuitive and consistent with other collection endpoints\n\n### 2. Better API Organization\n- The v1 endpoint is part of the dedicated Collections API (`PublicTargetCollectionController`)\n- Better aligns with RESTful principles where collection-related operations are grouped together\n- More discoverable alongside other collection management endpoints\n\n### 3. Enhanced Functionality\n- The v1 Collections API provides additional endpoints for managing targets in collections:\n- `POST /public/v1/collections/{collectionId}/targets` - Add targets to a collection\n- `DELETE /public/v1/collections/{collectionId}/targets/{targetId}` - Remove a target from a collection\n- `GET /public/v1/collections/{collectionId}/targets` - List targets in a collection (replacement)\n\n### 4. Improved Documentation\n- Comprehensive examples for all endpoints\n- Detailed error response documentation\n- Clear parameter descriptions\n- Better Swagger/OpenAPI documentation\n\n---\n\n## Quick Migration Guide\n\n### Step 1: Update Endpoint URL\n**Before:**\n```http\nGET /public/v2/network/{collectionId}/targets?page=0&size=20\n```\n\n**After:**\n```http\nGET /public/v1/collections/{collectionId}/targets?page=0&size=20\n```\n\n### Step 2: Verify Response Structure\nThe response structure is **identical** - no changes needed to your response parsing logic:\n\n**Response Format (unchanged):**\n```json\n{\n\"content\": [\n{\n\"id\": 10422185,\n\"name\": \"Inter Cars SA\"\n},\n{\n\"id\": 101641243,\n\"name\": \"Asmet Sp. z o.o.\"\n}\n],\n\"size\": 10,\n\"number\": 0,\n\"totalElements\": 57,\n\"totalPages\": 6,\n\"numberOfElements\": 2\n}\n```\n\n### Step 3: Update Error Handling\nError responses remain the same:\n- `401` - Authentication required\n- `403` - Insufficient permissions to read this collection\n- `404` - Collection not found or not accessible to the user\n\n---\n\n## Breaking Changes\n\n**None** - This is a straightforward URL change with identical functionality:\n\n1. **URL Path Only**: Only the URL path changes from `/public/v2/network/{collectionId}/targets` to `/public/v1/collections/{collectionId}/targets`\n2. **Response Structure**: Identical - returns `Page<PublicTargetRef>` with `id` and `name` fields\n3. **Query Parameters**: Identical - supports standard Spring pagination parameters (`page`, `size`, `sort`)\n4. **Permissions**: Identical - requires `ACCESS_PUBLIC_TARGET` authority and `READ` permission on the collection\n5. **Performance**: Identical - uses the same underlying service method\n\n---\n\n## Migration Example\n\n### Before (v2)\n```http\nGET /public/v2/network/123/targets?page=0&size=20\n```\n\n### After (v1)\n```http\nGET /public/v1/collections/123/targets?page=0&size=20\n```\n\nThe response will be identical in both cases.\n\n---\n\n**Required Permissions**: `ACCESS_PUBLIC_TARGET` and `READ` on the collection\n\n**Performance Impact**: Low\n\nFor detailed API reference, see the v1 Collections API documentation.\n        ","operationId":"targets","parameters":[{"name":"collectionId","in":"path","required":true,"schema":{"type":"integer","format":"int32"}},{"name":"pageable","in":"query","required":true,"schema":{"$ref":"#/components/schemas/Pageable"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"object","properties":{"content":{"type":"array","items":{"$ref":"#/components/schemas/PublicTargetRef"}},"size":{"type":"integer","format":"int32"},"number":{"type":"integer","format":"int32"},"totalElements":{"type":"integer","format":"int32"},"totalPages":{"type":"integer","format":"int32"},"numberOfElements":{"type":"integer","format":"int32"},"first":{"type":"boolean"},"last":{"type":"boolean"},"empty":{"type":"boolean"}}}}}},"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    }"}}}}}},"deprecated":true}},"/public/v2/network/{collectionId}/commodity-graph":{"get":{"tags":["Collections - Network"],"summary":"Get commodity graph for a collection","description":"\nRetrieve a commodity-based network graph for a collection.\n\nThis endpoint returns a graph structure showing how targets in the collection are connected\nthrough commodity relationships. The graph represents supply chain relationships organized\nby commodity/product categories.\n\n**Use Cases**:\n- Analyze commodity-based supply chain networks\n- Visualize relationships organized by product categories\n- Identify commodity-specific supplier connections\n\n**Response Format**:\nReturns an array of tree nodes, where each node contains:\n- Target information\n- Commodity relationships\n- Nested supplier structures organized by commodities\n\n**Required Permissions**: `ACCESS_PUBLIC_COMMODITY_GRAPH` and `READ` on the collection\n\n**Performance Impact**: High\n        ","operationId":"commodityGraph","parameters":[{"name":"collectionId","in":"path","required":true,"schema":{"type":"integer","format":"int32"}}],"responses":{"200":{"description":"Successfully retrieved commodity graph","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/PublicTreeTargetV2"}}}}},"404":{"description":"404 Not Found - Collection not found or not accessible","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\": 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    }"}}}}}}}},"/public/v2/network/tree/{commodityTreeId}/commodity-graph":{"get":{"tags":["Collections - Network"],"summary":"Get commodity graph for a commodity tree","description":"\nRetrieve a commodity-based network graph using a commodity tree ID.\n\nThis endpoint is similar to the collection-based commodity graph endpoint but uses a commodity\ntree ID to identify the collection. The commodity tree represents a hierarchical organization\nof commodity categories.\n\n**Use Cases**:\n- Analyze commodity-based networks using commodity tree identifiers\n- Visualize relationships for specific commodity hierarchies\n- Integrate with systems that use commodity tree IDs\n\n**Response Format**:\nReturns an array of tree nodes organized by commodity relationships.\n\n**Required Permission**: `ACCESS_PUBLIC_COMMODITY_GRAPH`\n\n**Performance Impact**: High\n        ","operationId":"treeCommodityGraph","parameters":[{"name":"commodityTreeId","in":"path","required":true,"schema":{"type":"integer","format":"int32"}}],"responses":{"200":{"description":"Successfully retrieved commodity graph","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/PublicTreeTargetV2"}}}}},"404":{"description":"404 Not Found - Commodity tree not found or no associated collection 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\": 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    }"}}}}}}}},"/public/v2/feed":{"get":{"tags":["Alerts"],"summary":"Get all alerts of the current user's feed (V2)","description":"\nRetrieve all alerts for targets that are in collections with feed delivery enabled. Results are ordered by newest first. V2 uses the same filtering and feed logic as the Prewave dashboard.\n\n**Response:** A `Page` containing a list of alert objects. Standard pagination fields: `content`, `totalElements`, `totalPages`, `size`, `number`, `first`, `last`. Each alert includes id, title, timestamps (ISO 8601 UTC), event, priority, classification, locations, links, media, primary/mentioned targets, collection paths, optional geo (see `includeGeo`), and optional `statusUpdates` when that field is enabled for your organization.\n\n**Pagination:** Use query parameters `page` (0-based index) and `size` (items per page). Default page size is 20 when not specified.\n\n**Required permission:** `access_public_user_feed`\n\n**Note:** Geographic information (`geo`) is only included when `includeGeo=true`. `statusUpdates` is only included when enabled for your organization. Fields with null values are omitted from the JSON response.\n\n---\n\n## Migration from V1 (`/public/v1/feed`)\n\nV1 is **deprecated** and will be removed on **May 31, 2027**. Responses from V1 include a `Sunset` HTTP header (RFC 8594).\n\n### What changed\n\n| Aspect | V1 | V2 |\n|--------|----|----|\n| **URL** | `/public/v1/feed` | `/public/v2/feed` |\n| **Collections** | `collectionId` (singular) | `collectionIds` (plural); same comma-separated IDs |\n| **Date filter** | `from` or `newerThan` (milliseconds) | `from` only; UTC ISO 8601 (e.g. `2024-01-01T00:00:00Z`) |\n| **Omit date** | (varies) | Last **90 days** of data |\n| **Timestamps in response** | Numeric (e.g. milliseconds) | **ISO 8601 strings in UTC** for `createdAt`, `predictedAtStart`, `predictedAtEnd` |\n\n### What is new in V2\n\n- **Tier control:** `minTier` and `maxTier` to include specific supply chain tiers (Tier 1 = direct suppliers, Tier 2 = their suppliers, etc.). Omit both for Tier 1 only (default).\n- **Classification:** `isSituationReport`, `active`, `relevancy` on each alert.\n- **Structured metadata:** `eventTypes`, `eventTypeGroups`, `alertTypes`, `labels`—easier to filter and display than the previous `infotags` list.\n- **Context:** `mentionedTargets`, `previousAlerts`, `flagged`, `useCaseDetails` for richer context.\n- **Status updates:** `statusUpdates` on each alert when enabled for your organization.\n- **Performance:** V2 is significantly faster than V1—lower latency and higher throughput.\n\n### What is removed in V2\n\n- **`statusId`** — no longer returned.\n- **`infotags`** — use the new structured fields instead: `eventTypes`, `eventTypeGroups`, `alertTypes`, `labels`.\n        ","operationId":"alertFeed","parameters":[{"name":"collectionIds","in":"query","description":"Collection IDs to filter the feed by. Only alerts for targets in these collections will be returned. In V1 this was collectionId (singular); same comma-separated IDs.","required":false,"schema":{"uniqueItems":true,"type":"array","items":{"type":"integer","format":"int32"}},"example":"123, 456"},{"name":"from","in":"query","description":"Start of the date range (inclusive). Use UTC ISO 8601 format (e.g. `2024-01-01T00:00:00Z`). If omitted, V2 returns alerts from the last 90 days filtered by `createdAt`. In V1 you could use `newerThan` (milliseconds) or `from`; V2 uses `from` only.","required":false,"schema":{"type":"string","format":"date-time"},"example":"2024-01-01T00:00:00Z"},{"name":"perspectiveId","in":"query","description":"Perspective ID to filter the feed by. Defaults to the user's default perspective.","required":false,"schema":{"type":"integer","format":"int32"},"example":1},{"name":"priorities","in":"query","description":"List of priorities to filter the feed by Allowed values: Low, Mid, High, Critical (comma-separated).","required":false,"schema":{"type":"array","items":{"$ref":"#/components/schemas/Priority"}},"example":"High, Critical"},{"name":"includeGeo","in":"query","description":"If set to true, the response will include the geo information. Set to true when you need coordinates or shapes for mapping.","required":false,"schema":{"type":"boolean","default":false},"example":true},{"name":"impactLevelIds","in":"query","description":"Impact level IDs to filter the feed by. Valid IDs depend on your tenant configuration.","required":false,"schema":{"uniqueItems":true,"type":"array","items":{"type":"integer","format":"int32"}},"example":"1, 2"},{"name":"minTier","in":"query","description":"Minimum supply chain tier depth to include (V2 only). Tier 1 = direct suppliers, Tier 2 = their suppliers, etc. Default 1. Must be ≤ maxTier; max value 5.","required":false,"schema":{"maximum":5,"minimum":1,"type":"integer","format":"int32","default":1},"example":1},{"name":"maxTier","in":"query","description":"Maximum supply chain tier depth to include (V2 only). Tier 1 = direct suppliers, Tier 2 = their suppliers, etc. Default 1. Must be ≥ minTier; max value 5.","required":false,"schema":{"maximum":5,"minimum":1,"type":"integer","format":"int32","default":1},"example":1},{"name":"pageable","in":"query","required":true,"schema":{"$ref":"#/components/schemas/Pageable"}}],"responses":{"200":{"description":"Successfully retrieved alerts","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SchemaPublicAlertV2DTO"},"examples":{"Alert feed with results":{"summary":"Paginated feed containing one alert with V2 structured metadata","description":"Alert feed with results","value":"{\"content\":[{\"id\":12345,\"uuid\":\"a1b2c3d4-e5f6-7890-abcd-ef1234567890\",\"title\":\"Labor strike begins at Acme Manufacturing Inc\",\"createdAt\":1768473000.000000000,\"predictedAtStart\":1768456800.000000000,\"predictedAtEnd\":null,\"description\":\"Workers at Acme Manufacturing Inc began a strike affecting production lines.\",\"isSituationReport\":false,\"event\":{\"uuid\":\"b2c3d4e5-f6a7-8901-bcde-f23456789012\"},\"active\":true,\"relevancy\":\"Relevant\",\"locations\":[{\"id\":102006216,\"name\":\"Acme Manufacturing Plant\",\"sname\":null,\"logo\":null,\"backgroundPicture\":null,\"description\":null,\"website\":null,\"location\":\"Sample City, US\",\"yearFounded\":null,\"size\":null,\"screened\":true,\"screenedStatus\":null,\"linkedInId\":null,\"type\":{\"id\":1,\"type\":\"organization\",\"displayName\":\"Site Group\",\"pluralName\":\"Site Groups\",\"ordering\":null,\"scoring\":null},\"ctype\":{\"id\":1,\"ctype\":\"company\",\"targetTypeId\":1,\"displayName\":\"Company\",\"pluralName\":\"Companies\",\"icon\":\"fas fa-building\",\"ordering\":null,\"priority\":0,\"connectable\":false,\"bgColor\":\"#cccccc\",\"textColor\":\"#000000\"},\"geo\":{\"geometry\":null,\"properties\":{\"name\":null,\"countryCode\":null,\"alertCount\":null,\"boundingBox\":null},\"type\":\"Feature\"},\"geoShape\":{\"geometry\":null,\"properties\":{\"name\":null,\"countryCode\":null,\"alertCount\":null,\"boundingBox\":null},\"type\":\"Feature\"},\"parents\":[],\"organization\":null,\"industries\":[],\"monitoredSince\":null,\"ordering\":null,\"disruptionStatusUpdate\":null,\"own\":false,\"managed\":false,\"isPublic\":null,\"connectionContactsCount\":null,\"population\":null,\"following\":false,\"collectionFollowing\":false,\"tier\":1,\"path\":[],\"collectionLevel\":null,\"collectionPath\":[],\"collectionPaths\":[],\"foreignSystems\":[],\"scoreAvail\":\"None\",\"revenue\":null,\"impact\":null,\"hsCode\":[],\"mergedTargets\":[]}],\"links\":[{\"id\":null,\"url\":\"https://example.com/news/labor-strike-acme-manufacturing\",\"title\":\"Labor strike begins at Acme Manufacturing Inc\",\"description\":\"Workers at Acme Manufacturing Inc began a strike affecting production lines.\",\"pictureUrl\":null,\"originalLang\":null,\"originalTitle\":null,\"originalDescription\":null}],\"media\":[],\"primaryTargets\":[{\"target\":{\"id\":102006215,\"name\":\"Acme Manufacturing Inc\",\"sname\":null,\"logo\":null,\"backgroundPicture\":null,\"description\":null,\"website\":null,\"location\":\"Sample City, US\",\"yearFounded\":null,\"size\":null,\"screened\":true,\"screenedStatus\":null,\"linkedInId\":null,\"type\":{\"id\":1,\"type\":\"organization\",\"displayName\":\"Site Group\",\"pluralName\":\"Site Groups\",\"ordering\":null,\"scoring\":null},\"ctype\":{\"id\":1,\"ctype\":\"company\",\"targetTypeId\":1,\"displayName\":\"Company\",\"pluralName\":\"Companies\",\"icon\":\"fas fa-building\",\"ordering\":null,\"priority\":0,\"connectable\":false,\"bgColor\":\"#cccccc\",\"textColor\":\"#000000\"},\"geo\":{\"geometry\":null,\"properties\":{\"name\":null,\"countryCode\":null,\"alertCount\":null,\"boundingBox\":null},\"type\":\"Feature\"},\"geoShape\":{\"geometry\":null,\"properties\":{\"name\":null,\"countryCode\":null,\"alertCount\":null,\"boundingBox\":null},\"type\":\"Feature\"},\"parents\":[],\"organization\":null,\"industries\":[],\"monitoredSince\":null,\"ordering\":null,\"disruptionStatusUpdate\":null,\"own\":false,\"managed\":false,\"isPublic\":null,\"connectionContactsCount\":null,\"population\":null,\"following\":false,\"collectionFollowing\":false,\"tier\":1,\"path\":[],\"collectionLevel\":null,\"collectionPath\":[],\"collectionPaths\":[],\"foreignSystems\":[],\"scoreAvail\":\"None\",\"revenue\":null,\"impact\":null,\"hsCode\":[],\"mergedTargets\":[]},\"impactLevel\":{\"id\":4222469,\"level\":\"company\",\"displayName\":\"Site Group\",\"ordering\":10},\"impactScore\":\"High\",\"priority\":\"High\"}],\"mentionedTargets\":[{\"id\":102006217,\"name\":\"Pacific Components Ltd\",\"sname\":null,\"logo\":null,\"backgroundPicture\":null,\"description\":null,\"website\":null,\"location\":\"Port City, US\",\"yearFounded\":null,\"size\":null,\"screened\":true,\"screenedStatus\":null,\"linkedInId\":null,\"type\":{\"id\":1,\"type\":\"organization\",\"displayName\":\"Site Group\",\"pluralName\":\"Site Groups\",\"ordering\":null,\"scoring\":null},\"ctype\":{\"id\":1,\"ctype\":\"company\",\"targetTypeId\":1,\"displayName\":\"Company\",\"pluralName\":\"Companies\",\"icon\":\"fas fa-building\",\"ordering\":null,\"priority\":0,\"connectable\":false,\"bgColor\":\"#cccccc\",\"textColor\":\"#000000\"},\"geo\":{\"geometry\":null,\"properties\":{\"name\":null,\"countryCode\":null,\"alertCount\":null,\"boundingBox\":null},\"type\":\"Feature\"},\"geoShape\":{\"geometry\":null,\"properties\":{\"name\":null,\"countryCode\":null,\"alertCount\":null,\"boundingBox\":null},\"type\":\"Feature\"},\"parents\":[],\"organization\":null,\"industries\":[],\"monitoredSince\":null,\"ordering\":null,\"disruptionStatusUpdate\":null,\"own\":false,\"managed\":false,\"isPublic\":null,\"connectionContactsCount\":null,\"population\":null,\"following\":false,\"collectionFollowing\":false,\"tier\":2,\"path\":[],\"collectionLevel\":null,\"collectionPath\":[],\"collectionPaths\":[],\"foreignSystems\":[],\"scoreAvail\":\"None\",\"revenue\":null,\"impact\":null,\"hsCode\":[],\"mergedTargets\":[]}],\"priority\":\"High\",\"priorityDetails\":{\"massDisruption\":true,\"brandMention\":false,\"rumour\":false,\"lowPeerRisk\":false,\"terminates\":false},\"previousAlerts\":[{\"alertId\":12340,\"eventId\":5678,\"title\":\"Labor strike announced at Acme Manufacturing Inc\",\"description\":\"Union announces planned strike action beginning next week.\",\"createdAt\":1768032000.000000000}],\"flagged\":{\"reason\":\"Needs review\",\"comment\":\"Escalated for supplier risk assessment\",\"flaggedAt\":1768474800.000000000},\"useCaseDetails\":{\"relevant\":true,\"reason\":\"Direct tier-1 supplier in monitored collection\"},\"labels\":[{\"id\":42,\"scope\":\"Customer\",\"name\":\"High impact\",\"bgColor\":\"#FF5733\",\"textColor\":\"#FFFFFF\"}],\"eventTypes\":[{\"id\":501,\"value\":\"Labor dispute\",\"svalue\":\"labor_dispute\",\"icon\":\"fa-kit fa-strike\"}],\"eventTypeGroups\":[{\"id\":10,\"name\":\"Labor and workforce\",\"sname\":\"labor_workforce\",\"eventTypeIds\":[501]}],\"alertTypes\":[{\"id\":201,\"value\":\"happens\",\"svalue\":\"happens\",\"icon\":\"fa-kit fa-alert\"}],\"collectionPath\":[{\"id\":123,\"name\":\"Tier 1 suppliers\",\"path\":[{\"id\":1,\"name\":\"Supply chain monitoring\"},{\"id\":123,\"name\":\"Tier 1 suppliers\"}]}],\"geo\":{\"geometry\":null,\"properties\":{\"name\":null,\"countryCode\":null,\"alertCount\":null,\"boundingBox\":null},\"type\":\"Feature\"},\"statusUpdates\":[{\"id\":1,\"targetId\":102006215,\"assignedAt\":1768475700.000000000,\"assignedBy\":{\"id\":42,\"firstname\":\"Anna\",\"lastname\":\"Schmidt\",\"customerName\":\"Acme Manufacturing Inc\"},\"comment\":\"Investigating the reported incident with the supplier.\",\"forCustomerName\":null,\"status\":\"confirmed\"},{\"id\":2,\"targetId\":102006215,\"assignedAt\":1768573800.000000000,\"assignedBy\":{\"id\":43,\"firstname\":\"Lars\",\"lastname\":\"Berg\",\"customerName\":\"Acme Manufacturing Inc\"},\"comment\":\"Supplier confirmed mitigation steps are underway.\",\"forCustomerName\":\"Acme Manufacturing Inc\",\"status\":\"resolved\"}]}],\"pageable\":{\"pageNumber\":0,\"pageSize\":20,\"sort\":{\"empty\":true,\"sorted\":false,\"unsorted\":true},\"offset\":0,\"paged\":true,\"unpaged\":false},\"totalPages\":1,\"totalElements\":1,\"last\":true,\"size\":20,\"number\":0,\"numberOfElements\":1,\"sort\":{\"empty\":true,\"sorted\":false,\"unsorted\":true},\"first\":true,\"empty\":false}"},"Empty alert feed":{"summary":"No alerts match the current filters","description":"Empty alert feed","value":"{\"content\":[],\"pageable\":{\"pageNumber\":0,\"pageSize\":20,\"sort\":{\"empty\":true,\"sorted\":false,\"unsorted\":true},\"offset\":0,\"paged\":true,\"unpaged\":false},\"totalPages\":0,\"totalElements\":0,\"last\":true,\"size\":20,\"number\":0,\"numberOfElements\":0,\"sort\":{\"empty\":true,\"sorted\":false,\"unsorted\":true},\"first\":true,\"empty\":true}"}}}}},"400":{"description":"Bad Request - Invalid parameters (e.g. invalid date format, tier bounds, or priority values)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorDTO"},"examples":{"Invalid request parameters":{"summary":"Error when a query parameter has an invalid value","description":"Invalid request parameters","value":"{\"code\":\"invalid_request\",\"message\":\"Email must be a valid email address.\"}"}}}}},"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    }"}}}}}}}},"/public/v2/eudr/suppliers/origin-requests":{"get":{"tags":["EUDR - Suppliers"],"summary":"Fetch supplier origin requests","description":"\nRetrieve a paginated list of origin requests received by the supplier.\n\nThis endpoint returns all origin requests that have been sent to the supplier's organization,\nwith optional filtering by customer ID, reference, and status. Each item includes the linked\nproduct, references, supplier DDS references when answered, and origins when available.\n\n**Use Cases**:\n- View all origin requests received\n- Filter requests by customer or status\n- Track request status and responses\n\n**Pagination**:\n- Results are paginated (default: 10 items per page)\n- Use `page` and `size` query parameters to control pagination\n\n**Required permission:** `access_public_eudr_suppliers`\n        ","operationId":"findSupplierOriginRequests","parameters":[{"name":"page","in":"query","description":"Page number (0-based)","required":false,"schema":{"type":"integer","default":0},"example":0},{"name":"size","in":"query","description":"Page size","required":false,"schema":{"type":"integer","default":10},"example":10},{"name":"customerId","in":"query","description":"Customer ID","required":false,"schema":{"type":"integer"},"example":100},{"name":"reference","in":"query","description":"Origin request reference","required":false,"schema":{"type":"string"},"example":"PO-2025-001"},{"name":"status","in":"query","description":"Origin request status","required":false,"schema":{"$ref":"#/components/schemas/FilterOriginRequestStatus"}}],"responses":{"200":{"description":"Paginated list of origin requests received by the supplier.","content":{"application/json":{"schema":{"type":"object","properties":{"content":{"type":"array","items":{"$ref":"#/components/schemas/PublicSupplierOriginRequest"}},"size":{"type":"integer","format":"int32"},"number":{"type":"integer","format":"int32"},"totalElements":{"type":"integer","format":"int32"},"totalPages":{"type":"integer","format":"int32"},"numberOfElements":{"type":"integer","format":"int32"},"first":{"type":"boolean"},"last":{"type":"boolean"},"empty":{"type":"boolean"}}},"examples":{"Supplier origin requests page":{"summary":"Requested, answered, and delayed origin requests","description":"Supplier origin requests page","value":"{\"content\":[{\"id\":1001,\"status\":\"Requested\",\"createdAt\":{\"date\":\"2025-09-01T10:00:00\",\"_datetype_\":\"DateTime\"},\"updatedAt\":{\"date\":\"2025-09-01T10:00:00\",\"_datetype_\":\"DateTime\"},\"closedAt\":null,\"endDate\":{\"date\":\"2025-09-30\",\"_datetype_\":\"Date\"},\"requestedWeight\":1000.50,\"providedWeight\":null,\"references\":[{\"reference\":\"PO-2025-001\",\"referenceType\":\"PurchaseOrder\"},{\"reference\":\"SHP-2025-042\",\"referenceType\":\"ShipmentNumber\"}],\"product\":{\"id\":201,\"customerId\":100,\"supplierId\":102006215,\"reference\":\"INB-2025-001\",\"type\":\"Inbound\",\"name\":\"Oak Wood Planks\"},\"origins\":[],\"supplierDDSReferences\":[]},{\"id\":1002,\"status\":\"Answered\",\"createdAt\":{\"date\":\"2025-08-10T08:30:00\",\"_datetype_\":\"DateTime\"},\"updatedAt\":{\"date\":\"2025-08-20T14:15:00\",\"_datetype_\":\"DateTime\"},\"closedAt\":{\"date\":\"2025-08-20T14:15:00\",\"_datetype_\":\"DateTime\"},\"endDate\":{\"date\":\"2025-08-31\",\"_datetype_\":\"Date\"},\"requestedWeight\":750.00,\"providedWeight\":720.25,\"references\":[{\"reference\":\"PO-2025-002\",\"referenceType\":\"PurchaseOrder\"}],\"product\":{\"id\":202,\"customerId\":100,\"supplierId\":102006215,\"reference\":\"INB-2025-002\",\"type\":\"Inbound\",\"name\":\"Teak Wood Beams\"},\"origins\":[],\"supplierDDSReferences\":[\"EU-SUP-67890\",\"EU-SUP-67891\"]},{\"id\":1003,\"status\":\"Delayed\",\"createdAt\":{\"date\":\"2025-09-05T09:00:00\",\"_datetype_\":\"DateTime\"},\"updatedAt\":{\"date\":\"2025-09-12T11:30:00\",\"_datetype_\":\"DateTime\"},\"closedAt\":null,\"endDate\":{\"date\":\"2025-10-15\",\"_datetype_\":\"Date\"},\"requestedWeight\":500.25,\"providedWeight\":null,\"references\":[{\"reference\":\"PO-2025-003\",\"referenceType\":\"PurchaseOrder\"}],\"product\":{\"id\":203,\"customerId\":100,\"supplierId\":102006215,\"reference\":\"INB-2025-003\",\"type\":\"Inbound\",\"name\":\"Plywood Panels\"},\"origins\":[],\"supplierDDSReferences\":[]}],\"pageable\":{\"pageNumber\":0,\"pageSize\":10,\"sort\":{\"empty\":true,\"sorted\":false,\"unsorted\":true},\"offset\":0,\"paged\":true,\"unpaged\":false},\"totalPages\":1,\"totalElements\":3,\"last\":true,\"size\":10,\"number\":0,\"numberOfElements\":3,\"sort\":{\"empty\":true,\"sorted\":false,\"unsorted\":true},\"first\":true,\"empty\":false}"}}}}},"400":{"description":"Invalid pagination or filter parameters.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorDTO"},"examples":{"Invalid page number":{"description":"Invalid page number","value":{"code":"invalid_request","message":"Page number must be non-negative","solution":"Provide a valid page number (0 or greater)"}},"Invalid page size":{"description":"Invalid page size","value":{"code":"invalid_request","message":"Page size must be between 1 and 100","solution":"Provide a valid page size"}}}}}},"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    }"}}}}}}}},"/public/v2/eudr/suppliers/customers":{"get":{"tags":["EUDR - Suppliers"],"summary":"Fetch supplier customers","description":"\nRetrieve a list of all customers that have products associated with this supplier.\n\nThis endpoint returns all customers that have inbound products linked to the supplier's organization.\nThis information is useful for understanding which customers are requesting origin information.\n\n**Use Cases**:\n- View all customers that have products from this supplier\n- Understand customer relationships\n- Identify active customer connections\n\n**Required permission:** `access_public_eudr_suppliers`\n        ","operationId":"findSupplierCustomers","responses":{"200":{"description":"List of customers linked to the supplier through inbound products.","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/PublicSupplierCustomer"}},"examples":{"Supplier customers":{"summary":"Customers with inbound products from this supplier","description":"Supplier customers","value":"[{\"id\":100,\"name\":\"Acme GmbH\"},{\"id\":101,\"name\":\"Beta Trading AG\"},{\"id\":102,\"name\":\"Global Retail Corp\"}]"},"No customers":{"summary":"Supplier has no linked customer products","description":"No customers","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    }"}}}}}}}},"/public/v2/eudr/shared/hscodes":{"get":{"tags":["EUDR - Shared"],"summary":"Get a list of EUDR related HS Codes","description":"\nRetrieve a list of Harmonized System (HS) codes relevant for EUDR compliance.\n\nThis endpoint returns reference data containing all HS codes that are applicable for EUDR products.\nHS codes are used to classify products for customs and compliance purposes. Each entry includes\nthe code, description, and linked commodity ID when available.\n\n**Use Cases**:\n- Get HS code reference data for products\n- Populate HS code selection dropdowns\n- Validate product classifications\n\n**Required permissions (one of):** `access_public_products` or `access_public_eudr_suppliers`\n        ","operationId":"findHSCodes","responses":{"200":{"description":"List of EUDR-related HS codes.","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/PublicProductHSCode"}},"examples":{"EUDR HS codes":{"summary":"HS codes with descriptions and commodity IDs","description":"EUDR HS codes","value":"[{\"code\":\"440799\",\"description\":\"Wood sawn or chipped lengthwise, sliced or peeled, of oak\",\"commodityId\":1},{\"code\":\"441510\",\"description\":\"Plywood, veneered panels and similar laminated wood\",\"commodityId\":1},{\"code\":\"180100\",\"description\":\"Cocoa beans, whole or broken, raw or roasted\",\"commodityId\":2},{\"code\":\"151110\",\"description\":\"Crude palm oil\",\"commodityId\":3}]"}}}}},"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    }"}}}}}}}},"/public/v2/eudr/shared/countries":{"get":{"tags":["EUDR - Shared"],"summary":"Get a list of countries","description":"\nRetrieve a list of all available countries for EUDR compliance.\n\nThis endpoint returns reference data containing all countries that can be used in EUDR workflows,\nsuch as product origins, supplier locations, and compliance reporting.\n\n**Use Cases**:\n- Get country reference data for product origins\n- Populate country selection dropdowns\n- Validate country codes\n\n**Required permissions (one of):** `access_public_products` or `access_public_eudr_suppliers`\n        ","operationId":"findCountries","responses":{"200":{"description":"List of countries available for EUDR workflows.","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/PublicCountry"}},"examples":{"Countries":{"summary":"Countries with ISO 3166-1 alpha-2 codes","description":"Countries","value":"[{\"id\":14,\"name\":\"Austria\",\"countryCode\":\"AT\",\"bounds\":null},{\"id\":276,\"name\":\"Germany\",\"countryCode\":\"DE\",\"bounds\":null},{\"id\":826,\"name\":\"United Kingdom\",\"countryCode\":\"GB\",\"bounds\":null},{\"id\":756,\"name\":\"Switzerland\",\"countryCode\":\"CH\",\"bounds\":null}]"}}}}},"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    }"}}}}}}}},"/public/v2/eudr/shared/commodities":{"get":{"tags":["EUDR - Shared"],"summary":"Get a list of EUDR related commodities","description":"\nRetrieve a list of commodities relevant for EUDR compliance.\n\nThis endpoint returns reference data containing all commodities that are applicable for EUDR products.\nOnly commodities whose names start with \"EUDR \" are included. Commodities are used to categorize\nproducts for compliance and reporting purposes.\n\n**Use Cases**:\n- Get commodity reference data for products\n- Populate commodity selection dropdowns\n- Validate product categorizations\n\n**Required permissions (one of):** `access_public_products` or `access_public_eudr_suppliers`\n        ","operationId":"findCommodities","responses":{"200":{"description":"List of EUDR-related commodities.","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/PublicCommodity"}},"examples":{"EUDR commodities":{"summary":"Commodities applicable to EUDR products","description":"EUDR commodities","value":"[{\"id\":1,\"name\":\"EUDR Wood\"},{\"id\":2,\"name\":\"EUDR Cocoa\"},{\"id\":3,\"name\":\"EUDR Palm Oil\"}]"}}}}},"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    }"}}}}}}}},"/public/v2/eudr/customers/suppliers":{"get":{"tags":["EUDR - Customers - Suppliers"],"summary":"Find suppliers by their IDs or references where at least one of the two parameters must be provided and maximum allowed is 100.","description":"\nFind suppliers by providing either a list of target IDs or a list of references. Exactly one of the two parameters must be provided. The maximum number of allowed IDs or references is limited to 100. Returns a list of supplier details for the provided identifiers, including screening status, references, connection contacts, and supplier maturity when available.\n\n**Use Cases**:\n- Look up suppliers by internal target IDs\n- Resolve suppliers by external reference codes\n- Retrieve supplier details for product or compliance workflows\n\n**Required permission:** `access_public_products`\n        ","operationId":"findSuppliers_1","parameters":[{"name":"targetIds","in":"query","description":"List of supplier target IDs. Must not be provided together with 'refs'. Maximum allowed: 100.","required":false,"schema":{"type":"integer","format":"int32"},"example":102006215},{"name":"refs","in":"query","description":"List of supplier references. Must not be provided together with 'targetIds'. Maximum allowed: 100.","required":false,"schema":{"type":"array"},"example":"ERP-12345"}],"responses":{"200":{"description":"List of suppliers matching the provided IDs or references.","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/PublicEUDRSupplier"}},"examples":{"Suppliers by IDs or references":{"summary":"Suppliers with references, contacts, and maturity status","description":"Suppliers by IDs or references","value":"[{\"id\":102006215,\"name\":\"Acme Manufacturing Inc\",\"location\":\"Vienna\",\"isPublic\":true,\"organization\":{\"id\":200,\"name\":\"Acme Group\",\"location\":\"Vienna\"},\"screened\":true,\"references\":[{\"id\":\"ERP-12345\",\"source\":\"erp\"},{\"id\":\"ERP-789\",\"source\":\"internal\"}],\"connectionContacts\":[{\"id\":42,\"email\":\"procurement@acme.example.com\"},{\"id\":43,\"email\":\"sustainability@acme.example.com\"}],\"supplierMaturity\":{\"answerStatus\":\"Good\",\"answerHidden\":false}},{\"id\":102006216,\"name\":\"Beta Timber Ltd\",\"location\":\"London\",\"isPublic\":false,\"organization\":null,\"screened\":false,\"references\":[{\"id\":\"REF-001\",\"source\":\"Manual\"}],\"connectionContacts\":[],\"supplierMaturity\":null}]"},"No suppliers found":{"summary":"None of the provided identifiers matched a supplier","description":"No suppliers found","value":[]}}}}},"400":{"description":"Invalid parameters: both or neither of targetIds and refs provided, or exceeded maximum allowed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorDTO"},"examples":{"Both parameters provided":{"summary":"Both targetIds and refs provided","description":"Both parameters provided","value":{"code":"invalid_request","message":"Exactly one of targetIds or refs must be provided","solution":"Provide either targetIds or refs, but not both"}},"Neither parameter provided":{"summary":"Neither targetIds nor refs provided","description":"Neither parameter provided","value":{"code":"invalid_request","message":"At least one of targetIds or refs must be provided","solution":"Provide either targetIds or refs parameter"}},"Exceeded maximum":{"summary":"Too many identifiers provided","description":"Exceeded maximum","value":{"code":"invalid_request","message":"Maximum allowed identifiers exceeded","solution":"Reduce the number of identifiers to the maximum allowed limit"}}}}}},"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    }"}}}}}}}},"/public/v2/eudr/customers/suppliers/search":{"get":{"tags":["EUDR - Customers - Suppliers"],"summary":"Search for supplier sites (max results: 100)","description":"\nSearch for supplier sites by a free-text query. Only site-type suppliers are returned.\nThe query must be at least 3 characters long. The maximum number of results is limited to\n100. If the query is too short or no matching supplier type\nis found, an error is returned.\n\n**Use Cases**:\n- Search for suppliers by name or identifier\n- Find supplier sites for product associations\n- Discover available suppliers\n\n**Required permission:** `access_public_products`\n        ","operationId":"queryPoiTargets","parameters":[{"name":"query","in":"query","description":"The search string (minimum 3 characters). Used to match supplier names or other identifying information.","required":true,"schema":{"minLength":3,"type":"string"},"example":"Acme"}],"responses":{"200":{"description":"List of supplier sites matching the search criteria.","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/PublicEUDRTarget"}},"examples":{"Supplier search results":{"summary":"Supplier sites matching a free-text query","description":"Supplier search results","value":"[{\"id\":102006215,\"name\":\"Acme Manufacturing Inc\",\"location\":\"Vienna\",\"isPublic\":true,\"organization\":{\"id\":200,\"name\":\"Acme Group\",\"location\":\"Vienna\"}},{\"id\":102006216,\"name\":\"Beta Timber Ltd\",\"location\":\"London\",\"isPublic\":false,\"organization\":null}]"},"No matches":{"summary":"Query returned no supplier sites","description":"No matches","value":[]}}}}},"400":{"description":"Query too short or invalid parameters.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorDTO"},"examples":{"Query too short":{"summary":"Query parameter is less than 3 characters","description":"Query too short","value":{"code":"invalid_request","message":"Query must be at least 3 characters long","solution":"Provide a query string with at least 3 characters"}}}}}},"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    }"}}}}}}}},"/public/v2/eudr/customers/products/{productId}/supplier-dds":{"get":{"tags":["EUDR - Customers - DDS"],"summary":"Fetch supplier DDS entries for a product","description":"\nRetrieve all supplier Due Diligence Statements (DDS) associated with the specified product.\n\nThis endpoint returns all supplier DDS entries that have been submitted for the product,\nincluding origin information provided by suppliers in response to origin requests.\n\n**Use Cases**:\n- View supplier DDS responses for a product\n- Track supplier compliance data\n- Review origin information from suppliers\n\n**Required permission:** `access_public_products` and `READ` on the product\n        ","operationId":"findSupplierDDS","parameters":[{"name":"productId","in":"path","description":"ID of the product for which to fetch supplier DDS entries.","required":true,"schema":{"type":"integer"},"example":301}],"responses":{"200":{"description":"List of supplier DDS entries for the product.","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/PublicProductSupplierDDS"}},"examples":{"Supplier DDS list":{"summary":"Active and archived supplier DDS entries","description":"Supplier DDS list","value":"[{\"id\":201,\"active\":true,\"referenceNumber\":\"EU-SUP-67890\",\"date\":{\"date\":\"2025-08-15T14:00:00\",\"_datetype_\":\"DateTime\"},\"netWeightInKg\":500.25,\"archived\":false,\"archiveDate\":null},{\"id\":202,\"active\":false,\"referenceNumber\":\"EU-SUP-11111\",\"date\":{\"date\":\"2024-11-20T10:00:00\",\"_datetype_\":\"DateTime\"},\"netWeightInKg\":320.00,\"archived\":true,\"archiveDate\":{\"date\":\"2025-01-10T08:00:00\",\"_datetype_\":\"DateTime\"}}]"},"No supplier DDS entries":{"summary":"Product has no supplier DDS responses yet","description":"No supplier 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    }"}}}}}}}},"/public/v2/eudr/customers/products/{productId}/origin-requests":{"get":{"tags":["EUDR - Customers - Origin Requests"],"summary":"Fetch customer origin requests per inbound product","description":"\nRetrieve a paginated list of origin requests for a specific inbound product.\n\nReturns origin requests created for the product, with optional filtering by reference and status.\nEach item includes status details when the request is answered, delayed, or rejected.\n\n**Use Cases**:\n- View all origin requests for a product\n- Track request status and supplier responses\n- Filter requests by reference or status\n\n**Pagination**:\n- Results are paginated (default: 10 items per page)\n- Use `page` and `size` query parameters to control pagination\n\n**Required permission:** `access_public_products` and `READ` on the product\n        ","operationId":"findCustomerOriginRequests","parameters":[{"name":"productId","in":"path","description":"The ID of the product.","required":true,"schema":{"type":"integer","format":"int32"},"example":301},{"name":"page","in":"query","description":"Page number (0-based)","required":false,"schema":{"type":"integer","default":0},"example":0},{"name":"size","in":"query","description":"Page size","required":false,"schema":{"type":"integer","default":10},"example":10},{"name":"reference","in":"query","description":"Origin request reference","required":false,"schema":{"type":"string"},"example":"PO-2025-001"},{"name":"status","in":"query","description":"Origin request status","required":false,"schema":{"$ref":"#/components/schemas/FilterOriginRequestStatus"}}],"responses":{"200":{"description":"Paginated list of customer origin requests for the product.","content":{"application/json":{"schema":{"type":"object","properties":{"content":{"type":"array","items":{"$ref":"#/components/schemas/PublicCustomerOriginRequest"}},"size":{"type":"integer","format":"int32"},"number":{"type":"integer","format":"int32"},"totalElements":{"type":"integer","format":"int32"},"totalPages":{"type":"integer","format":"int32"},"numberOfElements":{"type":"integer","format":"int32"},"first":{"type":"boolean"},"last":{"type":"boolean"},"empty":{"type":"boolean"}}},"examples":{"Origin requests page":{"summary":"Requested, answered, and delayed origin requests","description":"Origin requests page","value":"{\"content\":[{\"id\":1001,\"status\":\"Requested\",\"createdAt\":{\"date\":\"2025-09-01T10:00:00\",\"_datetype_\":\"DateTime\"},\"updatedAt\":{\"date\":\"2025-09-01T10:00:00\",\"_datetype_\":\"DateTime\"},\"closedAt\":null,\"endDate\":{\"date\":\"2025-09-30\",\"_datetype_\":\"Date\"},\"requestedWeight\":1000.50,\"providedWeight\":null,\"references\":[{\"reference\":\"PO-2025-001\",\"referenceType\":\"PurchaseOrder\"},{\"reference\":\"SHP-2025-042\",\"referenceType\":\"ShipmentNumber\"}],\"answeredStatusDetails\":null,\"delayedStatusDetails\":null,\"rejectStatusDetails\":null},{\"id\":1002,\"status\":\"Answered\",\"createdAt\":{\"date\":\"2025-08-10T08:30:00\",\"_datetype_\":\"DateTime\"},\"updatedAt\":{\"date\":\"2025-08-20T14:15:00\",\"_datetype_\":\"DateTime\"},\"closedAt\":{\"date\":\"2025-08-20T14:15:00\",\"_datetype_\":\"DateTime\"},\"endDate\":{\"date\":\"2025-08-31\",\"_datetype_\":\"Date\"},\"requestedWeight\":750.00,\"providedWeight\":720.25,\"references\":[{\"reference\":\"PO-2025-002\",\"referenceType\":\"PurchaseOrder\"}],\"answeredStatusDetails\":{\"originIds\":[501,502],\"supplierDDSReferences\":[\"EU-SUP-67890\",\"EU-SUP-67891\"]},\"delayedStatusDetails\":null,\"rejectStatusDetails\":null},{\"id\":1003,\"status\":\"Delayed\",\"createdAt\":{\"date\":\"2025-09-05T09:00:00\",\"_datetype_\":\"DateTime\"},\"updatedAt\":{\"date\":\"2025-09-12T11:30:00\",\"_datetype_\":\"DateTime\"},\"closedAt\":null,\"endDate\":{\"date\":\"2025-10-15\",\"_datetype_\":\"Date\"},\"requestedWeight\":500.25,\"providedWeight\":null,\"references\":[{\"reference\":\"PO-2025-003\",\"referenceType\":\"PurchaseOrder\"}],\"answeredStatusDetails\":null,\"delayedStatusDetails\":{\"code\":\"LackOfInfo\",\"reason\":\"Missing documents from supplier\",\"comment\":\"Awaiting geolocation data and harvest period confirmation.\",\"delayedUntil\":{\"date\":\"2025-10-05T12:00:00\",\"_datetype_\":\"DateTime\"}},\"rejectStatusDetails\":null}],\"pageable\":{\"pageNumber\":0,\"pageSize\":10,\"sort\":{\"empty\":true,\"sorted\":false,\"unsorted\":true},\"offset\":0,\"paged\":true,\"unpaged\":false},\"totalPages\":1,\"totalElements\":3,\"last\":true,\"size\":10,\"number\":0,\"numberOfElements\":3,\"sort\":{\"empty\":true,\"sorted\":false,\"unsorted\":true},\"first\":true,\"empty\":false}"}}}}},"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    }"}}}}}}}},"/public/v2/eudr/customers/dds-units":{"get":{"tags":["EUDR - Customers - DDS"],"summary":"Retrieve all available DDS units along with their associated HS codes","description":"\nRetrieve reference data for all available DDS units and their associated HS codes.\n\nThis endpoint returns all DDS units that can be used when creating or updating DDS entries,\nalong with the HS codes that are associated with each unit.\n\n**Use Cases**:\n- Get DDS unit reference data before creating a DDS\n- Populate unit selection dropdowns\n- Validate unit and HS code associations\n\n**Required permission:** `access_public_products`\n        ","operationId":"findDDSUnits","responses":{"200":{"description":"List of DDS units with associated HS codes.","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/PublicDDSUnit"}},"examples":{"DDS units":{"summary":"Common units with linked HS codes","description":"DDS units","value":"[{\"unit\":\"MTQ\",\"hsCodes\":[{\"code\":\"440799\",\"description\":\"Wood sawn or chipped lengthwise, sliced or peeled, of oak\",\"commodityId\":1},{\"code\":\"441510\",\"description\":\"Plywood, veneered panels and similar laminated wood\",\"commodityId\":2}],\"description\":\"Cubic metre\"},{\"unit\":\"NAR\",\"hsCodes\":[{\"code\":\"441510\",\"description\":\"Plywood, veneered panels and similar laminated wood\",\"commodityId\":2}],\"description\":\"Number of items (pieces)\"},{\"unit\":\"KSD\",\"hsCodes\":[{\"code\":\"0901\",\"description\":\"Coffee, whether or not roasted or decaffeinated\",\"commodityId\":3}],\"description\":\"Kilogram of substance in dry state\"}]"}}}}},"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    }"}}}}}}}},"/public/v1/users/roles/available":{"get":{"tags":["Users - Roles"],"summary":"List all available role definitions","description":"\n### Overview\nRetrieve a list of all role names that can be assigned to users within your organization.\n\n### Use Cases\n- **Discovery**: Find out which roles are valid for assignment before calling the Add Roles endpoint.\n- **UI Population**: Populate a dropdown in your internal management tool with valid role names and descriptions.\n\n### Why Use This?\nUse this endpoint to discover valid role identifiers before assigning them. This ensures you only use roles that are active and compatible with your organization's permissions.\n\n### Related Operations\n- **Assign Roles to User**: [POST /public/v1/users/{userId}/roles](#operations-Users_-_Roles-add)\n- **View User's Roles**: [GET /public/v1/users/{userId}/roles](#operations-Users_-_Roles-read)\n- **Onboard New User**: [POST /public/v1/users](#operations-Users-create)\n\n### Required Permission\n`access_public_users`\n    ","operationId":"getAvailableRoles","responses":{"200":{"description":"Available roles retrieved successfully.","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/PublicUserRoleDTO"}},"examples":{"Assignable Roles List":{"summary":"Full list of roles available for assignment","description":"Assignable Roles List","value":"[{\"id\":1,\"name\":\"GRANT_USER_MANAGER_ACCESS\",\"description\":\"Full access to user management features.\"},{\"id\":2,\"name\":\"GRANT_TEAM_MANAGER_ACCESS\",\"description\":\"Ability to create and manage teams.\"},{\"id\":3,\"name\":\"GRANT_ACTIONS_ACCESS\",\"description\":\"Permission to handle action items and alerts.\"}]"}}}}},"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    }"}}}}}}}},"/public/v1/target/{systemId}/{targetId}":{"get":{"tags":["Suppliers - Management"],"summary":"Get detailed information about a target.","description":"\nRetrieve detailed information about a target identified by system ID and target ID.\n\n**Required Permission**: `access_public_target`\n\n**Performance impact**: Low\n    ","operationId":"target","parameters":[{"name":"systemId","in":"path","description":"The system ID is an identifier to determine from which the targetId might originate from. Supported systemIds are \"prewave\", \"customer\", \"supplier\", \"own\".","required":true,"schema":{"type":"string"},"example":"prewave"},{"name":"targetId","in":"path","description":"The target ID can be the target's prewaveId or an external id (edge number) representing the site in another system.","required":true,"schema":{"type":"string"},"example":10422185}],"responses":{"200":{"description":"Successfully retrieved target details","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicTargetDTO"},"examples":{"Target detail example":{"summary":"Sample target response with foreign system mappings","description":"Target detail example","value":"{\"id\":102006215,\"name\":\"Acme Manufacturing Inc\",\"sname\":\"4990729\",\"logo\":\"/images/company-img/acme-manufacturing-logo.svg\",\"backgroundPicture\":\"/images/company-img/acme-manufacturing-bg.jpg\",\"description\":\"Automotive parts manufacturer specializing in electric vehicle components and battery assemblies.\",\"website\":\"https://www.acme-manufacturing.example.com\",\"location\":\"Detroit, MI, US\",\"yearFounded\":1987,\"size\":\"Large\",\"screened\":true,\"screenedStatus\":\"Screened\",\"linkedInId\":\"acme-manufacturing\",\"type\":{\"id\":5195261,\"type\":\"organization\",\"displayName\":\"Site Group\",\"pluralName\":\"Site Groups\",\"ordering\":0,\"scoring\":\"Alert\"},\"ctype\":{\"id\":972417,\"ctype\":\"company\",\"targetTypeId\":5195261,\"displayName\":\"Site Group\",\"pluralName\":\"Site Groups\",\"icon\":\"fas fa-building\",\"ordering\":0,\"priority\":0,\"connectable\":true,\"bgColor\":\"#E8F4FD\",\"textColor\":\"#1A365D\"},\"geo\":{\"geometry\":null,\"properties\":{\"name\":\"Detroit\",\"countryCode\":\"US\",\"alertCount\":null,\"boundingBox\":null},\"type\":\"Feature\"},\"geoShape\":{\"geometry\":null,\"properties\":{\"name\":null,\"countryCode\":null,\"alertCount\":null,\"boundingBox\":null},\"type\":\"Feature\"},\"parents\":[],\"organization\":{\"id\":987654321,\"name\":\"Acme Corporation\",\"sname\":\"6252001\",\"logo\":\"/images/company-img/acme-corporation-logo.svg\",\"backgroundPicture\":\"/images/company-img/acme-corporation-bg.jpg\",\"description\":\"Global automotive supplier and parent organization of Acme Manufacturing Inc.\",\"website\":\"https://www.acme-corporation.example.com\",\"location\":\"Stuttgart, DE\",\"yearFounded\":1962,\"size\":\"Very large\",\"screened\":true,\"screenedStatus\":\"Screened\",\"linkedInId\":\"acme-corporation\",\"type\":{\"id\":5195261,\"type\":\"organization\",\"displayName\":\"Site Group\",\"pluralName\":\"Site Groups\",\"ordering\":0,\"scoring\":\"Alert\"},\"ctype\":{\"id\":972417,\"ctype\":\"company\",\"targetTypeId\":5195261,\"displayName\":\"Site Group\",\"pluralName\":\"Site Groups\",\"icon\":\"fas fa-building\",\"ordering\":0,\"priority\":0,\"connectable\":true,\"bgColor\":\"#E8F4FD\",\"textColor\":\"#1A365D\"},\"geo\":{\"geometry\":null,\"properties\":{\"name\":\"Stuttgart\",\"countryCode\":\"DE\",\"alertCount\":null,\"boundingBox\":null},\"type\":\"Feature\"},\"geoShape\":{\"geometry\":null,\"properties\":{\"name\":null,\"countryCode\":null,\"alertCount\":null,\"boundingBox\":null},\"type\":\"Feature\"},\"parents\":[],\"organization\":null,\"industries\":[],\"monitoredSince\":{\"date\":\"2018-01-10T09:00:00\",\"_datetype_\":\"DateTime\"},\"earliestAlert\":{\"date\":\"2019-04-12T14:30:00\",\"_datetype_\":\"DateTime\"},\"ordering\":0,\"disruptionStatusUpdate\":null,\"own\":true,\"managed\":true,\"isPublic\":true,\"connectionContactsCount\":12,\"population\":null,\"following\":true,\"collectionFollowing\":true,\"tier\":null,\"path\":[],\"collectionLevel\":1,\"collectionPath\":[{\"id\":42,\"name\":\"Tier-1 Suppliers\"}],\"collectionPaths\":[[{\"id\":42,\"name\":\"Tier-1 Suppliers\"}]],\"foreignSystems\":[{\"system\":\"customer\",\"id\":\"ACME-CORP-001\",\"source\":\"SAP\"}],\"scoreAvail\":\"Alert\",\"revenue\":8500000000,\"impact\":\"Low\",\"hsCode\":[{\"code\":\"870810\",\"nshipments\":128}],\"merged_targets\":[]},\"industries\":[{\"id\":554433221,\"name\":\"Automotive Manufacturing\",\"sname\":null,\"logo\":null,\"backgroundPicture\":null,\"description\":\"Industry classification for automotive parts and vehicle component manufacturing.\",\"website\":null,\"location\":\"Global\",\"yearFounded\":null,\"size\":null,\"screened\":true,\"screenedStatus\":\"Screened\",\"linkedInId\":null,\"type\":{\"id\":5195261,\"type\":\"organization\",\"displayName\":\"Site Group\",\"pluralName\":\"Site Groups\",\"ordering\":0,\"scoring\":\"Alert\"},\"ctype\":{\"id\":1122334,\"ctype\":\"industry\",\"targetTypeId\":5195261,\"displayName\":\"Industry\",\"pluralName\":\"Industries\",\"icon\":\"fas fa-industry\",\"ordering\":10,\"priority\":1,\"connectable\":false,\"bgColor\":\"#F0F0F0\",\"textColor\":\"#333333\"},\"geo\":{\"geometry\":null,\"properties\":{\"name\":null,\"countryCode\":null,\"alertCount\":null,\"boundingBox\":null},\"type\":\"Feature\"},\"geoShape\":{\"geometry\":null,\"properties\":{\"name\":null,\"countryCode\":null,\"alertCount\":null,\"boundingBox\":null},\"type\":\"Feature\"},\"parents\":[],\"organization\":null,\"industries\":[],\"monitoredSince\":null,\"ordering\":null,\"disruptionStatusUpdate\":null,\"own\":false,\"managed\":false,\"isPublic\":null,\"connectionContactsCount\":null,\"population\":null,\"following\":false,\"collectionFollowing\":false,\"tier\":null,\"path\":[],\"collectionLevel\":null,\"collectionPath\":[],\"collectionPaths\":[],\"foreignSystems\":[],\"scoreAvail\":\"None\",\"revenue\":123.456,\"impact\":\"Low\",\"hsCode\":[],\"merged_targets\":[]}],\"monitoredSince\":{\"date\":\"2020-03-15T10:30:00\",\"_datetype_\":\"DateTime\"},\"earliestAlert\":{\"date\":\"2021-06-01T08:00:00\",\"_datetype_\":\"DateTime\"},\"ordering\":1,\"disruptionStatusUpdate\":null,\"own\":true,\"managed\":true,\"isPublic\":false,\"connectionContactsCount\":3,\"population\":null,\"following\":true,\"collectionFollowing\":true,\"tier\":null,\"path\":[{\"id\":987654321,\"name\":\"Acme Corporation\",\"customName\":null,\"latestRequest\":null,\"foreignSystems\":[{\"number\":\"ACME-CORP-001\",\"source\":\"SAP\",\"existingEdgeId\":null}]},{\"id\":102006215,\"name\":\"Acme Manufacturing Inc\",\"customName\":null,\"latestRequest\":null,\"foreignSystems\":[{\"number\":\"SUPPLIER001\",\"source\":\"SAP\",\"existingEdgeId\":null}]}],\"collectionLevel\":2,\"collectionPath\":[{\"id\":42,\"name\":\"Tier-1 Suppliers\"},{\"id\":108,\"name\":\"Automotive\"}],\"collectionPaths\":[[{\"id\":42,\"name\":\"Tier-1 Suppliers\"},{\"id\":108,\"name\":\"Automotive\"}],[{\"id\":55,\"name\":\"North America\"},{\"id\":108,\"name\":\"Automotive\"}]],\"foreignSystems\":[{\"system\":\"customer\",\"id\":\"SUPPLIER001\",\"source\":\"SAP\"},{\"system\":\"supplier\",\"id\":\"ACME-MFG-42\",\"source\":\"Excel\"}],\"scoreAvail\":\"Peer\",\"revenue\":1250000000,\"impact\":\"Low\",\"hsCode\":[{\"code\":\"870899\",\"nshipments\":42},{\"code\":\"401110\",\"nshipments\":15}],\"merged_targets\":[102001100]}"}}}}},"404":{"description":"Target not found or no permission to access it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorDTO"},"examples":{"Target not found":{"description":"Target not found","value":"{\"code\":\"resource_not_found\",\"message\":\"Target not found: systemId=customer, targetId=INVALID_ID\",\"solution\":\"Verify target ID and system ID are correct\"}"}}}}},"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    }"}}}}}}}},"/public/v1/target/{systemId}/{targetId}/score":{"get":{"tags":["Scores - Target"],"summary":"Returns the target score including the overall score and scores for all infotag-groups.","description":"\n⚠️ **DEPRECATED** - This endpoint is deprecated and will be removed on 31 May 2027.\n\n**Note**: Responses include a `Sunset` HTTP header (RFC 8594) indicating the removal date.\n\n---\n\n## Migration Required\n\nThis endpoint has been deprecated in favor of the Enterprise Export API. Please migrate to the new endpoint:\n\n### Replacement Endpoint\n\n| Old Endpoint | New Endpoint | Purpose |\n|--------------|--------------|---------|\n| `GET /public/v1/target/{systemId}/{targetId}/score` | `GET /public/v1/enterprise-export/scores` | Retrieve score data |\n\n---\n\n## Why Migrate?\n\nThe Enterprise Export API (`PublicEnterpriseExportController`) provides significant improvements:\n\n### 1. Bulk Operations\n- Retrieve scores for multiple targets in a single request\n- More efficient for large-scale integrations\n\n### 2. Automated Updates\n- Configure scheduled exports that run automatically\n- No need to poll individual endpoints\n\n### 3. Better Performance\n- Optimized for large-scale data retrieval\n- Consistent data calculation timestamps\n\n### 4. Error Handling\n- Detailed error logs for failed calculations\n- Better visibility into data quality issues\n\n---\n\n## Quick Migration Guide\n\n### Step 1: Configure Export Job\n\nUse `POST /public/v1/enterprise-export/scores/config` to set up your export configuration:\n\n```json\n{\n  \"runInterval\": \"DAILY\",\n  \"enabled\": true,\n  \"collectionIds\": [123, 456],\n  \"targetIds\": [102006215, 101641243],\n  \"perspectiveIds\": [1, 2],\n  \"includeComponents\": true\n}\n```\n\n### Step 2: Retrieve Scores\n\nUse `GET /public/v1/enterprise-export/scores` to retrieve score data:\n\n```http\nGET /public/v1/enterprise-export/scores?page=0&size=20\n```\n\nThe response includes all the same information as this endpoint, plus additional metadata:\n- Calculation timestamps\n- Risk levels\n- Edge numbers for target identification\n\n---\n\n## Current Endpoint Behavior\n\n**Required Permission**: `ACCESS_PUBLIC_TARGET_SCORE`\n\n**Performance impact**: Low\n\nReturns the target score including:\n- Overall target score\n- Scores for all infotag groups\n\nSupports filtering by:\n- Perspective ID (optional, defaults to user's perspective)\n- Group ID (optional)\n- Component (optional)\n- Subcomponent (optional)\n        ","operationId":"score","parameters":[{"name":"systemId","in":"path","description":"The system ID is an identifier to determine from which the targetId might originate from. Supported systemIds are \"prewave\", \"customer\", \"supplier\", \"own\".","required":true,"schema":{"type":"string"}},{"name":"targetId","in":"path","description":"The target ID can be the target's prewaveId or an external id (edge number) representing the site in another system.","required":true,"schema":{"type":"string"}},{"name":"perspectiveId","in":"query","description":"Id of the perspective, that should be used to calculate the target-score.","required":false,"schema":{"type":"integer","format":"int32"}},{"name":"groupId","in":"query","description":"Id of the group that items should be returned","required":false,"schema":{"type":"integer","format":"int32"}},{"name":"component","in":"query","description":"Filter by score component","required":false,"schema":{"$ref":"#/components/schemas/ScoreComponent"}},{"name":"subcomponent","in":"query","description":"Filter by score subcomponent","required":false,"schema":{"$ref":"#/components/schemas/ScoreSubcomponent"}}],"responses":{"200":{"description":"Target score successfully retrieved","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicTargetScore"},"examples":{"Score response example":{"summary":"Sample target score response","description":"Score response example","value":{"score":{"score":85,"riskLevel":"LOW"},"groups":[{"id":1,"name":"Environmental","score":90},{"id":2,"name":"Social","score":80}]}}}}}},"404":{"description":"Target not found or no permission to access it","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\": 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    }"}}}}}},"deprecated":true}},"/public/v1/target/{systemId}/{targetId}/score/{groupId}":{"get":{"tags":["Scores - Target"],"summary":"Get the event type scores for a infotag group","description":"\n⚠️ **DEPRECATED** - This endpoint is deprecated and will be removed on 31 May 2027.\n\n**Note**: Responses include a `Sunset` HTTP header (RFC 8594) indicating the removal date.\n\n---\n\n## Migration Required\n\nThis endpoint has been deprecated in favor of the Enterprise Export API. Please migrate to the new endpoint:\n\n### Replacement Endpoint\n\n| Old Endpoint | New Endpoint | Purpose |\n|--------------|--------------|---------|\n| `GET /public/v1/target/{systemId}/{targetId}/score/{groupId}` | `GET /public/v1/enterprise-export/scores` | Retrieve event type scores |\n\n---\n\n## Why Migrate?\n\nThe Enterprise Export API (`PublicEnterpriseExportController`) provides:\n- Event type scores when `includeComponents: true` is set in the configuration\n- Bulk retrieval for multiple targets\n- Automated scheduled exports\n- Better performance for large-scale operations\n\n---\n\n## Quick Migration Guide\n\n### Step 1: Configure Export Job with Components\n\nConfigure your export job to include components (which includes event type scores):\n\n```json\n{\n  \"runInterval\": \"DAILY\",\n  \"enabled\": true,\n  \"targetIds\": [102006215],\n  \"perspectiveIds\": [1],\n  \"includeComponents\": true\n}\n```\n\n### Step 2: Retrieve Event Type Scores\n\nUse `GET /public/v1/enterprise-export/scores` to retrieve score data with event type scores:\n\n```http\nGET /public/v1/enterprise-export/scores?page=0&size=20\n```\n\nThe response includes `groups` arrays with `eventTypes` when `includeComponents` is enabled.\n\n---\n\n## Current Endpoint Behavior\n\n**Required Permission**: `ACCESS_PUBLIC_TARGET_SCORE`\n\n**Performance impact**: Low\n\nReturns the event type scores for a specific infotag group, including:\n- Event type information\n- Event type score\n\nSupports filtering by:\n- Perspective ID (optional, defaults to user's perspective)\n- Component (optional)\n- Subcomponent (optional)\n        ","operationId":"scoreEventType","parameters":[{"name":"systemId","in":"path","description":"The system ID is an identifier to determine from which the targetId might originate from. Supported systemIds are \"prewave\", \"customer\", \"supplier\", \"own\".","required":true,"schema":{"type":"string"}},{"name":"targetId","in":"path","description":"The target ID can be the target's prewaveId or an external id (edge number) representing the site in another system.","required":true,"schema":{"type":"string"}},{"name":"groupId","in":"path","description":"Id of the group that items should be returned","required":true,"schema":{"type":"integer","format":"int32"}},{"name":"perspectiveId","in":"query","description":"Id of the perspective, that should be used to calculate the target-score.","required":false,"schema":{"type":"integer","format":"int32"}},{"name":"component","in":"query","description":"Filter by score component","required":false,"schema":{"$ref":"#/components/schemas/ScoreComponent"}},{"name":"subcomponent","in":"query","description":"Filter by score subcomponent","required":false,"schema":{"$ref":"#/components/schemas/ScoreSubcomponent"}}],"responses":{"200":{"description":"Event type scores successfully retrieved","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/PublicEventTypeScore"}},"examples":{"Event type scores response example":{"summary":"Sample event type scores response","description":"Event type scores response example","value":[{"eventType":{"id":1,"name":"Environmental Incident","type":"EVENT_TYPE"},"score":{"score":85,"riskLevel":"LOW"}}]}}}}},"404":{"description":"Target not found or no permission to access it","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\": 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    }"}}}}}},"deprecated":true}},"/public/v1/target/{systemId}/{targetId}/score-history":{"get":{"tags":["Scores - Target"],"summary":"The historical overall-score of the target for the last months, depending on the defined perspective","description":"\n⚠️ **DEPRECATED** - This endpoint is deprecated and will be removed on 31 May 2027.\n\n**Note**: Responses include a `Sunset` HTTP header (RFC 8594) indicating the removal date.\n\n---\n\n## Migration Required\n\nThis endpoint has been deprecated in favor of the Enterprise Export API. Please migrate to the new endpoint:\n\n### Replacement Endpoint\n\n| Old Endpoint | New Endpoint | Purpose |\n|--------------|--------------|---------|\n| `GET /public/v1/target/{systemId}/{targetId}/score-history` | `GET /public/v1/enterprise-export/scores` | Retrieve historical score data |\n\n---\n\n## Why Migrate?\n\nThe Enterprise Export API (`PublicEnterpriseExportController`) provides:\n- Historical score data with calculation timestamps\n- Bulk retrieval for multiple targets\n- Automated scheduled exports\n- Better performance for large-scale operations\n\n---\n\n## Quick Migration Guide\n\n### Step 1: Configure Export Job\n\nConfigure your export job to include historical data:\n\n```json\n{\n  \"runInterval\": \"DAILY\",\n  \"enabled\": true,\n  \"targetIds\": [102006215],\n  \"perspectiveIds\": [1],\n  \"includeComponents\": false\n}\n```\n\n### Step 2: Retrieve Historical Scores\n\nUse `GET /public/v1/enterprise-export/scores` to retrieve score data with timestamps:\n\n```http\nGET /public/v1/enterprise-export/scores?page=0&size=100\n```\n\nThe response includes `calculatedAt` timestamps that allow you to track score changes over time.\n\n---\n\n## Current Endpoint Behavior\n\n**Required Permission**: `ACCESS_PUBLIC_TARGET_SCORE`\n\n**Performance impact**: Low\n\nReturns the historical overall-score of the target for the last months, including:\n- Monthly scores\n- Month-over-month change\n- Year-over-year change\n- Maximum and minimum scores (overall and past year)\n\nSupports filtering by:\n- Perspective ID (optional, defaults to user's perspective)\n- Group ID (optional)\n- Component (optional)\n- Subcomponent (optional)\n        ","operationId":"scoreHistory","parameters":[{"name":"systemId","in":"path","description":"The system ID is an identifier to determine from which the targetId might originate from. Supported systemIds are \"prewave\", \"customer\", \"supplier\", \"own\".","required":true,"schema":{"type":"string"}},{"name":"targetId","in":"path","description":"The target ID can be the target's prewaveId or an external id (edge number) representing the site in another system.","required":true,"schema":{"type":"string"}},{"name":"groupId","in":"query","description":"Id of the group that items should be returned","required":false,"schema":{"type":"integer","format":"int32"}},{"name":"perspectiveId","in":"query","description":"Id of the perspective, that should be used to calculate the target-score.","required":false,"schema":{"type":"integer","format":"int32"}},{"name":"component","in":"query","description":"Filter by score component","required":false,"schema":{"$ref":"#/components/schemas/ScoreComponent"}},{"name":"subcomponent","in":"query","description":"Filter by score subcomponent","required":false,"schema":{"$ref":"#/components/schemas/ScoreSubcomponent"}}],"responses":{"200":{"description":"Target score history successfully retrieved","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicTargetScoreHistory"},"examples":{"Score history response example":{"summary":"Sample target score history response","description":"Score history response example","value":{"months":[{"month":"2024-01","score":85},{"month":"2024-02","score":87}],"monthChange":2,"yearChange":5,"max":95,"yearMax":90,"min":70,"yearMin":75}}}}}},"404":{"description":"Target not found or no permission to access it","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\": 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    }"}}}}}},"deprecated":true}},"/public/v1/target/{systemId}/{targetId}/score-components":{"get":{"tags":["Scores - Target"],"summary":"The current score for a target split up into the scoring components, depending on the defined perspective.","description":"\n⚠️ **DEPRECATED** - This endpoint is deprecated and will be removed on 31 May 2027.\n\n**Note**: Responses include a `Sunset` HTTP header (RFC 8594) indicating the removal date.\n\n---\n\n## Migration Required\n\nThis endpoint has been deprecated in favor of the Enterprise Export API. Please migrate to the new endpoint:\n\n### Replacement Endpoint\n\n| Old Endpoint | New Endpoint | Purpose |\n|--------------|--------------|---------|\n| `GET /public/v1/target/{systemId}/{targetId}/score-components` | `GET /public/v1/enterprise-export/scores` | Retrieve score components |\n\n---\n\n## Why Migrate?\n\nThe Enterprise Export API (`PublicEnterpriseExportController`) provides:\n- Score components and subcomponents when `includeComponents: true` is set in the configuration\n- Bulk retrieval for multiple targets\n- Automated scheduled exports\n- Better performance for large-scale operations\n\n---\n\n## Quick Migration Guide\n\n### Step 1: Configure Export Job with Components\n\nConfigure your export job to include components:\n\n```json\n{\n  \"runInterval\": \"DAILY\",\n  \"enabled\": true,\n  \"targetIds\": [102006215],\n  \"perspectiveIds\": [1],\n  \"includeComponents\": true\n}\n```\n\n### Step 2: Retrieve Score Components\n\nUse `GET /public/v1/enterprise-export/scores` to retrieve score data with components:\n\n```http\nGET /public/v1/enterprise-export/scores?page=0&size=20\n```\n\nThe response includes `components` and `subComponents` arrays when `includeComponents` is enabled.\n\n---\n\n## Current Endpoint Behavior\n\n**Required Permission**: `ACCESS_PUBLIC_TARGET_SCORE`\n\n**Performance impact**: Low\n\nReturns the current score for a target split up into scoring components, including:\n- Component type\n- Component score\n- List of subcomponents with their scores\n\nSupports filtering by:\n- Perspective ID (optional, defaults to user's perspective)\n- Group ID (optional)\n        ","operationId":"scoreComponents","parameters":[{"name":"systemId","in":"path","description":"The system ID is an identifier to determine from which the targetId might originate from. Supported systemIds are \"prewave\", \"customer\", \"supplier\", \"own\".","required":true,"schema":{"type":"string"}},{"name":"targetId","in":"path","description":"The target ID can be the target's prewaveId or an external id (edge number) representing the site in another system.","required":true,"schema":{"type":"string"}},{"name":"perspectiveId","in":"query","description":"Id of the perspective, that should be used to calculate the target-score.","required":false,"schema":{"type":"integer","format":"int32"}},{"name":"groupId","in":"query","description":"Id of the group that items should be returned","required":false,"schema":{"type":"integer","format":"int32"}}],"responses":{"200":{"description":"Target score components successfully retrieved","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/PublicTargetScoreComponents"}},"examples":{"Score components response example":{"summary":"Sample target score components response","description":"Score components response example","value":[{"component":"ENVIRONMENTAL","score":{"score":90,"riskLevel":"LOW"},"subcomponents":[{"subcomponent":"CARBON_FOOTPRINT","score":{"score":88,"riskLevel":"LOW"}}]}]}}}}},"404":{"description":"Target not found or no permission to access it","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\": 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    }"}}}}}},"deprecated":true}},"/public/v1/target/{systemId}/{targetId}/parents":{"get":{"tags":["Suppliers - Management"],"summary":"Get the parents of the target as a list.","description":"\nRetrieve parent targets for the specified target.\n\n**Required Permission**: `access_public_target_parents`\n\n**Performance impact**: Low\n    ","operationId":"targetParents","parameters":[{"name":"systemId","in":"path","description":"The system ID is an identifier to determine from which the targetId might originate from. Supported systemIds are \"prewave\", \"customer\", \"supplier\", \"own\".","required":true,"schema":{"type":"string"},"example":"prewave"},{"name":"targetId","in":"path","description":"The target ID can be the target's prewaveId or an external id (edge number) representing the site in another system.","required":true,"schema":{"type":"string"},"example":10422185},{"name":"pageable","in":"query","required":true,"schema":{"$ref":"#/components/schemas/Pageable"}}],"responses":{"200":{"description":"Successfully retrieved parent targets","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/PublicTargetDTO"}},"examples":{"Target parents example":{"summary":"Sample list of parent targets","description":"Target parents example","value":"[{\"id\":987654321,\"name\":\"Acme Corporation\",\"sname\":\"6252001\",\"logo\":\"/images/company-img/acme-corporation-logo.svg\",\"backgroundPicture\":\"/images/company-img/acme-corporation-bg.jpg\",\"description\":\"Global automotive supplier and parent organization of Acme Manufacturing Inc.\",\"website\":\"https://www.acme-corporation.example.com\",\"location\":\"Stuttgart, DE\",\"yearFounded\":1962,\"size\":\"Very large\",\"screened\":true,\"screenedStatus\":\"Screened\",\"linkedInId\":\"acme-corporation\",\"type\":{\"id\":5195261,\"type\":\"organization\",\"displayName\":\"Site Group\",\"pluralName\":\"Site Groups\",\"ordering\":0,\"scoring\":\"Alert\"},\"ctype\":{\"id\":972417,\"ctype\":\"company\",\"targetTypeId\":5195261,\"displayName\":\"Site Group\",\"pluralName\":\"Site Groups\",\"icon\":\"fas fa-building\",\"ordering\":0,\"priority\":0,\"connectable\":true,\"bgColor\":\"#E8F4FD\",\"textColor\":\"#1A365D\"},\"geo\":{\"geometry\":null,\"properties\":{\"name\":\"Stuttgart\",\"countryCode\":\"DE\",\"alertCount\":null,\"boundingBox\":null},\"type\":\"Feature\"},\"geoShape\":{\"geometry\":null,\"properties\":{\"name\":null,\"countryCode\":null,\"alertCount\":null,\"boundingBox\":null},\"type\":\"Feature\"},\"parents\":[],\"organization\":null,\"industries\":[{\"id\":554433221,\"name\":\"Automotive Manufacturing\",\"sname\":null,\"logo\":null,\"backgroundPicture\":null,\"description\":\"Industry classification for automotive parts and vehicle component manufacturing.\",\"website\":null,\"location\":\"Global\",\"yearFounded\":null,\"size\":null,\"screened\":true,\"screenedStatus\":\"Screened\",\"linkedInId\":null,\"type\":{\"id\":5195261,\"type\":\"organization\",\"displayName\":\"Site Group\",\"pluralName\":\"Site Groups\",\"ordering\":0,\"scoring\":\"Alert\"},\"ctype\":{\"id\":1122334,\"ctype\":\"industry\",\"targetTypeId\":5195261,\"displayName\":\"Industry\",\"pluralName\":\"Industries\",\"icon\":\"fas fa-industry\",\"ordering\":10,\"priority\":1,\"connectable\":false,\"bgColor\":\"#F0F0F0\",\"textColor\":\"#333333\"},\"geo\":{\"geometry\":null,\"properties\":{\"name\":null,\"countryCode\":null,\"alertCount\":null,\"boundingBox\":null},\"type\":\"Feature\"},\"geoShape\":{\"geometry\":null,\"properties\":{\"name\":null,\"countryCode\":null,\"alertCount\":null,\"boundingBox\":null},\"type\":\"Feature\"},\"parents\":[],\"organization\":null,\"industries\":[],\"monitoredSince\":null,\"ordering\":null,\"disruptionStatusUpdate\":null,\"own\":false,\"managed\":false,\"isPublic\":null,\"connectionContactsCount\":null,\"population\":null,\"following\":false,\"collectionFollowing\":false,\"tier\":null,\"path\":[],\"collectionLevel\":null,\"collectionPath\":[],\"collectionPaths\":[],\"foreignSystems\":[],\"scoreAvail\":\"None\",\"revenue\":123.456,\"impact\":\"Low\",\"hsCode\":[],\"merged_targets\":[]}],\"monitoredSince\":{\"date\":\"2018-01-10T09:00:00\",\"_datetype_\":\"DateTime\"},\"earliestAlert\":{\"date\":\"2019-04-12T14:30:00\",\"_datetype_\":\"DateTime\"},\"ordering\":0,\"disruptionStatusUpdate\":null,\"own\":true,\"managed\":true,\"isPublic\":true,\"connectionContactsCount\":12,\"population\":null,\"following\":true,\"collectionFollowing\":true,\"tier\":null,\"path\":[],\"collectionLevel\":1,\"collectionPath\":[{\"id\":42,\"name\":\"Tier-1 Suppliers\"}],\"collectionPaths\":[[{\"id\":42,\"name\":\"Tier-1 Suppliers\"}]],\"foreignSystems\":[{\"system\":\"customer\",\"id\":\"ACME-CORP-001\",\"source\":\"SAP\"}],\"scoreAvail\":\"Alert\",\"revenue\":8500000000,\"impact\":\"Low\",\"hsCode\":[{\"code\":\"870810\",\"nshipments\":128}],\"merged_targets\":[]}]"}}}}},"404":{"description":"Target not found or no permission to access it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorDTO"},"examples":{"Target not found":{"description":"Target not found","value":"{\"code\":\"resource_not_found\",\"message\":\"Target not found: systemId=customer, targetId=INVALID_ID\",\"solution\":\"Verify target ID and system ID are correct\"}"}}}}},"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    }"}}}}}}}},"/public/v1/target/{systemId}/{targetId}/alerts":{"get":{"tags":["Alerts"],"summary":"Get alerts for a specific target","description":"\nRetrieve alerts for a specific target identified by system ID and target ID.\n\nThis endpoint returns paginated alerts for a single target, supporting foreign system ID mapping.\nThe target can be identified using Prewave internal IDs or foreign system IDs (e.g., customer,\nsupplier, SAP IDs).\n\n**Response:**\nReturns a paginated list of alert objects. Each alert includes basic information (id, uuid, title, timestamps), event grouping, priority and classification details, location/geographic data, source links and media, infotags, primary target information, and collection paths. The response is wrapped in a Spring Data `Page` object with standard pagination fields. See the response schema for complete field definitions.\n\n**Note**: Fields with null values are omitted from the JSON response. This is standard JSON serialization behavior. Geographic information (`geo`) is only available if `includeGeo` query parameter is set to `true`.\n\n**Use Cases**:\n- Monitor alerts for a specific supplier\n- Track alerts for targets identified by external system IDs\n- Filter alerts by priority, date, or perspective\n- Export target-specific alerts for reporting\n\n**Target Identification**:\n- Supports Prewave internal IDs (`systemId=\"prewave\"`)\n- Supports foreign system IDs (e.g., `systemId=\"customer\"`, `systemId=\"supplier\"`)\n- Automatically resolves foreign IDs to Prewave target IDs\n\n**Filtering Options**:\n- **priorities**: Filter by alert priority levels (Low, Mid, High, Critical)\n- **newerThan**: Filter alerts newer than a timestamp (milliseconds)\n- **perspectiveId**: Filter by perspective (defaults to user's perspective)\n- **includeGeo**: Include geographic coordinates in response\n\n**Pagination**:\n- Results are paginated (default: 20 items per page)\n- Use `page` and `size` query parameters to control pagination\n\n**Required Permission**: `access_public_target_feed`\n\n**Performance Impact**: Medium\n    ","operationId":"targetAlerts","parameters":[{"name":"systemId","in":"path","description":"An identifier that indicates which system the targetId originates from. Supported values are \"prewave\", \"customer\", \"supplier\", \"own\".","required":true,"schema":{"type":"string"},"example":"prewave"},{"name":"targetId","in":"path","description":"The target ID can be the target's prewaveId or an external id (edge number) representing the site in another system.","required":true,"schema":{"type":"string"},"example":102006215},{"name":"newerThan","in":"query","description":"Only return alerts that are newer than the given timestamp (Timestamp in milliseconds since epoch)","required":false,"schema":{"type":"integer","format":"int64"},"example":1705312800000},{"name":"priorities","in":"query","description":"List of priorities to filter the feed by","required":false,"schema":{"type":"array","items":{"$ref":"#/components/schemas/Priority"}},"example":"High,Critical"},{"name":"includeGeo","in":"query","description":"If set to true, the response will include the geo information.","required":false,"schema":{"type":"boolean"},"example":true},{"name":"perspectiveId","in":"query","description":"The perspective ID to filter the alerts. If not provided, the user's perspective ID will be used.","required":false,"schema":{"type":"integer","format":"int32"},"example":1},{"name":"pageable","in":"query","required":true,"schema":{"$ref":"#/components/schemas/Pageable"}}],"responses":{"200":{"description":"Successfully retrieved target alerts","content":{"application/json":{"schema":{"type":"object","properties":{"content":{"type":"array","items":{"$ref":"#/components/schemas/PublicAlertDTO"}},"size":{"type":"integer","format":"int32"},"number":{"type":"integer","format":"int32"},"totalElements":{"type":"integer","format":"int32"},"totalPages":{"type":"integer","format":"int32"},"numberOfElements":{"type":"integer","format":"int32"},"first":{"type":"boolean"},"last":{"type":"boolean"},"empty":{"type":"boolean"}}},"examples":{"Target alerts example":{"summary":"Sample paginated alerts response for a target","description":"Target alerts example","value":"{\"content\":[{\"id\":12345,\"uuid\":\"a1b2c3d4-e5f6-7890-abcd-ef1234567890\",\"title\":\"Insolvency announced at Acme Manufacturing Inc\",\"createdAt\":1704067200000,\"predictedAtStart\":1703980800000,\"predictedAtEnd\":1704067199000,\"description\":\"Insolvency announced for Acme Manufacturing Inc on 15-01-2025\",\"event\":{\"uuid\":\"b2c3d4e5-f6a7-8901-bcde-f23456789012\"},\"locations\":[],\"links\":[{\"id\":null,\"url\":\"https://example.com/news/insolvency-acme-manufacturing\",\"title\":\"Insolvency announced for Acme Manufacturing Inc\",\"description\":\"Insolvency announced for Acme Manufacturing Inc on 15-01-2025\",\"pictureUrl\":null,\"originalLang\":null,\"originalTitle\":null,\"originalDescription\":null}],\"media\":[],\"infotags\":[{\"id\":1001,\"type\":{\"type\":\"event_type\",\"active\":true,\"displayName\":\"Event Type\",\"icon\":null,\"ordering\":10001,\"display\":true},\"value\":\"Insolvency\",\"svalue\":\"insolvency\",\"icon\":\"fa-kit fa-financial-stress\",\"numValue\":null,\"priority\":null,\"impactScore\":null}],\"primaryTargets\":[{\"target\":{\"id\":102006215,\"name\":\"Acme Manufacturing Inc\",\"sname\":null,\"logo\":null,\"backgroundPicture\":null,\"description\":null,\"website\":null,\"location\":\"Sample City, US\",\"yearFounded\":null,\"size\":null,\"screened\":true,\"screenedStatus\":null,\"linkedInId\":null,\"type\":{\"id\":1,\"type\":\"organization\",\"displayName\":\"Site Group\",\"pluralName\":\"Site Groups\",\"ordering\":null,\"scoring\":null},\"ctype\":{\"id\":1,\"ctype\":\"company\",\"targetTypeId\":1,\"displayName\":\"Company\",\"pluralName\":\"Companies\",\"icon\":\"fas fa-building\",\"ordering\":null,\"priority\":0,\"connectable\":false,\"bgColor\":\"#cccccc\",\"textColor\":\"#000000\"},\"geo\":{\"geometry\":null,\"properties\":{\"name\":null,\"countryCode\":null,\"alertCount\":null,\"boundingBox\":null},\"type\":\"Feature\"},\"geoShape\":{\"geometry\":null,\"properties\":{\"name\":null,\"countryCode\":null,\"alertCount\":null,\"boundingBox\":null},\"type\":\"Feature\"},\"parents\":[],\"organization\":null,\"industries\":[],\"monitoredSince\":null,\"ordering\":null,\"disruptionStatusUpdate\":null,\"own\":false,\"managed\":false,\"isPublic\":null,\"connectionContactsCount\":null,\"population\":null,\"following\":false,\"collectionFollowing\":false,\"tier\":null,\"path\":[],\"collectionLevel\":null,\"collectionPath\":[],\"collectionPaths\":[],\"foreignSystems\":[],\"scoreAvail\":\"None\",\"revenue\":null,\"impact\":null,\"hsCode\":[],\"mergedTargets\":[]},\"impactLevel\":{\"id\":4222469,\"level\":\"company\",\"displayName\":\"Site Group\",\"ordering\":10},\"impactScore\":null,\"priority\":\"Mid\"}],\"priority\":\"Critical\",\"priorityDetails\":{\"massDisruption\":false,\"brandMention\":false,\"rumour\":false,\"lowPeerRisk\":false,\"terminates\":false},\"collectionPath\":[],\"geo\":null}],\"pageable\":{\"pageNumber\":0,\"pageSize\":20,\"sort\":{\"empty\":true,\"sorted\":false,\"unsorted\":true},\"offset\":0,\"paged\":true,\"unpaged\":false},\"totalPages\":1,\"totalElements\":1,\"last\":true,\"size\":20,\"number\":0,\"numberOfElements\":1,\"sort\":{\"empty\":true,\"sorted\":false,\"unsorted\":true},\"first\":true,\"empty\":false}"}}}}},"400":{"description":"Bad Request - Invalid parameters (e.g., invalid timestamp, invalid priority values)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorDTO"}}}},"404":{"description":"Target not found or foreign system ID mapping not found","content":{"application/json":{"examples":{"Target not found":{"summary":"Error when target ID is invalid","description":"Target not found","value":"{\"code\":\"resource_not_found\",\"message\":\"Target not found: systemId=customer, targetId=INVALID_ID\",\"solution\":\"Verify target ID and system ID are correct\"}"}}}}},"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    }"}}}}}}}},"/public/v1/suppliers":{"get":{"tags":["Suppliers - Management"],"summary":"Get all suppliers of the customer","description":"⚠️ **DEPRECATED** - This endpoint is deprecated and will be removed on 31 May 2027.\n\n---\n\n## Migration Required\n\nThis endpoint has been replaced by the v2 Supplier Management API. Please migrate to the new endpoints:\n\n### Replacement Endpoints\n\n| Old Endpoint | New Endpoint | Purpose |\n|--------------|--------------|---------|\n| `GET /public/v1/suppliers` | `GET /public/v2/suppliers/sites` | List all suppliers |\n| `GET /public/v1/target/prewave/{targetId}` | `GET /public/v2/suppliers/sites/find-by-identifier?prewaveId={targetId}` | Get detailed supplier by ID |\n\n---\n\n## Why Migrate?\n\nThe v2 API provides significant improvements:\n\n### 1. Simplified Response Structure\n- **v1**: Returns complex `PublicTargetDTO` with 30+ fields including nested objects (parents, industries, collections, etc.)\n- **v2**: Returns `PublicSupplierV2DTO` with only essential fields:\n  - `prewaveTargetId` (Int)\n  - `name` (String)\n  - `address` (String?)\n  - `city` (String?)\n  - `countryCode` (String?)\n  - `supplierIds` (List<PublicSupplierIdentifierId>)\n\n**Example v2 Response:**\n```json\n{\n  \"content\": [\n    {\n      \"prewaveTargetId\": 102006215,\n      \"name\": \"Acme Corporation\",\n      \"address\": \"123 Main St, Vienna, Austria\",\n      \"city\": \"Vienna\",\n      \"countryCode\": \"AT\",\n      \"supplierIds\": [\n        {\"id\": \"SUP-12345\", \"source\": \"SAP\"}\n      ]\n    }\n  ]\n}\n```\n\n### 2. Better Documentation\n- Comprehensive examples for all endpoints\n- Detailed error response documentation\n- Clear parameter descriptions\n- Migration guidance and best practices\n\n### 3. Improved Consistency\n- Fixed alphabetical ordering (by name, then by ID) for deterministic pagination\n- Consistent response structure across all endpoints\n- Predictable behavior for integrations\n\n### 4. Target ID Stability Guidance\n- Clear documentation about when target IDs may change\n- Best practices for synchronization\n- Guidance on handling target merges\n\n### 5. Full CRUD Operations\n- `POST /public/v2/suppliers/sites` - Create suppliers\n- `DELETE /public/v2/suppliers/sites` - Deactivate suppliers\n- `GET /public/v2/suppliers/sites/pending` - Track pending creations\n\n### 6. Better Performance\n- Optimized database queries\n- Reduced response payload size (typically 60-80% smaller)\n- Faster response times\n\n---\n\n## Quick Migration Guide\n\n### Step 1: Update List Endpoint\n**Before:**\n```http\nGET /public/v1/suppliers?page=0&size=20\n```\n\n**After:**\n```http\nGET /public/v2/suppliers/sites?page=0&size=20\n```\n\n### Step 2: Update Response Parsing\n**Before:** Parse complex `PublicTargetDTO` with nested structures\n\n**After:** Parse simplified `PublicSupplierV2DTO` with flat structure\n\n### Step 3: Understand Sites vs Site-Groups\n⚠️ **Important**: The v2 endpoint returns **only sites** (physical locations), not site-groups.\n\n- **v1**: Included both sites and site-groups\n- **v2**: Includes only sites (physical locations with addresses)\n- **Result**: Total count may be lower in v2\n\nIf you need site-group information, you may need to adjust your integration logic or contact support for guidance.\n\n### Step 4: Get Detailed Information (if needed)\nIf you need detailed supplier information, use the v2 search endpoint:\n```http\nGET /public/v2/suppliers/sites/find-by-identifier?prewaveId={prewaveTargetId}\n```\n\n---\n\n## Breaking Changes\n\n1. **Response Structure**: The response structure is completely different. You'll need to update your response parsing logic.\n2. **Field Names**: Some field names have changed (e.g., `id` → `prewaveTargetId`).\n3. **Removed Fields**: Many fields from v1 are not available in the list endpoint (use the detail endpoint if needed).\n4. **Query Parameters**: The `hasNumber` parameter is not available in v2. Filter by supplier identifiers in your application logic if needed.\n5. **Sites vs Site-Groups**:\n   - **v1**: Returns both **sites** (physical locations/branches with addresses) and **site-groups** (general company owners without specific addresses)\n   - **v2**: Returns **only sites** (physical locations/branches with addresses). Site-groups are excluded\n   - **Impact**: The total number of elements returned by v2 may be **lower** than v1 because site-groups are excluded\n   - **Why**: The v2 API focuses on physical supplier locations (sites) which are more relevant for most integrations\n\n---\n\n**Required Permission**: `ACCESS_PUBLIC_SUPPLIERS`\n\n**Performance Impact**: Medium\n\nFor detailed migration examples and API reference, see the v2 Supplier Management API documentation.","operationId":"suppliers","parameters":[{"name":"hasNumber","in":"query","description":"If true, only suppliers that have at least one Supplier Information Number are returned. If false, only suppliers that do not have a Supplier Information Number are returned. If not provided, all suppliers are returned.","required":false,"schema":{"type":"boolean"}},{"name":"pageable","in":"query","required":true,"schema":{"$ref":"#/components/schemas/Pageable"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"object","properties":{"content":{"type":"array","items":{"$ref":"#/components/schemas/PublicTargetDTO"}},"size":{"type":"integer","format":"int32"},"number":{"type":"integer","format":"int32"},"totalElements":{"type":"integer","format":"int32"},"totalPages":{"type":"integer","format":"int32"},"numberOfElements":{"type":"integer","format":"int32"},"first":{"type":"boolean"},"last":{"type":"boolean"},"empty":{"type":"boolean"}}}}}},"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    }"}}}}}},"deprecated":true}},"/public/v1/suppliers/{systemId}/{targetId}/supplier-graph":{"get":{"tags":["Suppliers - Supplier Graph"],"summary":"Get a tree-structure of suppliers of the given target","description":"\n⚠️ **DEPRECATED** - This endpoint is deprecated and will be removed on 31 May 2027.\n\n---\n\n## Migration Required\n\nThis endpoint has been replaced by the v1 Collections Tier-N API. Please migrate to the new endpoint:\n\n### Replacement Endpoint\n\n| Old Endpoint | New Endpoint | Purpose |\n|--------------|--------------|---------|\n| `GET /public/v1/suppliers/{systemId}/{targetId}/supplier-graph` | `GET /public/v1/collections/{collectionId}/tier-n/data` | Get collection-based supplier graphs |\n\n---\n\n## Why Migrate?\n\nThe v1 Collections Tier-N API provides significant improvements:\n\n### 1. Collection-Based Approach\n- **v1**: Works with individual target IDs\n- **v1 Tier-N**: Works with collections, allowing you to analyze multiple suppliers together\n- **v1 Tier-N**: Better integration with collection management workflows\n- **v1 Tier-N**: Collection-level configuration for consistent analysis settings\n\n### 2. Enhanced Functionality\n- **v1**: Basic supplier graph with limited configuration\n- **v1 Tier-N**: Advanced filtering through collection settings\n- **v1 Tier-N**: Configurable data sources (customs, media, predictions)\n- **v1 Tier-N**: Better control over scope (private, shared, public targets)\n\n### 3. Improved Consistency\n- **v1**: Target-specific endpoint\n- **v1 Tier-N**: Aligned with collection-based API design\n- **v1 Tier-N**: Consistent with other collection management endpoints\n\n### 4. Better Documentation\n- Comprehensive examples for all endpoints\n- Detailed error response documentation\n- Clear parameter descriptions\n- Migration guidance and best practices\n\n---\n\n## Quick Migration Guide\n\n### Step 1: Identify Collection ID\n\n**Important**: The v1 Tier-N endpoint requires a collection ID instead of a target ID. If you don't have a collection yet:\n\n1. Create a collection using `POST /public/v1/collections`\n2. Add your target to the collection using `POST /public/v1/collections/{collectionId}/targets`\n3. Ensure the collection has tier-n enabled (`tiersEnabled: true`)\n\n### Step 2: Update Endpoint Call\n\n**Before:**\n```http\nGET /public/v1/suppliers/prewave/102006215/supplier-graph?tierLevel=3&commodityIds=101,102&filter={...}\n```\n\n**After:**\n```http\nGET /public/v1/collections/123/tier-n/data?tierLevel=3&commodityIds=101,102\n```\n\n### Step 3: Update Request Parameters\n\n**v1 Parameters**:\n- `systemId`: System identifier (path parameter)\n- `targetId`: Target identifier (path parameter)\n- `tierLevel`: Maximum tier level (query parameter, max 4)\n- `commodityIds`: List of commodity IDs (query parameter)\n- `filter`: Complex filter object (query parameter)\n- `commodityTreeId`: Commodity tree ID (query parameter)\n- `fetchParents`: Include parents (query parameter, default: true)\n\n**v1 Tier-N Parameters**:\n- `collectionId`: Collection identifier (path parameter)\n- `tierLevel`: Maximum tier level (query parameter, max 4)\n- `commodityIds`: List of commodity IDs (query parameter)\n- `commodityTreeId`: Commodity tree ID (query parameter)\n- Filter options can be configured in collection settings using `PUT /public/v1/collections/{collectionId}/tier-n/settings`\n\n### Step 4: Configure Collection Settings (Optional)\n\nFor advanced filtering, configure collection settings:\n\n```http\nPUT /public/v1/collections/123/tier-n/settings\n{\n\"maxTier\": 3,\n\"scopePrivate\": true,\n\"scopeShared\": true,\n\"sourceCustoms\": true,\n\"sourceMedia\": true,\n\"minShipments\": 5,\n\"probability\": 75\n}\n```\n\n---\n\n## Breaking Changes\n\n1. **Endpoint Path**: Changed from `/public/v1/suppliers/{systemId}/{targetId}/supplier-graph` to `/public/v1/collections/{collectionId}/tier-n/data`\n2. **Path Parameters**:\n- **v1**: Requires `systemId` and `targetId`\n- **v1 Tier-N**: Requires `collectionId` (collection-based approach)\n3. **Filter Configuration**:\n- **v1**: Filter passed as query parameter object\n- **v1 Tier-N**: Filter options configured in collection settings or passed as separate query parameters\n4. **Response Structure**: May differ slightly - review response format\n5. **Collection Requirement**: v1 Tier-N requires targets to be part of a collection\n\n---\n\n## Important Notes\n\n### Collection Requirement\n- The v1 Tier-N endpoint requires targets to be part of a collection\n- If you're currently using this endpoint with individual targets, you'll need to:\n1. Create or identify a collection containing your target\n2. Ensure the collection has tier-n enabled (`tiersEnabled: true`)\n3. Use the collection ID instead of target ID\n\n### Filter Migration\n- Complex filter objects from v1 should be migrated to collection settings\n- Use `GET /public/v1/collections/{collectionId}/tier-n/settings` to view current settings\n- Use `PUT /public/v1/collections/{collectionId}/tier-n/settings` to configure filters\n\n---\n\n**Required Permission**: `ACCESS_PUBLIC_SUPPLIER_GRAPH`\n\n**Performance Impact**: High\n\nFor detailed API reference and examples, see the v1 Collections Tier-N API documentation.\n","operationId":"findSupplierGraph_2","parameters":[{"name":"systemId","in":"path","description":"The system ID is an identifier to determine from which the targetId might originate from. Supported systemIds are \"prewave\", \"customer\", \"supplier\", \"own\".","required":true,"schema":{"type":"string"},"example":"prewave"},{"name":"targetId","in":"path","description":"The target ID can be the target's prewaveId or an external id (edge number) representing the site in another system.","required":true,"schema":{"type":"string"},"example":10422185},{"name":"tierLevel","in":"query","description":"Defines the maximum limit of tiers that should be fetched. Must be <=4","required":false,"schema":{"maximum":4,"type":"integer","format":"int32"},"example":3},{"name":"commodityIds","in":"query","description":"List of commodity ids to filter the supplier graph","required":false,"schema":{"type":"array","items":{"type":"integer","format":"int32"}},"example":"101, 102, 103"},{"name":"commodityTreeId","in":"query","description":"Represents a collection of commodityIds","required":false,"schema":{"type":"integer","format":"int32"},"example":456},{"name":"filter","in":"query","description":"Filter object used for specifying limiting criteria for retrieving targets, affects both the targets and edge data in relation to the affected organization which queries the data.\n\n - **q**                     *[TARGET & EDGE]* - a query term by which target details (target name or existing edge details\n                                             (edge number WITHOUT edge number source are used as condition)\n\n - **collections**           *[TARGET]* - a list of collection ids to filter in any which the target needs to exist\n\n - **commodityIds**          *[TARGET & EDGE]* - a list of commodity infotag ids by which the target needs to be associated with any\n\n - **tt**                    *[TARGET]* - a list of target types the target needs to be assigned\n\n - **tier**                  *[EDGE]* - a list of tiers by which to filter the targets by, in relation to the organization as a supplier\n\n - **scope**                 *[EDGE]* - defines the visibilities of edge connections to the affected target\n                                    (if an edge is restricted to the affected customer it's 'Private',\n                                    otherwise it's 'Shared' if the edge is shared to the organization by\n                                    a different organization)\n\n - **source**                *[EDGE]* - determines edge source that should be considered (either 'Customer', 'Customs', 'Media' or 'PrewavePrediction')\n\n - **country**               *[TARGET]* - a list of infotag ids for countries which the target is assigned to any\n                                      (`country_id` column in the target, generally only for POI targets)\n\n - **hscode**                *[EDGE]* - a list of codes by which the target is associated to via an edge's HS code\n\n - **ods**                    *[TARGET]* - only direct suppliers (true/false)\n\n - **lastShipment**           *[EDGE]* - a date which determines a cut-off point after which the latest shipment must have happened regardless of HS Codes\n                                    (if `hscodes` are supplied it's already taken care of by the time this filter is applied, otherwise filters over all HS Codes)","required":true,"schema":{"$ref":"#/components/schemas/TargetSuppliersFilter"}},{"name":"fetchParents","in":"query","description":"Defines whether the parents of the targets should be included in the result.","required":false,"schema":{"type":"boolean","default":true},"example":true}],"responses":{"200":{"description":"Successfully retrieved supplier graph","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/PublicTreeTargetV1"}},"examples":{"Supplier graph example":{"summary":"Sample supplier tree structure","description":"Supplier graph example","value":[{"target":10422185,"suppliers":[{"target":101641243,"suppliers":[],"tier":1,"path":[10422185],"edgeSource":"Shared","merged_targets":[]}],"tier":0,"path":[],"edgeSource":"Public Media","merged_targets":[]}]}}}}},"400":{"description":"Invalid request parameters (e.g., tier level > 4)","content":{"application/json":{}}},"404":{"description":"Target not found or not accessible to the user","content":{"application/json":{}}},"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    }"}}}}}},"deprecated":true}},"/public/v1/sites-upsert/{requestId}/matched-targets":{"get":{"tags":["Suppliers - Sites Upsert"],"summary":"Get details of matched targets.","description":"\n\n⚠️ **DEPRECATED** - This endpoint is deprecated and will be removed on 31 May 2027.\n\n**Migration:** `POST /public/v2/suppliers/sites` to create sites, `GET /public/v2/suppliers/sites/pending` to track processing.\n\nRetrieve targets matched during processing of a site upsert request.\n\n**Required permission:** `create_sites_upsert_requests`\n\n**Performance impact:** Low\n    ","operationId":"getMatchedTargets","parameters":[{"name":"requestId","in":"path","description":"The ID of a sites upsert request. Use this ID to check the status of the request and to retrieve dry-run ids.","required":true,"schema":{"type":"string","format":"uuid"},"example":"550e8400-e29b-41d4-a716-446655440001"}],"responses":{"200":{"description":"Successfully retrieved matched targets","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/PublicSitesUpsertMatchedTarget"}},"examples":{"Matched targets":{"summary":"Target matched to a submitted site reference","description":"Matched targets","value":"[{\"targetId\":102006215,\"name\":\"Acme Manufacturing Inc\",\"createdAt\":{\"date\":\"2026-01-15T11:00:00\",\"_datetype_\":\"DateTime\"},\"edgeNumbers\":[{\"number\":\"ERP-12345\",\"source\":\"erp\",\"existingEdgeId\":null},{\"number\":\"ACME-VIE-001\",\"source\":\"erp\",\"existingEdgeId\":null}]}]"}}}}},"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    }"}}}}}},"deprecated":true}},"/public/v1/sites-upsert/{requestId}/dry-runs":{"get":{"tags":["Suppliers - Sites Upsert"],"summary":"Get the list of dry runs for a specific request.","description":"\n\n⚠️ **DEPRECATED** - This endpoint is deprecated and will be removed on 31 May 2027.\n\n**Migration:** `POST /public/v2/suppliers/sites` to create sites, `GET /public/v2/suppliers/sites/pending` to track processing.\n\nList dry runs associated with a site upsert request. Use a dry-run ID with the dry-run report endpoint.\n\n**Required permission:** `create_sites_upsert_requests`\n\n**Performance impact:** Low\n    ","operationId":"getDryRuns","parameters":[{"name":"requestId","in":"path","description":"The ID of a sites upsert request. Use this ID to check the status of the request and to retrieve dry-run ids.","required":true,"schema":{"type":"string","format":"uuid"},"example":"550e8400-e29b-41d4-a716-446655440001"}],"responses":{"200":{"description":"Successfully retrieved dry runs","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/SitesUpsertDryRunDTO"}},"examples":{"Dry run list":{"summary":"Dry runs created for a request","description":"Dry run list","value":"[{\"requestId\":\"550e8400-e29b-41d4-a716-446655440001\",\"dryRunId\":\"660e8400-e29b-41d4-a716-446655440001\",\"time\":{\"date\":\"2026-01-15T10:35:00\",\"_datetype_\":\"DateTime\"}}]"},"No dry runs":{"summary":"Request has no dry runs yet","description":"No dry runs","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    }"}}}}}},"deprecated":true}},"/public/v1/sites-upsert/requests":{"get":{"tags":["Suppliers - Sites Upsert"],"summary":"List all site upsert requests for your organisation.","description":"\n\n⚠️ **DEPRECATED** - This endpoint is deprecated and will be removed on 31 May 2027.\n\n**Migration:** `POST /public/v2/suppliers/sites` to create sites, `GET /public/v2/suppliers/sites/pending` to track processing.\n\nList all site upsert requests for your organisation. The organisation is determined by your API user or API token.\n\n**Required permission:** `create_sites_upsert_requests`\n\n**Performance impact:** Low\n","operationId":"listRequests_1","responses":{"200":{"description":"Successfully retrieved site upsert requests","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/PublicSitesUpsertRequestEntry"}},"examples":{"Site upsert request list":{"summary":"Requests in progress and completed","description":"Site upsert request list","value":"[{\"requestId\":\"550e8400-e29b-41d4-a716-446655440001\",\"status\":\"Work in progress\",\"created\":\"2026-01-15T10:30:00Z\"},{\"requestId\":\"550e8400-e29b-41d4-a716-446655440002\",\"status\":\"Done\",\"created\":\"2026-01-10T14:00:00Z\"}]"},"No requests":{"summary":"Organisation has no site upsert requests yet","description":"No requests","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    }"}}}}}},"deprecated":true}},"/public/v1/sites-upsert/full/{requestId}":{"get":{"tags":["Suppliers - Sites Upsert"],"summary":"Get the status of a specific site upsert request.","description":"\n\n⚠️ **DEPRECATED** - This endpoint is deprecated and will be removed on 31 May 2027.\n\n**Migration:** `POST /public/v2/suppliers/sites` to create sites, `GET /public/v2/suppliers/sites/pending` to track processing.\n\nRetrieve processing status and per-site outcomes for a site upsert request.\n\n**Required permission:** `create_sites_upsert_requests`\n\n**Performance impact:** Low\n    ","operationId":"fullLoadStatus","parameters":[{"name":"requestId","in":"path","description":"The ID of a sites upsert request. Use this ID to check the status of the request and to retrieve dry-run ids.","required":true,"schema":{"type":"string","format":"uuid"},"example":"550e8400-e29b-41d4-a716-446655440001"}],"responses":{"200":{"description":"Successfully retrieved request status","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SitesUpsertRequestStatusResponse"},"examples":{"Request status with mixed site outcomes":{"summary":"Sites in Done, Work in progress, and Failed states","description":"Request status with mixed site outcomes","value":"{\"status\":\"Work in progress\",\"reason\":null,\"sites\":[{\"id\":1,\"yourReference\":\"ERP-12345\",\"yourReferenceSource\":\"erp\",\"status\":\"Done\",\"statusText\":null,\"prewaveId\":102006215},{\"id\":2,\"yourReference\":\"ERP-67890\",\"yourReferenceSource\":\"erp\",\"status\":\"Work in progress\",\"statusText\":\"Matching supplier in Prewave network\",\"prewaveId\":null},{\"id\":3,\"yourReference\":\"ERP-INVALID\",\"yourReferenceSource\":\"erp\",\"status\":\"Failed\",\"statusText\":\"Country code must be a valid ISO 3166-1 alpha-2 code\",\"prewaveId\":null}]}"}}}}},"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    }"}}}}}},"deprecated":true}},"/public/v1/sites-upsert/dry-run/{dryRunId}":{"get":{"tags":["Suppliers - Sites Upsert"],"summary":"Download the dry-run results report.","description":"\n\n⚠️ **DEPRECATED** - This endpoint is deprecated and will be removed on 31 May 2027.\n\n**Migration:** `POST /public/v2/suppliers/sites` to create sites, `GET /public/v2/suppliers/sites/pending` to track processing.\n\nDownload an Excel report for a dry run. Obtain the dry-run ID from the `{requestId}/dry-runs` endpoint.\n\n**Required permission:** `create_sites_upsert_requests`\n\n**Performance impact:** Low\n    ","operationId":"getDryRunReport","parameters":[{"name":"dryRunId","in":"path","description":"Dry-run ID","required":true,"schema":{"type":"string","format":"uuid"},"example":"660e8400-e29b-41d4-a716-446655440001"}],"responses":{"200":{"description":"Excel spreadsheet containing dry-run results","content":{"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet":{}}},"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    }"}}}}}},"deprecated":true}},"/public/v1/scores/externals/event-types":{"get":{"tags":["Scores - Externals"],"summary":"List event types for a perspective","description":"\nLists event types configured for a perspective—the risk dimensions you can score (e.g. Carbon, Flood). Use this before a bulk upload so your integration sends event type keys that match what customers see in the product.\n\n**When to use this**\n- Planning a score import: see which event types apply before building the file or API payload.\n- Explaining to stakeholders which risk dimensions external scores can refer to for that perspective.\n- Troubleshooting failed uploads: compare your source data with the keys returned here.\n\n**Typical workflow**\n1. Call this endpoint with a `perspectiveId` your API token can access.\n2. Use the returned `eventTypeKey` values when uploading scores.\n3. If some rows fail on upload, check whether the event type key exists in this list.\n\n**Note:** Upload may still accept event type keys that exist globally but are not listed here. Keys that do not exist at all are reported in the upload response `errors`.\n\n**Required permission:** `access_public_internal_score`\n        ","operationId":"listExternalScoreEventTypes","parameters":[{"name":"perspectiveId","in":"query","description":"Perspective to list event types for. Use the same perspective as your uploads or reads when possible. Your API token must have access to this perspective.","required":true,"schema":{"type":"integer","format":"int32"},"example":5484774}],"responses":{"200":{"description":"Event types configured for this perspective. Each row includes an event type key (`eventTypeKey`) and a display name.","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/PublicExternalScoreEventTypeDTO"}},"examples":{"Event types — sample":{"summary":"Event types configured for the perspective","description":"Event types — sample","value":"[{\"id\":101,\"eventTypeKey\":\"carbon\",\"name\":\"Carbon\"},{\"id\":102,\"eventTypeKey\":\"flood\",\"name\":\"Flood\"},{\"id\":103,\"eventTypeKey\":\"credit_risk\",\"name\":\"Credit Risk\"},{\"id\":104,\"eventTypeKey\":\"water_stress\",\"name\":\"Water Stress\"}]"},"Event types - empty":{"summary":"No event types configured for this perspective","description":"Empty list — no event types are set up for this perspective in Prewave.","value":"[]"}}}}},"400":{"description":"Perspective ID is missing — add `perspectiveId` to the request.","content":{"application/json":{}}},"403":{"description":"This perspective is not available for your account.","content":{"application/json":{}}},"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    }"}}}}}}}},"/public/v1/network/{collectionId}/tree-graph":{"get":{"tags":["Collections - Network (deprecated)"],"summary":"Get tree graph for a collection","description":"\n⚠️ **DEPRECATED** - This endpoint is deprecated and will be removed on 31 May 2027.\n\n**Note**: Responses include a `Sunset` HTTP header (RFC 8594) indicating the removal date.\n\n---\n\nRetrieve a hierarchical tree structure showing supplier relationships within a collection.\n\nThis endpoint returns a tree graph representing the supply chain network, showing how suppliers\nare connected through multiple tiers. Each node in the tree represents a target (supplier/customer),\nand edges represent relationships between them.\n\n**Use Cases**:\n- Visualize supplier network structure\n- Analyze supply chain depth and breadth\n- Identify direct and indirect suppliers\n- Map relationships across multiple tiers\n\n**Filtering Options**:\n- **commodityIds**: Filter results to include only targets associated with specific commodities\n- **commodityTreeId**: Filter using a predefined commodity tree\n- **tierLevel**: Limit the depth of the tree (maximum 4 tiers)\n- **fetchParents**: Include parent organizations in the results\n\n**Response Format**:\nReturns an array of tree nodes, where each node contains:\n- Target information\n- Supplier relationships (nested structure)\n- Tier information\n- Edge source information\n\n**Required Permissions**: `ACCESS_PUBLIC_TREE_GRAPH` and `READ` on the collection\n\n**Performance Impact**: High\n        ","operationId":"treeGraph_1","parameters":[{"name":"collectionId","in":"path","required":true,"schema":{"type":"integer","format":"int32"}},{"name":"commodityIds","in":"query","required":false,"schema":{"type":"array","items":{"type":"integer","format":"int32"}}},{"name":"commodityTreeId","in":"query","required":false,"schema":{"type":"integer","format":"int32"}},{"name":"fetchParents","in":"query","required":false,"schema":{"type":"boolean","default":true}},{"name":"tierLevel","in":"query","required":false,"schema":{"maximum":4,"type":"integer","format":"int32"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/PublicTreeTargetV1"}}}}},"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    }"}}}}}},"deprecated":true}},"/public/v1/network/{collectionId}/commodity-graph":{"get":{"tags":["Collections - Network (deprecated)"],"summary":"Get commodity graph for a collection","description":"\n⚠️ **DEPRECATED** - This endpoint is deprecated and will be removed on 31 May 2027.\n\n**Note**: Responses include a `Sunset` HTTP header (RFC 8594) indicating the removal date.\n\n---\n\n## Migration Required\n\nThis endpoint has been replaced by the v2 Network API. Please migrate to the new endpoint:\n\n### Replacement Endpoint\n\n| Old Endpoint | New Endpoint | Purpose |\n|--------------|--------------|---------|\n| `GET /public/v1/network/{collectionId}/commodity-graph` | `GET /public/v2/network/{collectionId}/commodity-graph` | Get commodity graph for a collection |\n\n---\n\n## Why Migrate?\n\nThe v2 Network API provides improvements:\n\n### 1. Enhanced Response Structure\n- **v1**: Returns `PublicTreeTargetV1` structure\n- **v2**: Returns `PublicTreeTargetV2` structure with additional metadata\n- **v2**: Better organized response format\n\n### 2. Improved Consistency\n- **v2**: Aligned with other v2 API endpoints\n- **v2**: Consistent response structures across network endpoints\n\n### 3. Better Documentation\n- Comprehensive examples for all endpoints\n- Detailed error response documentation\n- Clear parameter descriptions\n\n---\n\n## Quick Migration Guide\n\n### Step 1: Update Endpoint URL\n\n**Before:**\n```http\nGET /public/v1/network/123/commodity-graph\n```\n\n**After:**\n```http\nGET /public/v2/network/123/commodity-graph\n```\n\n### Step 2: Update Response Parsing\n\n**Before:** Parse `PublicTreeTargetV1` structure\n\n**After:** Parse `PublicTreeTargetV2` structure (may have additional fields)\n\n---\n\n## Breaking Changes\n\n1. **Endpoint Path**: Changed from `/public/v1/network/{collectionId}/commodity-graph` to `/public/v2/network/{collectionId}/commodity-graph`\n2. **Response Structure**: Returns `PublicTreeTargetV2` instead of `PublicTreeTargetV1` (may have additional fields)\n\n---\n\n**Required Permissions**: `ACCESS_PUBLIC_COMMODITY_GRAPH` and `READ` on the collection\n\n**Performance Impact**: High\n        ","operationId":"commodityGraph_1","parameters":[{"name":"collectionId","in":"path","required":true,"schema":{"type":"integer","format":"int32"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/PublicTreeTargetV1"}}}}},"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    }"}}}}}},"deprecated":true}},"/public/v1/network/tree/{commodityTreeId}/commodity-graph":{"get":{"tags":["Collections - Network (deprecated)"],"summary":"Get commodity graph for a commodity tree","description":"\n⚠️ **DEPRECATED** - This endpoint is deprecated and will be removed on 31 May 2027.\n\n**Note**: Responses include a `Sunset` HTTP header (RFC 8594) indicating the removal date.\n\n---\n\n## Migration Required\n\nThis endpoint has been replaced by the v2 Network API. Please migrate to the new endpoint:\n\n### Replacement Endpoint\n\n| Old Endpoint | New Endpoint | Purpose |\n|--------------|--------------|---------|\n| `GET /public/v1/network/tree/{commodityTreeId}/commodity-graph` | `GET /public/v2/network/tree/{commodityTreeId}/commodity-graph` | Get commodity graph for a commodity tree |\n\n---\n\n## Why Migrate?\n\nThe v2 Network API provides improvements:\n\n### 1. Enhanced Response Structure\n- **v1**: Returns `PublicTreeTargetV1` structure\n- **v2**: Returns `PublicTreeTargetV2` structure with additional metadata\n- **v2**: Better organized response format\n\n### 2. Improved Consistency\n- **v2**: Aligned with other v2 API endpoints\n- **v2**: Consistent response structures across network endpoints\n\n### 3. Better Documentation\n- Comprehensive examples for all endpoints\n- Detailed error response documentation\n- Clear parameter descriptions\n\n---\n\n## Quick Migration Guide\n\n### Step 1: Update Endpoint URL\n\n**Before:**\n```http\nGET /public/v1/network/tree/456/commodity-graph\n```\n\n**After:**\n```http\nGET /public/v2/network/tree/456/commodity-graph\n```\n\n### Step 2: Update Response Parsing\n\n**Before:** Parse `PublicTreeTargetV1` structure\n\n**After:** Parse `PublicTreeTargetV2` structure (may have additional fields)\n\n---\n\n## Breaking Changes\n\n1. **Endpoint Path**: Changed from `/public/v1/network/tree/{commodityTreeId}/commodity-graph` to `/public/v2/network/tree/{commodityTreeId}/commodity-graph`\n2. **Response Structure**: Returns `PublicTreeTargetV2` instead of `PublicTreeTargetV1` (may have additional fields)\n\n---\n\n**Required Permission**: `ACCESS_PUBLIC_COMMODITY_GRAPH`\n\n**Performance Impact**: High\n        ","operationId":"treeCommodityGraph_1","parameters":[{"name":"commodityTreeId","in":"path","required":true,"schema":{"type":"integer","format":"int32"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/PublicTreeTargetV1"}}}}},"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    }"}}}}}},"deprecated":true}},"/public/v1/infotags":{"get":{"tags":["Infotags"],"summary":"Get public feed infotags","description":"\nRetrieve reference infotags used to interpret alert and feed data.\n\nReturns public infotags for the following types: `alert_status`, `event_type`, `risk_level`, `industry`,\nand `location`. Each entry includes the infotag ID, type, optional short code (`svalue`), and display name.\n\n**Use cases**:\n- Resolve infotag IDs and codes when consuming alert feeds\n- Populate filter dropdowns for event types, risk levels, and locations\n- Map short codes to human-readable labels\n\n**Required permission:** `access_public_infotags`\n\n**Performance impact:** Low\n    ","operationId":"infotags","responses":{"200":{"description":"List of public feed infotags.","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/PublicSimplifiedInfotagDTO"}},"examples":{"Feed infotags":{"summary":"Event types, risk levels, locations, and related reference values","description":"Feed infotags","value":"[{\"id\":101,\"type\":\"event_type\",\"svalue\":\"carbon\",\"value\":\"Carbon emissions\"},{\"id\":102,\"type\":\"event_type\",\"svalue\":\"credit_risk\",\"value\":\"Credit risk\"},{\"id\":103,\"type\":\"event_type\",\"svalue\":\"fire\",\"value\":\"Fire\"},{\"id\":201,\"type\":\"risk_level\",\"svalue\":\"low\",\"value\":\"Low\"},{\"id\":202,\"type\":\"risk_level\",\"svalue\":\"mid\",\"value\":\"Mid\"},{\"id\":203,\"type\":\"risk_level\",\"svalue\":\"high\",\"value\":\"High\"},{\"id\":301,\"type\":\"location\",\"svalue\":null,\"value\":\"Vienna\"},{\"id\":302,\"type\":\"location\",\"svalue\":null,\"value\":\"Stuttgart\"},{\"id\":401,\"type\":\"industry\",\"svalue\":\"I_AUTOMOTIVE\",\"value\":\"Automotive\"},{\"id\":501,\"type\":\"alert_status\",\"svalue\":\"confirmed\",\"value\":\"Confirmed\"}]"},"No infotags":{"summary":"No public feed infotags are configured","description":"No infotags","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    }"}}}}}}}},"/public/v1/infotags/groups":{"get":{"tags":["Infotags"],"summary":"Get infotag groups for the current user","description":"\nRetrieve infotag groups available to the authenticated user.\n\nInfotag groups cluster related event types—for example Environmental or Social—and are used when\nworking with scores, alerts, and feed filters.\n\n**Use cases**:\n- List groups the current user can access\n- Resolve group IDs when filtering alerts or scores by category\n\n**Required permission:** `access_public_infotags`\n\n**Performance impact:** Low\n    ","operationId":"infotagGroups","responses":{"200":{"description":"List of infotag groups for the current user.","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/PublicInfotagGroup"}},"examples":{"Infotag groups":{"summary":"Groups such as Environmental and Social","description":"Infotag groups","value":"[{\"id\":1,\"name\":\"Environmental\",\"sname\":\"E\"},{\"id\":2,\"name\":\"Social\",\"sname\":\"S\"},{\"id\":3,\"name\":\"Financial Stress\",\"sname\":\"Financial\"},{\"id\":4,\"name\":\"Legal Stress\",\"sname\":\"Legal\"}]"},"No groups":{"summary":"User has no infotag groups assigned","description":"No groups","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    }"}}}}}}}},"/public/v1/industries":{"get":{"tags":["Suppliers - Industries"],"summary":"List Prewave industries","description":"\nRetrieve Prewave industry catalog entries that can be associated with a supplier on create.\n\nUse the returned `name` values in the optional `industries` field of\n`POST /public/v2/suppliers/sites`. Matching is case-insensitive. Commodities are not included.\n\n**Required permission:** `access_public_connect_target`\n\n**Performance impact:** Low\n    ","operationId":"listPublicIndustries","responses":{"200":{"description":"List of Prewave industries ordered by name.","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/PublicIndustryV1DTO"}},"examples":{"Industries":{"summary":"Industry catalog entries with id and display name","description":"Industries","value":"[{\"id\":101,\"name\":\"Automotive\"},{\"id\":102,\"name\":\"Electronics\"},{\"id\":103,\"name\":\"Manufacturing\"}]"},"No industries":{"summary":"No industries are available in the catalog","description":"No industries","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    }"}}}}}}}},"/public/v1/feed":{"get":{"tags":["Alerts"],"summary":"Get all alerts of the current user's feed","description":"\n⚠️ **DEPRECATED** - This endpoint is deprecated and will be removed on May 31, 2027. Use `GET /public/v2/feed` instead.\n\n**Note**: Responses include a `Sunset` HTTP header (RFC 8594) indicating the removal date.\n\n---\n\n## Migration Required\n\nMigrate to `GET /public/v2/feed`. Same required permission: `access_public_user_feed`.\n\n| V1 | V2 |\n|----|----|\n| `/public/v1/feed` | `/public/v2/feed` |\n| `collectionId` | `collectionIds` |\n| `from` or `newerThan` (milliseconds) | `from` only; UTC ISO 8601 (e.g. `2024-01-01T00:00:00Z`) |\n| Numeric timestamps in the response | ISO 8601 UTC strings |\n\nV2 also adds `to`, `timeFilterBy`, `minTier` / `maxTier`, structured `eventTypes` / `eventTypeGroups` / `alertTypes` / `labels` (replacing `infotags`), and `relevancy` (replacing `statusId`). See the V2 operation documentation and the public API changelog (Q3 2026) for the full migration guide.\n\n---\n\n## Current Endpoint Behavior\n\nRetrieve all alerts for targets that are in collections with feed delivery enabled.\n\nThis endpoint returns paginated alerts filtered by various criteria. Alerts are returned for targets\nthat belong to collections where feed delivery is enabled. Results are ordered by newest first.\n\n**Response:**\nReturns a paginated list of alert objects. Each alert includes basic information (id, uuid, title, timestamps), event grouping, priority and classification details, location/geographic data, source links and media, infotags, primary target information, and collection paths. The response is wrapped in a Spring Data `Page` object with standard pagination fields. See the response schema for complete field definitions.\n\n**Note**: Fields with null values are omitted from the JSON response. This is standard JSON serialization behavior. Geographic information (`geo`) is only available if `includeGeo` query parameter is set to `true`.\n\n**Required Permission**: `access_public_user_feed`\n\n**Performance Impact**: Medium\n        ","operationId":"alertFeed_1","parameters":[{"name":"collectionId","in":"query","description":"Collection IDs to filter the feed by. Only alerts for targets in these collections will be returned. Obtain collection IDs from `GET /public/v1/collections` endpoint.","required":false,"schema":{"type":"array","items":{"type":"integer","format":"int32"}},"example":"123,456"},{"name":"newerThan","in":"query","description":"⚠️ **DEPRECATED** - Use `from` parameter instead. Only return alerts that are newer than the given timestamp (Timestamp in milliseconds). This parameter is deprecated in favor of ISO 8601 date format.","required":false,"deprecated":true,"schema":{"type":"integer","format":"int64"}},{"name":"from","in":"query","description":"Only return alerts that are newer than the given date. Use ISO 8601 format (e.g., 2020-12-31T23:59). This parameter replaces the deprecated `newerThan` parameter.","required":false,"schema":{"type":"string","format":"date-time"},"example":"2020-12-31T23:59"},{"name":"perspectiveId","in":"query","description":"Perspective ID to filter the feed by. Defaults to the user's default perspective. The perspective determines which risk factors and scoring weights are applied to alerts.","required":false,"schema":{"type":"integer","format":"int32"},"example":1},{"name":"priorities","in":"query","description":"List of priorities to filter the feed by","required":false,"schema":{"type":"array","items":{"$ref":"#/components/schemas/Priority"}},"example":"High,Critical"},{"name":"includeGeo","in":"query","description":"If set to true, the response will include the geo information.","required":false,"schema":{"type":"boolean"},"example":true},{"name":"impactLevelIds","in":"query","description":"Impact level IDs to filter the feed by. Only alerts with these impact levels will be returned.","required":false,"schema":{"type":"array","items":{"type":"integer","format":"int32"}},"example":"1,2,3"},{"name":"pageable","in":"query","required":true,"schema":{"$ref":"#/components/schemas/Pageable"}}],"responses":{"200":{"description":"Successfully retrieved alerts","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SchemaPublicAlertDTO"},"examples":{"Alerts feed example":{"summary":"Sample paginated alerts response","description":"Alerts feed example","value":{"content":[{"id":12345,"uuid":"a1b2c3d4-e5f6-7890-abcd-ef1234567890","title":"Industry Update happens at Acme Corporation","createdAt":1704067200000,"predictedAtStart":1703980800000,"predictedAtEnd":1704067199000,"description":"Acme Corporation is implementing new sustainability measures following industry best practices. The company has announced a comprehensive plan to reduce carbon emissions and improve supply chain transparency.","event":{"uuid":"b2c3d4e5-f6a7-8901-bcde-f23456789012"},"locations":[],"links":[{"url":"https://example.com/news/acme-sustainability-initiative","title":"Acme Corporation announces sustainability initiative","description":"Acme Corporation has announced a comprehensive plan to reduce carbon emissions and improve supply chain transparency."}],"media":[{"url":"/images/twitter-img/example-image.jpg","mimeType":"image/jpeg"}],"infotags":[{"id":1001,"type":{"type":"alert_type","active":false,"displayName":"Alert Status","icon":"far fa-bell","ordering":1,"display":true},"value":"happens / occurs","svalue":"happens"},{"id":2001,"type":{"type":"event_type","active":false,"displayName":"Event Type","ordering":10001,"display":true},"value":"Industry Update","svalue":"industry_update","icon":"fas fa-bullhorn","priority":"Low"}],"primaryTargets":[{"target":{"id":102006215,"name":"Acme Corporation","logo":"/images/company-img/8258b578a63d8e9ea222e66fd6f578b12fa32c14cdb04779fc9d42b215bd2aeb.svg","screened":false,"type":{"id":5195261,"type":"organization","displayName":"Site Group","pluralName":"","ordering":0,"scoring":"Alert"},"ctype":{"id":972417,"ctype":"company","targetTypeId":5195261,"displayName":"Site Group","pluralName":"","icon":"fas fa-building","ordering":0,"priority":0,"connectable":false,"bgColor":"","textColor":""},"geo":{"properties":{},"type":"Feature"},"geoShape":{"properties":{},"type":"Feature"},"parents":[],"industries":[],"own":false,"managed":false,"following":false,"collectionFollowing":false,"tier":1,"path":[{"id":102006215,"name":"Acme Corporation","foreignSystems":[]}],"collectionPath":[],"collectionPaths":[],"foreignSystems":[],"scoreAvail":"None","hsCode":[],"merged_targets":[]},"impactLevel":{"id":7513328,"level":"tier2","displayName":"Tier-2","ordering":100},"priority":"Mid"}],"priority":"Low","priorityDetails":{"massDisruption":false,"brandMention":false,"rumour":false,"lowPeerRisk":false,"terminates":false},"collectionPath":[],"geo":{"properties":{},"type":"Feature"}}],"size":20,"number":0,"totalElements":150,"totalPages":8,"numberOfElements":20}}}}}},"400":{"description":"Bad Request - Invalid parameters (e.g., invalid date format, invalid priority values)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorDTO"},"examples":{"Invalid date format":{"summary":"Error when date format is invalid","description":"Invalid date format","value":{"code":"invalid_request","message":"Invalid date format for parameter 'from'. Expected ISO 8601 format (e.g., 2020-12-31T23:59)","solution":"Use ISO 8601 date format: YYYY-MM-DDTHH:mm"}}}}}},"404":{"description":"Collection not found or not accessible","content":{"application/json":{"examples":{"Collection not found":{"summary":"Error when collection ID is invalid","description":"Collection not found","value":{"code":"resource_not_found","message":"Collection [999] not found","solution":"Verify collection IDs using GET /public/v1/collections"}}}}}},"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    }"}}}}}},"deprecated":true}},"/public/v1/enterprise-export/scores":{"get":{"tags":["Scores - Enterprise Export"],"summary":"Retrieve Latest Score Results","description":"\nRetrieve a paginated list of the most recent score results for the authenticated user.\n\nThis endpoint returns score data generated by the user's configured export job from the most recent successful execution. Results include:\n- Target information (ID, name, supplier identifiers)\n- Perspective details (ID, name)\n- Calculated scores and risk levels\n- Action priority when enabled for the export account in the database, using the same Supply Chain Analysis matrix logic as `GET/POST /v2/analysis/matrix-targets/{targetId}?perspectiveId=...`\n- Score components and subcomponents (if enabled in configuration)\n- Calculation timestamps\n\n**Data Source:**\n- Results are automatically generated based on the user's export configuration and run interval\n- This endpoint returns data from the **last successful execution** only\n- Results are paginated for efficient data retrieval\n- If no export job has been configured or no results are available, an empty page is returned\n\n**Response:**\nReturns a paginated list of score entries. Each entry includes target information (ID, name, supplier identifiers), perspective details, calculated scores, risk levels, action priority when available, and optionally score components/subcomponents if enabled in configuration. See the response schema for complete field definitions.\n\n**Pagination:**\n- Results are paginated for efficient data retrieval\n- Use query parameters to control pagination:\n  - `page`: Page number (0-indexed, default: 0)\n  - `size`: Number of items per page (default: 20)\n- Results are ordered by calculation timestamp (most recent first)\n\n**Important: Target ID Stability**\n\n✅ **This endpoint always returns correct target IDs**\n\nThe `targetId` field in each score entry represents the current, correct Prewave Target ID. If a target merge or consolidation occurred after a score was calculated, the system automatically updates the stored target ID to reflect the current, merged target. You can rely on the `targetId` values returned by this endpoint as the authoritative source for current target identifiers.\n\n⚠️ **However, target IDs may change over time** due to target merges or data consolidation. When this happens:\n- The target's edge numbers, edge data, and collection memberships are automatically moved to a new target\n- This endpoint automatically updates score entries to reference the new `targetId` after a merge occurs\n- To find the current `targetId` for a supplier independently, use `GET /public/v2/suppliers/sites` and match by supplier identifiers from the `supplierIds` field\n\n**Target ID Stability:**\n- Once a supplier has been **screened** (indicated by `screened: true` when retrieving supplier details via `GET /public/v2/suppliers/sites/find-by-identifier?prewaveId={targetId}`), the chance of `targetId` changing becomes very low\n- Target ID changes can still occur for screened suppliers, but this is rare\n- Unscreened suppliers (`screened: false`) have a higher likelihood of ID changes during data consolidation\n\n**How This Affects Score Results:**\n- Score entries are initially associated with the `targetId` that existed at the time the score was calculated\n- If a target merge occurs after score calculation, this endpoint automatically updates the stored `targetId` to the current, merged target ID\n- All score entries returned by this endpoint always reference the current, correct `targetId`\n- The `edgeNumbers` field in each score entry provides additional stable identifiers (like SAP IDs, Coupa IDs) for mapping to your internal systems\n\n💡 **Tip for Integrations:**\n- Use the `edgeNumbers` field as a stable identifier for mapping scores to your internal systems (e.g., SAP IDs, Coupa IDs)\n- For regular synchronization, use `GET /public/v2/suppliers/sites` to always have the latest `targetId` values mapped to your supplier identifiers\n- When matching scores to suppliers, prefer matching by supplier identifiers rather than `targetId` for better reliability\n- For screened suppliers (`screened: true`), the `targetId` is more stable, but periodic synchronization is still recommended\n- For unscreened suppliers, more frequent synchronization is advisable\n\n**Note**: Fields with null values (`riskLevel`, `actionPriority`, `groups`, `components`, `subComponents`) are omitted from the JSON response. This is standard JSON serialization behavior.\n\n**Required Permission**: `ACCESS_ENTERPRISE_EXPORT_API`\n        ","operationId":"getScoreResults","parameters":[{"name":"page","in":"query","description":"Zero-based page index (0..N)","required":false,"schema":{"minimum":0,"type":"integer","default":0}},{"name":"size","in":"query","description":"The size of the page to be returned","required":false,"schema":{"minimum":1,"type":"integer","default":20}},{"name":"sort","in":"query","description":"Sorting criteria in the format: property,(asc|desc). Default sort order is ascending. Multiple sort criteria are supported.","required":false,"schema":{"type":"array","items":{"type":"string"}}}],"responses":{"200":{"description":"Score results successfully retrieved. Returns a paginated response containing score data entries from the most recent successful execution.","content":{"application/json":{"schema":{"type":"object","properties":{"content":{"type":"array","items":{"$ref":"#/components/schemas/PublicScoreDataEntry"}},"size":{"type":"integer","format":"int32"},"number":{"type":"integer","format":"int32"},"totalElements":{"type":"integer","format":"int32"},"totalPages":{"type":"integer","format":"int32"},"numberOfElements":{"type":"integer","format":"int32"},"first":{"type":"boolean"},"last":{"type":"boolean"},"empty":{"type":"boolean"}}},"examples":{"Score results - Basic":{"summary":"Sample paginated score results response","description":"Basic score results without components. Action priority is included when available. Note: Fields with null values (such as `riskLevel`, `actionPriority`, `groups`, `components`, `subComponents`) are omitted from the JSON response.","value":{"content":[{"targetId":102006215,"targetName":"Inter Cars SA","edgeNumbers":[{"number":"SUP-12345","source":"SAP","existingEdgeId":102006215},{"number":"BNOID-67890","existingEdgeId":102006215}],"perspectiveId":1,"perspectiveName":"LKSG","calculatedAt":"2025-01-20T10:30:00","score":85,"riskLevel":"LOW","actionPriority":{"value":68,"riskLevel":"High"}},{"targetId":101641243,"targetName":"Acme Corporation","edgeNumbers":[{"number":"COUPA-54321","source":"Coupa","existingEdgeId":101641243}],"perspectiveId":1,"perspectiveName":"LKSG","calculatedAt":"2025-01-20T10:30:00","score":92,"riskLevel":"LOW","actionPriority":{"value":42,"riskLevel":"Mid"}}],"size":20,"number":0,"totalElements":150,"totalPages":8,"numberOfElements":20}},"Score results - With Components":{"summary":"Score results with detailed components enabled","description":"Score results when `includeComponents` is enabled in the configuration. Includes action priority when available, plus groups, components, and subComponents.","value":{"content":[{"targetId":102006215,"targetName":"Inter Cars SA","edgeNumbers":[{"number":"SUP-12345","source":"SAP","existingEdgeId":102006215}],"perspectiveId":1,"perspectiveName":"LKSG","calculatedAt":"2025-01-20T10:30:00","score":85,"riskLevel":"LOW","actionPriority":{"value":68,"riskLevel":"High"},"groups":[{"id":1,"name":"Environmental","score":90,"riskLevel":"LOW"},{"id":2,"name":"Social","score":80,"riskLevel":"MEDIUM"}],"components":[{"name":"Carbon Footprint","score":88,"riskLevel":"LOW"},{"name":"Water Usage","score":92,"riskLevel":"LOW"}],"subComponents":[{"name":"Scope 1 Emissions","score":92,"riskLevel":"LOW"},{"name":"Scope 2 Emissions","score":85,"riskLevel":"MEDIUM"}]}],"size":20,"number":0,"totalElements":150,"totalPages":8,"numberOfElements":20}},"Score results - Empty":{"summary":"Empty results when no scores available","description":"When no export job has been configured or no results are available yet, an empty page is returned.","value":{"content":[],"size":20,"number":0,"totalElements":0,"totalPages":0,"numberOfElements":0}}}}}},"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    }"}}}}}}}},"/public/v1/enterprise-export/scores/errors":{"get":{"tags":["Scores - Enterprise Export"],"summary":"Retrieve Score Generation Errors","description":"\nRetrieve a paginated list of error logs related to score generation for the authenticated user.\n\nThis endpoint returns detailed error information for targets and perspectives where score calculation failed during the most recent successful export job execution. Use this endpoint to identify and troubleshoot issues that prevented score calculation for specific target-perspective combinations.\n\n**Data Source:**\n- Error logs are from the **last successful execution** only (errors from failed executions are not included)\n- Errors are only recorded for execution units that failed during score calculation\n- If no errors occurred during the last execution, an empty page is returned\n- Results are paginated for efficient data retrieval\n\n**Response:**\nReturns a paginated list of error entries. Each entry includes the target ID, perspective ID, timestamp when the error occurred, and a list of error messages explaining why score calculation failed. See the response schema for complete field definitions.\n\n**Common Error Causes:**\n\nErrors are typically caused by:\n- **Missing or invalid target data**: Target may have been deleted, deactivated, or is inaccessible\n- **Insufficient data for score calculation**: Not enough data points available to calculate a reliable score\n- **Invalid perspective configuration**: Perspective may not be properly configured or accessible\n- **Target not in perspective scope**: Target may not be included in the perspective's scope\n- **System processing issues**: Temporary system issues during score calculation\n- **Data quality issues**: Missing required data fields or invalid data formats\n\n**Pagination:**\n- Results are paginated for efficient data retrieval\n- Use query parameters to control pagination:\n  - `page`: Page number (0-indexed, default: 0)\n  - `size`: Number of items per page (default: 20)\n- Results are ordered by error timestamp (most recent first)\n\n**Important: Target ID Stability**\n\n✅ **This endpoint always returns correct target IDs**\n\nThe `targetId` field in each error entry represents the current, correct Prewave Target ID. If a target merge or consolidation occurred after an error was recorded, the system automatically updates the stored target ID to reflect the current, merged target. You can rely on the `targetId` values returned by this endpoint as the authoritative source for current target identifiers.\n\n⚠️ **However, target IDs may change over time** due to target merges or data consolidation. When this happens:\n- The target's supplier identifiers, edge data, and collection memberships are automatically moved to a new target\n- This endpoint automatically updates error entries to reference the new `targetId` after a merge occurs\n- To find the current `targetId` for a supplier independently, use `GET /public/v2/suppliers/sites` and match by supplier identifiers\n\n**Target ID Stability:**\n- Once a supplier has been **screened** (indicated by `screened: true` when retrieving supplier details via `GET /public/v2/suppliers/sites/find-by-identifier?prewaveId={targetId}`), the chance of `targetId` changing becomes very low\n- Target ID changes can still occur for screened suppliers, but this is rare\n- Unscreened suppliers (`screened: false`) have a higher likelihood of ID changes during data consolidation\n\n**How This Affects Error Logs:**\n- Error entries are initially associated with the `targetId` that existed at the time the error occurred\n- If a target merge occurs after an error was recorded, this endpoint automatically updates the stored `targetId` to the current, merged target ID\n- All error entries returned by this endpoint always reference the current, correct `targetId`\n\n**Using Error Information:**\n\n1. **Identify Issues**: Review error messages to understand why score calculation failed\n2. **Fix Configuration**: Update your export configuration if targets or perspectives are invalid\n3. **Verify Access**: Ensure you have access to the targets and perspectives referenced in errors\n4. **Monitor Trends**: Track error patterns over time to identify systemic issues\n5. **Retry After Fixes**: After fixing configuration issues, wait for the next scheduled execution to see if errors are resolved\n\n**Note**: This endpoint only returns errors from the most recent successful execution. If an entire execution fails, no error logs will be available via this endpoint.\n\n**Required Permission**: `ACCESS_ENTERPRISE_EXPORT_API`\n        ","operationId":"getScoreGenerationErrors","parameters":[{"name":"page","in":"query","description":"Zero-based page index (0..N)","required":false,"schema":{"minimum":0,"type":"integer","default":0}},{"name":"size","in":"query","description":"The size of the page to be returned","required":false,"schema":{"minimum":1,"type":"integer","default":20}},{"name":"sort","in":"query","description":"Sorting criteria in the format: property,(asc|desc). Default sort order is ascending. Multiple sort criteria are supported.","required":false,"schema":{"type":"array","items":{"type":"string"}}}],"responses":{"200":{"description":"Error logs successfully retrieved. Returns a paginated response containing error entries from the most recent successful execution.","content":{"application/json":{"schema":{"type":"object","description":"Paginated response containing error log entries"},"examples":{"Error logs - Multiple errors":{"summary":"Sample paginated error logs response","description":"Error logs showing multiple targets with different error types. Each entry represents a target-perspective combination that failed during score calculation.","value":{"content":[{"targetId":102006215,"perspectiveId":1,"calculatedAt":"2025-01-20T10:30:00","errors":["Insufficient data for score calculation","Missing ESG indicators for target"]},{"targetId":101641243,"perspectiveId":2,"calculatedAt":"2025-01-20T10:30:00","errors":["Target not found in perspective scope"]},{"targetId":10422185,"perspectiveId":1,"calculatedAt":"2025-01-20T10:30:00","errors":["Target data is incomplete","Required data fields are missing"]}],"size":20,"number":0,"totalElements":5,"totalPages":1,"numberOfElements":3}},"Error logs - Single error":{"summary":"Response with single error entry","description":"A single target-perspective combination that failed with one error message.","value":{"content":[{"targetId":102006215,"perspectiveId":1,"calculatedAt":"2025-01-20T10:30:00","errors":["Insufficient data for score calculation"]}],"size":20,"number":0,"totalElements":1,"totalPages":1,"numberOfElements":1}},"Error logs - Empty":{"summary":"No errors occurred","description":"When no errors occurred during the last execution, an empty page is returned.","value":{"content":[],"size":20,"number":0,"totalElements":0,"totalPages":0,"numberOfElements":0}}}}}},"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    }"}}}}}}}},"/public/v1/collections/{collectionId}/tier-n/data":{"get":{"tags":["Collections - Tier-N"],"summary":"Get tier-n collection supplier graph","description":"\n### Overview\nRetrieve a stream of supplier relationship data for a tier-n enabled collection.\n\n**Effective tier** = `tier` if provided, otherwise `maxTier` (request override, else collection setting, else 1). That value selects the response mode:\n- **Effective tier = 1**: Collection membership rows only — each supplier in the collection with the customer organization as `customerTargetId`. Edge/discovery fields (`source`, `probability`, `mediaSources`, `nShipments`, `shipments`) are null and omitted from JSON.\n- **Effective tier ≥ 2**: Membership rows first (same shape as tier 1), then suppliers discovered via tier-n traversal from collection members. Relative to each collection member: response `tier` 1 = that member's direct suppliers, tier 2+ = indirect (suppliers of suppliers). Distinguish membership from traversal `\"tier\": 1` by `customerTargetId` = organization and `source` omitted/null.\n\n**Request `tier` vs response `tier`:** In traversal rows, response `tier` is relative to each collection member — not a copy of the request parameter. Example: `?tier=3` can still return traversal rows with `\"tier\": 1` (a collection member's direct supplier). Membership rows always use `\"tier\": 1` with the organization as `customerTargetId`.\n\n### Examples\n- `GET .../tier-n/data?tier=1` → membership only (see \"Membership\" example): `[{ \"tier\": 1, \"supplierTargetId\": …, \"customerTargetId\": <organizationId> }, …]`\n- `GET .../tier-n/data?tier=3` → membership first, then traversal up to tier 3 relative to collection members (see \"Traversal\" example); e.g. membership `\"tier\": 1` with organization as `customerTargetId`, then traversal `\"tier\": 1` = that member's direct suppliers, `\"tier\": 2` = indirect, and so on\n- Omitting `tier` uses `maxTier` (query override, else collection setting, else 1). If that resolves to 1, you get membership only — common when the collection's `maxTier` is 1\n\n### Response Format\n- JSON array of entries (`tier`, `supplierTargetId`, `customerTargetId`, and optional `source` / probability / media / shipment fields).\n- Null-valued fields are omitted. Optional edge fields appear based on query params only on traversal rows (e.g. `includeMediaSources`, `includeShipmentDetails`). Membership rows have no edge data.\n\n### Query Parameters\nAll optional. They override collection defaults from `GET .../tier-n/settings`.\n- At **effective tier = 1**, filter and include parameters (`source`, `hsCodes`, `lastShipment`, `includeMediaSources`, `includeShipmentDetails`, scope/source overrides, etc.) are **ignored** — the response is always unfiltered membership.\n- At **effective tier ≥ 2**, those parameters apply to discovered (traversal) relationships only; membership rows remain unfiltered.\n\n### Performance\n- For traversal, filter by `source` or `hsCodes` to reduce response size. Higher effective tier / `maxTier` increases data volume and response time.\n\n### Related Operations\n- **Settings**: [GET /public/v1/collections/{collectionId}/tier-n/settings](#operations-Collections_-_Tier-N-getTierNCollectionSettings)\n- **Update settings**: [PUT /public/v1/collections/{collectionId}/tier-n/settings](#operations-Collections_-_Tier-N-updateTierNCollectionSettings)\n\n### Required Permission\n`access_public_supplier_graph`, `access_collection`, and `read` on the collection.\n    ","operationId":"getTierNCollectionGraph","parameters":[{"name":"collectionId","in":"path","description":"Unique identifier of the tier-n collection. Same as the `id` from GET /public/v1/collections. The collection must have tiersEnabled=true.","required":true,"schema":{"type":"integer","format":"int32"},"example":123},{"name":"includeCommodityFilter","in":"query","description":"Include commodity filter metadata in the response. When true, adds commodity filter information to help understand data scope and filtering applied.","required":false,"schema":{"type":"boolean","description":"Include commodity filter metadata in the response. When true, adds commodity filter information to help understand data scope and filtering applied.","example":true},"example":true},{"name":"includeMediaSources","in":"query","description":"Include media source URLs for MEDIA-type relationships (traversal only; ignored when effective tier = 1). When true, adds `mediaSources` array with URLs used to derive the relationship from news/media sources.","required":false,"schema":{"type":"boolean","description":"Include media source URLs for MEDIA-type relationships (traversal only; ignored when effective tier = 1). When true, adds `mediaSources` array with URLs used to derive the relationship from news/media sources.","example":false},"example":false},{"name":"includeShipmentDetails","in":"query","description":"Include detailed shipment information per HS code (traversal only; ignored when effective tier = 1). When true, adds `shipments` array with shipment counts and dates broken down by product code.","required":false,"schema":{"type":"boolean","description":"Include detailed shipment information per HS code (traversal only; ignored when effective tier = 1). When true, adds `shipments` array with shipment counts and dates broken down by product code.","example":false},"example":false},{"name":"tier","in":"query","description":"Sets the effective tier when provided (otherwise effective tier = maxTier). Effective tier 1 = collection membership only (edge fields omitted; other query filters ignored). Effective tier ≥ 2 = membership rows first, then traversal; traversal response `tier` is relative to each collection member (1 = that member's direct suppliers, 2+ = indirect), not a copy of this parameter. Range: 1-9.","required":false,"schema":{"type":"integer","description":"Sets the effective tier when provided (otherwise effective tier = maxTier). Effective tier 1 = collection membership only (edge fields omitted; other query filters ignored). Effective tier ≥ 2 = membership rows first, then traversal; traversal response `tier` is relative to each collection member (1 = that member's direct suppliers, 2+ = indirect), not a copy of this parameter. Range: 1-9.","format":"int32","example":2},"example":2},{"name":"source","in":"query","description":"Filter by data source type (traversal only; ignored when effective tier = 1). Valid values: Customs (shipment data), Media (news/media), Customer (customer data), PrewavePrediction (AI predictions). If not specified, uses all enabled sources.","required":false,"schema":{"$ref":"#/components/schemas/EdgeSource"},"example":"Customs"},{"name":"lastShipment","in":"query","description":"Only include suppliers with shipments since this date (traversal only; ignored when effective tier = 1). Format: YYYY-MM-DD.","required":false,"schema":{"type":"string","description":"Only include suppliers with shipments since this date (traversal only; ignored when effective tier = 1). Format: YYYY-MM-DD.","example":"2024-01-01"},"example":"2024-01-01"},{"name":"hsCodes","in":"query","description":"Filter by specific HS codes, comma-separated (traversal only; ignored when effective tier = 1). Example: 847330,940161","required":false,"schema":{"type":"string","description":"Filter by specific HS codes, comma-separated (traversal only; ignored when effective tier = 1). Example: 847330,940161","example":"847330,940161"},"example":"847330,940161"},{"name":"maxTier","in":"query","description":"Override the collection maxTier setting. When `tier` is omitted, this value is also the effective tier (1 = membership only with other filters ignored; ≥ 2 = membership plus traversal up to that tier relative to collection members). Higher values may increase response time and data volume. Range: 1-9.","required":false,"schema":{"type":"integer","description":"Override the collection maxTier setting. When `tier` is omitted, this value is also the effective tier (1 = membership only with other filters ignored; ≥ 2 = membership plus traversal up to that tier relative to collection members). Higher values may increase response time and data volume. Range: 1-9.","format":"int32","example":4},"example":4},{"name":"scopePrivate","in":"query","description":"Override collection setting: include private targets in scope. When true, includes relationships involving private targets (typically internal company data).","required":false,"schema":{"type":"boolean","description":"Override collection setting: include private targets in scope. When true, includes relationships involving private targets (typically internal company data).","example":true},"example":true},{"name":"scopeShared","in":"query","description":"Override collection setting: include shared targets in scope. When true, includes relationships involving shared targets (typically partner/team data).","required":false,"schema":{"type":"boolean","description":"Override collection setting: include shared targets in scope. When true, includes relationships involving shared targets (typically partner/team data).","example":true},"example":true},{"name":"scopePublic","in":"query","description":"Override collection setting: include public targets in scope. When true, includes relationships involving public targets (typically open/public data).","required":false,"schema":{"type":"boolean","description":"Override collection setting: include public targets in scope. When true, includes relationships involving public targets (typically open/public data).","example":false},"example":false},{"name":"sourceCustomer","in":"query","description":"Override collection setting: include customer data sources. When true, includes relationships derived from customer-provided data.","required":false,"schema":{"type":"boolean","description":"Override collection setting: include customer data sources. When true, includes relationships derived from customer-provided data.","example":true},"example":true},{"name":"sourceCustoms","in":"query","description":"Override collection setting: include customs data sources. When true, includes relationships derived from customs/shipment data (most reliable source).","required":false,"schema":{"type":"boolean","description":"Override collection setting: include customs data sources. When true, includes relationships derived from customs/shipment data (most reliable source).","example":true},"example":true},{"name":"sourceMedia","in":"query","description":"Override collection setting: include media data sources. When true, includes relationships derived from media/news sources (may be less reliable).","required":false,"schema":{"type":"boolean","description":"Override collection setting: include media data sources. When true, includes relationships derived from media/news sources (may be less reliable).","example":false},"example":false},{"name":"sourcePrewavePrediction","in":"query","description":"Override collection setting: include Prewave prediction data sources. When true, includes AI-predicted relationships with probability scores.","required":false,"schema":{"type":"boolean","description":"Override collection setting: include Prewave prediction data sources. When true, includes AI-predicted relationships with probability scores.","example":true},"example":true},{"name":"minShipments","in":"query","description":"Override collection setting: minimum number of shipments required for a relationship to be included. Higher values filter out less established relationships. Range: 0+.","required":false,"schema":{"type":"integer","description":"Override collection setting: minimum number of shipments required for a relationship to be included. Higher values filter out less established relationships. Range: 0+.","format":"int32","example":10},"example":10},{"name":"probability","in":"query","description":"Override collection setting: minimum probability threshold for predicted relationships. Range: 0-100. Higher values return only high-confidence predictions.","required":false,"schema":{"type":"integer","description":"Override collection setting: minimum probability threshold for predicted relationships. Range: 0-100. Higher values return only high-confidence predictions.","format":"int32","example":80},"example":80},{"name":"shipmentsPeriodFrom","in":"query","description":"Override collection setting: start date for shipment period analysis. Format: YYYY-MM-DD. Only relationships with shipments in this period are considered.","required":false,"schema":{"type":"string","description":"Override collection setting: start date for shipment period analysis. Format: YYYY-MM-DD. Only relationships with shipments in this period are considered.","example":"2024-06-01"},"example":"2024-06-01"},{"name":"shipmentsPeriodTo","in":"query","description":"Override collection setting: end date for shipment period analysis. Format: YYYY-MM-DD. Only relationships with shipments in this period are considered.","required":false,"schema":{"type":"string","description":"Override collection setting: end date for shipment period analysis. Format: YYYY-MM-DD. Only relationships with shipments in this period are considered.","example":"2024-11-30"},"example":"2024-11-30"},{"name":"suspectedSuppliers","in":"query","description":"Override collection setting: include suspected suppliers. When true, includes suppliers flagged as potentially risky or suspicious.","required":false,"schema":{"type":"boolean","description":"Override collection setting: include suspected suppliers. When true, includes suppliers flagged as potentially risky or suspicious.","example":false},"example":false},{"name":"logisticsProvider","in":"query","description":"Override collection setting: include logistics providers. When true, includes companies that provide logistics services rather than direct suppliers.","required":false,"schema":{"type":"boolean","description":"Override collection setting: include logistics providers. When true, includes companies that provide logistics services rather than direct suppliers.","example":false},"example":false}],"responses":{"200":{"description":"Successfully retrieved tier-n collection supplier graph.","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/PublicTierNCollectionGraphEntry"}},"examples":{"Tier-N Graph - Membership (effective tier = 1)":{"summary":"GET ?tier=1 — collection suppliers; customerTargetId = organization; edge fields omitted","description":"Tier-N Graph - Membership (effective tier = 1)","value":"[{\"tier\":1,\"supplierTargetId\":4567,\"customerTargetId\":1234,\"source\":null,\"probability\":null,\"mediaSources\":null,\"shipments\":null,\"nshipments\":null},{\"tier\":1,\"supplierTargetId\":7890,\"customerTargetId\":1234,\"source\":null,\"probability\":null,\"mediaSources\":null,\"shipments\":null,\"nshipments\":null}]"},"Tier-N Graph - Membership + Traversal (effective tier ≥ 2)":{"summary":"GET ?tier=3 — membership first (org as customerTargetId), then traversal; tier 1 = that member's direct suppliers, tier 2 = indirect","description":"Tier-N Graph - Membership + Traversal (effective tier ≥ 2)","value":"[{\"tier\":1,\"supplierTargetId\":101,\"customerTargetId\":1234,\"source\":null,\"probability\":null,\"mediaSources\":null,\"shipments\":null,\"nshipments\":null},{\"tier\":1,\"supplierTargetId\":4567,\"customerTargetId\":101,\"source\":\"Customs\",\"probability\":null,\"mediaSources\":null,\"shipments\":null,\"nshipments\":8},{\"tier\":2,\"supplierTargetId\":7890,\"customerTargetId\":4567,\"source\":\"Media\",\"probability\":null,\"mediaSources\":null,\"shipments\":null,\"nshipments\":null}]"},"Tier-N Graph - With Shipment Details":{"summary":"GET ?tier=2&includeShipmentDetails=true — traversal CUSTOMS row with shipment breakdown","description":"Tier-N Graph - With Shipment Details","value":"[{\"tier\":1,\"supplierTargetId\":4567,\"customerTargetId\":101,\"source\":\"Customs\",\"probability\":null,\"mediaSources\":null,\"shipments\":[{\"hscode\":847330,\"lastShipment\":{\"date\":\"2024-03-15\",\"_datetype_\":\"Date\"},\"nshipments\":10}],\"nshipments\":15}]"},"Tier-N Graph - With Predictions":{"summary":"GET ?tier=2&sourcePrewavePrediction=true — traversal PREWAVE_PREDICTION row","description":"Tier-N Graph - With Predictions","value":"[{\"tier\":2,\"supplierTargetId\":9999,\"customerTargetId\":7890,\"source\":\"PrewavePrediction\",\"probability\":87,\"mediaSources\":null,\"shipments\":null,\"nshipments\":null}]"}}}}},"400":{"description":"Collection not tier-n enabled or invalid parameters (e.g. tier/maxTier out of range).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorDTO"},"examples":{"Not tier-n collection":{"description":"Not tier-n collection","value":"{\"code\":\"INVALID_REQUEST\",\"message\":\"Only tier-n collections can be used by this endpoint. Collection 123 does not have tiers enabled.\",\"solution\":\"Use a collection with tiersEnabled=true\"}"},"Invalid tier":{"description":"Invalid tier","value":"{\"code\":\"INVALID_REQUEST\",\"message\":\"Tier must be within 1..9 range\",\"solution\":\"Provide a valid tier value between 1 and 9\"}"}}}}},"404":{"description":"Collection not found, inactive, not tier-n enabled, or not accessible.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorDTO"},"examples":{"Collection not found":{"description":"Collection not found","value":"{\"code\":\"RESOURCE_NOT_FOUND\",\"message\":\"Collection not found: ID=123\",\"solution\":\"Check collection ID or verify access permissions\"}"}}}}},"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    }"}}}}}}}},"/public/v1/alpha/exposure/{id}":{"get":{"tags":["Exposure"],"summary":"Get exposure analysis info by exposure analysis id","description":"**Performance impact**: Medium","operationId":"getExposureAnalysisById","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","format":"int32"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ExposureAnalysis"}}}},"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    }"}}}}}}}},"/public/v1/alpha/exposure/{id}/graph":{"get":{"tags":["Exposure"],"summary":"Get exposure graph by exposure analysis id","description":"**Performance impact**: Medium","operationId":"getExposureGraphById","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","format":"int32"}},{"name":"filter","in":"query","required":false,"schema":{"$ref":"#/components/schemas/ExposureFilter"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ExposureGraph"}}}},"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    }"}}}}}}}},"/public/v1/actions":{"get":{"tags":["Actions"],"summary":"List actions","description":"\nRetrieves a paginated list of actions with filtering and sorting capabilities.\n\nFor detailed information about actions, action types, and action statuses, see the [Prewave Help Center](https://help.prewave.com/en/articles/258470-action-planner-action-dashboard-action-status-and-action-types).\n\n**Quick Start:**\n```\nGET /public/v1/actions?page=0&size=20\n```\n\n**Response Format:**\nReturns a lightweight summary view optimized for list/table displays. For complete action details including full descriptions, action items, and attachment metadata, use `GET /public/v1/actions/{actionId}`.\n\n**Filtering:**\nAll filter parameters are optional and can be combined. Multiple values are passed as comma-separated lists (e.g., `typeIds=5,6,7`).\n\n**Finding Valid Filter Values:**\n- **Target IDs**: Use `GET /public/v2/suppliers/sites` to get valid `prewaveTargetId` values\n- **Action Types & Status IDs**: Use [`GET /public/v1/actions/types`](#/Actions/listActionTypes) to get valid action type IDs and [`GET /public/v1/actions/statuses`](#/Actions/listActionStatuses) to get valid status IDs\n- **Team IDs & User IDs**: Available in your organization's team and user management interfaces\n\n**Performance:**\n- Response payloads are optimized for list views (60-80% smaller than full detail responses)\n- Using multiple filters may impact query performance\n- Text search (`query` parameter) searches across title and description fields\n- Date range filters are inclusive (both endpoints included)\n- Use pagination (`page`, `size`) to limit response size for large result sets\n\n**Required Permission:** `access_public_actions`\n        ","operationId":"listActions","parameters":[{"name":"page","in":"query","description":"Zero-based page index (0..N)","required":false,"schema":{"minimum":0,"type":"integer","default":0}},{"name":"size","in":"query","description":"The size of the page to be returned","required":false,"schema":{"minimum":1,"type":"integer","default":10}},{"name":"sort","in":"query","description":"Sorting criteria in the format: property,(asc|desc). Default sort order is ascending. Multiple sort criteria are supported.","required":false,"schema":{"type":"array","items":{"type":"string"}}},{"name":"typeIds","in":"query","description":"Filter by action type IDs. Multiple values: comma-separated (e.g., '5,6,7') or repeated parameter. Use GET /public/v1/actions/types to find valid type IDs.","required":false,"schema":{"uniqueItems":true,"type":"array","items":{"type":"integer","format":"int32"}},"example":5},{"name":"statusIds","in":"query","description":"Filter by status IDs. Multiple values: comma-separated (e.g., '2,3') or repeated parameter. Use GET /public/v1/actions/statuses to find valid status IDs.","required":false,"schema":{"uniqueItems":true,"type":"array","items":{"type":"integer","format":"int32"}},"example":2},{"name":"targetIds","in":"query","description":"Filter by target/supplier IDs (prewaveTargetId). Multiple values: comma-separated (e.g., '102006215,102006216') or repeated parameter","required":false,"schema":{"uniqueItems":true,"type":"array","items":{"type":"integer","format":"int32"}},"example":102006215},{"name":"assigneeIds","in":"query","description":"Filter by assignee user IDs. Multiple values: comma-separated (e.g., '100,101') or repeated parameter","required":false,"schema":{"uniqueItems":true,"type":"array","items":{"type":"integer","format":"int32"}},"example":100},{"name":"teamIds","in":"query","description":"Filter by team IDs. Multiple values: comma-separated (e.g., '10,11') or repeated parameter","required":false,"schema":{"uniqueItems":true,"type":"array","items":{"type":"integer","format":"int32"}},"example":10},{"name":"organizationIds","in":"query","description":"Filter by organization/site group IDs. Multiple values: comma-separated (e.g., '500001') or repeated parameter","required":false,"schema":{"uniqueItems":true,"type":"array","items":{"type":"integer","format":"int32"}},"example":500001},{"name":"dueDateFrom","in":"query","description":"Due date from (ISO 8601 timestamp)","required":false,"schema":{"type":"string","format":"date-time"},"example":"2024-01-01T00:00:00Z"},{"name":"dueDateTo","in":"query","description":"Due date to (ISO 8601 timestamp)","required":false,"schema":{"type":"string","format":"date-time"},"example":"2024-12-31T23:59:59Z"},{"name":"createdAtFrom","in":"query","description":"Creation date from (ISO 8601 timestamp)","required":false,"schema":{"type":"string","format":"date-time"},"example":"2024-01-01T00:00:00Z"},{"name":"createdAtTo","in":"query","description":"Creation date to (ISO 8601 timestamp)","required":false,"schema":{"type":"string","format":"date-time"},"example":"2024-01-31T23:59:59Z"},{"name":"updatedAtFrom","in":"query","description":"Update date from (ISO 8601 timestamp)","required":false,"schema":{"type":"string","format":"date-time"},"example":"2024-01-01T00:00:00Z"},{"name":"updatedAtTo","in":"query","description":"Update date to (ISO 8601 timestamp)","required":false,"schema":{"type":"string","format":"date-time"},"example":"2024-01-31T23:59:59Z"},{"name":"query","in":"query","description":"Text search in title/description (case-insensitive)","required":false,"schema":{"type":"string"},"example":"compliance"}],"responses":{"200":{"description":"Successfully retrieved actions","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SchemaPublicActionDTO"},"examples":{"Paginated actions":{"description":"Paginated actions","value":"{\"content\":[{\"actionId\":12345,\"title\":\"Review supplier compliance documentation\",\"type\":{\"id\":5,\"displayName\":\"Incident Review\"},\"status\":{\"id\":2,\"title\":\"In Progress\",\"state\":\"InProgress\"},\"target\":{\"id\":102006215,\"name\":\"Acme Corporation\"},\"assignees\":[{\"id\":100,\"name\":\"John Doe\",\"email\":\"john.doe@example.com\"}],\"teams\":[{\"id\":10,\"name\":\"Compliance Team\"}],\"dueDate\":1735689599.000000000,\"createdAt\":1705314600.000000000,\"updatedAt\":1705761900.000000000}],\"totalElements\":57,\"totalPages\":3,\"size\":20,\"number\":0}"}}}}},"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    }"}}}}}}}},"/public/v1/actions/{actionId}":{"get":{"tags":["Actions"],"summary":"Get action by ID","description":"\nRetrieves detailed information about a specific action.\n\nFor detailed information about actions, action types, and action statuses, see the [Prewave Help Center](https://help.prewave.com/en/articles/258470-action-planner-action-dashboard-action-status-and-action-types).\n\n**Quick Start:**\n```\nGET /public/v1/actions/12345\n```\n\n**Response:**\nReturns comprehensive action details including description, creator, action items, skip information, and attachment metadata.\n\n**Action ID:**\nThe `actionId` is a **stable identifier** that uniquely identifies an action. Once created, it never changes, making it safe for:\n- Storing in your database for future reference\n- Using in URLs and bookmarks\n- External references and integrations\n\nTo find action IDs, use [`GET /public/v1/actions`](#/Actions/listActions) to list all actions and retrieve their `actionId` values.\n\n**Related Operations:**\n- `GET /public/v1/actions` - List all actions (to find actions by other criteria)\n\n**Required Permission:** `access_public_actions`\n        ","operationId":"getActionById","parameters":[{"name":"actionId","in":"path","description":"Action key (stable identifier). Use GET /public/v1/actions to find action keys.","required":true,"schema":{"type":"integer","format":"int32"},"example":12345}],"responses":{"200":{"description":"Action found and returned successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicActionDetailDTO"},"examples":{"Action detail":{"description":"Action detail","value":"{\"actionId\":12345,\"title\":\"Review supplier compliance documentation\",\"description\":\"Please review the compliance documentation provided by Acme Corporation\",\"type\":{\"id\":5,\"displayName\":\"Incident Review\"},\"status\":{\"id\":2,\"title\":\"In Progress\",\"state\":\"InProgress\"},\"target\":{\"id\":102006215,\"name\":\"Acme Corporation\"},\"assignees\":[{\"id\":100,\"name\":\"John Doe\",\"email\":\"john.doe@example.com\"}],\"teams\":[{\"id\":10,\"name\":\"Compliance Team\"}],\"creator\":{\"id\":99,\"name\":\"Alice Manager\",\"email\":\"alice.manager@example.com\"},\"dueDate\":1735689599.000000000,\"createdAt\":1705314600.000000000,\"updatedAt\":1705761900.000000000,\"mainItem\":{\"id\":1001,\"type\":\"Alert\",\"entityId\":5001},\"attachmentItems\":[]}"}}}}},"404":{"description":"404 Not Found - The action with the specified actionId was not found or is not accessible to your organization.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorDTO"},"examples":{"Action not found":{"summary":"actionId does not exist or access denied","description":"Action not found","value":{"code":"resource_not_found","message":"Action not found for actionId 12345","solution":"Verify the actionId and ensure it belongs to your organization. Use GET /public/v1/actions to list all accessible actions."}}}}}},"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    }"}}}}}}}},"/public/v1/actions/types":{"get":{"tags":["Actions"],"summary":"List action types","description":"\nRetrieves a list of all action types available for your organization.\n\nFor detailed information about actions, action types, and action statuses, see the [Prewave Help Center](https://help.prewave.com/en/articles/258470-action-planner-action-dashboard-action-status-and-action-types).\n\n**Quick Start:**\n```\nGET /public/v1/actions/types\n```\n\n**Response Format:**\nReturns all action types accessible to your organization. Each action type includes:\n- `id` - Internal action type identifier\n- `displayName` - Human-readable name for display in UI\n\n**Filtering:**\nAction types are automatically filtered to show only those:\n- Available for your organization\n- Not excluded for your user/role\n- Marked as public\n\n**Use Cases:**\n- Discover available action types for dropdown/select UI components\n- Display action type information in user interfaces\n- Find valid `typeId` values for filtering actions (`GET /public/v1/actions?typeIds=...`)\n\n**Related Operations:**\n- `GET /public/v1/actions/types/{typeId}` - Get details for a specific action type\n- `GET /public/v1/actions?typeIds={typeId}` - Filter actions by type ID\n\n**Required Permission:** `access_public_actions`\n        ","operationId":"listActionTypes","responses":{"200":{"description":"Successfully retrieved action types","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/PublicActionTypeDTO"}},"examples":{"Action types list":{"description":"Action types list","value":"[{\"id\":5,\"displayName\":\"Incident Review\"},{\"id\":6,\"displayName\":\"Self Assessment Request\"},{\"id\":7,\"displayName\":\"Code of Conduct Review\"}]"}}}}},"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    }"}}}}}}}},"/public/v1/actions/types/{typeId}":{"get":{"tags":["Actions"],"summary":"Get action type by ID","description":"\nRetrieves detailed information about a specific action type.\n\nFor detailed information about actions, action types, and action statuses, see the [Prewave Help Center](https://help.prewave.com/en/articles/258470-action-planner-action-dashboard-action-status-and-action-types).\n\n**Quick Start:**\n```\nGET /public/v1/actions/types/5\n```\n\n**Response Format:**\nReturns the action type details including ID and display name.\n\n**Use Cases:**\n- Display action type information in detail views\n- Check if a specific action type is available for your organization\n\n**Related Operations:**\n- `GET /public/v1/actions/types` - List all available action types\n- `GET /public/v1/actions?typeIds={typeId}` - Filter actions by this type ID\n\n**Required Permission:** `access_public_actions`\n        ","operationId":"getActionTypeById","parameters":[{"name":"typeId","in":"path","description":"Action type ID. Use GET /public/v1/actions/types to find action type IDs.","required":true,"schema":{"type":"integer","format":"int32"},"example":5}],"responses":{"200":{"description":"Action type found and returned successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicActionTypeDTO"},"examples":{"Action type detail":{"description":"Action type detail","value":"{\"id\":5,\"displayName\":\"Incident Review\"}"}}}}},"404":{"description":"404 Not Found - The action type with the specified ID was not found or is not accessible to your organization.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorDTO"},"examples":{"Action type not found":{"summary":"typeId does not exist or is not accessible","description":"Action type not found","value":{"code":"resource_not_found","message":"Action type with id 999 is not found or is not accessible","solution":"Verify the typeId and ensure it belongs to your organization. Use GET /public/v1/actions/types to list all accessible action types."}}}}}},"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    }"}}}}}}}},"/public/v1/actions/statuses":{"get":{"tags":["Actions"],"summary":"List action statuses for type","description":"\nRetrieves a list of action statuses that are valid for a specific action type.\n\nFor detailed information about actions, action types, and action statuses, see the [Prewave Help Center](https://help.prewave.com/en/articles/258470-action-planner-action-dashboard-action-status-and-action-types).\n\n**Quick Start:**\n```\nGET /public/v1/actions/statuses?typeId=5\n```\n\n**Response Format:**\nReturns only the statuses that are valid for the specified action type. This is essential for:\n- Building type-specific status selection UI components\n- Understanding which statuses can be assigned to actions of a specific type\n\n**Status Transitions:**\nEach action type has a defined set of valid statuses.\n\n**Use Cases:**\n- Discover valid statuses for a specific action type\n- Build dynamic UI that only shows valid statuses for each action type\n\n**Finding Action Type IDs:**\nUse `GET /public/v1/actions/types` to find valid `typeId` values.\n\n**Related Operations:**\n- `GET /public/v1/actions/types` - List all available action types\n- `GET /public/v1/actions/statuses` - List all statuses (not filtered by type)\n\n**Required Permission:** `access_public_actions`\n        ","operationId":"listActionStatusesForType","parameters":[{"name":"typeId","in":"query","description":"Action type ID. Use GET /public/v1/actions/types to find action type IDs.","required":true,"schema":{"type":"integer","format":"int32"},"example":5}],"responses":{"200":{"description":"Successfully retrieved action statuses for the specified type","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/PublicActionStatusDTO"}},"examples":{"Action statuses list":{"description":"Action statuses list","value":"[{\"id\":1,\"title\":\"Planned\",\"state\":\"Planned\"},{\"id\":2,\"title\":\"In Progress\",\"state\":\"InProgress\"},{\"id\":3,\"title\":\"Completed\",\"state\":\"Completed\"},{\"id\":4,\"title\":\"Aborted\",\"state\":\"Aborted\"}]"}}},"*/*":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/PublicActionStatusDTO"}}}}},"404":{"description":"404 Not Found - The action type with the specified ID was not found or is not accessible to your organization.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorDTO"},"examples":{"Action type not found":{"summary":"typeId does not exist or is not accessible","description":"Action type not found","value":{"code":"resource_not_found","message":"Action type with id 999 is not found or is not accessible","solution":"Verify the typeId and ensure it belongs to your organization. Use GET /public/v1/actions/types to list all accessible action types."}}}},"*/*":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/PublicActionStatusDTO"}}}}},"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    }"}}}}}}}},"/public/v2/eudr/customers/supplier-dds/{ddsId}":{"delete":{"tags":["EUDR - Customers - DDS"],"summary":"Delete a supplier DDS and its origins","description":"\nDelete a supplier Due Diligence Statement (DDS) and all its associated origin information.\n\nThis endpoint permanently removes the specified supplier DDS and all related origin data.\nUse with caution as this operation cannot be undone.\n\n**Use Cases**:\n- Remove incorrect supplier DDS entries\n- Clean up duplicate DDS data\n- Delete outdated compliance statements\n\n**Required permission:** `access_public_products` and `DELETE` on the DDS\n        ","operationId":"deleteSupplierDDS","parameters":[{"name":"ddsId","in":"path","description":"ID of the supplier DDS to delete.","required":true,"schema":{"type":"integer"},"example":123}],"responses":{"200":{"description":"Supplier DDS deleted successfully."},"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}":{"delete":{"tags":["EUDR - Customers - Products"],"summary":"Deactivate a product and its origins","description":"\nDeactivate a product and its associated origins.\n\nOnce deactivated, the product is no longer available for active use in EUDR compliance workflows.\n\n**Required permission:** `access_public_products` and `DELETE` on the product\n        ","operationId":"deactivateProduct","parameters":[{"name":"productId","in":"path","description":"The ID of the product.","required":true,"schema":{"type":"integer","format":"int32"},"example":301}],"responses":{"200":{"description":"Product deactivated successfully."},"404":{"description":"Product not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorDTO"},"examples":{"Product not found":{"description":"Product not found","value":{"code":"resource_not_found","message":"Product with id 123 not found","solution":"Verify the product ID"}}}}}},"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/v1/users/{userId}/roles/{roleName}":{"delete":{"tags":["Users - Roles"],"summary":"Revoke a specific role from a user","description":"\n### Overview\nRevoke a specific role from an existing user.\n\n### Use Cases\n- **Access Reduction**: Downgrade a user's permissions when they move to a different team or department.\n- **Security**: Remove access that is no longer required as part of the principle of least privilege.\n\n### Identification\n- **userId**: Numerical identifier of the user.\n- **roleName**: The exact string identifier of the role (e.g., `ROLE_USER_MANAGER`).\n\n### Getting User ID\n- To find users and their numerical IDs, use the Users Management API:\n  - `GET /public/v1/users` - Retrieve all users with their `id` field.\n- The `id` field in the user response is the `{userId}` used in this endpoint's path parameter.\n\n### Getting Role Names\n- Discover valid role names via `GET /public/v1/users/roles/available`.\n\n### Related Operations\n- **Add Roles**: [POST /public/v1/users/{userId}/roles](#operations-Users_-_Roles-add)\n- **List All Roles**: [GET /public/v1/users/{userId}/roles](#operations-Users_-_Roles-read)\n\n### Required Permission\n`manage_public_users`\n    ","operationId":"delete","parameters":[{"name":"userId","in":"path","description":"The unique numerical identifier of the target user. If you do not have this ID, you can find it by searching for the user via `GET /public/v1/users`.","required":true,"schema":{"type":"integer","format":"int32"},"example":4523345},{"name":"roleName","in":"path","description":"The exact internal name of the role to remove. Discover valid names via the [Available Roles](#operations-Users_-_Roles-getAvailableRoles) endpoint.","required":true,"schema":{"type":"string"},"example":"ROLE_USER_MANAGER"}],"responses":{"204":{"description":"No Content - Role successfully removed."},"404":{"description":"Not Found - User or Role identifier not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorDTO"},"examples":{"Role Not Found":{"description":"Role Not Found","value":"{\"code\":\"role_not_found\",\"message\":\"The user does not possess the role 'ROLE_USER_MANAGER'.\"}"}}}}},"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/v1/collections/{collectionId}/targets/{targetId}":{"delete":{"tags":["Collections - Targets"],"summary":"Remove target from collection","description":"\nRemove a single target from a collection.\n\nThe target is identified by its `prewaveTargetId` (target's `infotag_id`) in the URL path. If the target is not\ncurrently in the collection, the operation will complete successfully without error (idempotent operation).\n\n**Getting Collection ID:**\n- To find available collections and their IDs, use the Collections Management API:\n  - `GET /public/v1/collections` - List all collections accessible to you (returns collections with `id` field)\n  - `GET /public/v1/collections/{collectionId}` - Get a specific collection by ID\n- The `id` field in collection responses is the `collectionId` used in this endpoint's path parameter\n\n**Getting Target ID (prewaveTargetId):**\n- To get the current target ID, use the Supplier Sites API or the collection targets endpoint:\n  - `GET /public/v1/collections/{collectionId}/targets` - List all targets in the collection with their current `prewaveTargetId` values\n  - `GET /public/v2/suppliers/sites` - List all suppliers with their current `prewaveTargetId` values\n  - `GET /public/v2/suppliers/sites/find-by-identifier?prewaveId={prewaveTargetId}` - Get a specific supplier by `prewaveTargetId`\n- The `id` field in target/supplier responses is the `prewaveTargetId` used in this endpoint's path parameter\n\n**Important: Target ID Stability**\n\n⚠️ **The target `id` (prewaveTargetId) may change** due to target merges or data consolidation. When this happens:\n- The target's edge numbers, edge data, and collection memberships are automatically moved to a new target\n- Using an outdated target ID will result in a `404 Not Found` error\n\n💡 **Best Practice for Integrations:**\n- **Always use current target IDs** when removing targets from collections\n- Use `GET /public/v1/collections/{collectionId}/targets` to get the current target IDs in the collection before removing them\n- Alternatively, use `GET /public/v2/suppliers/sites` to find the current `prewaveTargetId` by matching your supplier identifiers\n- If you receive a `404 Not Found` error, use `GET /public/v2/suppliers/sites` to find the current `prewaveTargetId` by matching your supplier identifiers\n\n**Audit Trail:**\n- All changes are audited for compliance and tracking purposes\n- Every action is recorded in the audit log with:\n  - The user who performed the operation\n  - Timestamp of the operation\n  - Details about which target was removed from the collection\n  - Reference to the public API endpoint used\n\n**Required Permissions**: `manage_collection` and `update` on the collection.\n        ","operationId":"removeTargetFromCollection","parameters":[{"name":"collectionId","in":"path","description":"Unique identifier of the collection","required":true,"schema":{"type":"integer","format":"int32"},"example":123},{"name":"targetId","in":"path","description":"The prewaveTargetId (target's infotag_id) of the target to remove from the collection. This is the same identifier returned in the `id` field when retrieving targets via GET /public/v1/collections/{collectionId}/targets or GET /public/v2/suppliers/sites.","required":true,"schema":{"type":"integer","format":"int32"},"example":10422185}],"responses":{"204":{"description":"Target removed from collection successfully (or was not in collection). All changes have been audited."},"404":{"description":"Collection not found, target not found, or not accessible to the user. This may occur if: (1) the collection doesn't exist or is not accessible to your organization, (2) the target ID doesn't exist, (3) the target ID is not accessible to your organization, or (4) the target ID has changed due to a target merge (in which case, use GET /public/v2/suppliers/sites to find the new ID by matching supplier identifiers).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorDTO"},"examples":{"Collection not found":{"summary":"Collection does not exist or is not accessible","description":"Collection not found","value":"{\"code\":\"collection_not_found\",\"message\":\"Collection not found: ID={collectionId}\"}"},"Target ID not found":{"summary":"Target ID is invalid or has changed","description":"If a target ID has changed due to a merge, use GET /public/v2/suppliers/sites to find the current prewaveTargetId by matching your supplier identifiers.","value":"{\"code\":\"resource_not_found\",\"message\":\"Collection with id {collectionId} not found or access denied\"}"}}}}},"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    }"}}}}}}}}},"components":{"schemas":{"PublicInboundProductPayload":{"required":["hsCode","name","supplierId"],"type":"object","properties":{"name":{"type":"string","description":"Product name.","example":"Wooden Table"},"scientificName":{"type":"string","description":"Scientific name label.","nullable":true,"example":"Quercus robur"},"reference":{"type":"string","description":"Reference label.","nullable":true,"example":"REF-12345"},"hsCode":{"type":"string","description":"HS code associated with the product. Can be retrieved from the HS code list endpoint.","example":"440799"},"annualSpend":{"type":"number","description":"Annual spend (EUR).","format":"decimal","nullable":true,"example":10000.0,"deprecated":true},"annualQuantity":{"type":"number","description":"Annual quantity.","nullable":true,"example":100.0,"deprecated":true},"unit":{"type":"string","description":"Quantity unit.","nullable":true,"example":"kg","deprecated":true},"supplierId":{"type":"integer","description":"Target ID of the supplier.","format":"int32","example":42}},"description":"Payload for creating or updating an inbound product. Inherits common product properties and adds annual spend and supplier ID.","example":null},"ErrorDTO":{"required":["code","message"],"type":"object","properties":{"code":{"type":"string","description":"Error code","example":null},"message":{"type":"string","description":"Error message","example":null},"solution":{"type":"string","description":"Possible solution to the error","nullable":true,"example":null}},"description":"Error response","example":null},"PublicUpdateOriginRequestPayload":{"type":"object","properties":{"endDate":{"type":"string","description":"End date for the origin request (format: yyyy-MM-dd).","format":"date","nullable":true,"example":"2025-09-30"},"requestedWeight":{"type":"number","description":"Requested weight in kg, related to origin requests with weight.","nullable":true,"example":null}},"example":null},"PublicActivityType":{"type":"string","description":"Public activity type.","example":"Import","enum":["Import","Export","Domestic","Trade"]},"PublicCustomerDDSPayload":{"required":["activityType","customerCity","customerCountryId","customerName","customerPostalCode","customerStreet","eoriNumber","netWeightInKg"],"type":"object","properties":{"eoriNumber":{"type":"string","description":"EORI number of the customer.","example":"EU123456789"},"customerName":{"type":"string","description":"Name of the customer as stated on the DDS.","example":"Acme GmbH"},"customerCity":{"type":"string","description":"City of the customer as stated on the DDS.","example":"Vienna"},"customerPostalCode":{"type":"string","description":"Postal code of the customer as stated on the DDS.","example":"1010"},"customerStreet":{"type":"string","description":"Street of the customer as stated on the DDS.","example":"Main Street 1"},"customerCountryId":{"type":"integer","description":"ID of the customer's home country (see /countries endpoint).","format":"int32","example":14},"operatorType":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/PublicOperatorType"}],"example":null},"activityType":{"$ref":"#/components/schemas/PublicActivityType"},"countryOfActivityId":{"type":"integer","description":"ID of the country where the economic activity is taking place (see /countries endpoint).","format":"int32","nullable":true,"example":14},"originRequestReferences":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/PublicDDSReferencePayload"}],"example":null},"netWeightInKg":{"type":"number","description":"Net weight of the product in kg.","example":100.5},"quantity":{"type":"number","description":"Product quantity (additional info).","nullable":true,"example":10},"unit":{"type":"string","description":"Unit of the quantity (e.g. kg, t, m3).","nullable":true,"example":"kg"}},"description":"Payload for creating or updating a Customer DDS. Contains all required and optional fields for a customer DDS statement, including references and product measures.","example":null},"PublicDDSReferencePayload":{"required":["reference","type"],"type":"object","properties":{"reference":{"type":"array","description":"Reference labels (e.g. purchase order numbers, shipment numbers).","example":["PO-2025-001","PO-2025-002"],"items":{"type":"string","description":"Reference labels (e.g. purchase order numbers, shipment numbers).","example":"[\"PO-2025-001\",\"PO-2025-002\"]"}},"type":{"$ref":"#/components/schemas/PublicProductReferenceType"}},"description":"Reference for a DDS statement, including one or more reference labels and the reference type.","example":null},"PublicOperatorType":{"type":"string","description":"Public operator type. RepresentativeOperator is the only supported value. Operator and Trader are deprecated and retained only for legacy data.","example":"RepresentativeOperator","enum":["RepresentativeOperator","Operator","Trader"]},"PublicProductReferenceType":{"type":"string","description":"Public product reference type.","example":"PurchaseOrder","enum":["PurchaseOrder","ShipmentNumber","Other"]},"Level":{"type":"string","enum":["NA","No","Low","Mid","High","Critical"],"example":null},"PublicCheckType":{"type":"string","description":"Public deforestation check type.","enum":["Basic","Advanced"],"example":null},"PublicCountry":{"required":["id","name"],"type":"object","properties":{"id":{"type":"integer","description":"Country ID","format":"int32","example":14},"name":{"type":"string","description":"Country name","example":"Austria"},"countryCode":{"maxLength":2,"minLength":2,"type":"string","description":"Country code in form of ISO 3166-1 alpha-2 code","nullable":true,"example":"AT"},"bounds":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/PublicGeometrySchema"}],"example":null}},"description":"Country where the economic activity is taking place","example":null},"PublicCustomerDDS":{"required":["active","activityType","archived","customerCity","customerCountry","customerName","customerPostalCode","customerStreet","date","eoriNumber","hsCode","id","netWeightInKg","operatorType","origins","productDescription","productName","state"],"type":"object","properties":{"id":{"type":"integer","description":"DDS ID","format":"int32","example":null},"active":{"type":"boolean","description":"Active status","example":null},"referenceNumber":{"type":"string","description":"Reference number","nullable":true,"example":null},"verificationNumber":{"type":"string","description":"Verification number","nullable":true,"example":null},"date":{"type":"string","description":"DDS date","format":"date-time","example":null},"archived":{"type":"boolean","description":"Archived","example":null},"archiveDate":{"type":"string","description":"Archive date","format":"date-time","nullable":true,"example":null},"origins":{"type":"array","description":"List of DDS origins","items":{"$ref":"#/components/schemas/PublicOrigin"},"example":null},"eoriNumber":{"type":"string","description":"EORI number of the customer","example":"EU123456789"},"customerName":{"type":"string","description":"Name of the customer as stated on the DDS","example":"Acme GmbH"},"customerCity":{"type":"string","description":"City of the customer as stated on the DDS","example":"Vienna"},"customerPostalCode":{"type":"string","description":"Postal code of the customer as stated on the DDS","example":"1010"},"customerStreet":{"type":"string","description":"Street of the customer as stated on the DDS","example":"Main Street 1"},"customerCountry":{"$ref":"#/components/schemas/PublicCountry"},"state":{"$ref":"#/components/schemas/PublicCustomerDDSState"},"operatorType":{"$ref":"#/components/schemas/PublicOperatorType"},"activityType":{"$ref":"#/components/schemas/PublicActivityType"},"countryOfActivity":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/PublicCountry"}],"example":null},"originRequestReferences":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/PublicDDSReference"}],"example":null},"productName":{"type":"string","description":"Product name label","example":"Wooden Table"},"productDescription":{"type":"string","description":"Product description label","example":"Oak wood table, 2m x 1m"},"netWeightInKg":{"type":"number","description":"Net Weight in Kg","example":100.5},"quantity":{"type":"number","description":"Product quantity (additional info)","nullable":true,"example":10},"unit":{"type":"string","description":"Quantity unit","nullable":true,"example":"kg"},"hsCode":{"type":"string","description":"HS code","example":"440799"},"submissionError":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/PublicSubmissionError"}],"example":null}},"example":null},"PublicCustomerDDSState":{"type":"string","description":"Public customer DDS state.","example":"Available","enum":["New","Submitting","Submitted","SubmissionError","Available","Rejected","Cancelled","Withdrawn","Archived","Suspended","Updated","Grouped","Obsolete"]},"PublicDDSReference":{"required":["ddsId","reference","type"],"type":"object","properties":{"ddsId":{"type":"integer","description":"Referenced DDS ID","format":"int32","example":456},"reference":{"type":"string","description":"Reference label","example":"PO-2025-001"},"type":{"$ref":"#/components/schemas/PublicProductReferenceType"}},"description":"List of DDS references","example":null},"PublicDFCheck":{"required":["checkDate","deforestedArea","numberOfAlerts","pictures","primaryForestArea"],"type":"object","properties":{"checkDate":{"type":"string","description":"Deforestation check date","format":"date-time","example":null},"primaryForestArea":{"type":"number","description":"Available forest area in hectares","format":"double","example":null},"deforestedArea":{"type":"number","description":"Deforested area in hectares","format":"double","example":null},"numberOfAlerts":{"type":"integer","description":"Number of alerts","format":"int32","example":null},"pictures":{"type":"array","items":{"type":"string","format":"uuid","example":null},"example":null}},"description":"Result of deforestation check request","example":null},"PublicDFCheckResult":{"required":["outdated","status"],"type":"object","properties":{"status":{"$ref":"#/components/schemas/DFStatus"},"outdated":{"type":"boolean","description":"Is the check outdated","example":null}},"description":"Deforestation check result status","example":null},"PublicEUDRRisk":{"type":"string","description":"Public EUDR risk.","enum":["Low","Mid","High"],"example":null},"PublicFeature":{"required":["geometry","properties"],"type":"object","properties":{"geometry":{"$ref":"#/components/schemas/PublicGeometrySchema"},"properties":{"type":"object","additionalProperties":{"type":"object","description":"Value map with available keys:\n            - ProducerName (String)\n            - ProducerCountry (Country code in form of ISO 3166-1 alpha-2 code)\n            - ProductionPlace (String)\n            - Area (Double)\n            "},"description":"Value map with available keys:\n            - ProducerName (String)\n            - ProducerCountry (Country code in form of ISO 3166-1 alpha-2 code)\n            - ProductionPlace (String)\n            - Area (Double)\n            ","example":null}},"example":null},"PublicFeatureCollection":{"required":["features"],"type":"object","properties":{"features":{"type":"array","items":{"$ref":"#/components/schemas/PublicFeature"},"example":null}},"description":"Plot of the origin","example":null},"PublicGeometrySchema":{"required":["coordinates","type"],"type":"object","properties":{"type":{"type":"string","description":"Geometry available types: Point, MultiPoint, Polygon, MultiPolygon","example":null},"coordinates":{"type":"array","description":"Geometry coordinates","items":{"type":"array","description":"Geometry coordinates","items":{"type":"array","description":"Geometry coordinates","items":{"type":"number","description":"Geometry coordinates","format":"double","example":null},"example":null},"example":null},"example":null}},"description":"Geometry plot object","example":null},"PublicMinimalOriginRequest":{"required":["createdAt","id","references","status"],"type":"object","properties":{"id":{"type":"integer","description":"Origin request ID","format":"int32","example":null},"createdAt":{"type":"string","description":"Creation date of the origin request","format":"date-time","example":null},"status":{"$ref":"#/components/schemas/PublicFilterOriginRequestStatus"},"references":{"type":"array","description":"References date of the origin request","items":{"$ref":"#/components/schemas/PublicOriginRequestRef"},"example":null}},"description":"Origin request references","example":null},"PublicOrigin":{"required":["active","country","createdAt","id","plot","plotAreaHa","updatedAt"],"type":"object","properties":{"id":{"type":"integer","description":"Origin ID","format":"int32","example":null},"name":{"type":"string","description":"Origin name","nullable":true,"example":null},"active":{"type":"boolean","description":"Active status","example":null},"producedAtStart":{"type":"string","description":"Production start date","format":"date-time","nullable":true,"example":null},"producedAtEnd":{"type":"string","description":"Production end date","format":"date-time","nullable":true,"example":null},"producer":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/PublicProducer"}],"example":null},"country":{"$ref":"#/components/schemas/PublicCountry"},"plot":{"$ref":"#/components/schemas/PublicFeatureCollection"},"plotAreaHa":{"type":"number","description":"Plot area in hectares","format":"double","example":null},"dds":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/PublicProductSupplierDDS"}],"example":null},"request":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/PublicMinimalOriginRequest"}],"example":null},"pendingProducerDiscoveryRequest":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/PublicProducerDiscoveryRequest"}],"example":null},"countryRisk":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/PublicEUDRRisk"}],"example":null},"pendingDFRequest":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/PublicPendingDFRequest"}],"example":null},"dfCheck":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/PublicDFCheck"}],"example":null},"dfCheckResult":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/PublicDFCheckResult"}],"example":null},"legalityCheck":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/PublicOriginLegalityCheck"}],"example":null},"weight":{"type":"number","description":"Weight, if origin is provided from an origin request with weight","nullable":true,"example":null},"createdAt":{"type":"string","description":"Creation date of the origin","format":"date-time","example":null},"updatedAt":{"type":"string","description":"Last update date of the origin","format":"date-time","example":null}},"description":"List of product's origins","example":null},"PublicOriginLegalityCheck":{"required":["scoreAvail","status"],"type":"object","properties":{"score":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/Score"}],"example":null},"scoreAvail":{"$ref":"#/components/schemas/ScoreAvailability"},"status":{"$ref":"#/components/schemas/DFStatus"}},"description":"Legality check result","example":null},"PublicOriginRequestRef":{"required":["id","reference","referenceType"],"type":"object","properties":{"id":{"type":"integer","description":"Request ID","format":"int32","example":null},"reference":{"type":"string","description":"Reference label","example":null},"referenceType":{"$ref":"#/components/schemas/PublicProductReferenceType"}},"description":"References date of the origin request","example":null},"PublicPendingDFRequest":{"required":["type"],"type":"object","properties":{"type":{"$ref":"#/components/schemas/PublicCheckType"}},"description":"Public pending deforestation request details.","example":null},"PublicProducer":{"required":["id","name"],"type":"object","properties":{"id":{"type":"integer","description":"Target ID of the producer","format":"int32","example":null},"name":{"type":"string","description":"Producer name","example":null},"geo":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/PublicGeometrySchema"}],"example":null},"countryId":{"type":"integer","description":"Country ID of the producer","format":"int32","nullable":true,"example":null}},"description":"Producer of the origin","example":null},"PublicProducerDiscoveryRequest":{"required":["id","name","originId"],"type":"object","properties":{"id":{"type":"integer","description":"Producer discovery request ID","format":"int32","example":null},"originId":{"type":"integer","description":"Origin ID","format":"int32","example":null},"name":{"type":"string","description":"Producer name","example":null},"targetId":{"type":"integer","description":"Producer Target ID","format":"int32","nullable":true,"example":null}},"description":"Pending producer discovery request","example":null},"PublicProductSupplierDDS":{"required":["active","archived","date","id","netWeightInKg"],"type":"object","properties":{"id":{"type":"integer","description":"Supplier DDS ID","format":"int32","example":201},"active":{"type":"boolean","description":"Active status","example":true},"referenceNumber":{"type":"string","description":"Reference number","nullable":true,"example":"EU-REF-12345"},"date":{"type":"string","description":"DDS date","format":"date-time","example":null},"netWeightInKg":{"type":"number","description":"Net Weight in Kg","example":100.5},"archived":{"type":"boolean","description":"Archived","example":false},"archiveDate":{"type":"string","description":"Archive date","format":"date-time","nullable":true,"example":null}},"description":"Supplier DDS","example":null},"PublicSubmissionError":{"required":["code","detail"],"type":"object","properties":{"code":{"type":"string","description":"Error code","example":null},"detail":{"type":"string","description":"Human readable details about the error","example":null},"reasons":{"type":"array","description":"Detailed reasons about the error, if any","nullable":true,"items":{"type":"string","description":"Detailed reasons about the error, if any","example":null},"example":null}},"description":"Details about a submission error, if state is SUBMISSION_ERROR","example":null},"Score":{"required":["risk","value"],"type":"object","properties":{"value":{"type":"integer","format":"int32","example":null},"risk":{"$ref":"#/components/schemas/Level"}},"example":null},"PublicUpdateEdgeDataPayload":{"required":["spendDataMlnEuro","year"],"type":"object","properties":{"year":{"type":"integer","description":"Year that provided spend data applies to","format":"int32","example":2025},"spendDataMlnEuro":{"type":"number","description":"Spend data in millions of euros (e.g., 0.15 for 150,000 euros, 1.5 for 1.5 million euros)","format":"double","example":0.15},"cocSigned":{"type":"boolean","description":"Flag indicating if the supplier is signed by the Code of Conduct (Coc)","nullable":true,"example":false}},"example":null},"BoundingBox":{"required":["xmax","xmin","ymax","ymin"],"type":"object","properties":{"xmin":{"type":"number","format":"double","example":null},"ymin":{"type":"number","format":"double","example":null},"xmax":{"type":"number","format":"double","example":null},"ymax":{"type":"number","format":"double","example":null}},"example":null},"CollectionRef":{"required":["id","name"],"type":"object","properties":{"id":{"type":"integer","format":"int32","example":null},"name":{"type":"string","example":null}},"example":null},"EdgeNumber":{"required":["number"],"type":"object","properties":{"number":{"type":"string","example":null},"source":{"type":"string","nullable":true,"example":null},"existingEdgeId":{"type":"integer","format":"int32","nullable":true,"example":null}},"example":null},"Geo":{"required":["properties","type"],"type":"object","properties":{"geometry":{"$ref":"#/components/schemas/Geometry"},"properties":{"$ref":"#/components/schemas/GeoProperties"},"type":{"type":"string","example":null}},"description":"Geo information for this alert. Only available if includeGeo is set to true.","example":null},"GeoProperties":{"type":"object","properties":{"name":{"type":"string","nullable":true,"example":null},"countryCode":{"type":"string","nullable":true,"example":null},"alertCount":{"type":"integer","format":"int32","nullable":true,"example":null},"boundingBox":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/BoundingBox"}],"example":null}},"example":null},"Geometry":{"type":"object","additionalProperties":true,"description":"GeoJSON-compatible geometry object. Fields follow the GeoJSON spec (https://geojson.org): a `type` string (e.g. `Point`, `Polygon`) and a `coordinates` array.","example":null},"PublicHSCode":{"required":["code"],"type":"object","properties":{"code":{"type":"string","example":null},"nShipments":{"type":"integer","format":"int32","nullable":true,"writeOnly":true,"example":null},"nshipments":{"type":"integer","format":"int32","example":null}},"description":"List of HS Codes of the target","example":null},"PublicTargetCTypeDTO":{"required":["bgColor","connectable","ctype","displayName","icon","id","pluralName","targetTypeId","textColor"],"type":"object","properties":{"id":{"type":"integer","description":"Prewave-internal id of the target ctype","format":"int32","example":1234},"ctype":{"type":"string","description":"Name of the target ctype","example":"mine"},"targetTypeId":{"type":"integer","description":"Identifier of the target ctype","format":"int32","example":1234},"displayName":{"type":"string","description":"Display name of the target ctype","example":"Mine"},"pluralName":{"type":"string","description":"Plural name of the target ctype","example":"Mines"},"icon":{"type":"string","description":"Icon of the target ctype. Fontawesome icon name. See https://fontawesome.com/icons for more information","example":"fas fa-mine"},"ordering":{"type":"integer","description":"Ordering of the target ctype","format":"int32","nullable":true,"example":null},"priority":{"type":"integer","description":"Deprecated. Unused leftover sort rank. Omitted when enabled for your organization.","format":"int32","nullable":true,"deprecated":true,"example":null},"connectable":{"type":"boolean","description":"Whether it is possible to connect to targets of this type or not","example":null},"bgColor":{"type":"string","description":"Background color of the target ctype. Valid CSS color value","example":"#ff0000"},"textColor":{"type":"string","description":"Text color of the target ctype. Valid CSS color value","example":"#ffffff"}},"description":"CTypes are what is known as \"Facility Types\" in the Prewave system (e.g in Network > Filters). They provide a slightly more specific categorization of what the target is. Examples for ctypes are \"mine\", \"factory\" etc.","example":null},"PublicTargetDTO":{"required":["collectionFollowing","collectionPath","collectionPaths","ctype","following","foreignSystems","geo","geoShape","hsCode","id","industries","managed","mergedTargets","name","own","parents","path","scoreAvail","screened","type"],"type":"object","properties":{"id":{"type":"integer","description":"Prewave target id","format":"int32","example":102006215},"name":{"type":"string","description":"Name of the Prewave target","example":"Høyanger"},"sname":{"type":"string","description":"Geonames Id (see https://geonames.org)","nullable":true,"example":"3191281"},"logo":{"type":"string","description":"URL to the logo shown in the target profile","nullable":true,"example":null},"backgroundPicture":{"type":"string","description":"URL to the background picture shown in the target profile","nullable":true,"example":null},"description":{"type":"string","description":"Description of the Prewave target","nullable":true,"example":"Description shown in the target profile"},"website":{"type":"string","description":"URL to the website shown in the target profile","nullable":true,"example":null},"location":{"type":"string","description":"Location of the target","nullable":true,"example":"Mistelbach"},"yearFounded":{"type":"integer","description":"Year the target was founded shown in the target profile","format":"int32","nullable":true,"example":1999},"size":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/TargetSize"}],"example":null},"screened":{"type":"boolean","description":"Whether the target is screened or not","example":true},"screenedStatus":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/ScreeningStatus"}],"example":null},"linkedInId":{"type":"string","description":"LinkedIn ID of the target","nullable":true,"example":"general-motors"},"type":{"$ref":"#/components/schemas/PublicTargetTypeDTO"},"ctype":{"$ref":"#/components/schemas/PublicTargetCTypeDTO"},"geo":{"$ref":"#/components/schemas/Geo"},"geoShape":{"$ref":"#/components/schemas/Geo"},"parents":{"type":"array","description":"List of parent targets","items":{"$ref":"#/components/schemas/PublicTargetDTO"},"example":null},"organization":{"$ref":"#/components/schemas/PublicTargetDTO"},"industries":{"type":"array","description":"List of industries the target belongs to","items":{"$ref":"#/components/schemas/PublicTargetDTO"},"example":null},"monitoredSince":{"type":"string","description":"Date the target was monitored since","format":"date-time","nullable":true,"example":null},"earliestAlert":{"type":"string","description":"Deprecated. Date of the earliest alert. Omitted when enabled for your organization.","format":"date-time","nullable":true,"deprecated":true,"example":null},"ordering":{"type":"integer","description":"Ordering of the target","format":"int32","nullable":true,"example":null},"disruptionStatusUpdate":{"type":"object","description":"Deprecated. Disruption status has been removed and this field is always null.","nullable":true,"deprecated":true,"example":null},"own":{"type":"boolean","description":"Whether the target is owned by user customer or not","example":null},"managed":{"type":"boolean","description":"`true` if user is target connection contact or target is owned by user customer, `false` otherwise","example":null},"isPublic":{"type":"boolean","description":"Whether the target is public or not","nullable":true,"example":null},"connectionContactsCount":{"type":"integer","description":"Number of connection contacts of the target","format":"int32","nullable":true,"example":null},"population":{"type":"integer","description":"Population of the target. Generally applies to locations","format":"int32","nullable":true,"example":null},"following":{"type":"boolean","description":"Target resides in \"My follows\" collection","example":null},"collectionFollowing":{"type":"boolean","description":"Target resides in any followed collection (including children)","example":null},"tier":{"type":"integer","description":"Tier of the target (relevant when fetching Tier-N)","format":"int32","nullable":true,"example":null},"path":{"type":"array","description":"Path of the target (relevant when fetching Tier-N)","items":{"$ref":"#/components/schemas/PublicTargetRefExtended"},"example":null},"collectionLevel":{"type":"integer","description":"How deep the target is in the collection hierarchy","format":"int32","nullable":true,"example":null},"collectionPath":{"type":"array","description":"Path of the target in the collection hierarchy","items":{"$ref":"#/components/schemas/CollectionRef"},"example":null},"collectionPaths":{"type":"array","description":"Paths of the target in the collection hierarchy","items":{"type":"array","description":"Paths of the target in the collection hierarchy","items":{"$ref":"#/components/schemas/CollectionRef"},"example":null},"example":null},"foreignSystems":{"type":"array","description":"List of foreign systems the target is connected to","items":{"$ref":"#/components/schemas/PublicTargetForeignSystemDTO"},"example":null},"scoreAvail":{"$ref":"#/components/schemas/ScoreAvailability"},"revenue":{"type":"number","description":"Revenue of the target","nullable":true,"example":null},"impact":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/Level"}],"example":null},"hsCode":{"type":"array","description":"List of HS Codes of the target","items":{"$ref":"#/components/schemas/PublicHSCode"},"example":null},"mergedTargets":{"type":"array","description":"Target ids of past targets that were merged into this current target","items":{"type":"integer","description":"Target ids of past targets that were merged into this current target","format":"int32","example":null},"example":null},"public":{"type":"boolean","writeOnly":true,"example":null}},"example":null},"PublicTargetForeignSystemDTO":{"required":["id","system"],"type":"object","properties":{"system":{"type":"string","description":"The system ID is an identifier to determine from which the targetId might originate from. Supported systemIds are \"prewave\", \"customer\", \"supplier\", \"own\".","example":null},"id":{"type":"string","description":"The id in the foreign system","example":"1234"},"source":{"type":"string","description":"Name of the foreign system","nullable":true,"example":"SAP_ARIBA"}},"description":"List of foreign systems the target is connected to","example":null},"PublicTargetRefExtended":{"required":["foreignSystems","id","name"],"type":"object","properties":{"id":{"type":"integer","format":"int32","example":null},"name":{"type":"string","example":null},"customName":{"type":"string","nullable":true,"example":null},"latestRequest":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/TargetRequestInfoDto"}],"example":null},"foreignSystems":{"type":"array","items":{"$ref":"#/components/schemas/EdgeNumber"},"example":null}},"description":"Path of the target (relevant when fetching Tier-N)","example":null},"PublicTargetTypeDTO":{"required":["displayName","id","pluralName","type"],"type":"object","properties":{"id":{"type":"integer","description":"Prewave-internal ID of the target type","format":"int32","example":null},"type":{"type":"string","description":"Machine-readable name of the target type","example":null},"displayName":{"type":"string","description":"Display name of the target type","example":null},"pluralName":{"type":"string","description":"Plural name of the target type","example":null},"ordering":{"type":"integer","description":"Ordering of the target type","format":"int32","nullable":true,"example":null},"scoring":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/Scoring"}],"example":null}},"description":"Target types are what is known as \"Target Type\" in the Prewave system (e.g in Network > Filters). They provide a broad categorization of what the target is. Examples for target types are \"poi\", \"organization\" etc.","example":null},"ScoreAvailability":{"type":"string","enum":["None","Peer","Alert","SSA","External"],"example":null},"Scoring":{"type":"string","description":"Scoring of the target type","enum":["Alert","Peer"],"example":null},"ScreeningStatus":{"type":"string","description":"Screening status of the target","example":"Screened","enum":["Required","Pending","Screened","NotPossible"]},"TargetRequestInfoDto":{"required":["targetId"],"type":"object","properties":{"targetId":{"type":"integer","format":"int32","example":null},"validationRequest":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/TargetRequestTypeStatusDto"}],"example":null},"screeningRequest":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/TargetRequestTypeStatusDto"}],"example":null},"reportedTargetRequest":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/TargetRequestTypeStatusDto"}],"example":null}},"example":null},"TargetRequestInfoStatus":{"type":"string","enum":["NONE","PENDING","COMPLETED","REJECTED"],"example":null},"TargetRequestTypeStatusDto":{"type":"object","properties":{"id":{"type":"integer","format":"int32","nullable":true,"example":null},"customerId":{"type":"integer","format":"int32","nullable":true,"example":null},"status":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/TargetRequestInfoStatus"}],"example":null},"rejectionReason":{"type":"string","nullable":true,"example":null}},"example":null},"TargetSize":{"type":"string","enum":["Small","Medium","Large","Very large"],"example":null},"PublicCollectionUpdatePayload":{"required":["lanes","name"],"type":"object","properties":{"name":{"minLength":1,"type":"string","example":null},"lanes":{"type":"boolean","example":null}},"example":null},"CollectionScope":{"type":"string","enum":["User","Customer","Featured"],"example":null},"CollectionType":{"type":"string","enum":["Default","Commodity","Ariba"],"example":null},"PublicCollectionDTO":{"required":["children","id","lanes","name","scope","tiersEnabled","type","uuid"],"type":"object","properties":{"id":{"type":"integer","format":"int32","example":null},"uuid":{"type":"string","format":"uuid","example":null},"scope":{"$ref":"#/components/schemas/CollectionScope"},"type":{"$ref":"#/components/schemas/CollectionType"},"name":{"type":"string","example":null},"count":{"type":"integer","format":"int32","nullable":true,"example":null},"lanes":{"type":"boolean","example":null},"tiersEnabled":{"type":"boolean","example":null},"parentId":{"type":"integer","format":"int32","nullable":true,"example":null},"children":{"type":"array","items":{"$ref":"#/components/schemas/PublicCollectionDTO"},"example":null},"updatedAt":{"type":"string","format":"date-time","nullable":true,"example":null}},"example":null},"PublicTierNCollectionSettingsUpdateRequest":{"type":"object","properties":{"maxTier":{"maximum":9,"minimum":1,"type":"integer","description":"Maximum tier level configured for analysis. Range: 1-9. Higher values allow deeper supply chain analysis but may increase response time.","format":"int32","nullable":true,"example":3},"scopePrivate":{"type":"boolean","description":"Whether to include private targets in the analysis scope. Private targets typically represent internal company data.","nullable":true,"example":true},"scopeShared":{"type":"boolean","description":"Whether to include shared targets in the analysis scope. Shared targets typically represent partner/team data.","nullable":true,"example":true},"scopePublic":{"type":"boolean","description":"Whether to include public targets in the analysis scope. Public targets typically represent open/public data.","nullable":true,"example":false},"sourceCustomer":{"type":"boolean","description":"Whether to include customer data sources in the analysis. Customer data comes from customer-provided information.","nullable":true,"example":true},"sourceCustoms":{"type":"boolean","description":"Whether to include customs data sources in the analysis. Customs data is typically the most reliable source based on shipment records.","nullable":true,"example":true},"sourceMedia":{"type":"boolean","description":"Whether to include media data sources in the analysis. Media data comes from news reports and may be less reliable.","nullable":true,"example":false},"sourcePrewavePrediction":{"type":"boolean","description":"Whether to include Prewave prediction data sources in the analysis. These are AI-predicted relationships with confidence scores.","nullable":true,"example":true},"minShipments":{"minimum":0,"type":"integer","description":"Minimum number of shipments required for a relationship to be included. Higher values filter out less established relationships. Set to null to remove minimum.","format":"int32","nullable":true,"example":5},"probability":{"maximum":100,"minimum":0,"type":"integer","description":"Minimum probability threshold for predicted relationships (0-100). Higher values return only high-confidence predictions. Set to null to remove threshold.","format":"int32","nullable":true,"example":75},"shipmentsPeriodFrom":{"type":"string","description":"Start date for shipment period analysis. Only relationships with shipments in this period are considered. Format: YYYY-MM-DD. Set to null to remove start date limit.","format":"date","nullable":true,"example":"2024-01-01"},"shipmentsPeriodTo":{"type":"string","description":"End date for shipment period analysis. Only relationships with shipments in this period are considered. Format: YYYY-MM-DD. Set to null to remove end date limit.","format":"date","nullable":true,"example":"2024-12-31"},"suspectedSuppliers":{"type":"boolean","description":"Whether to include suspected suppliers in the analysis. Suspected suppliers are flagged as potentially risky or suspicious.","nullable":true,"example":false},"logisticsProvider":{"type":"boolean","description":"Whether to include logistics providers in the analysis. Logistics providers are companies that provide logistics services rather than direct suppliers.","nullable":true,"example":false}},"description":"\n        Request payload for updating tier-n collection settings.\n\n        This class contains the configuration settings that can be updated for a tier-n enabled collection.\n        All fields are optional, allowing partial updates of the collection settings.\n\n        ## Configuration Categories\n\n        ### Tier Configuration\n        - `maxTier`: Maximum tier level for analysis (1-9)\n\n        ### Scope Settings\n        - `scopePrivate/Shared/Public`: Which target types to include in analysis\n\n        ### Data Source Settings\n        - `source*`: Which data sources to use for relationship discovery\n\n        ### Filtering Parameters\n        - `minShipments`: Minimum shipment count threshold\n        - `probability`: Minimum confidence threshold for predictions\n        - `shipmentsPeriodFrom/To`: Time period for shipment analysis\n        - `suspectedSuppliers`: Include flagged suppliers\n        - `logisticsProvider`: Include logistics service providers\n    ","example":null},"PublicTierNCollectionSettings":{"required":["collectionId","collectionName","commodityFilterTargetIds","logisticsProvider","maxTier","scopePrivate","scopePublic","scopeShared","sourceCustomer","sourceCustoms","sourceMedia","sourcePrewavePrediction","suspectedSuppliers","targetIds"],"type":"object","properties":{"collectionId":{"type":"integer","description":"Unique identifier of the collection. Use this ID in API requests to reference this specific collection.","format":"int32","example":123},"collectionName":{"type":"string","description":"Human-readable name of the collection. Useful for display purposes and identifying the collection in logs.","example":"My Tier-N Collection"},"maxTier":{"type":"integer","description":"Maximum tier level configured for analysis. Range: 1-9. Higher values allow deeper supply chain analysis but may increase response time.","format":"int32","example":3},"targetIds":{"type":"array","description":"List of target IDs included in this collection. These are the starting points for tier-n analysis.","example":[101,102,103],"items":{"type":"integer","description":"List of target IDs included in this collection. These are the starting points for tier-n analysis.","format":"int32","example":null}},"scopePrivate":{"type":"boolean","description":"Whether to include private targets in the analysis scope. Private targets typically represent internal company data.","example":true},"scopeShared":{"type":"boolean","description":"Whether to include shared targets in the analysis scope. Shared targets typically represent partner/team data.","example":true},"scopePublic":{"type":"boolean","description":"Whether to include public targets in the analysis scope. Public targets typically represent open/public data.","example":false},"sourceCustomer":{"type":"boolean","description":"Whether to include customer data sources in the analysis. Customer data comes from customer-provided information.","example":true},"sourceCustoms":{"type":"boolean","description":"Whether to include customs data sources in the analysis. Customs data is typically the most reliable source based on shipment records.","example":true},"sourceMedia":{"type":"boolean","description":"Whether to include media data sources in the analysis. Media data comes from news reports and may be less reliable.","example":false},"sourcePrewavePrediction":{"type":"boolean","description":"Whether to include Prewave prediction data sources in the analysis. These are AI-predicted relationships with confidence scores.","example":true},"minShipments":{"type":"integer","description":"Minimum number of shipments required for a relationship to be included. Higher values filter out less established relationships. Null means no minimum.","format":"int32","nullable":true,"example":5},"probability":{"type":"integer","description":"Minimum probability threshold for predicted relationships (0-100). Higher values return only high-confidence predictions. Null means no threshold.","format":"int32","nullable":true,"example":75},"shipmentsPeriodFrom":{"type":"string","description":"Start date for shipment period analysis. Only relationships with shipments in this period are considered. Format: YYYY-MM-DD. Null means no start date limit.","format":"date","nullable":true,"example":"2024-01-01"},"shipmentsPeriodTo":{"type":"string","description":"End date for shipment period analysis. Only relationships with shipments in this period are considered. Format: YYYY-MM-DD. Null means no end date limit.","format":"date","nullable":true,"example":"2024-12-31"},"suspectedSuppliers":{"type":"boolean","description":"Whether to include suspected suppliers in the analysis. Suspected suppliers are flagged as potentially risky or suspicious.","example":false},"logisticsProvider":{"type":"boolean","description":"Whether to include logistics providers in the analysis. Logistics providers are companies that provide logistics services rather than direct suppliers.","example":false},"commodityFilterTargetIds":{"type":"array","description":"List of target IDs used for commodity-based filtering. These targets help focus the analysis on specific commodity categories.","example":[201,202],"items":{"type":"integer","description":"List of target IDs used for commodity-based filtering. These targets help focus the analysis on specific commodity categories.","format":"int32","example":null}}},"description":"Tier-n collection settings and metadata configuration.","example":null},"BaseExposurePayload":{"required":["collectionCommodityFilters","commodityFilter","exposedCollectionIds","exposedCountryIds","exposedTargetIds","maxTiers","scopePrivate","scopePublic","scopeShared","sourceCustomer","sourceCustoms","sourceMedia","sourcePrewavePrediction","type"],"type":"object","properties":{"maxTiers":{"type":"integer","format":"int32","example":null},"type":{"$ref":"#/components/schemas/ExposureAnalysisType"},"scopePrivate":{"type":"boolean","example":null},"scopeShared":{"type":"boolean","example":null},"scopePublic":{"type":"boolean","example":null},"sourceCustoms":{"type":"boolean","example":null},"sourcePrewavePrediction":{"type":"boolean","example":null},"sourceMedia":{"type":"boolean","example":null},"sourceCustomer":{"type":"boolean","example":null},"minShipments":{"type":"integer","format":"int32","nullable":true,"example":null},"minProbability":{"type":"number","format":"double","nullable":true,"example":null},"shipmentsPeriodFrom":{"type":"string","format":"date","nullable":true,"example":null},"shipmentsPeriodTo":{"type":"string","format":"date","nullable":true,"example":null},"commodityFilter":{"$ref":"#/components/schemas/CommodityFilter"},"collectionCommodityFilters":{"type":"object","additionalProperties":{"$ref":"#/components/schemas/CommodityFilter"},"example":null},"exposedCollectionIds":{"type":"array","items":{"type":"integer","format":"int32","example":null},"example":null},"exposedTargetIds":{"type":"array","items":{"type":"integer","format":"int32","example":null},"example":null},"exposedTargetId":{"type":"integer","format":"int32","nullable":true,"example":null},"exposedCountryIds":{"type":"array","items":{"type":"integer","format":"int32","example":null},"example":null},"exposedAlertId":{"type":"integer","format":"int32","nullable":true,"example":null},"scenarioId":{"type":"integer","format":"int32","nullable":true,"example":null}},"example":null},"CommodityFilter":{"required":["commodities","logisticsProvider","suspectedSuppliers"],"type":"object","properties":{"commodities":{"type":"array","items":{"$ref":"#/components/schemas/CommodityFilterId"},"example":null},"suspectedSuppliers":{"type":"boolean","example":null},"logisticsProvider":{"type":"boolean","example":null}},"example":null},"CommodityFilterId":{"required":["commodityId","path","treeId"],"type":"object","properties":{"treeId":{"type":"integer","format":"int32","example":null},"commodityId":{"type":"integer","format":"int32","example":null},"path":{"type":"array","items":{"type":"integer","format":"int32","example":null},"example":null}},"example":null},"ExposureAnalysisType":{"type":"string","enum":["Collection","Target","TargetList","Country","Alert","Scenario"],"example":null},"CustomerData":{"type":"object","allOf":[{"$ref":"#/components/schemas/Data"}],"example":null},"CustomsData":{"required":["nshipments","shipments"],"type":"object","allOf":[{"$ref":"#/components/schemas/Data"},{"type":"object","properties":{"nshipments":{"type":"integer","format":"int32","example":null},"shipments":{"type":"array","items":{"$ref":"#/components/schemas/Shipment"},"example":null}},"example":null}],"example":null},"Data":{"required":["type"],"type":"object","properties":{"type":{"type":"string","example":null}},"discriminator":{"propertyName":"type"},"example":null},"EdgeDetails":{"required":["data","id","source"],"type":"object","properties":{"id":{"type":"integer","format":"int32","example":null},"source":{"$ref":"#/components/schemas/EdgeSource"},"data":{"oneOf":[{"$ref":"#/components/schemas/CustomerData"},{"$ref":"#/components/schemas/CustomsData"},{"$ref":"#/components/schemas/MediaData"},{"$ref":"#/components/schemas/PredictionData"}],"example":null}},"example":null},"EdgeSource":{"type":"string","enum":["Customer","Media","Customs","PrewavePrediction"],"example":null},"ExplorerGraph":{"required":["linkSets","tiers"],"type":"object","properties":{"tiers":{"type":"array","items":{"$ref":"#/components/schemas/ExplorerTier"},"example":null},"linkSets":{"type":"array","items":{"$ref":"#/components/schemas/ExplorerLinkSet"},"example":null}},"example":null},"ExplorerLink":{"required":["from","fromWeight","to","toWeight"],"type":"object","properties":{"from":{"$ref":"#/components/schemas/ExplorerTargetRef"},"to":{"$ref":"#/components/schemas/ExplorerTargetRef"},"fromWeight":{"type":"number","format":"double","example":null},"toWeight":{"type":"number","format":"double","example":null},"edgeDetails":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/EdgeDetails"}],"example":null}},"example":null},"ExplorerLinkSet":{"required":["fromTier","links","toTier"],"type":"object","properties":{"fromTier":{"type":"integer","format":"int32","example":null},"toTier":{"type":"integer","format":"int32","example":null},"links":{"type":"array","items":{"$ref":"#/components/schemas/ExplorerLink"},"example":null}},"example":null},"ExplorerTarget":{"required":["commodityIds","id","name","tier","weight"],"type":"object","properties":{"tier":{"type":"integer","format":"int32","example":null},"id":{"type":"integer","format":"int32","example":null},"name":{"type":"string","example":null},"weight":{"type":"number","format":"double","example":null},"purchase":{"type":"number","nullable":true,"example":null},"nShipments":{"type":"integer","format":"int32","nullable":true,"writeOnly":true,"example":null},"exposedSuppliersCount":{"type":"integer","format":"int32","nullable":true,"example":null},"baseSuppliersCount":{"type":"integer","format":"int32","nullable":true,"example":null},"commodityIds":{"type":"array","items":{"type":"integer","format":"int32","example":null},"example":null},"nshipments":{"type":"integer","format":"int32","example":null}},"example":null},"ExplorerTargetRef":{"required":["targetId","tier"],"type":"object","properties":{"tier":{"type":"integer","format":"int32","example":null},"targetId":{"type":"integer","format":"int32","example":null}},"example":null},"ExplorerTier":{"required":["targets","tier"],"type":"object","properties":{"tier":{"type":"integer","format":"int32","example":null},"targets":{"type":"array","items":{"$ref":"#/components/schemas/ExplorerTarget"},"example":null}},"example":null},"MediaData":{"required":["mediaSources"],"type":"object","allOf":[{"$ref":"#/components/schemas/Data"},{"type":"object","properties":{"mediaSources":{"type":"array","items":{"type":"string","example":null},"example":null}},"example":null}],"example":null},"PredictionData":{"required":["probability"],"type":"object","allOf":[{"$ref":"#/components/schemas/Data"},{"type":"object","properties":{"probability":{"type":"number","format":"double","example":null}},"example":null}],"example":null},"Shipment":{"required":["hscode"],"type":"object","properties":{"hscode":{"type":"integer","format":"int32","example":null},"nshipments":{"type":"integer","format":"int32","example":null},"lastShipment":{"type":"string","format":"date","nullable":true,"example":null}},"example":null},"PublicSupplierCreatePayloadV2":{"required":["address","city","countryCode","name","supplierId"],"type":"object","properties":{"name":{"minLength":1,"type":"string","description":"Name of the supplier","example":"Acme Corporation"},"countryCode":{"minLength":1,"pattern":"^[A-Z]{2}$","type":"string","description":"ISO 3166-1 alpha-2 country code where the supplier is located (e.g., 'AT' for Austria, 'DE' for Germany, 'US' for United States). Must be exactly 2 uppercase letters.","example":"AT"},"city":{"minLength":1,"type":"string","description":"City where the supplier is located","example":"Vienna"},"address":{"minLength":1,"type":"string","description":"Full address of the supplier","example":"123 Main St, Vienna, Austria"},"supplierId":{"$ref":"#/components/schemas/PublicSupplierIdentifierId"},"postalCode":{"type":"string","description":"Postal/ZIP code of the supplier's location","nullable":true,"example":"1010"},"industries":{"type":"array","description":"Optional list of Prewave industry names associated with the supplier. Names are matched case-insensitively against GET /public/v1/industries. Unknown or ambiguous names return 400. Commodities are not accepted. Empty strings in the array will be filtered out. Leading/trailing whitespace will be trimmed.","nullable":true,"example":["Manufacturing","Electronics"],"items":{"type":"string","description":"Optional list of Prewave industry names associated with the supplier. Names are matched case-insensitively against GET /public/v1/industries. Unknown or ambiguous names return 400. Commodities are not accepted. Empty strings in the array will be filtered out. Leading/trailing whitespace will be trimmed.","nullable":true,"example":"[\"Manufacturing\",\"Electronics\"]"}},"screeningPeriodInYears":{"type":"integer","description":"Optional. If set to 2, 5, or 10, a history screening for that many years is scheduled automatically after the supplier is created and onboarding completes (batch post_init_screening_period). Requires permission access_public_screening_request in addition to access_public_connect_target. Omit or null to skip.","format":"int32","nullable":true,"example":2,"enum":[2,5,10]},"requestValidationOnCreate":{"type":"boolean","description":"Optional. If set to true, a validation (discovery) request is scheduled automatically after the supplier is created and onboarding completes. Requires permission access_public_validation_request in addition to access_public_connect_target. Omit or set to null/false to skip.","nullable":true,"example":true}},"description":"Payload for creating a new supplier via Public API v2","example":null},"PublicSupplierIdentifierId":{"required":["id"],"type":"object","properties":{"id":{"minLength":1,"type":"string","description":"The supplier ID identifier","example":"SUP-12345"},"source":{"type":"string","description":"Source system of the supplier ID (e.g., 'SAP', 'Excel', 'Coupa'). Optional - omitted when null (legacy supplier IDs). Defaults to 'Public API' when creating suppliers via Public API v2.","nullable":true,"example":"SAP"}},"description":"Supplier ID identifying a supplier in an external system. Supplier IDs are identifiers from external systems (e.g., SAP, Coupa, DNB) that link suppliers to your organization's systems.","example":{"id":"SUP-12345","source":"SAP"}},"PublicSupplierCreateResponseV2":{"required":["message","pendingEndpoint","uuid"],"type":"object","properties":{"uuid":{"type":"string","description":"UUID of the created batch request target that can be used to track the supplier creation request","format":"uuid","example":"550e8400-e29b-41d4-a716-446655440000"},"message":{"type":"string","description":"Success message","example":"Supplier creation request submitted successfully"},"pendingEndpoint":{"type":"string","description":"Information about where to find pending suppliers","example":"Pending suppliers can be found at GET /public/v2/suppliers/sites/pending"}},"example":null},"PublicExternalTargetIdentifier":{"type":"object","properties":{"supplierId":{"type":"string","description":"Supplier ID of the target. Can be combined with customerId, ownId, and/or prewaveId.","nullable":true,"example":"SAP-12345"},"customerId":{"type":"string","description":"Customer ID of the target. Can be combined with supplierId, ownId, and/or prewaveId.","nullable":true,"example":"CRM-67890"},"ownId":{"type":"string","description":"Own site ID of the target. Can be combined with supplierId, customerId, and/or prewaveId.","nullable":true,"example":"OWN-SITE-01"},"prewaveId":{"type":"integer","description":"Prewave ID of the target. Can be combined with supplierId, customerId, and/or ownId.","format":"int32","nullable":true,"example":102006215},"source":{"type":"string","description":"Optional source system to filter by. Applies to supplierId, customerId, and ownId (not prewaveId).","nullable":true,"example":"SAP"}},"description":"Supplier site identifier. At least one lookup key (`supplierId`, `customerId`, `ownId`, or `prewaveId`) should be set; `source` optionally narrows text identifiers.","example":"swagger.example.external-score.target-identifier"},"PublicValidationRequestPayloadV2":{"required":["identifier"],"type":"object","properties":{"identifier":{"$ref":"#/components/schemas/PublicExternalTargetIdentifier"}},"description":"Payload for requesting validation for a supplier via Public API v2","example":null},"PublicValidationRequestResponseV2":{"required":["message","requestId"],"type":"object","properties":{"requestId":{"type":"string","description":"UUID of the validation request, used to track the status via the GET endpoint","format":"uuid","example":"550e8400-e29b-41d4-a716-446655440000"},"message":{"type":"string","description":"Success message","example":"Validation request submitted successfully"}},"example":null},"PublicScreeningOptionsV2":{"required":["periodInYears"],"type":"object","properties":{"periodInYears":{"type":"integer","description":"Screening window length in **years**. Supported values: 2, 5, 10. Note: screening requests may incur additional costs.","format":"int32","example":2,"enum":[2,5,10]}},"description":"Screening parameters to apply","example":null},"PublicScreeningRequestPayloadV2":{"required":["identifier","options"],"type":"object","properties":{"identifier":{"$ref":"#/components/schemas/PublicExternalTargetIdentifier"},"options":{"$ref":"#/components/schemas/PublicScreeningOptionsV2"}},"description":"Payload for requesting screening for a supplier site","example":null},"PublicScreeningCreatedResponseV2":{"required":["message","screeningRequestIds"],"type":"object","properties":{"screeningRequestIds":{"type":"array","description":"IDs of the created screening requests. One ID per resolved target. Empty if all targets were already screened or otherwise ineligible.","example":[10042,10043],"items":{"type":"integer","description":"IDs of the created screening requests. One ID per resolved target. Empty if all targets were already screened or otherwise ineligible.","format":"int32","example":null}},"message":{"type":"string","description":"Human-readable confirmation message.","example":"Screening request submitted successfully"}},"description":"Response returned when a screening request is successfully submitted","example":null},"IdentifierType":{"type":"string","description":"Type of identifier","example":"SUPPLIER_ID","enum":["SUPPLIER_ID","CUSTOMER_ID","OWN_ID"]},"PublicIdentifierCreatePayloadV2":{"required":["id","type"],"type":"object","properties":{"type":{"$ref":"#/components/schemas/IdentifierType"},"id":{"minLength":1,"type":"string","description":"The identifier value","example":"SUP-12345"},"source":{"type":"string","description":"Source system of the identifier (e.g., 'SAP', 'Excel', 'Coupa'). Optional - defaults to 'PUBLIC_API' when not provided.","nullable":true,"example":"SAP"}},"description":"Payload for creating a new identifier (supplier ID, customer ID, or own site ID)","example":{"type":"SUPPLIER_ID","id":"SUP-12345","source":"SAP"}},"PublicIdentifierResponseV2":{"required":["id","prewaveTargetId","type"],"type":"object","properties":{"type":{"$ref":"#/components/schemas/IdentifierType"},"id":{"type":"string","description":"The identifier value","example":"SUP-12345"},"source":{"type":"string","description":"Source system of the identifier","nullable":true,"example":"SAP"},"prewaveTargetId":{"type":"integer","description":"Prewave target ID of the supplier this identifier was added to","format":"int32","example":101266998}},"description":"Response for identifier creation","example":{"type":"SUPPLIER_ID","id":"SUP-12345","source":"SAP","prewaveTargetId":101266998}},"PublicConnectionContactPayload":{"required":["email"],"type":"object","properties":{"email":{"type":"string","description":"Email address of the connection contact.","format":"email","example":"contact@example.com"}},"description":"Payload for creating or updating a connection contact. Contains the contact's email address.","example":null},"PublicSupplierConnectionContact":{"required":["id"],"type":"object","properties":{"id":{"type":"integer","description":"Unique identifier of the connection contact.","format":"int32","example":42},"email":{"type":"string","description":"Email address of the connection contact. May be null if not provided.","format":"email","nullable":true,"example":"contact@example.com"}},"description":"Public representation of a supplier's connection contact. Contains the unique contact ID and the contact's email address.","example":null},"PublicSupplierDDSPayload":{"required":["hsCode","productDescription","referenceNumber","verificationNumber"],"type":"object","properties":{"referenceNumber":{"type":"string","description":"Reference number for the supplier DDS","example":"EU-REF-12345"},"verificationNumber":{"maxLength":40,"type":"string","description":"Verification number for the supplier DDS","example":"VER-987654"},"hsCode":{"maxLength":8,"type":"string","description":"HS Code of the product in the supplier DDS, as stated in the TracesNT system","example":"441510"},"productDescription":{"maxLength":150,"type":"string","description":"Description of the product in the supplier DDS, as stated in the TracesNT system","example":"Wood product"}},"example":null},"PublicCreateOriginRequestPayload":{"required":["items"],"type":"object","properties":{"items":{"$ref":"#/components/schemas/PublicOriginRequestItemPayload"}},"description":"Payload for creating a new origin request. Contains a list of origin request items.","example":null},"PublicOriginRequestItemPayload":{"required":["productId"],"type":"object","properties":{"productId":{"type":"integer","description":"ID of the product for which the origin request is made.","format":"int32","example":123},"endDate":{"type":"string","description":"End date for the origin request (format: yyyy-MM-dd).","format":"date","nullable":true,"example":"2025-09-30"},"requestedWeight":{"type":"number","description":"Requested weight in kg, related to origin requests with weight.","nullable":true,"example":null},"connectionContactIds":{"type":"array","description":"List of connection contact IDs of the supplier. Contacts can be retrieved and managed by the connection-contact endpoints.","nullable":true,"example":[1,2,3],"items":{"type":"integer","description":"List of connection contact IDs of the supplier. Contacts can be retrieved and managed by the connection-contact endpoints.","format":"int32","example":null}},"comment":{"type":"string","description":"Additional notification comment.","nullable":true,"example":"Please process urgently."},"references":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/PublicOriginRequestRefPayload"}],"example":null}},"description":"Payload for a single origin request item. Contains product, date, contacts, comment, and references.","example":null},"PublicOriginRequestRefPayload":{"required":["referenceType"],"type":"object","properties":{"reference":{"type":"string","description":"Reference label.","nullable":true,"example":"PO-2025-001"},"referenceType":{"$ref":"#/components/schemas/PublicProductReferenceType"}},"description":"Reference for an origin request, including label and type.","example":null},"BulkResultFailedPublicOriginRequestItemPayload":{"required":["value"],"type":"object","properties":{"value":{"$ref":"#/components/schemas/PublicOriginRequestItemPayload"},"message":{"type":"string","nullable":true,"example":null}},"example":null},"BulkResultStatus":{"type":"string","enum":["Succeeded","PartlySucceeded","Failed"],"example":null},"PublicOriginRequest":{"required":["createdAt","id","productId","status"],"type":"object","properties":{"id":{"type":"integer","description":"Origin Request ID.","format":"int32","example":1001},"productId":{"type":"integer","description":"Product ID of the origin request.","format":"int32","example":123},"createdAt":{"type":"string","description":"Creation date of the origin request.","format":"date-time","example":null},"status":{"$ref":"#/components/schemas/PublicFilterOriginRequestStatus"},"references":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/PublicOriginRequestRefPayload"}],"example":null}},"description":"Origin request details, including ID, product, creation date, status, and references.","example":null},"PublicOriginRequestResult":{"required":["failed","status","succeeded"],"type":"object","properties":{"succeeded":{"type":"array","items":{"$ref":"#/components/schemas/PublicOriginRequest"},"example":null},"failed":{"type":"array","items":{"$ref":"#/components/schemas/BulkResultFailedPublicOriginRequestItemPayload"},"example":null},"status":{"$ref":"#/components/schemas/BulkResultStatus"}},"description":"Bulk result for origin request creation. Contains succeeded and failed items.","example":null},"OriginRequestProductUnsupportedErrorDTO":{"required":["code","message"],"type":"object","properties":{"message":{"type":"string","description":"Error message","example":null},"code":{"type":"string","description":"Error code","example":null},"solution":{"type":"string","description":"Possible solution to the error","nullable":true,"example":null}},"description":"Error for unsupported origin request products","example":{"code":"origin_request_product_unsupported","message":"Products are not accessible for origin requests, please check if products are available and type of 'Inbound': 1, 2, 3","solution":"Please verify the product details and ensure it is supported."}},"ErrorCode":{"type":"string","enum":["duplicate_key","foreign_key_violation","data_integrity_violation","data_access","database_query_timeout","resource_not_found","invalid_json","parameter_missing","missing_property","invalid_request","record_not_found","credits_off","microservice_not_configured","microservice_not_available","duplicate_edge_number","duplicate_edge_source","invalid_edge_number","permission_limit_exceeded","permission_limit_value_missing","work_in_progress","http_method_not_supported","ds_exchange_conflict","ds_detailed_update_error","follows_collection_not_found","not_implemented","general_connection_contact_missing","denied_for_private_organization","report_already_fetched","unknown_error","multiple_target_found","graph_not_available_for_non_tier_collection","passed","assertion_failed","error_occured","only_one_active_bafa_report_allowed_per_customer","action_not_found","action_status_not_found","action_update_failed","role_not_found","alert_label_not_found","alert_not_found","customer_not_found","connection_contact_not_found","collection_not_found","edge_not_found","incident_not_found","infotag_not_found","invitation_not_found","perspective_not_found","target_not_found","supplier_not_found","commodity_level_not_found","exposure_analysis_not_found","graph_size_reached","empty_exposure_collection","tier_n_collection_not_found","plan_not_found","team_not_found","user_not_found","geo_json_syntax","answer_blocked","tracesnt_dds_error","customer_dds_withdrawal_not_allowed","origin_request_update_error","hs_code_not_found","unsupported_product_regulation","missing_wooden_product_scientific_name","origin_request_product_unsupported","target_score_not_available","demo_user_not_found","no_customer_for_given_organization","demo_user_already_exists","cache_missing","invalid_group_id","unsupported_component","risk_analysis_has_snapshot","risk_analysis_monitor_quota_exceeded","risk_analysis_already_monitored"],"example":null},"TracesNtDDSErrorDTO":{"required":["code","message","reasons","solution"],"type":"object","properties":{"message":{"type":"string","example":null},"reasons":{"type":"array","items":{"type":"string","example":null},"example":null},"solution":{"type":"string","example":null},"code":{"$ref":"#/components/schemas/ErrorCode"}},"example":null},"CodeErrorDTO":{"required":["code","message"],"type":"object","properties":{"code":{"type":"string","description":"Error code","example":null},"ex":{"type":"object","properties":{"cause":{"type":"object","properties":{"stackTrace":{"type":"array","items":{"type":"object","properties":{"classLoaderName":{"type":"string","example":null},"moduleName":{"type":"string","example":null},"moduleVersion":{"type":"string","example":null},"methodName":{"type":"string","example":null},"fileName":{"type":"string","example":null},"lineNumber":{"type":"integer","format":"int32","example":null},"className":{"type":"string","example":null},"nativeMethod":{"type":"boolean","example":null}},"example":null},"example":null},"message":{"type":"string","example":null},"suppressed":{"type":"array","items":{"type":"object","properties":{"stackTrace":{"type":"array","items":{"type":"object","properties":{"classLoaderName":{"type":"string","example":null},"moduleName":{"type":"string","example":null},"moduleVersion":{"type":"string","example":null},"methodName":{"type":"string","example":null},"fileName":{"type":"string","example":null},"lineNumber":{"type":"integer","format":"int32","example":null},"className":{"type":"string","example":null},"nativeMethod":{"type":"boolean","example":null}},"example":null},"example":null},"message":{"type":"string","example":null},"localizedMessage":{"type":"string","example":null}},"example":null},"example":null},"localizedMessage":{"type":"string","example":null}},"example":null},"stackTrace":{"type":"array","items":{"type":"object","properties":{"classLoaderName":{"type":"string","example":null},"moduleName":{"type":"string","example":null},"moduleVersion":{"type":"string","example":null},"methodName":{"type":"string","example":null},"fileName":{"type":"string","example":null},"lineNumber":{"type":"integer","format":"int32","example":null},"className":{"type":"string","example":null},"nativeMethod":{"type":"boolean","example":null}},"example":null},"example":null},"message":{"type":"string","example":null},"suppressed":{"type":"array","items":{"type":"object","properties":{"stackTrace":{"type":"array","items":{"type":"object","properties":{"classLoaderName":{"type":"string","example":null},"moduleName":{"type":"string","example":null},"moduleVersion":{"type":"string","example":null},"methodName":{"type":"string","example":null},"fileName":{"type":"string","example":null},"lineNumber":{"type":"integer","format":"int32","example":null},"className":{"type":"string","example":null},"nativeMethod":{"type":"boolean","example":null}},"example":null},"example":null},"message":{"type":"string","example":null},"localizedMessage":{"type":"string","example":null}},"example":null},"example":null},"localizedMessage":{"type":"string","example":null}},"writeOnly":true,"example":null},"message":{"type":"string","description":"Error message","example":null},"solution":{"type":"string","description":"Possible solution to the error","nullable":true,"example":null}},"example":null},"PublicCreateUserRequest":{"required":["email"],"type":"object","properties":{"email":{"minLength":1,"type":"string","format":"email","example":null},"firstname":{"type":"string","nullable":true,"example":null},"lastname":{"type":"string","nullable":true,"example":null},"teamIds":{"type":"array","nullable":true,"items":{"type":"integer","format":"int32","example":null},"example":null},"roleNames":{"type":"array","nullable":true,"items":{"type":"string","example":null},"example":null},"planId":{"type":"integer","format":"int32","nullable":true,"example":null}},"example":null},"PublicUserResponse":{"required":["active","confirmed","customer","id","roles","teams"],"type":"object","properties":{"id":{"type":"integer","format":"int32","example":null},"active":{"type":"boolean","example":null},"confirmed":{"type":"boolean","example":null},"firstname":{"type":"string","nullable":true,"example":null},"lastname":{"type":"string","nullable":true,"example":null},"email":{"type":"string","nullable":true,"example":null},"customer":{"$ref":"#/components/schemas/PublicUserResponseCustomerDTO"},"organization":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/PublicUserResponseOrganizationDTO"}],"example":null},"plan":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/PublicUserResponsePlanDTO"}],"example":null},"teams":{"type":"array","items":{"$ref":"#/components/schemas/PublicUserResponseTeamDTO"},"example":null},"roles":{"type":"array","items":{"$ref":"#/components/schemas/PublicUserRoleDTO"},"example":null}},"example":null},"PublicUserResponseCustomerDTO":{"required":["id","name"],"type":"object","properties":{"id":{"type":"integer","format":"int32","example":null},"name":{"type":"string","example":null}},"example":null},"PublicUserResponseOrganizationDTO":{"required":["id","name"],"type":"object","properties":{"id":{"type":"integer","format":"int32","example":null},"name":{"type":"string","example":null}},"example":null},"PublicUserResponsePlanDTO":{"required":["id","name"],"type":"object","properties":{"id":{"type":"integer","format":"int32","example":null},"name":{"type":"string","example":null},"validFrom":{"type":"string","format":"date-time","nullable":true,"example":null}},"example":null},"PublicUserResponseTeamDTO":{"required":["id","name"],"type":"object","properties":{"id":{"type":"integer","format":"int32","example":null},"name":{"type":"string","example":null}},"example":null},"PublicUserRoleDTO":{"required":["id","name"],"type":"object","properties":{"id":{"type":"integer","format":"int32","example":null},"name":{"type":"string","example":null},"description":{"type":"string","nullable":true,"example":null}},"example":null},"PublicBulkFetchTargetsRequest":{"required":["isValid"],"type":"object","properties":{"targetIds":{"type":"array","description":"List of Prewave internal target IDs to fetch","nullable":true,"example":[101,102,103],"items":{"type":"integer","description":"List of Prewave internal target IDs to fetch","format":"int32","example":null}},"foreignTargets":{"type":"array","description":"List of foreign system target mappings to fetch","nullable":true,"example":[{"systemId":"customer","targetId":"SUPPLIER001"}],"items":{"$ref":"#/components/schemas/PublicForeignTargetId"}},"isValid":{"type":"boolean","example":null}},"example":null},"PublicForeignTargetId":{"required":["systemId","targetId"],"type":"object","properties":{"systemId":{"type":"string","description":"Foreign system identifier (e.g., 'SAP', 'prewave')","example":"SAP"},"targetId":{"type":"string","description":"Target ID in the foreign system","example":"SUPPLIER001"}},"description":"List of foreign system target mappings to fetch","example":[{"systemId":"customer","targetId":"SUPPLIER001"}]},"PublicBulkFetchError":{"required":["reason"],"type":"object","properties":{"targetId":{"type":"integer","description":"Prewave internal target ID (if available)","format":"int32","nullable":true,"example":101},"systemId":{"type":"string","description":"The system ID is an identifier to determine from which the targetId might originate from. Supported systemIds are \"prewave\", \"customer\", \"supplier\", \"own\".","nullable":true,"example":"customer"},"systemTargetId":{"type":"string","description":"The target ID can be the target's prewaveId or an external id (edge number) representing the site in another system.","nullable":true,"example":"SUPPLIER001"},"reason":{"type":"string","description":"Error reason","example":"NOT_FOUND","enum":["NOT_FOUND","ACCESS_DENIED","INVALID_SYSTEM_ID","SCORE_NOT_AVAILABLE","TARGET_NOT_IN_MEMORY_CACHE"]}},"description":"Failed target lookups with error details","example":null},"PublicBulkFetchTargetsResponse":{"required":["errors","targets"],"type":"object","properties":{"targets":{"type":"array","description":"Successfully fetched targets with full details","items":{"$ref":"#/components/schemas/PublicTargetDTO"},"example":null},"errors":{"type":"array","description":"Failed target lookups with error details","items":{"$ref":"#/components/schemas/PublicBulkFetchError"},"example":null}},"example":null},"BirsDeviation":{"type":"string","description":"Deviation from the agreed upon Safety Stock","example":"OnTarget","enum":["NotApplicable","OnTarget","Below","Above"]},"BirsLocation":{"type":"string","description":"The supplier location","example":"SameBuilding","enum":["SameBuilding","DifferentFireSection","DifferentBuilding","NotApplicable"]},"Priority":{"type":"string","description":"Priority of alert","enum":["Low","Mid","High","Critical"],"example":null},"PublicFullSitesUpsertPayload":{"required":["dryRun","siteData"],"type":"object","properties":{"siteData":{"type":"array","items":{"$ref":"#/components/schemas/SitesUpsertPayloadSiteEntry"},"example":null},"dryRun":{"type":"boolean","description":"If set to true, the request will be processed without actually writing to the database.This is useful for testing purposes.\n            |Use endpoints `{requestId}/dry-runs` and `dry-run/{id}` to get the status and the results of your dry-runs.","example":null}},"example":null},"SitesUpsertExternalReferencePayload":{"required":["externalId","system"],"type":"object","properties":{"externalId":{"type":"string","description":"The external identifier","example":"DUNS_123"},"system":{"type":"string","description":"The external identifier type","example":"duns"}},"description":"External identifiers that uniquely identify a Site. Prewave allows multiple identifier types.","example":null},"SitesUpsertImpactDataPayload":{"required":["year"],"type":"object","properties":{"year":{"type":"integer","description":"Year of this impact data","format":"int32","example":2024},"bi12MlnEuro":{"type":"number","description":"The Business Interruption-12 Value is the revenue generated with the products produced with the suppliers goods. It represents the revenue at risk in case this supplier fails to deliver.","format":"double","nullable":true,"example":20.0},"grossMttrEMonths":{"type":"integer","description":"Mean time to recovery (mttr) in months in case of an \"elementary loss\" of this suppliers facility.\n            |In other words: \"How long does it take to shift production to another site or another supplier?\" ","format":"int32","nullable":true,"example":2},"grossMttrIMonths":{"type":"integer","description":"Mean time to recovery (mttr) in months in case of an \"insolvency loss\" of this suppliers facility.\n            |In other words: \"'\"How long does it take to shift production to another site or another supplier?\" ","format":"int32","nullable":true,"example":4},"cocSigned":{"type":"boolean","description":"Did this supplier sign our Code of Conduct?","nullable":true,"example":true},"additionalInformation":{"type":"string","description":"Additional text information regarding this impact data","nullable":true,"example":null}},"description":"Data related to calculating the impact.","example":null},"SitesUpsertIndustryDefinitionPayload":{"required":["industry","industryStandard"],"type":"object","properties":{"industry":{"type":"string","description":"The industry identifier based on the standard","example":"I_AUTOMOTIVE"},"industryStandard":{"type":"string","description":"The industry standard used","example":"MOCK-ISO-42"}},"description":"Can be used to define industries for a site. This helps to assign the site to a specific industry.","example":null},"SitesUpsertPayloadSiteEntry":{"required":["addressLine","countryCode","locality","name","yourReference"],"type":"object","properties":{"name":{"type":"string","description":"The human-readable name for the Site, usually canonical.\n            |The name must refer to an organization that is publicly registered\n            |and carries out its main activity in that specific location.","example":null},"countryCode":{"type":"string","description":"Alpha-2 ISO Code of the address. See https://www.iso.org/obp/ui for details.","example":"AT"},"locality":{"type":"string","description":"Refers to the city/town portion of the address.\n            |In regions of the world where localities are not well defined or do not fit into this structure well, choose the closest locally instead.\n            |Must have more than 3 characters.","example":null},"addressLine":{"type":"string","description":"Unstructured address lines describing the lower levels of an address. Usually this is a street name and house number.","example":"Rothschildplatz 4, 3rd Floor"},"postalCode":{"type":"string","description":"Postal code of the address. Not all countries use or require postal codes to be present, but where they are used, they may trigger additional validation with other parts of the address.","nullable":true,"example":"1020"},"industries":{"type":"array","description":"Can be used to define industries for a site. This helps to assign the site to a specific industry.","nullable":true,"items":{"$ref":"#/components/schemas/SitesUpsertIndustryDefinitionPayload"},"example":null},"website":{"type":"string","description":"The official website for this site, such as the homepage of a business.","nullable":true,"example":"https://www.prewave.com"},"contact":{"type":"array","description":"List of email addresses for the site's contacts to complete self-assessments.","nullable":true,"items":{"type":"string","description":"List of email addresses for the site's contacts to complete self-assessments.","example":null},"example":null},"yourReference":{"$ref":"#/components/schemas/SitesUpsertYourReference"},"additionalReferences":{"type":"array","description":"A list of additional references that identify a Site connected to your organization. Your reference can be a Supplier ID, ERP ID, or any other unique identifier for a site.","items":{"$ref":"#/components/schemas/SitesUpsertYourReference"},"default":[],"example":null},"connectionType":{"$ref":"#/components/schemas/SitesUpsertSiteType"},"diImpact":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/Level"}],"example":null},"biImpact":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/Level"}],"example":null},"priority":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/Priority"}],"example":null},"spendData":{"type":"number","description":"The total value of the goods and/or services you purchased at that site in EUR per year.\n            |Prewave can automatically evaluate its impact based on the spending data you provide and the total revenue of the site.","format":"double","nullable":true,"example":500000.0},"collectionNames":{"type":"array","description":"A list of collections in which you want to group your site.","nullable":true,"example":["product group","responsible supplier manager","responsible team","region","product"],"items":{"type":"string","description":"A list of collections in which you want to group your site.","example":"[\"product group\",\"responsible supplier manager\",\"responsible team\",\"region\",\"product\"]"}},"externalReferences":{"type":"array","description":"External identifiers that uniquely identify a Site. Prewave allows multiple identifier types.","nullable":true,"items":{"$ref":"#/components/schemas/SitesUpsertExternalReferencePayload"},"example":null},"postInitScreeningPeriod":{"type":"integer","description":"Request a history screening of the site (in years to be screened) to be triggered automatically right after the onboarding.\n             |Additional costs may apply, quota is affected.","format":"int32","nullable":true,"example":null},"impactData":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/SitesUpsertImpactDataPayload"}],"example":null},"safetyStock":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/SitesUpsertSafetyStockPayload"}],"example":null}},"example":null},"SitesUpsertSafetyStockPayload":{"type":"object","properties":{"onPremiseStockLevelMonths":{"type":"integer","description":"Safety stocks on premise of goods purchased from this supplier","format":"int32","nullable":true,"example":2},"atSupplierLocation":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/BirsLocation"}],"example":null},"atSupplierDeviation":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/BirsDeviation"}],"example":null},"atSupplierStockLevelMonths":{"type":"integer","description":"Agreed upon safety stock at the supplier","format":"int32","nullable":true,"example":4},"atSupplierLastConfirmedDate":{"type":"string","description":"Date on which the safety stock level was last confirmed by the supplier.","format":"date","nullable":true,"example":"2023-11-23"},"inLogisticChainDaysOnHand":{"type":"integer","description":"Stock Level currently on the logistics chain to the production facilities.","format":"int32","nullable":true,"example":40}},"example":null},"SitesUpsertSiteType":{"type":"string","description":"How the Site is associated with your organization.\n            |For reports and analysis, the connection type functions as a filter within the Prewave platform.","example":"Supplier","default":"Supplier","enum":["Supplier","Customer","Own"]},"SitesUpsertYourReference":{"required":["id"],"type":"object","properties":{"id":{"type":"string","description":"A textual identifier that uniquely identifies a Site connected to your organization. Your reference can be a Supplier ID, ERP ID, or any other unique identifier for a site.","example":"ERP-ID-123"},"source":{"type":"string","description":"An identifier that determines which system the “your_reference” originates. The source could be any ERP system or any internal tool you use to maintain your data","nullable":true,"example":"erp"}},"example":null},"SitesUpsertRequestCreatedResponse":{"required":["requestId"],"type":"object","properties":{"requestId":{"type":"string","description":"The ID of a sites upsert request. Use this ID to check the status of the request and to retrieve dry-run ids.","format":"uuid","example":null}},"example":null},"SitesUpsertValidationErrorEntry":{"required":["error","yourReference"],"type":"object","properties":{"yourReference":{"type":"string","example":null},"error":{"type":"string","example":null}},"example":null},"SitesUpsertValidationFailedResponse":{"required":["validationErrors"],"type":"object","properties":{"validationErrors":{"type":"array","items":{"$ref":"#/components/schemas/SitesUpsertValidationErrorEntry"},"example":null}},"example":null},"PublicDeltaSitesUpsertPayload":{"required":["dryRun","siteData"],"type":"object","properties":{"siteData":{"type":"array","items":{"$ref":"#/components/schemas/SitesUpsertPayloadSiteEntry"},"example":null},"dryRun":{"type":"boolean","description":"If set to true, the request will be processed without actually writing to the database.This is useful for testing purposes.\n            |Use endpoints `{requestId}/dry-runs` and `dry-run/{id}` to get the status and the results of your dry-runs.","example":null}},"example":null},"PublicExternalScoreCreationRequest":{"required":["data"],"type":"object","properties":{"data":{"maxItems":100,"minItems":0,"type":"array","description":"Suppliers and their scores. At most 100 suppliers per request.","items":{"$ref":"#/components/schemas/PublicExternalTargetScoreCollection"},"example":null}},"example":null},"PublicExternalTargetScore":{"required":["eventTypeKey","scoreValue"],"type":"object","properties":{"eventTypeKey":{"minLength":1,"type":"string","example":null},"scoreValue":{"maximum":100,"minimum":1,"type":"integer","format":"int32","example":null},"comment":{"type":"string","nullable":true,"example":null}},"description":"Scores for this supplier, one per event type. At most 50 per supplier.","example":null},"PublicExternalTargetScoreCollection":{"required":["identifier","scores"],"type":"object","properties":{"identifier":{"$ref":"#/components/schemas/PublicExternalTargetIdentifier"},"scores":{"maxItems":50,"minItems":0,"type":"array","description":"Scores for this supplier, one per event type. At most 50 per supplier.","items":{"$ref":"#/components/schemas/PublicExternalTargetScore"},"example":null}},"description":"Suppliers and their scores. At most 100 suppliers per request.","example":null},"PublicExternalScoreCreationError":{"required":["entryIndex","identifier","message","reason"],"type":"object","properties":{"entryIndex":{"type":"integer","format":"int32","example":null},"scoreIndex":{"type":"integer","format":"int32","nullable":true,"example":null},"identifier":{"$ref":"#/components/schemas/PublicExternalTargetIdentifier"},"eventTypeKey":{"type":"string","nullable":true,"example":null},"reason":{"$ref":"#/components/schemas/PublicExternalScoreCreationErrorReason"},"message":{"type":"string","example":null}},"example":null},"PublicExternalScoreCreationErrorReason":{"type":"string","enum":["INVALID_IDENTIFIER","TARGET_NOT_FOUND","MULTIPLE_TARGETS_MATCHED","UNKNOWN_EVENT_TYPE","PERSIST_ERROR","UNEXPECTED_ERROR"],"example":null},"PublicExternalScoreCreationResponse":{"required":["errors","resolvedCount","skippedCount","success","totalCount","validCount","writtenCount"],"type":"object","properties":{"success":{"type":"boolean","example":null},"totalCount":{"type":"integer","format":"int32","example":null},"validCount":{"type":"integer","format":"int32","example":null},"resolvedCount":{"type":"integer","format":"int32","example":null},"writtenCount":{"type":"integer","format":"int32","example":null},"skippedCount":{"type":"integer","format":"int32","example":null},"errors":{"type":"array","items":{"$ref":"#/components/schemas/PublicExternalScoreCreationError"},"example":null}},"example":null},"EnterpriseExportRunInterval":{"type":"string","description":"\n            Defines the time interval for running the export job.\n            Options include SIX_HOURS, TWELVE_HOURS, DAILY, and WEEKLY.\n            Defaults to WEEKLY if not specified.","example":"WEEKLY","enum":["SIX_HOURS","TWELVE_HOURS","DAILY","WEEKLY"]},"PublicScoreExecutionConfig":{"required":["collectionIds","enabled","includeComponents","perspectiveIds","runInterval","targetIds"],"type":"object","properties":{"runInterval":{"$ref":"#/components/schemas/EnterpriseExportRunInterval"},"enabled":{"type":"boolean","description":"Indicates whether the export job is enabled. If false, the job will not run.","example":true},"collectionIds":{"type":"array","description":"List of Prewave Collection IDs to include in the export job.","example":[123,456,789],"items":{"type":"integer","description":"List of Prewave Collection IDs to include in the export job.","format":"int32","example":null}},"targetIds":{"type":"array","description":"List of Target IDs to include in the export job.","example":[101,202,303,102006215],"items":{"type":"integer","description":"List of Target IDs to include in the export job.","format":"int32","example":null}},"perspectiveIds":{"type":"array","description":"List of Perspective IDs to include in the export job.","example":[1,2,3],"items":{"type":"integer","description":"List of Perspective IDs to include in the export job.","format":"int32","example":null}},"includeComponents":{"type":"boolean","description":"\n            Indicates whether to include score components and subcomponents in the export result.\n            If true, components will be included.","example":false}},"example":null},"PublicCollectionPayload":{"required":["lanes","name","scope","tiersEnabled"],"type":"object","properties":{"scope":{"$ref":"#/components/schemas/CollectionScope"},"name":{"minLength":1,"type":"string","example":null},"lanes":{"type":"boolean","example":null},"tiersEnabled":{"type":"boolean","example":null},"parentId":{"type":"integer","format":"int32","nullable":true,"example":null}},"example":null},"PublicUpdateUserRequest":{"type":"object","properties":{"firstname":{"type":"string","nullable":true,"example":null},"lastname":{"type":"string","nullable":true,"example":null},"planId":{"type":"integer","format":"int32","nullable":true,"example":null},"active":{"type":"boolean","nullable":true,"example":null}},"example":null},"PublicOutputFormat":{"type":"string","description":"Output format for supplier graph responses","enum":["JSON","CSV"],"example":null},"PublicSupplierGraphEntry":{"required":["customerId","source","supplierId","tier"],"type":"object","properties":{"tier":{"type":"integer","description":"Tier number of the relationship (1 = direct)","format":"int32","example":2},"supplierId":{"type":"integer","description":"Supplier node identifier","format":"int32","example":4567},"customerId":{"type":"integer","description":"Customer/target node identifier","format":"int32","example":1234},"source":{"$ref":"#/components/schemas/EdgeSource"},"probability":{"type":"integer","description":"Confidence or probability for the relationship in percent (0-100)","format":"int32","nullable":true,"example":87},"mediaSources":{"type":"array","description":"List of media source URLs used to derive MEDIA edges; present only when includeMediaSources=true","nullable":true,"example":["https://example.com/article-1","https://example.com/article-2"],"items":{"type":"string","description":"List of media source URLs used to derive MEDIA edges; present only when includeMediaSources=true","example":"[\"https://example.com/article-1\",\"https://example.com/article-2\"]"}},"nShipments":{"type":"integer","description":"Number of shipments observed for this supplier/target pair (if shipments filtering is active)","format":"int32","nullable":true,"writeOnly":true,"example":3},"shipments":{"type":"array","description":"Detailed shipment information per HS code; present only when includeShipmentDetails=true","nullable":true,"items":{"$ref":"#/components/schemas/PublicSupplierGraphShipment"},"example":null},"nshipments":{"type":"integer","format":"int32","example":null}},"description":"Single supplier relationship entry in the supplier graph","example":null},"PublicSupplierGraphShipment":{"required":["hscode"],"type":"object","properties":{"hscode":{"type":"integer","description":"HS code (6 digits)","format":"int32","example":847330},"nShipments":{"type":"integer","description":"Number of shipments observed for this HS code","format":"int32","nullable":true,"writeOnly":true,"example":5},"lastShipment":{"type":"string","description":"Date of the last observed shipment for this HS code","format":"date","nullable":true,"example":"2024-03-15"},"nshipments":{"type":"integer","format":"int32","example":null}},"description":"Shipment details for a supplier relationship, grouped by HS code","example":null},"PublicEdgeInfo":{"required":["hsCodes"],"type":"object","properties":{"hsCodes":{"type":"array","items":{"$ref":"#/components/schemas/PublicHSCode"},"example":null},"probability":{"type":"number","format":"double","nullable":true,"example":null}},"example":null},"PublicTargetInfoDTO":{"required":["collectionPath","path"],"type":"object","properties":{"tier":{"type":"integer","description":"How far the supplier is away from the root supplier","format":"int32","nullable":true,"example":null},"path":{"type":"array","description":"The path to the supplier, where the first element is the root supplier","items":{"type":"integer","description":"The path to the supplier, where the first element is the root supplier","format":"int32","example":null},"example":null},"collectionLevel":{"type":"integer","description":"How deep the supplier is in the collection hierarchy","format":"int32","nullable":true,"example":null},"collectionPath":{"type":"array","description":"The path to the collection, where the first element is the root collection","items":{"type":"integer","description":"The path to the collection, where the first element is the root collection","format":"int32","example":null},"example":null},"collectionPaths":{"type":"array","description":"List of collection paths per target with collection id as bottom level collection","nullable":true,"items":{"type":"array","description":"List of collection paths per target with collection id as bottom level collection","items":{"type":"integer","description":"List of collection paths per target with collection id as bottom level collection","format":"int32","example":null},"example":null},"example":null}},"description":"Information about the supplier (tier, path, collection)","example":null},"PublicTreeTargetV2":{"required":["edgeSource","suppliers","target","targetInfo"],"type":"object","properties":{"target":{"type":"integer","description":"The target id of the supplier","format":"int32","example":null},"suppliers":{"type":"array","description":"All sub-suppliers nested in the same structure","items":{"$ref":"#/components/schemas/PublicTreeTargetV2"},"example":null},"targetInfo":{"$ref":"#/components/schemas/PublicTargetInfoDTO"},"edgeSource":{"type":"string","description":"Allowed values \"Public Media\", \"Public Customs\", \"Private\", \"Shared\", \"Prewave Prediction\" ","example":null},"edgeInfo":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/PublicEdgeInfo"}],"example":null},"merged_targets":{"type":"array","description":"Target ids of past targets that were merged into this current target","items":{"type":"integer","description":"Target ids of past targets that were merged into this current target","format":"int32","example":null},"default":[],"example":null}},"example":null},"Scope":{"type":"string","enum":["Private","Shared","Public"],"example":null},"TargetSuppliersFilter":{"required":["collectionIds","commodityIds","countryIds","hscodes","onlyDirectlySuppliers","scopes","targetTypeIds","tiers"],"type":"object","properties":{"query":{"type":"string","nullable":true,"example":null},"collectionIds":{"type":"array","items":{"type":"integer","format":"int32","example":null},"example":null},"commodityIds":{"type":"array","items":{"type":"integer","format":"int32","example":null},"example":null},"targetTypeIds":{"type":"array","items":{"type":"integer","format":"int32","example":null},"example":null},"tiers":{"type":"array","items":{"type":"integer","format":"int32","example":null},"example":null},"scopes":{"type":"array","items":{"$ref":"#/components/schemas/Scope"},"example":null},"source":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/EdgeSource"}],"example":null},"countries":{"type":"array","writeOnly":true,"items":{"type":"integer","format":"int32","example":null},"example":null},"hscodes":{"type":"array","items":{"type":"string","example":null},"example":null},"lastShipment":{"type":"string","format":"date","nullable":true,"example":null},"onlyDirectlySuppliers":{"type":"boolean","example":null},"countryIds":{"type":"array","items":{"type":"integer","format":"int32","example":null},"example":null}},"example":null},"Pageable":{"type":"object","properties":{"page":{"minimum":0,"type":"integer","format":"int32","example":null},"size":{"minimum":1,"type":"integer","format":"int32","example":null},"sort":{"type":"array","items":{"type":"string","example":null},"example":null}},"example":null},"SortObject":{"type":"object","properties":{"empty":{"type":"boolean","example":null},"sorted":{"type":"boolean","example":null},"unsorted":{"type":"boolean","example":null}},"example":null},"PublicValidationStatus":{"type":"string","description":"Current status of the validation request","example":"PENDING","enum":["PENDING","COMPLETED","REJECTED","PENDING","COMPLETED","REJECTED"]},"PublicValidationStatusV2DTO":{"required":["prewaveTargetId","requestId","status"],"type":"object","properties":{"requestId":{"type":"string","description":"UUID of the validation request","format":"uuid","example":"550e8400-e29b-41d4-a716-446655440000"},"status":{"$ref":"#/components/schemas/PublicValidationStatus"},"prewaveTargetId":{"type":"integer","description":"Prewave target ID of the supplier for which validation was requested","format":"int32","example":102006215},"outcomeTargetId":{"type":"integer","description":"Prewave target ID of the outcome site (set when status is COMPLETED)","format":"int32","nullable":true,"example":102006220},"rejectionReason":{"type":"string","description":"Reason for rejection (set when status is REJECTED)","nullable":true,"example":"Address could not be validated"},"rejectionReasonNotes":{"type":"string","description":"Additional notes on the rejection reason (set when status is REJECTED)","nullable":true,"example":"The provided address does not match any known location"},"createdAt":{"type":"string","description":"Timestamp when the validation request was created (ISO-8601, no timezone offset)","format":"date-time","nullable":true,"example":null},"resolvedAt":{"type":"string","description":"Timestamp when the validation request was resolved (ISO-8601, no timezone offset; set when status is COMPLETED or REJECTED)","format":"date-time","nullable":true,"example":null}},"example":null},"PublicScreeningStatusResponseV2":{"required":["id","periodInYears","status"],"type":"object","properties":{"id":{"type":"integer","description":"The screening request ID.","format":"int32","example":10042},"status":{"$ref":"#/components/schemas/ScreeningRequestStatus"},"periodInYears":{"type":"integer","description":"Screening window length in years (as requested).","format":"int32","example":2}},"description":"Status and outcome of a screening request","example":null},"ScreeningRequestStatus":{"type":"string","description":"Current status of the screening request: New (in progress), Finished (findings found), NoFindings (no findings), Aborted (failed or rejected).","example":"Finished","enum":["New","Finished","NoFindings","Aborted"]},"PublicPendingSupplierV2DTO":{"required":["status","supplierId","uuid"],"type":"object","properties":{"uuid":{"type":"string","description":"Batch request target UUID","format":"uuid","example":"550e8400-e29b-41d4-a716-446655440000"},"supplierId":{"$ref":"#/components/schemas/PublicSupplierIdentifierId"},"name":{"type":"string","description":"Name of the supplier","nullable":true,"example":"Acme Corporation"},"countryCode":{"type":"string","description":"ISO country code","nullable":true,"example":"AT"},"city":{"type":"string","description":"City","nullable":true,"example":"Vienna"},"address":{"type":"string","description":"Address","nullable":true,"example":"123 Main St, Vienna, Austria"},"status":{"type":"string","description":"Status of the batch request target","example":"Pending"},"reason":{"type":"string","description":"Reason for the current status","nullable":true,"example":"Awaiting processing"}},"example":null},"PublicSupplierDetailV2DTO":{"required":["customerIds","name","ownIds","prewaveTargetId","screened","supplierIds"],"type":"object","properties":{"prewaveTargetId":{"type":"integer","description":"Prewave target ID of the supplier","format":"int32","example":102006215},"name":{"type":"string","description":"Name of the supplier","example":"Acme Corporation"},"sname":{"type":"string","description":"Geonames ID (see https://geonames.org)","nullable":true,"example":"3191281"},"linkedInId":{"type":"string","description":"LinkedIn ID of the supplier","nullable":true,"example":"acme-corporation"},"address":{"type":"string","description":"Full address of the supplier","nullable":true,"example":"123 Main St, Vienna, Austria"},"city":{"type":"string","description":"City of the supplier's location","nullable":true,"example":"Vienna"},"countryCode":{"type":"string","description":"ISO 3166-1 alpha-2 country code of the supplier's location","nullable":true,"example":"AT"},"postalCode":{"type":"string","description":"Postal/ZIP code of the supplier's location","nullable":true,"example":"1010"},"website":{"type":"string","description":"Website URL of the supplier","nullable":true,"example":"https://www.example.com"},"description":{"type":"string","description":"Description of the supplier","nullable":true,"example":"Leading manufacturer of electronic components"},"logo":{"type":"string","description":"URL to the logo shown in the supplier profile","nullable":true,"example":null},"yearFounded":{"type":"integer","description":"Year the supplier was founded","format":"int32","nullable":true,"example":1999},"size":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/TargetSize"}],"example":null},"supplierIds":{"type":"array","description":"Supplier IDs associated with the supplier","items":{"$ref":"#/components/schemas/PublicSupplierIdentifierId"},"example":null},"customerIds":{"type":"array","description":"Customer IDs associated with the supplier","items":{"$ref":"#/components/schemas/PublicSupplierIdentifierId"},"example":null},"ownIds":{"type":"array","description":"Own site IDs associated with the supplier","items":{"$ref":"#/components/schemas/PublicSupplierIdentifierId"},"example":null},"screened":{"type":"boolean","description":"Whether the supplier is screened or not","example":true},"screenedStatus":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/ScreeningStatus"}],"example":null},"monitoredSince":{"type":"string","description":"Timestamp when the supplier monitoring started (ISO-8601 UTC)","format":"date-time","nullable":true,"example":"2023-01-01T12:00:00Z"},"earliestAlert":{"type":"string","description":"Deprecated. Timestamp of the earliest alert for the supplier (ISO-8601 UTC). Omitted when enabled for your organization.","format":"date-time","nullable":true,"example":"2023-01-01T12:00:00Z","deprecated":true},"siteGroup":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/PublicTargetRef"}],"example":null},"connectionContactsCount":{"type":"integer","description":"Number of connection contacts of the supplier","format":"int32","nullable":true,"example":5}},"example":null},"PublicTargetRef":{"required":["id","name"],"type":"object","properties":{"id":{"type":"integer","description":"Prewave Target ID","format":"int32","example":102006215},"name":{"type":"string","description":"Target name","example":"Acme Corporation"}},"description":"Reference to a target (supplier/site)","example":null},"AlertLabelScope":{"type":"string","description":"Scope of the label","enum":["Public","Customer","User"],"example":null},"AlertRelevancy":{"type":"string","description":"Relevancy of the alert","enum":["Relevant","Irrelevant","NotYetAssigned"],"example":null},"PublicAlertFlaggedDTO":{"required":["flaggedAt","reason"],"type":"object","properties":{"reason":{"type":"string","description":"Reason why the alert was flagged","example":null},"comment":{"type":"string","description":"Optional comment on the flagging","nullable":true,"example":null},"flaggedAt":{"type":"string","description":"When the alert was flagged","format":"date-time","example":null}},"description":"Flagging information for this alert","example":null},"PublicAlertLabelDTO":{"required":["bgColor","name","scope","textColor"],"type":"object","properties":{"id":{"type":"integer","description":"Prewave-internal label id","format":"int32","nullable":true,"example":null},"scope":{"$ref":"#/components/schemas/AlertLabelScope"},"name":{"type":"string","description":"Name of the label","example":null},"bgColor":{"type":"string","description":"Background color of the label","example":null},"textColor":{"type":"string","description":"Text color of the label","example":null}},"description":"Labels assigned to this alert","example":null},"PublicAlertTargetDTO":{"required":["impactLevel","target"],"type":"object","properties":{"target":{"$ref":"#/components/schemas/PublicTargetDTO"},"impactLevel":{"$ref":"#/components/schemas/PublicImpactLevelDTO"},"impactScore":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/Priority"}],"example":null},"priority":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/Priority"}],"example":null}},"description":"The targets affected by this alert.","example":null},"PublicAlertTypeDTO":{"required":["id","value"],"type":"object","properties":{"id":{"type":"integer","description":"Prewave-internal alert type id","format":"int32","example":null},"value":{"type":"string","description":"Alert type name","example":"happens"},"svalue":{"type":"string","description":"Alert type machine-readable name","nullable":true,"example":"happens"},"icon":{"type":"string","description":"Icon for the alert type","nullable":true,"example":null}},"description":"Alert types (e.g. happens, terminates) associated with this alert","example":null},"PublicAlertV2DTO":{"required":["active","alertTypes","collectionPath","createdAt","event","eventTypeGroups","eventTypes","id","isSituationReport","labels","links","locations","media","mentionedTargets","previousAlerts","primaryTargets","uuid"],"type":"object","properties":{"id":{"type":"integer","description":"Prewave-internal alert id","format":"int32","example":null},"uuid":{"type":"string","description":"Prewave-internal alert uuid","format":"uuid","example":null},"title":{"type":"string","description":"Alert title","nullable":true,"example":"Hurricane happens at Norsk Hydro in Høyanger, NO"},"createdAt":{"type":"string","description":"When the alert was generated/created at prewave","format":"date-time","example":null},"predictedAtStart":{"type":"string","description":"When the event - that this alert is describing - started","format":"date-time","nullable":true,"example":null},"predictedAtEnd":{"type":"string","description":"When the event - that this alert is describing - ended","format":"date-time","nullable":true,"example":null},"description":{"type":"string","description":"Detailed description of alert. Usually an excerpt taken from one of the links","nullable":true,"example":"It's windy in Høyanger"},"isSituationReport":{"type":"boolean","description":"Whether this alert is a situation report","example":null},"event":{"$ref":"#/components/schemas/PublicEventDTO"},"active":{"type":"boolean","description":"Whether the alert is active","example":null},"relevancy":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/AlertRelevancy"}],"example":null},"locations":{"type":"array","description":"Locations where the alert happened","items":{"$ref":"#/components/schemas/PublicTargetDTO"},"example":null},"links":{"type":"array","description":"Source links the alert is based on","items":{"$ref":"#/components/schemas/PublicLinkDTO"},"example":null},"media":{"type":"array","description":"Media files attached to the alert","items":{"$ref":"#/components/schemas/PublicMediaDTO"},"example":null},"primaryTargets":{"type":"array","description":"The targets affected by this alert.","items":{"$ref":"#/components/schemas/PublicAlertTargetDTO"},"example":null},"mentionedTargets":{"type":"array","description":"The targets mentioned in this alert.","items":{"$ref":"#/components/schemas/PublicTargetDTO"},"example":null},"priority":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/Priority"}],"example":null},"priorityDetails":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/PublicPriorityDetailsDTO"}],"example":null},"previousAlerts":{"type":"array","description":"Previous alerts related to this alert's event","items":{"$ref":"#/components/schemas/PublicPreviousAlertDTO"},"example":null},"flagged":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/PublicAlertFlaggedDTO"}],"example":null},"useCaseDetails":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/PublicUseCaseDetailsDTO"}],"example":null},"labels":{"type":"array","description":"Labels assigned to this alert","items":{"$ref":"#/components/schemas/PublicAlertLabelDTO"},"example":null},"eventTypes":{"type":"array","description":"Event types associated with this alert","items":{"$ref":"#/components/schemas/PublicEventTypeDTO"},"example":null},"eventTypeGroups":{"type":"array","description":"Event type groups associated with this alert","items":{"$ref":"#/components/schemas/PublicEventTypeGroupDTO"},"example":null},"alertTypes":{"type":"array","description":"Alert types (e.g. happens, terminates) associated with this alert","items":{"$ref":"#/components/schemas/PublicAlertTypeDTO"},"example":null},"collectionPath":{"type":"array","description":"The collections and their hierarchy for the target","items":{"$ref":"#/components/schemas/PublicCollectionPathRef"},"example":null},"geo":{"$ref":"#/components/schemas/Geo"},"statusUpdates":{"type":"array","description":"Status updates for this alert. Only included when enabled for your organization.","nullable":true,"items":{"$ref":"#/components/schemas/PublicStatusUpdateDTO"},"example":null}},"example":null},"PublicCollectionPathRef":{"required":["id","name","path"],"type":"object","properties":{"id":{"type":"integer","format":"int32","example":null},"name":{"type":"string","example":null},"path":{"type":"array","items":{"$ref":"#/components/schemas/CollectionRef"},"example":null}},"description":"The collections and their hierarchy for the target","example":null},"PublicEventDTO":{"required":["uuid"],"type":"object","properties":{"uuid":{"type":"string","description":"Prewave event uuid","format":"uuid","example":null}},"description":"Way of grouping alerts that belong to the same event, e.g. Strike announcement, Strike happens, Strike terminates","example":null},"PublicEventTypeDTO":{"required":["id","value"],"type":"object","properties":{"id":{"type":"integer","description":"Prewave-internal event type id","format":"int32","example":null},"value":{"type":"string","description":"Event type name","example":"Hurricane"},"svalue":{"type":"string","description":"Event type machine-readable name","nullable":true,"example":"hurricane"},"icon":{"type":"string","description":"Icon for the event type","nullable":true,"example":null}},"description":"Event types associated with this alert","example":null},"PublicEventTypeGroupDTO":{"required":["eventTypeIds","id","name","sname"],"type":"object","properties":{"id":{"type":"integer","description":"ID of the event type group","format":"int32","example":null},"name":{"type":"string","description":"Name of the event type group","example":"Natural Disasters"},"sname":{"type":"string","description":"Technical name of the event type group","example":"natural_disasters"},"eventTypeIds":{"type":"array","description":"List of event type IDs in this group","items":{"type":"integer","description":"List of event type IDs in this group","format":"int32","example":null},"example":null}},"description":"Event type groups associated with this alert","example":null},"PublicImpactLevelDTO":{"required":["displayName","id","level","ordering"],"type":"object","properties":{"id":{"type":"integer","format":"int32","example":null},"level":{"$ref":"#/components/schemas/ImpactLevelLevel"},"displayName":{"type":"string","example":null},"ordering":{"type":"integer","format":"int32","example":null}},"example":null},"PublicLinkDTO":{"type":"object","properties":{"id":{"type":"integer","format":"int32","nullable":true,"example":null},"url":{"type":"string","nullable":true,"example":null},"title":{"type":"string","nullable":true,"example":null},"description":{"type":"string","nullable":true,"example":null},"pictureUrl":{"type":"string","nullable":true,"example":null},"originalLang":{"type":"string","nullable":true,"example":null},"originalTitle":{"type":"string","nullable":true,"example":null},"originalDescription":{"type":"string","nullable":true,"example":null}},"description":"Source links the alert is based on","example":null},"PublicMediaDTO":{"type":"object","properties":{"id":{"type":"integer","format":"int32","nullable":true,"example":null},"url":{"type":"string","nullable":true,"example":null},"mimeType":{"type":"string","nullable":true,"example":null}},"description":"Media files attached to the alert","example":null},"PublicPreviousAlertDTO":{"required":["alertId","createdAt","eventId"],"type":"object","properties":{"alertId":{"type":"integer","description":"Prewave-internal alert id of the previous alert","format":"int32","example":null},"eventId":{"type":"integer","description":"Prewave-internal event id","format":"int32","example":null},"title":{"type":"string","description":"Title of the previous alert","nullable":true,"example":null},"description":{"type":"string","description":"Description of the previous alert","nullable":true,"example":null},"createdAt":{"type":"string","description":"When the previous alert was created","format":"date-time","example":null}},"description":"Previous alerts related to this alert's event","example":null},"PublicPriorityDetailsDTO":{"required":["brandMention","lowPeerRisk","massDisruption","rumour","terminates"],"type":"object","properties":{"massDisruption":{"type":"boolean","example":null},"brandMention":{"type":"boolean","example":null},"rumour":{"type":"boolean","example":null},"lowPeerRisk":{"type":"boolean","example":null},"terminates":{"type":"boolean","example":null}},"description":"Priority details of alert","example":null},"PublicStatusUpdateAssignedByDTO":{"required":["customerName","id"],"type":"object","properties":{"id":{"type":"integer","description":"Prewave-internal user id of the person who assigned this status","format":"int32","example":null},"firstname":{"type":"string","description":"First name of the person who assigned this status","nullable":true,"example":null},"lastname":{"type":"string","description":"Last name of the person who assigned this status","nullable":true,"example":null},"customerName":{"type":"string","description":"Customer name of the person who assigned this status","example":"Acme Manufacturing Inc"}},"description":"Who assigned this status","example":null},"PublicStatusUpdateDTO":{"required":["assignedAt","assignedBy","id","targetId"],"type":"object","properties":{"id":{"type":"integer","description":"Prewave-internal status update id","format":"int32","example":null},"targetId":{"type":"integer","description":"Prewave-internal target id this status update applies to","format":"int32","example":null},"assignedAt":{"type":"string","description":"When the status was assigned","format":"date-time","example":null},"assignedBy":{"$ref":"#/components/schemas/PublicStatusUpdateAssignedByDTO"},"comment":{"type":"string","description":"Optional comment on the status update","nullable":true,"example":null},"forCustomerName":{"type":"string","description":"Customer this status update was written for, if it is customer-specific","nullable":true,"example":null},"status":{"type":"string","description":"Alert status key (confirmed, denied, resolved, outdated)","nullable":true,"example":"resolved"}},"description":"Status updates for this alert. Only included when enabled for your organization.","example":null},"PublicUseCaseDetailsDTO":{"required":["reason","relevant"],"type":"object","properties":{"relevant":{"type":"boolean","description":"Whether the alert is relevant for the use case","example":null},"reason":{"type":"string","description":"Reason for the relevance decision","example":null}},"description":"Use case details for this alert","example":null},"SchemaPublicAlertV2DTO":{"type":"object","properties":{"totalPages":{"type":"integer","format":"int32","example":null},"totalElements":{"type":"integer","format":"int64","example":null},"size":{"type":"integer","format":"int32","example":null},"content":{"type":"array","items":{"$ref":"#/components/schemas/PublicAlertV2DTO"},"example":null},"number":{"type":"integer","format":"int32","example":null},"numberOfElements":{"type":"integer","format":"int32","example":null},"sort":{"$ref":"#/components/schemas/SortObject"},"pageable":{"$ref":"#/components/schemas/Pageable"},"first":{"type":"boolean","example":null},"last":{"type":"boolean","example":null},"empty":{"type":"boolean","example":null}},"example":null},"PublicMinimalProduct":{"required":["customerId","id","name","type"],"type":"object","properties":{"id":{"type":"integer","description":"Product ID","format":"int32","example":123},"customerId":{"type":"integer","description":"Customer ID","format":"int32","example":456},"supplierId":{"type":"integer","description":"Supplier ID","format":"int32","nullable":true,"example":789},"reference":{"type":"string","description":"Product reference label","nullable":true,"example":"REF-001"},"type":{"$ref":"#/components/schemas/PublicProductType"},"name":{"type":"string","description":"Product name","example":"Wooden Table"}},"description":"Origin Request Product.","example":null},"PublicOriginRequestReference":{"required":["referenceType"],"type":"object","properties":{"reference":{"type":"string","description":"Reference label.","nullable":true,"example":"PO-2025-001"},"referenceType":{"$ref":"#/components/schemas/PublicProductReferenceType"}},"description":"Reference for an origin request, including label and type.","example":null},"PublicProductType":{"type":"string","description":"Public product type.","example":"Inbound","enum":["Inbound","Outbound"]},"PublicSupplierOrigin":{"required":["active","countryName","createdAt","id","plot","plotAreaHa","updatedAt"],"type":"object","properties":{"id":{"type":"integer","description":"Origin Id","format":"int32","example":null},"name":{"type":"string","description":"Origin name","nullable":true,"example":null},"active":{"type":"boolean","description":"Origin active status","example":null},"producedAtStart":{"type":"string","description":"Starting Timestamp at which origin was produced","format":"date-time","nullable":true,"example":null},"producedAtEnd":{"type":"string","description":"Ending Timestamp at which origin was produced","format":"date-time","nullable":true,"example":null},"producerName":{"type":"string","description":"Producer name of the origin","nullable":true,"example":null},"countryName":{"type":"string","description":"Origin country name","example":null},"plot":{"$ref":"#/components/schemas/PublicFeatureCollection"},"plotAreaHa":{"type":"number","description":"Origin plot area","example":null},"weight":{"type":"number","description":"Origin weight, if requested weight from origin request is present","nullable":true,"example":null},"createdAt":{"type":"string","description":"Origin creation timestamp","format":"date-time","example":null},"updatedAt":{"type":"string","description":"Origin last update timestamp","format":"date-time","example":null}},"description":"List of origin request origins","example":null},"PublicSupplierOriginRequest":{"required":["createdAt","id","origins","product","references","status","supplierDDSReferences","updatedAt"],"type":"object","properties":{"id":{"type":"integer","description":"Origin Request ID.","format":"int32","example":1001},"status":{"$ref":"#/components/schemas/PublicFilterOriginRequestStatus"},"createdAt":{"type":"string","description":"Creation timestamp (UTC).","format":"date-time","example":null},"updatedAt":{"type":"string","description":"Last modification timestamp (UTC).","format":"date-time","example":null},"closedAt":{"type":"string","description":"Closed timestamp (UTC), related to origin requests with weight or time range set.","format":"date-time","nullable":true,"example":null},"endDate":{"type":"string","description":"End date, related to origin requests with time range set.","format":"date","nullable":true,"example":"2025-09-30"},"requestedWeight":{"type":"number","description":"Requested Weight, related to origin requests with weight set.","nullable":true,"example":null},"providedWeight":{"type":"number","description":"Provided Weight, related to origin requests with weight set.","nullable":true,"example":null},"references":{"$ref":"#/components/schemas/PublicOriginRequestReference"},"product":{"$ref":"#/components/schemas/PublicMinimalProduct"},"origins":{"$ref":"#/components/schemas/PublicSupplierOrigin"},"supplierDDSReferences":{"type":"array","description":"List of origin request supplierDDS references","items":{"type":"string","description":"List of origin request supplierDDS references","example":null},"example":null}},"description":"Supplier-facing view of an origin request, including status, timestamps, references, and product details.","example":null},"FilterOriginRequestStatus":{"type":"string","enum":["Requested","Delayed","Rejected","Canceled","Answered"],"example":null},"PublicSupplierCustomer":{"required":["id","name"],"type":"object","properties":{"id":{"type":"integer","description":"Unique identifier of the customer.","format":"int32","example":123},"name":{"type":"string","description":"Name of the customer.","example":"Acme GmbH"}},"description":"Public representation of a supplier's customer. Contains the unique customer ID and the customer's name.","example":null},"PublicProductHSCode":{"required":["code"],"type":"object","properties":{"code":{"type":"string","description":"HS code","example":"440799"},"description":{"type":"string","description":"HS code description","nullable":true,"example":"Wood sawn or chipped lengthwise, sliced or peeled, of oak"},"commodityId":{"type":"integer","description":"Commodity ID for the HS code","format":"int32","nullable":true,"example":1}},"description":"List of HS codes associated with this DDS unit","example":null},"PublicCommodity":{"required":["id","name"],"type":"object","properties":{"id":{"type":"integer","description":"Commodity ID","format":"int32","example":1},"name":{"type":"string","description":"Commodity name","example":"Timber"}},"example":null},"AnswerStatus":{"type":"string","description":"Enum representing possible statuses for a supplier's questionnaire answer in the public API.","nullable":true,"enum":["Requested","InProgress","Good","Critical"],"example":null},"PublicEUDROrganization":{"required":["id","name"],"type":"object","properties":{"id":{"type":"integer","description":"Organization ID","format":"int32","example":201},"name":{"type":"string","description":"Organization name","example":"Global Supplies Inc."},"location":{"type":"string","description":"Organization location","nullable":true,"example":"New York"}},"description":"Organization information for a supplier. Contains organization ID, name, and location.","example":null},"PublicEUDRSupplier":{"required":["id","isPublic","name","screened"],"type":"object","properties":{"id":{"type":"integer","description":"Supplier ID","format":"int32","example":101},"name":{"type":"string","description":"Supplier name","example":"Acme Corp"},"location":{"type":"string","description":"Supplier location","nullable":true,"example":"Vienna"},"isPublic":{"type":"boolean","description":"Indicates if the supplier profile is public","example":true},"organization":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/PublicEUDROrganization"}],"example":null},"screened":{"type":"boolean","description":"Indicates if the supplier has been screened or not","example":true},"references":{"type":"array","description":"List of references associated with the supplier","nullable":true,"items":{"$ref":"#/components/schemas/PublicSupplierReference"},"example":null},"connectionContacts":{"type":"array","description":"List of connection contacts for the supplier","nullable":true,"items":{"$ref":"#/components/schemas/PublicSupplierConnectionContact"},"example":null},"supplierMaturity":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/PublicSupplierMaturity"}],"example":null}},"description":"Public representation of a supplier. Contains detailed supplier information, screening status, references, and connection contacts.","example":null},"PublicSupplierMaturity":{"type":"object","properties":{"answerStatus":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/AnswerStatus"}],"example":null},"answerHidden":{"type":"boolean","description":"True if the answer is hidden due to permission status (e.g., denied or not requested), otherwise false.","nullable":true,"example":null}},"description":"Public API payload representing the status of a supplier maturity assessment","example":null},"PublicSupplierReference":{"required":["id"],"type":"object","properties":{"id":{"type":"string","description":"Reference ID","example":"REF-001"},"source":{"type":"string","description":"Source of the reference","nullable":true,"example":"SAP"}},"description":"Reference information for a supplier. Contains reference ID and source.","example":null},"PublicEUDRTarget":{"required":["id","isPublic","name"],"type":"object","properties":{"id":{"type":"integer","description":"Supplier ID","format":"int32","example":101},"name":{"type":"string","description":"Supplier name","example":"Acme Corp"},"location":{"type":"string","description":"Supplier location","nullable":true,"example":"Vienna"},"isPublic":{"type":"boolean","description":"Indicates if the supplier profile is public","example":true},"organization":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/PublicEUDROrganization"}],"example":null}},"description":"Public representation of a target. Contains basic target information and associated organization if available.","example":null},"PublicCustomerOriginRequest":{"required":["createdAt","id","references","status","updatedAt"],"type":"object","properties":{"id":{"type":"integer","description":"Origin Request ID.","format":"int32","example":1001},"status":{"$ref":"#/components/schemas/PublicFilterOriginRequestStatus"},"createdAt":{"type":"string","description":"Creation timestamp (UTC).","format":"date-time","example":null},"updatedAt":{"type":"string","description":"Last modification timestamp (UTC).","format":"date-time","example":null},"closedAt":{"type":"string","description":"Closed timestamp (UTC), related to origin requests with weight or time range set.","format":"date-time","nullable":true,"example":null},"endDate":{"type":"string","description":"End date, related to origin requests with time range set.","format":"date","nullable":true,"example":"2025-09-30"},"requestedWeight":{"type":"number","description":"Requested Weight, related to origin requests with weight set","nullable":true,"example":null},"providedWeight":{"type":"number","description":"Provided Weight, related to origin requests with weight set","nullable":true,"example":null},"references":{"$ref":"#/components/schemas/PublicOriginRequestReference"},"answeredStatusDetails":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/PublicCustomerOriginRequestAnsweredStatusDetails"}],"example":null},"delayedStatusDetails":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/PublicOriginRequestDelayStatusDetails"}],"example":null},"rejectStatusDetails":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/PublicOriginRequestRejectReason"}],"example":null}},"description":"Customer-facing view of an origin request, including status, timestamps, references, and status details for answered, delayed, or rejected requests.","example":null},"PublicCustomerOriginRequestAnsweredStatusDetails":{"required":["originIds","supplierDDSReferences"],"type":"object","properties":{"originIds":{"type":"array","description":"List of origin IDs.","example":[101,102],"items":{"type":"integer","description":"List of origin IDs.","format":"int32","example":null}},"supplierDDSReferences":{"type":"array","description":"List of supplier DDS references.","example":["DDS-REF-1","DDS-REF-2"],"items":{"type":"string","description":"List of supplier DDS references.","example":"[\"DDS-REF-1\",\"DDS-REF-2\"]"}}},"description":"Details for an answered origin request, including origin IDs and supplier DDS references.","example":null},"PublicOriginRequestDelayReasonCode":{"type":"string","description":"Public origin request delay reason code.","example":"LegallyBinding","enum":["LegallyBinding","LackOfInfo","ProductComplexity","Other"]},"PublicOriginRequestDelayStatusDetails":{"required":["code","comment","delayedUntil","reason"],"type":"object","properties":{"code":{"$ref":"#/components/schemas/PublicOriginRequestDelayReasonCode"},"reason":{"type":"string","description":"Human-readable reason for the delay.","example":"Missing documents from supplier."},"comment":{"type":"string","description":"Additional comment for the delay.","example":"Awaiting customs paperwork."},"delayedUntil":{"type":"string","description":"Timestamp until which the request is delayed (UTC).","format":"date-time","example":null}},"description":"Delay status details for a delayed origin request, including code, reason, comment, and delayed until timestamp.","example":null},"PublicOriginRequestRejectReason":{"required":["code","comment","reason"],"type":"object","properties":{"code":{"$ref":"#/components/schemas/PublicOriginRequestRejectReasonCode"},"reason":{"type":"string","description":"Human-readable reason for the rejection.","example":"Supplier declined to provide information."},"comment":{"type":"string","description":"Additional comment for the rejection.","example":"Supplier is not able to deliver the requested documents."}},"description":"Reject reason details for a rejected origin request, including code, reason, and comment.","example":null},"PublicOriginRequestRejectReasonCode":{"type":"string","description":"Public reject reason code for a rejected origin request.","example":"Y133","enum":["Y133","Y129","Y132","Y141","C716","DOWNSTREAM_OPERATOR","OTHER"]},"PublicCustomerDDSStatus":{"required":["status"],"type":"object","properties":{"status":{"$ref":"#/components/schemas/PublicFilterCustomerDDSStatus"},"reason":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/PublicDDSStatusReason"}],"example":null}},"description":"Customer DDS status","example":null},"PublicDDSStatusReason":{"type":"string","description":"Public reason for DDS status.","example":"NoOrigins","enum":["NoOrigins","PendingOriginRequest","DFARequired","DFANonNegligible","LARequired","LANonNegligible","DDSCreated","Unknown"]},"PublicDFAssessment":{"required":["outdated","status"],"type":"object","properties":{"status":{"$ref":"#/components/schemas/DFStatus"},"outdated":{"type":"boolean","description":"Is the assessment outdated","example":null},"checkType":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/PublicCheckType"}],"example":null}},"description":"Deforestation assessment result","example":null},"PublicEUDRUserType":{"type":"string","description":"Public EUDR user type.","example":"Customer","enum":["Customer","Supplier","Producer"]},"PublicInboundProduct":{"required":["active","commodity","creatorType","customerId","hasPendingOriginRequest","hsCode","id","name","orgId","origins","supplier","supplierDDS"],"type":"object","properties":{"id":{"type":"integer","format":"int32","example":null},"customerId":{"type":"integer","format":"int32","example":null},"orgId":{"type":"integer","format":"int32","example":null},"name":{"type":"string","example":null},"scientificName":{"type":"string","nullable":true,"example":null},"reference":{"type":"string","nullable":true,"example":null},"commodity":{"$ref":"#/components/schemas/PublicCommodity"},"hsCode":{"$ref":"#/components/schemas/PublicProductHSCode"},"annualSpend":{"type":"number","description":"Annual spend","nullable":true,"example":10000.0,"deprecated":true},"annualQuantity":{"type":"number","description":"Annual quantity","nullable":true,"example":500.0,"deprecated":true},"unit":{"type":"string","description":"Quantity unit","nullable":true,"example":"kg","deprecated":true},"countryRisk":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/PublicEUDRRisk"}],"example":null},"origins":{"$ref":"#/components/schemas/PublicOrigin"},"hasPendingOriginRequest":{"type":"boolean","description":"Indicates if the product has a pending origin request","example":false},"pendingDFRequest":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/PublicPendingDFRequest"}],"example":null},"supplier":{"$ref":"#/components/schemas/PublicSupplier"},"supplierDDS":{"$ref":"#/components/schemas/PublicProductSupplierDDS"},"dfAssessment":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/PublicDFAssessment"}],"example":null},"ddsStatus":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/PublicCustomerDDSStatus"}],"example":null},"customerDDS":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/PublicProductCustomerDDS"}],"example":null},"supplierMaturity":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/PublicSupplierMaturity"}],"example":null},"legalityAssessment":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/PublicLegalityAssessment"}],"example":null},"active":{"type":"boolean","description":"Product active status","example":true},"creatorType":{"$ref":"#/components/schemas/PublicEUDRUserType"}},"example":null},"PublicLegalityAssessment":{"required":["status"],"type":"object","properties":{"minScore":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/Score"}],"example":null},"minScoreAvail":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/ScoreAvailability"}],"example":null},"status":{"$ref":"#/components/schemas/DFStatus"}},"description":"Legality assessment result","example":null},"PublicProductCustomerDDS":{"required":["active","activityType","archived","customerCity","customerCountry","customerName","customerPostalCode","customerStreet","date","eoriNumber","hsCode","id","netWeightInKg","operatorType","productDescription","productName","references","state"],"type":"object","properties":{"id":{"type":"integer","description":"Customer DDS ID","format":"int32","example":123},"active":{"type":"boolean","description":"Active status","example":true},"referenceNumber":{"type":"string","description":"Reference number","nullable":true,"example":"EU-REF-12345"},"date":{"type":"string","description":"DDS date","format":"date-time","example":null},"archived":{"type":"boolean","description":"Archived","example":false},"archiveDate":{"type":"string","description":"Archive date","format":"date-time","nullable":true,"example":null},"eoriNumber":{"type":"string","description":"EORI number of the customer","example":"EU123456789"},"customerName":{"type":"string","description":"Name of the customer as stated on the DDS","example":"Acme GmbH"},"customerCity":{"type":"string","description":"City of the customer as stated on the DDS","example":"Vienna"},"customerPostalCode":{"type":"string","description":"Postal code of the customer as stated on the DDS","example":"1010"},"customerStreet":{"type":"string","description":"Street of the customer as stated on the DDS","example":"Main Street 1"},"customerCountry":{"$ref":"#/components/schemas/PublicCountry"},"state":{"$ref":"#/components/schemas/PublicCustomerDDSState"},"operatorType":{"$ref":"#/components/schemas/PublicOperatorType"},"activityType":{"$ref":"#/components/schemas/PublicActivityType"},"countryOfActivity":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/PublicCountry"}],"example":null},"references":{"$ref":"#/components/schemas/PublicDDSReference"},"productName":{"type":"string","description":"Product name label","example":"Wooden Table"},"productDescription":{"type":"string","description":"Product description label","example":"Oak wood table, 2m x 1m"},"netWeightInKg":{"type":"number","description":"Net Weight in Kg","example":100.5},"quantity":{"type":"number","description":"Product quantity (additional info)","nullable":true,"example":10},"unit":{"type":"string","description":"Quantity unit","nullable":true,"example":"kg"},"hsCode":{"type":"string","description":"HS code","example":"440799"},"submissionError":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/PublicSubmissionError"}],"example":null}},"description":"Customer DDS","example":null},"PublicSupplier":{"required":["id","name","type"],"type":"object","properties":{"id":{"type":"integer","description":"Supplier ID","format":"int32","example":101},"name":{"type":"string","description":"Supplier name","example":"Acme Corp"},"type":{"type":"string","description":"Supplier type","example":"Manufacturer"},"location":{"type":"string","description":"Supplier location","nullable":true,"example":"Vienna"},"countryId":{"type":"integer","description":"Country ID of the supplier","format":"int32","nullable":true,"example":14},"references":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/PublicSupplierReference"}],"example":null}},"description":"Represents a supplier in the public API. Contains basic supplier information and references.","example":null},"LAStatus":{"type":"string","description":"Filter by legality assessment status.","example":"[\"Negligible\",\"NotRequired\"]","enum":["Negligible","NonNegligible","NotRequired","Required","Derisked"]},"DFStatus":{"type":"string","description":"Filter by DF status.","example":"[\"Negligible\",\"NotRequired\"]","enum":["Negligible","NonNegligible","NotRequired","Required"]},"PublicFilterCustomerDDSStatus":{"type":"string","description":"Filter by DDS status, including active withdrawn customer DDS records.","example":"[\"Blocked\",\"Allowed\",\"WaitingForOrigins\",\"Draft\",\"Withdrawn\"]","enum":["Blocked","Allowed","WaitingForOrigins","NotRequired","Draft","Submitting","Submitted","Available","SubmissionError","Withdrawn"]},"FilterOriginStatus":{"type":"string","description":"Filter by origin status.","example":"Active","enum":["Missing","Active"]},"PublicFilterOriginRequestStatus":{"type":"string","description":"Filter by origin request status.","example":"[\"Requested\",\"Answered\"]","enum":["Requested","Delayed","Rejected","Canceled","Answered"]},"SCCAStatus":{"type":"string","description":"Filter by SCCA status.","example":"[\"Pending\",\"Derisked\"]","enum":["Negligible","NonNegligible","Pending","NotRequired","Derisked"]},"PublicDDSUnit":{"required":["hsCodes","unit"],"type":"object","properties":{"unit":{"type":"string","description":"Unit of the DDS (e.g., NAR, MTQ, KSD)","example":"NAR"},"hsCodes":{"$ref":"#/components/schemas/PublicProductHSCode"},"description":{"type":"string","description":"Description of the DDS unit","nullable":true,"example":"Cubic meter of sawn wood"}},"example":null},"PublicGroupScore":{"required":["group"],"type":"object","properties":{"group":{"$ref":"#/components/schemas/PublicInfotagGroup"},"score":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/PublicScore"}],"example":null}},"description":"List of group scores","example":null},"PublicInfotagGroup":{"required":["id","name","sname"],"type":"object","properties":{"id":{"type":"integer","description":"Id of the infotag group","format":"int32","example":null},"name":{"type":"string","description":"Name of the infotag group","example":null},"sname":{"type":"string","description":"Short name/code of the infotag group","example":null}},"example":null},"PublicScore":{"type":"object","properties":{"value":{"type":"integer","description":"Score value","format":"int32","nullable":true,"example":null},"risk":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/Level"}],"example":null}},"description":"Score of the target subcomponent","example":null},"PublicTargetScore":{"required":["groups","score"],"type":"object","properties":{"score":{"$ref":"#/components/schemas/PublicScore"},"groups":{"type":"array","description":"List of group scores","items":{"$ref":"#/components/schemas/PublicGroupScore"},"example":null}},"example":null},"ScoreComponent":{"type":"string","description":"Score component of the target","enum":["PeerScore","AlertScore","SSAScore","ExternalScore","TierNScore"],"example":null},"ScoreSubcomponent":{"type":"string","description":"Score subcomponent of the target","enum":["CountryScore","IndustryScore","CommodityScore","PublicAlertScore","CustomerAlertScore","InternalScore","TierNIndustryScore","TierNCommodityScore","TargetScore"],"example":null},"PublicEventTypeScore":{"required":["eventType"],"type":"object","properties":{"eventType":{"$ref":"#/components/schemas/PublicInfotagDTO"},"score":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/PublicScore"}],"example":null}},"example":null},"PublicInfotagDTO":{"required":["id","type","value"],"type":"object","properties":{"id":{"type":"integer","format":"int32","example":null},"type":{"$ref":"#/components/schemas/PublicInfotagTypeDTO"},"value":{"type":"string","example":null},"svalue":{"type":"string","nullable":true,"example":null},"icon":{"type":"string","nullable":true,"example":null},"numValue":{"type":"number","nullable":true,"example":null},"priority":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/Priority"}],"example":null},"impactScore":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/Priority"}],"example":null}},"example":null},"PublicInfotagTypeDTO":{"required":["active","display","type"],"type":"object","properties":{"type":{"type":"string","example":null},"active":{"type":"boolean","example":null},"displayName":{"type":"string","nullable":true,"example":null},"icon":{"type":"string","nullable":true,"example":null},"ordering":{"type":"integer","format":"int32","nullable":true,"example":null},"display":{"type":"boolean","example":null}},"example":null},"PublicTargetScoreHistory":{"required":["max","min","monthChange","months","yearChange","yearMax","yearMin"],"type":"object","properties":{"months":{"type":"array","description":"List of monthly scores","items":{"$ref":"#/components/schemas/PublicTargetScoreHistoryData"},"example":null},"monthChange":{"type":"integer","description":"Change in score from the previous month","format":"int32","example":null},"yearChange":{"type":"integer","description":"Change in score from the previous year","format":"int32","example":null},"max":{"type":"integer","description":"Maximum score overall","format":"int32","example":null},"yearMax":{"type":"integer","description":"Maximum score in the past year","format":"int32","example":null},"min":{"type":"integer","description":"Minimum score overall","format":"int32","example":null},"yearMin":{"type":"integer","description":"Minimum score in the past year","format":"int32","example":null}},"example":null},"PublicTargetScoreHistoryData":{"required":["date","score"],"type":"object","properties":{"date":{"type":"string","description":"Date of the score","format":"date-time","example":null},"score":{"$ref":"#/components/schemas/PublicScore"}},"description":"List of monthly scores","example":null},"PublicTargetScoreComponents":{"required":["subcomponents"],"type":"object","properties":{"component":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/ScoreComponent"}],"example":null},"score":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/PublicScore"}],"example":null},"subcomponents":{"type":"array","description":"List of target score subcomponents","items":{"$ref":"#/components/schemas/PublicTargetScoreSubcomponent"},"example":null}},"example":null},"PublicTargetScoreSubcomponent":{"required":["subcomponent"],"type":"object","properties":{"subcomponent":{"$ref":"#/components/schemas/ScoreSubcomponent"},"score":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/PublicScore"}],"example":null}},"description":"List of target score subcomponents","example":null},"PublicAlertDTO":{"required":["collectionPath","createdAt","event","id","infotags","links","locations","media","primaryTargets","uuid"],"type":"object","properties":{"id":{"type":"integer","description":"Prewave-internal alert id","format":"int32","example":null},"uuid":{"type":"string","description":"Prewave-internal alert uuid","format":"uuid","example":null},"title":{"type":"string","description":"Alert title","nullable":true,"example":"Hurricane happens at Norsk Hydro in Høyanger, NO"},"createdAt":{"type":"string","description":"When the alert was generated/created at prewave","format":"date-time","example":null},"predictedAtStart":{"type":"string","description":"When the event - that this alert is describing - started","format":"date-time","nullable":true,"example":null},"predictedAtEnd":{"type":"string","description":"When the event - that this alert is describing - ended","format":"date-time","nullable":true,"example":null},"description":{"type":"string","description":"Detailed description of alert. Usually an excerpt taken from one of the links","nullable":true,"example":"It's windy in Høyanger"},"event":{"$ref":"#/components/schemas/PublicEventDTO"},"locations":{"type":"array","description":"Locations where the alert happened","items":{"$ref":"#/components/schemas/PublicTargetDTO"},"example":null},"links":{"type":"array","description":"Source links the alert is based on","items":{"$ref":"#/components/schemas/PublicLinkDTO"},"example":null},"media":{"type":"array","description":"Media files attached to the alert","items":{"$ref":"#/components/schemas/PublicMediaDTO"},"example":null},"infotags":{"type":"array","items":{"$ref":"#/components/schemas/PublicInfotagDTO"},"example":null},"primaryTargets":{"type":"array","description":"The targets affected by this alert.","items":{"$ref":"#/components/schemas/PublicAlertTargetDTO"},"example":null},"priority":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/Priority"}],"example":null},"priorityDetails":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/PublicPriorityDetailsDTO"}],"example":null},"collectionPath":{"type":"array","description":"The collections and their hierarchy for the target","items":{"$ref":"#/components/schemas/PublicCollectionPathRef"},"example":null},"geo":{"$ref":"#/components/schemas/Geo"}},"example":null},"PublicTreeTargetV1":{"required":["edgeSource","filtered","suppliers","target"],"type":"object","properties":{"target":{"$ref":"#/components/schemas/PublicTargetDTO"},"suppliers":{"type":"array","items":{"$ref":"#/components/schemas/PublicTreeTargetV1"},"example":null},"edgeSource":{"type":"string","example":null},"edgeInfo":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/PublicEdgeInfo"}],"example":null},"filtered":{"type":"boolean","example":null}},"example":null},"PublicSitesUpsertMatchedTarget":{"required":["createdAt","edgeNumbers","name","targetId"],"type":"object","properties":{"targetId":{"type":"integer","format":"int32","example":null},"name":{"type":"string","example":null},"createdAt":{"type":"string","format":"date-time","example":null},"edgeNumbers":{"type":"array","items":{"$ref":"#/components/schemas/EdgeNumber"},"example":null}},"example":null},"SitesUpsertDryRunDTO":{"required":["dryRunId","requestId","time"],"type":"object","properties":{"requestId":{"type":"string","description":"The ID of a sites upsert request. Use this ID to check the status of the request and to retrieve dry-run ids.","format":"uuid","example":null},"dryRunId":{"type":"string","description":"The ID of the dry run. This ID can be used to retrieve the dry run results.","format":"uuid","example":null},"time":{"type":"string","description":"The time when the dry run was created.","format":"date-time","example":null}},"example":null},"PublicSitesUpsertRequestEntry":{"required":["created","requestId","status"],"type":"object","properties":{"requestId":{"type":"string","description":"The ID of a sites upsert request. Use this ID to check the status of the request and to retrieve dry-run ids.","format":"uuid","example":null},"status":{"$ref":"#/components/schemas/PublicSitesUpsertStatus"},"created":{"type":"string","description":"The time when the request was created","format":"date-time","example":null}},"example":null},"PublicSitesUpsertStatus":{"type":"string","enum":["Work in progress","Done","Failed","Cancelled"],"example":null},"SitesUpsertRequestStatusResponse":{"required":["sites","status"],"type":"object","properties":{"status":{"$ref":"#/components/schemas/PublicSitesUpsertStatus"},"reason":{"type":"string","nullable":true,"example":null},"sites":{"type":"array","items":{"$ref":"#/components/schemas/SitesUpsertSiteStatusEntry"},"example":null}},"example":null},"SitesUpsertSiteStatusEntry":{"required":["id","status","yourReference"],"type":"object","properties":{"id":{"type":"integer","format":"int32","example":null},"yourReference":{"type":"string","example":null},"yourReferenceSource":{"type":"string","nullable":true,"example":null},"status":{"$ref":"#/components/schemas/PublicSitesUpsertStatus"},"statusText":{"type":"string","nullable":true,"example":null},"prewaveId":{"type":"integer","description":"If status is \"Done\" this will reference the site on Prewave","format":"int32","nullable":true,"example":null}},"example":null},"PublicExtScoreHistory":{"required":["eventTypeKey","group","history","score","updatedAt"],"type":"object","properties":{"group":{"$ref":"#/components/schemas/PublicInfotagGroup"},"eventTypeKey":{"type":"string","example":null},"score":{"$ref":"#/components/schemas/Score"},"comment":{"type":"string","nullable":true,"example":null},"updatedAt":{"type":"string","description":"Last update. Timestamp (ISO 8601 UTC)","format":"date-time","example":"2026-01-15T10:30:00Z"},"validFrom":{"type":"string","description":"Start of validity period. Timestamp (ISO 8601 UTC)","format":"date-time","nullable":true,"example":"2026-01-01T00:00:00Z"},"validTo":{"type":"string","description":"End of validity period. Timestamp (ISO 8601 UTC)","format":"date-time","nullable":true,"example":"2026-12-31T23:59:59Z"},"history":{"type":"array","items":{"$ref":"#/components/schemas/PublicExtScoreHistory"},"example":null}},"example":null},"PublicExternalScoreResponse":{"required":["identifier","scores"],"type":"object","properties":{"identifier":{"$ref":"#/components/schemas/PublicExternalTargetIdentifier"},"scores":{"type":"array","items":{"$ref":"#/components/schemas/PublicExtScoreHistory"},"example":null}},"example":null},"PublicExternalScoreEventTypeDTO":{"required":["eventTypeKey","id","name"],"type":"object","properties":{"id":{"type":"integer","format":"int32","example":null},"eventTypeKey":{"type":"string","example":null},"name":{"type":"string","example":null}},"example":null},"PublicSimplifiedInfotagDTO":{"required":["id","type","value"],"type":"object","properties":{"id":{"type":"integer","description":"Id of the infotag","format":"int32","example":null},"type":{"type":"string","description":"Type of the infotag","example":null},"svalue":{"type":"string","description":"Short name/code of the infotag","nullable":true,"example":null},"value":{"type":"string","description":"Name of the infotag","example":null}},"example":null},"PublicIndustryV1DTO":{"required":["id","name"],"type":"object","properties":{"id":{"type":"integer","description":"Prewave target ID of the industry","format":"int32","example":123},"name":{"type":"string","description":"Display name of the industry. Use this value in POST /public/v2/suppliers/sites industries.","example":"Automotive"}},"description":"Industry that can be associated with a supplier via the industries name field","example":null},"SchemaPublicAlertDTO":{"type":"object","properties":{"totalPages":{"type":"integer","format":"int32","example":null},"totalElements":{"type":"integer","format":"int64","example":null},"size":{"type":"integer","format":"int32","example":null},"content":{"type":"array","items":{"$ref":"#/components/schemas/PublicAlertDTO"},"example":null},"number":{"type":"integer","format":"int32","example":null},"numberOfElements":{"type":"integer","format":"int32","example":null},"sort":{"$ref":"#/components/schemas/SortObject"},"pageable":{"$ref":"#/components/schemas/Pageable"},"first":{"type":"boolean","example":null},"last":{"type":"boolean","example":null},"empty":{"type":"boolean","example":null}},"example":null},"PublicTierNCollectionGraphEntry":{"required":["customerTargetId","supplierTargetId","tier"],"type":"object","properties":{"tier":{"type":"integer","description":"Tier level. Membership rows: always 1. Traversal rows: relative to each collection member (1 = that member's direct suppliers, 2+ = indirect). For traversal rows this is not the same as the request `tier` parameter (which selects membership-only vs membership+traversal / max depth).","format":"int32","example":2},"supplierTargetId":{"type":"integer","description":"Unique identifier of the supplier target in this relationship. Use this ID to look up additional supplier information via other APIs.","format":"int32","example":4567},"customerTargetId":{"type":"integer","description":"Unique identifier of the customer target in this relationship. The 'from' side of the relationship (customer organization for membership rows; upstream target for traversal rows).","format":"int32","example":1234},"source":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/EdgeSource"}],"example":null},"probability":{"type":"integer","description":"Confidence or probability score for the relationship (0-100). Only present for PREWAVE_PREDICTION sources. Higher values indicate more confident predictions.","format":"int32","nullable":true,"example":87},"mediaSources":{"type":"array","description":"List of media source URLs used to derive this MEDIA-type relationship. Only present when source=MEDIA and includeMediaSources=true. These URLs provide evidence for the relationship.","nullable":true,"example":["https://example.com/article-1","https://example.com/article-2"],"items":{"type":"string","description":"List of media source URLs used to derive this MEDIA-type relationship. Only present when source=MEDIA and includeMediaSources=true. These URLs provide evidence for the relationship.","example":"[\"https://example.com/article-1\",\"https://example.com/article-2\"]"}},"nShipments":{"type":"integer","description":"Number of shipments observed for this supplier/customer pair. Only present for CUSTOMS sources. Indicates the strength of the business relationship based on trade data.","format":"int32","nullable":true,"writeOnly":true,"example":3},"shipments":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/PublicTierNCollectionGraphShipment"}],"example":null},"nshipments":{"type":"integer","format":"int32","example":null}},"description":"\n        Single supplier relationship entry in the tier-n collection graph.\n\n        ## Understanding Tiers\n        Effective tier for the request is `tier` if set, otherwise `maxTier` (see operation docs).\n        - **Membership** (always when effective tier ≥ 1): Direct suppliers in the collection. Rows\n          identify the supplier (`supplierTargetId`) and customer organization (`customerTargetId`)\n          only; discovered edge fields (`source`, `probability`, `mediaSources`, `nShipments`,\n          `shipments`) are null/omitted. At effective tier 1 the response is membership only; at\n          effective tier ≥ 2 membership rows appear first, then traversal rows.\n        - **Traversal** (effective tier ≥ 2): Relative to each collection member. Response `tier` 1 =\n          that member's direct suppliers, tier 2+ = indirect (suppliers of suppliers) — not a copy\n          of the request `tier`. These rows include discovery metadata when available. Distinguish\n          from membership `\"tier\": 1` by `customerTargetId` = organization and `source` null/omitted.\n\n        ## Data Sources (traversal relationships only)\n        - **CUSTOMS**: Based on shipment data (most reliable)\n        - **MEDIA**: Based on news/media reports\n        - **CUSTOMER**: Based on customer-provided data\n        - **PREWAVE_PREDICTION**: AI-predicted relationships\n\n        ## Optional Fields\n        - `source`: Present for traversal relationships; omitted for membership rows\n        - `probability`: Only present for PREWAVE_PREDICTION sources\n        - `mediaSources`: Only present for MEDIA sources when requested\n        - `nShipments`: Only present for CUSTOMS sources\n        - `shipments`: Only present when includeShipmentDetails=true\n    ","example":null},"PublicTierNCollectionGraphShipment":{"required":["hscode"],"type":"object","properties":{"hscode":{"type":"integer","description":"6-digit HS (Harmonized System) code identifying the product category. Used internationally for trade classification.","format":"int32","example":847330},"nShipments":{"type":"integer","description":"Number of shipments observed for this specific HS code in the relationship. Indicates the volume of trade activity for this product category.","format":"int32","nullable":true,"writeOnly":true,"example":5},"lastShipment":{"type":"string","description":"Date of the most recent shipment observed for this HS code. Format: YYYY-MM-DD. Useful for assessing recency of product-specific activity.","format":"date","nullable":true,"example":"2024-03-15"},"nshipments":{"type":"integer","format":"int32","example":null}},"description":"\n        Detailed shipment information for a specific HS code within a supplier relationship.\n\n        This provides granular shipment data broken down by product category (HS code),\n        showing the volume and recency of trade activity for specific products between\n        the supplier and customer.\n\n        ## HS Codes\n        HS (Harmonized System) codes are 6-digit product classification codes used\n        internationally for trade. They help identify specific product categories\n        involved in the business relationship.\n\n        ## Use Cases\n        - **Product Analysis**: Understand which products drive the relationship\n        - **Volume Assessment**: See shipment frequency and volume per product\n        - **Recency Tracking**: Identify the most recent activity per product\n        - **Risk Analysis**: Assess dependency on specific product categories\n    ","example":null},"AnalysisType":{"type":"string","enum":["Default","LkSG","Norwegian Transparancy Act","CSDDD (Beta)","EU Battery Regulation"],"example":null},"CollectionDTO":{"required":["children","collectionTreeFilter","commodityFilter","deliverySettingTypes","id","isMonitored","isParentMonitored","lanes","level","name","own","path","scope","teams","tiersEnabled","type","uuid"],"type":"object","properties":{"id":{"type":"integer","format":"int32","example":null},"uuid":{"type":"string","format":"uuid","example":null},"scope":{"$ref":"#/components/schemas/CollectionScope"},"type":{"$ref":"#/components/schemas/CollectionType"},"collection":{"type":"string","nullable":true,"example":null},"name":{"type":"string","example":null},"user":{"$ref":"#/components/schemas/UserDTO"},"deliverySettingTypes":{"type":"array","items":{"$ref":"#/components/schemas/DeliverySettingTypeDTO"},"example":null},"logo":{"type":"string","nullable":true,"example":null},"teams":{"type":"array","items":{"$ref":"#/components/schemas/TeamDTO"},"example":null},"count":{"type":"integer","format":"int32","nullable":true,"example":null},"isMonitored":{"type":"boolean","example":null},"isParentMonitored":{"type":"boolean","example":null},"own":{"type":"boolean","example":null},"lanes":{"type":"boolean","example":null},"tiersEnabled":{"type":"boolean","example":null},"tierSettings":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/TierSettingsDTO"}],"example":null},"collectionTreeFilter":{"type":"array","items":{"type":"integer","format":"int32","example":null},"example":null},"userId":{"type":"integer","format":"int32","nullable":true,"example":null},"customerId":{"type":"integer","format":"int32","nullable":true,"example":null},"organizationId":{"type":"integer","format":"int32","nullable":true,"example":null},"viewedWithRole":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/CollectionRole"}],"example":null},"parentId":{"type":"integer","format":"int32","nullable":true,"example":null},"children":{"type":"array","items":{"$ref":"#/components/schemas/CollectionDTO"},"example":null},"level":{"type":"integer","format":"int32","example":null},"path":{"type":"array","items":{"$ref":"#/components/schemas/CollectionRef"},"example":null},"commodityFilter":{"type":"array","items":{"$ref":"#/components/schemas/CommodityFilterId"},"example":null},"updatedAt":{"type":"string","format":"date-time","nullable":true,"example":null},"monitored":{"type":"boolean","writeOnly":true,"example":null},"parentMonitored":{"type":"boolean","writeOnly":true,"example":null}},"example":null},"CollectionRole":{"type":"string","enum":["Manager","Editor"],"example":null},"Connection":{"required":["createdAt","customer1Id","customer2Id","initiatorCustomerId","pending","state","targetCustomerId"],"type":"object","properties":{"customer1Id":{"type":"integer","format":"int32","example":null},"customer2Id":{"type":"integer","format":"int32","example":null},"initiatorCustomerId":{"type":"integer","format":"int32","example":null},"state":{"$ref":"#/components/schemas/ConnectionState"},"pending":{"type":"boolean","example":null},"initiatorId":{"type":"integer","format":"int32","nullable":true,"example":null},"comment":{"type":"string","nullable":true,"example":null},"email":{"type":"string","nullable":true,"example":null},"text":{"type":"string","nullable":true,"example":null},"createdAt":{"type":"string","format":"date-time","example":null},"targetCustomerId":{"type":"integer","format":"int32","example":null}},"example":null},"ConnectionState":{"type":"string","enum":["Confirmed","Rejected","Failed"],"example":null},"CustomerDTO":{"required":["defaultEdgeType","id","name"],"type":"object","properties":{"id":{"type":"integer","format":"int32","example":null},"name":{"type":"string","example":null},"logo":{"type":"string","nullable":true,"example":null},"defaultEdgeType":{"$ref":"#/components/schemas/EdgeType"},"pristine":{"type":"boolean","nullable":true,"example":null},"confidentialSticker":{"type":"string","nullable":true,"example":null}},"example":null},"DIModel":{"type":"string","enum":["Direct","Parent","Auto"],"example":null},"DeliverySettingTypeDTO":{"required":["displayName","frequency","inherited","minPriority","ordering","type"],"type":"object","properties":{"type":{"$ref":"#/components/schemas/DeliveryType"},"displayName":{"type":"string","example":null},"ordering":{"type":"integer","format":"int32","example":null},"frequency":{"type":"string","example":null},"minPriority":{"$ref":"#/components/schemas/Priority"},"inherited":{"type":"boolean","example":null}},"example":null},"DeliveryType":{"type":"string","enum":["Feed","EmailRealtime","EmailDaily","EmailWeekly"],"example":null},"EdgeDTO":{"required":["active","customerId","derived","fromId","id","mediaSources","numbers","priority","source","toId","type"],"type":"object","properties":{"id":{"type":"integer","format":"int32","example":null},"type":{"$ref":"#/components/schemas/EdgeType"},"priority":{"$ref":"#/components/schemas/Priority"},"fromId":{"type":"integer","format":"int32","example":null},"toId":{"type":"integer","format":"int32","example":null},"customerId":{"type":"integer","format":"int32","example":null},"scope":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/Scope"}],"example":null},"source":{"$ref":"#/components/schemas/EdgeSource"},"numberShipments":{"type":"integer","format":"int32","nullable":true,"example":null},"numberHSCodes":{"type":"integer","format":"int32","nullable":true,"example":null},"lastShipmentDate":{"type":"string","format":"date","nullable":true,"example":null},"probability":{"type":"number","format":"double","nullable":true,"example":null},"mediaSources":{"type":"array","items":{"type":"string","example":null},"example":null},"active":{"type":"boolean","example":null},"derived":{"type":"boolean","example":null},"impactData":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/EdgeImpactData"}],"example":null},"edgeNumbers":{"type":"array","nullable":true,"items":{"$ref":"#/components/schemas/EdgeNumber"},"example":null},"numbers":{"type":"array","readOnly":true,"items":{"type":"string","example":null},"example":null}},"example":null},"EdgeImpactData":{"required":["causalContribution","coc","daysOnHand","deviation","edgeId","stockAtSupplier","stockOnPremise","validFrom","validTo"],"type":"object","properties":{"edgeId":{"type":"integer","format":"int32","example":null},"validFrom":{"type":"string","format":"date-time","example":null},"validTo":{"type":"string","format":"date-time","example":null},"purchase":{"type":"number","nullable":true,"example":null},"actualPurchase":{"type":"number","nullable":true,"example":null},"diForced":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/Level"}],"example":null},"di":{"type":"number","format":"double","nullable":true,"example":null},"causalContribution":{"type":"boolean","example":null},"bi12":{"type":"number","nullable":true,"example":null},"coc":{"type":"boolean","example":null},"mttrGrossE":{"type":"number","format":"double","nullable":true,"example":null},"mttrNetE":{"type":"number","format":"double","nullable":true,"example":null},"mttrGrossI":{"type":"number","format":"double","nullable":true,"example":null},"mttrNetI":{"type":"number","format":"double","nullable":true,"example":null},"stockOnPremise":{"type":"number","format":"double","example":null},"stockAtSupplier":{"type":"number","format":"double","example":null},"daysOnHand":{"type":"number","format":"double","example":null},"deviation":{"$ref":"#/components/schemas/BirsDeviation"},"location":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/BirsLocation"}],"example":null},"lastConfirmationDate":{"type":"string","format":"date","nullable":true,"example":null},"birsInfo":{"type":"string","nullable":true,"example":null},"biForced":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/Level"}],"example":null},"bi":{"type":"number","format":"double","nullable":true,"example":null},"biEffE":{"type":"number","format":"double","nullable":true,"example":null},"biEffI":{"type":"number","format":"double","nullable":true,"example":null},"impact":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/Level"}],"example":null}},"example":null},"EdgeType":{"type":"string","enum":["Supplier","Customer","PrimaryMaterial","SecondaryMaterial","Equipment","Own"],"example":null},"ExposureAnalysis":{"required":["baseCollections","collectionCommodityFilters","commodityFilter","customerId","date","exposedCollections","exposedCountries","id","maxTiers","name","scopePrivate","scopePublic","scopeShared","sourceCustomer","sourceCustoms","sourceMedia","sourcePrewavePrediction","tierNSettingsOutdated","type"],"type":"object","properties":{"id":{"type":"integer","format":"int32","example":null},"name":{"type":"string","example":null},"baseCollections":{"type":"array","items":{"$ref":"#/components/schemas/CollectionDTO"},"example":null},"date":{"type":"string","format":"date-time","example":null},"customerId":{"type":"integer","format":"int32","example":null},"type":{"$ref":"#/components/schemas/ExposureAnalysisType"},"maxTiers":{"type":"integer","format":"int32","example":null},"scopePrivate":{"type":"boolean","example":null},"scopeShared":{"type":"boolean","example":null},"scopePublic":{"type":"boolean","example":null},"sourceCustoms":{"type":"boolean","example":null},"sourcePrewavePrediction":{"type":"boolean","example":null},"sourceMedia":{"type":"boolean","example":null},"sourceCustomer":{"type":"boolean","example":null},"minShipments":{"type":"integer","format":"int32","nullable":true,"example":null},"shipmentsPeriodFrom":{"type":"string","format":"date","nullable":true,"example":null},"shipmentsPeriodTo":{"type":"string","format":"date","nullable":true,"example":null},"shipmentsTimeframe":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/ShipmentsTimeframe"}],"example":null},"tierNSettingsOutdated":{"type":"boolean","example":null},"minProbability":{"type":"number","format":"double","nullable":true,"example":null},"commodityFilter":{"$ref":"#/components/schemas/CommodityFilter"},"collectionCommodityFilters":{"type":"object","additionalProperties":{"$ref":"#/components/schemas/CommodityFilter"},"example":null},"exposedCollections":{"type":"array","items":{"$ref":"#/components/schemas/CollectionDTO"},"example":null},"exposedCountries":{"type":"array","items":{"$ref":"#/components/schemas/TargetRef"},"example":null},"exposedTarget":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/TargetRef"}],"example":null},"exposedAlertId":{"type":"integer","format":"int32","nullable":true,"example":null},"scenarioId":{"type":"integer","format":"int32","nullable":true,"example":null}},"example":null},"HSCode":{"required":["children","code","level"],"type":"object","properties":{"code":{"type":"string","example":null},"description":{"type":"string","nullable":true,"example":null},"numberShipments":{"type":"integer","format":"int32","nullable":true,"example":null},"lastShipment":{"type":"string","format":"date-time","nullable":true,"example":null},"children":{"type":"array","items":{"$ref":"#/components/schemas/HSCode"},"example":null},"level":{"type":"integer","format":"int32","example":null}},"example":null},"InfotagDTO":{"required":["id","isTarget","type"],"type":"object","properties":{"id":{"type":"integer","format":"int32","example":null},"type":{"$ref":"#/components/schemas/InfotagTypeDTO"},"value":{"type":"string","nullable":true,"example":null},"svalue":{"type":"string","nullable":true,"example":null},"icon":{"type":"string","nullable":true,"example":null},"numValue":{"type":"number","nullable":true,"example":null},"priority":{"description":"Obsolete","nullable":true,"deprecated":true,"allOf":[{"$ref":"#/components/schemas/Priority"}],"example":null},"impactScore":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/Priority"}],"example":null},"isTarget":{"type":"boolean","example":null},"updatedAt":{"type":"string","format":"date-time","nullable":true,"example":null}},"example":null},"InfotagGroup":{"required":["id","name","ordering","sname"],"type":"object","properties":{"id":{"type":"integer","format":"int32","example":null},"name":{"type":"string","example":null},"sname":{"type":"string","example":null},"icon":{"type":"string","nullable":true,"example":null},"ordering":{"type":"integer","format":"int32","example":null}},"example":null},"InfotagTypeDTO":{"required":["active","display","ordering","type"],"type":"object","properties":{"type":{"type":"string","example":null},"active":{"type":"boolean","example":null},"displayName":{"type":"string","nullable":true,"example":null},"icon":{"type":"string","nullable":true,"example":null},"ordering":{"type":"integer","format":"int32","example":null},"display":{"type":"boolean","example":null}},"example":null},"MissingScore":{"type":"string","enum":["Zero","Skip"],"example":null},"PermissionDTO":{"required":["authority","limits"],"type":"object","properties":{"authority":{"type":"string","example":null},"limits":{"type":"object","additionalProperties":{"type":"integer","format":"int32"},"example":null},"description":{"type":"string","nullable":true,"example":null},"id":{"type":"integer","format":"int32","nullable":true,"example":null}},"example":null},"PerspectiveDTO":{"required":["actualImpactT80","actualRiskT80","commodityMissingScore","countryMissingScore","diModel","eventTypes","groups","id","industryMissingScore","insolvencyLoss","isGlobal","massDisruptionFactor","name","riskModel","sname","type"],"type":"object","properties":{"id":{"type":"integer","format":"int32","example":null},"perspective":{"type":"string","nullable":true,"example":null},"name":{"type":"string","example":null},"sname":{"type":"string","example":null},"type":{"$ref":"#/components/schemas/PerspectiveTypeDTO"},"isGlobal":{"type":"boolean","example":null},"groups":{"type":"array","items":{"$ref":"#/components/schemas/InfotagGroup"},"example":null},"eventTypes":{"type":"array","items":{"$ref":"#/components/schemas/InfotagDTO"},"example":null},"massDisruptionFactor":{"type":"boolean","example":null},"description":{"type":"string","nullable":true,"example":null},"riskModel":{"$ref":"#/components/schemas/RiskModel"},"diModel":{"$ref":"#/components/schemas/DIModel"},"riskT80":{"type":"integer","format":"int32","nullable":true,"example":null},"impactT80":{"type":"number","format":"double","nullable":true,"example":null},"insolvencyLoss":{"type":"boolean","example":null},"industryMissingScore":{"$ref":"#/components/schemas/MissingScore"},"commodityMissingScore":{"$ref":"#/components/schemas/MissingScore"},"countryMissingScore":{"$ref":"#/components/schemas/MissingScore"},"actualRiskT80":{"type":"integer","format":"int32","example":null},"actualImpactT80":{"type":"number","format":"double","example":null}},"example":null},"PerspectiveTypeDTO":{"required":["displayName","id","ordering","type"],"type":"object","properties":{"id":{"type":"integer","format":"int32","example":null},"type":{"type":"string","example":null},"displayName":{"type":"string","example":null},"ordering":{"type":"integer","format":"int32","example":null}},"example":null},"PlanDTO":{"required":["limits"],"type":"object","properties":{"id":{"type":"integer","format":"int32","nullable":true,"example":null},"planType":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/PlanTypeDTO"}],"example":null},"name":{"type":"string","nullable":true,"example":null},"pricePerUser":{"type":"number","nullable":true,"example":null},"limits":{"type":"array","items":{"$ref":"#/components/schemas/PlanLimitDTO"},"example":null},"validFrom":{"type":"string","format":"date-time","nullable":true,"example":null},"validTo":{"type":"string","format":"date-time","nullable":true,"example":null}},"example":null},"PlanLimitDTO":{"required":["name","value"],"type":"object","properties":{"name":{"type":"string","example":null},"value":{"type":"integer","format":"int32","example":null}},"example":null},"PlanTypeDTO":{"type":"object","properties":{"id":{"type":"integer","format":"int32","nullable":true,"example":null},"type":{"type":"string","nullable":true,"example":null},"displayName":{"type":"string","nullable":true,"example":null},"ordering":{"type":"integer","format":"int32","nullable":true,"example":null}},"example":null},"RevenueAvailability":{"type":"string","enum":["Unknown","Available"],"example":null},"RiskAnalysis":{"required":["approvedForReport","collectionIds","date","diModel","id","impactT80","isArchived","locks","name","periodFrom","periodTo","perspective","reason","regularity","riskT80","scope","scopingCountryShare","targetType","tiern","type"],"type":"object","properties":{"id":{"type":"integer","format":"int32","example":null},"name":{"type":"string","example":null},"perspective":{"$ref":"#/components/schemas/PerspectiveDTO"},"targetType":{"$ref":"#/components/schemas/TargetTypeDTO"},"periodFrom":{"type":"string","format":"date","example":null},"periodTo":{"type":"string","format":"date","example":null},"date":{"type":"string","format":"date","example":null},"riskT80":{"type":"integer","format":"int32","example":null},"impactT80":{"type":"number","format":"double","example":null},"diModel":{"$ref":"#/components/schemas/DIModel"},"locks":{"type":"array","items":{"$ref":"#/components/schemas/RiskAnalysisLock"},"example":null},"isArchived":{"type":"boolean","example":null},"regularity":{"$ref":"#/components/schemas/RiskAnalysisRegularity"},"reason":{"type":"array","items":{"$ref":"#/components/schemas/RiskAnalysisReason"},"example":null},"specificOccasion":{"type":"string","nullable":true,"example":null},"approvedForReport":{"type":"boolean","example":null},"findings":{"type":"string","nullable":true,"example":null},"scope":{"$ref":"#/components/schemas/RiskAnalysisScope"},"type":{"$ref":"#/components/schemas/RiskAnalysisType"},"tiern":{"type":"boolean","example":null},"countryScoreThreshold":{"type":"number","format":"double","nullable":true,"example":null},"industryScoreThreshold":{"type":"number","format":"double","nullable":true,"example":null},"purchaseVolumeThreshold":{"type":"number","format":"double","nullable":true,"example":null},"collectionIds":{"type":"array","items":{"type":"integer","format":"int32","example":null},"example":null},"scopingCountryShare":{"type":"number","format":"double","example":null}},"example":null},"RiskAnalysisLock":{"required":["locked","type"],"type":"object","properties":{"type":{"$ref":"#/components/schemas/RiskAnalysisLockType"},"locked":{"type":"boolean","example":null},"user":{"$ref":"#/components/schemas/UserDTO"},"lockedAt":{"type":"string","format":"date-time","nullable":true,"example":null}},"example":null},"RiskAnalysisLockType":{"type":"string","enum":["Form","Suppliers","Matrix","Actions","Scoping","Products"],"example":null},"RiskAnalysisReason":{"type":"string","enum":["InternalDecisions","ExternalFactors","SubstantiatedKnowledge","ChangeNewProducts","ChangeNewAreas","Other"],"example":null},"RiskAnalysisRegularity":{"type":"string","enum":["Regular","Adhoc"],"example":null},"RiskAnalysisScope":{"type":"string","enum":["OwnBusinessArea","Suppliers","Customers"],"example":null},"RiskAnalysisType":{"required":["availablePerspectives","hideDetails","products","recommended","scoping","tierNAnalysisEnabled","type"],"type":"object","properties":{"type":{"$ref":"#/components/schemas/AnalysisType"},"hideDetails":{"type":"boolean","example":null},"recommended":{"type":"boolean","example":null},"tierNAnalysisEnabled":{"type":"boolean","example":null},"scoping":{"type":"boolean","example":null},"products":{"type":"boolean","example":null},"component":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/ScoreComponent"}],"example":null},"perspectiveId":{"type":"integer","format":"int32","nullable":true,"example":null},"availablePerspectives":{"type":"array","items":{"$ref":"#/components/schemas/PerspectiveDTO"},"example":null},"countryScoreThreshold":{"type":"number","format":"double","nullable":true,"example":null},"industryScoreThreshold":{"type":"number","format":"double","nullable":true,"example":null},"purchaseVolumeThreshold":{"type":"number","format":"double","nullable":true,"example":null}},"example":null},"RiskModel":{"type":"string","enum":["Sustainability","Disruption"],"example":null},"RoleDTO":{"required":["id","permissions","roleName"],"type":"object","properties":{"id":{"type":"integer","format":"int32","example":null},"type":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/RoleTypeDTO"}],"example":null},"roleName":{"type":"string","example":null},"displayName":{"type":"string","nullable":true,"example":null},"description":{"type":"string","nullable":true,"example":null},"permissions":{"type":"array","items":{"$ref":"#/components/schemas/PermissionDTO"},"example":null}},"example":null},"RoleTypeDTO":{"required":["displayName","id","type"],"type":"object","properties":{"id":{"type":"integer","format":"int32","example":null},"type":{"type":"string","example":null},"displayName":{"type":"string","example":null}},"example":null},"SanctionStatus":{"type":"string","enum":["DIRECT","INDIRECT","NONE"],"example":null},"ShipmentsTimeframe":{"type":"string","enum":["LAST_12_MONTHS","LAST_2_YEARS","LAST_3_YEARS","LAST_5_YEARS","ALL"],"example":null},"SupplierOnboardingData":{"required":["customerId","supplierId"],"type":"object","properties":{"supplierId":{"type":"integer","format":"int32","example":null},"customerId":{"type":"integer","format":"int32","example":null}},"example":null},"TargetCTypeDTO":{"required":["bgColor","connectable","ctype","displayName","icon","id","pluralName","priority","targetTypeId","textColor"],"type":"object","properties":{"id":{"type":"integer","format":"int32","example":null},"ctype":{"type":"string","example":null},"targetTypeId":{"type":"integer","format":"int32","example":null},"displayName":{"type":"string","example":null},"pluralName":{"type":"string","example":null},"icon":{"type":"string","example":null},"ordering":{"type":"integer","format":"int32","nullable":true,"example":null},"priority":{"type":"integer","format":"int32","example":null},"connectable":{"type":"boolean","example":null},"bgColor":{"type":"string","example":null},"textColor":{"type":"string","example":null}},"example":null},"TargetDTO":{"required":["children","collectionFollowing","collectionPath","collectionPaths","ctype","edges","followerCount","following","foreignSystems","geo","geoShape","hsCodes","id","industries","isAnonymous","managed","maturityAssessment","name","own","parents","path","paths","sanctionStatus","screened","type"],"type":"object","properties":{"id":{"type":"integer","format":"int32","example":null},"name":{"type":"string","example":null},"sname":{"type":"string","nullable":true,"example":null},"logo":{"type":"string","nullable":true,"example":null},"backgroundPicture":{"type":"string","nullable":true,"example":null},"description":{"type":"string","nullable":true,"example":null},"website":{"type":"string","nullable":true,"example":null},"location":{"type":"string","nullable":true,"example":null},"yearFounded":{"type":"integer","format":"int32","nullable":true,"example":null},"size":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/TargetSize"}],"example":null},"screened":{"type":"boolean","example":null},"maturityAssessment":{"type":"boolean","example":null},"linkedInId":{"type":"string","nullable":true,"example":null},"type":{"$ref":"#/components/schemas/TargetTypeDTO"},"ctype":{"$ref":"#/components/schemas/TargetCTypeDTO"},"geo":{"$ref":"#/components/schemas/Geo"},"geoShape":{"$ref":"#/components/schemas/Geo"},"address":{"type":"string","nullable":true,"example":null},"muted":{"type":"boolean","nullable":true,"example":null},"hierarchyCustomerId":{"type":"integer","format":"int32","nullable":true,"example":null},"hierarchyOrganizationId":{"type":"integer","format":"int32","nullable":true,"example":null},"level":{"type":"string","nullable":true,"example":null},"parents":{"type":"array","items":{"$ref":"#/components/schemas/TargetDTO"},"example":null},"children":{"type":"array","items":{"$ref":"#/components/schemas/TargetDTO"},"example":null},"organization":{"$ref":"#/components/schemas/TargetDTO"},"customer":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/CustomerDTO"}],"example":null},"industries":{"type":"array","items":{"$ref":"#/components/schemas/TargetDTO"},"example":null},"monitoredSince":{"type":"string","format":"date-time","nullable":true,"example":null},"earliestAlert":{"type":"string","format":"date-time","nullable":true,"example":null},"followerCount":{"type":"integer","format":"int32","example":null},"ordering":{"type":"integer","format":"int32","nullable":true,"example":null},"own":{"type":"boolean","example":null},"managed":{"type":"boolean","example":null},"isPublic":{"type":"boolean","nullable":true,"example":null},"edges":{"type":"array","items":{"$ref":"#/components/schemas/EdgeDTO"},"example":null},"connection":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/Connection"}],"example":null},"connectionContactsCount":{"type":"integer","format":"int32","nullable":true,"example":null},"population":{"type":"integer","format":"int32","nullable":true,"example":null},"following":{"type":"boolean","example":null},"collectionFollowing":{"type":"boolean","example":null},"paths":{"type":"array","items":{"type":"array","items":{"$ref":"#/components/schemas/TargetRef"},"example":null},"example":null},"tier":{"type":"integer","format":"int32","nullable":true,"example":null},"collectionLevel":{"type":"integer","format":"int32","nullable":true,"example":null},"collectionPath":{"type":"array","items":{"$ref":"#/components/schemas/CollectionRef"},"example":null},"collectionPaths":{"type":"array","items":{"type":"array","items":{"$ref":"#/components/schemas/CollectionRef"},"example":null},"example":null},"foreignSystems":{"type":"array","items":{"$ref":"#/components/schemas/TargetForeignSystemDTO"},"example":null},"scoreAvail":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/ScoreAvailability"}],"example":null},"revenue":{"type":"number","nullable":true,"example":null},"isRevenueEstimated":{"type":"boolean","nullable":true,"example":null},"actualRevenue":{"type":"number","nullable":true,"example":null},"revenueAvailability":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/RevenueAvailability"}],"example":null},"hsCodes":{"type":"array","items":{"$ref":"#/components/schemas/HSCode"},"example":null},"grievanceUrl":{"type":"string","nullable":true,"example":null},"sanctionStatus":{"$ref":"#/components/schemas/SanctionStatus"},"countryScoreAvailable":{"type":"boolean","nullable":true,"example":null},"industryScoreAvailable":{"type":"boolean","nullable":true,"example":null},"commodityScoreAvailable":{"type":"boolean","nullable":true,"example":null},"isAnonymous":{"type":"boolean","example":null},"customName":{"type":"string","nullable":true,"example":null},"latestRequest":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/TargetRequestInfoDto"}],"example":null},"path":{"type":"array","description":"There might be multiple paths to that target. `path` just returns any of the (shortest) paths.","deprecated":true,"items":{"$ref":"#/components/schemas/TargetRef"},"example":null},"public":{"type":"boolean","writeOnly":true,"example":null}},"example":null},"TargetForeignSystemDTO":{"required":["id","system"],"type":"object","properties":{"system":{"type":"string","example":null},"id":{"type":"string","example":null},"source":{"type":"string","nullable":true,"example":null}},"example":null},"TargetRef":{"required":["edges","id","name"],"type":"object","properties":{"id":{"type":"integer","format":"int32","example":null},"name":{"type":"string","example":null},"customName":{"type":"string","nullable":true,"example":null},"latestRequest":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/TargetRequestInfoDto"}],"example":null},"edges":{"type":"array","items":{"$ref":"#/components/schemas/EdgeDTO"},"example":null}},"example":null},"TargetTypeDTO":{"required":["displayName","id","pluralName","scoring","type"],"type":"object","properties":{"id":{"type":"integer","format":"int32","example":null},"type":{"type":"string","example":null},"displayName":{"type":"string","example":null},"pluralName":{"type":"string","example":null},"ordering":{"type":"integer","format":"int32","nullable":true,"example":null},"scoring":{"$ref":"#/components/schemas/Scoring"}},"example":null},"TeamDTO":{"required":["id","name","users"],"type":"object","properties":{"id":{"type":"integer","format":"int32","example":null},"name":{"type":"string","example":null},"organizationId":{"type":"integer","format":"int32","nullable":true,"example":null},"users":{"type":"array","items":{"$ref":"#/components/schemas/UserDTO"},"example":null}},"example":null},"TierSettingsDTO":{"required":["logisticsProvider","maxTier","scopePrivate","scopePublic","scopeShared","sourceCustomer","sourceCustoms","sourceMedia","sourcePrewavePrediction","suspectedSuppliers","tier2MinPrio","tier2TargetPrio","tier3PlusMinPrio","tier3PlusTargetPrio"],"type":"object","properties":{"maxTier":{"type":"integer","format":"int32","example":null},"tier2TargetPrio":{"$ref":"#/components/schemas/Priority"},"tier3PlusTargetPrio":{"$ref":"#/components/schemas/Priority"},"tier2MinPrio":{"$ref":"#/components/schemas/Priority"},"tier3PlusMinPrio":{"$ref":"#/components/schemas/Priority"},"scopePrivate":{"type":"boolean","example":null},"scopeShared":{"type":"boolean","example":null},"scopePublic":{"type":"boolean","example":null},"sourceCustoms":{"type":"boolean","example":null},"sourcePrewavePrediction":{"type":"boolean","example":null},"sourceMedia":{"type":"boolean","example":null},"sourceCustomer":{"type":"boolean","example":null},"minShipments":{"type":"integer","format":"int32","nullable":true,"example":null},"probability":{"type":"integer","format":"int32","nullable":true,"example":null},"lastShipmentsPeriodFrom":{"type":"string","format":"date","nullable":true,"example":null},"lastShipmentsPeriodTo":{"type":"string","format":"date","nullable":true,"example":null},"suspectedSuppliers":{"type":"boolean","example":null},"logisticsProvider":{"type":"boolean","example":null}},"example":null},"UserAttributes":{"required":["scenarioWelcomeScreenShown"],"type":"object","properties":{"scenarioWelcomeScreenShown":{"type":"boolean","example":null}},"example":null},"UserDTO":{"required":["firstname","id","lastname"],"type":"object","properties":{"id":{"type":"integer","format":"int32","example":null},"email":{"type":"string","format":"email","nullable":true,"example":null},"firstname":{"minLength":1,"type":"string","nullable":true,"example":null},"lastname":{"minLength":1,"type":"string","nullable":true,"example":null},"department":{"type":"string","nullable":true,"example":null},"position":{"type":"string","nullable":true,"example":null},"profilePic":{"type":"string","nullable":true,"example":null},"customer":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/CustomerDTO"}],"example":null},"userHash":{"type":"string","nullable":true,"example":null},"settings":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/UserSettings"}],"example":null},"activePlan":{"description":"Use the methods provided in the PlanService or PlanRepository","nullable":true,"deprecated":true,"allOf":[{"$ref":"#/components/schemas/PlanDTO"}],"example":null},"active":{"type":"boolean","nullable":true,"example":null},"confirmed":{"type":"boolean","nullable":true,"example":null},"roles":{"type":"array","nullable":true,"items":{"$ref":"#/components/schemas/RoleDTO"},"example":null},"teams":{"type":"array","nullable":true,"items":{"$ref":"#/components/schemas/TeamDTO"},"example":null},"perspective":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/PerspectiveDTO"}],"example":null},"organization":{"$ref":"#/components/schemas/TargetDTO"},"organizations":{"type":"array","nullable":true,"items":{"$ref":"#/components/schemas/TargetDTO"},"example":null},"defaultEdgeType":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/EdgeType"}],"example":null},"language":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/UserLanguage"}],"example":null},"collection":{"$ref":"#/components/schemas/CollectionDTO"},"passwordValidUntil":{"type":"string","format":"date-time","nullable":true,"example":null},"riskAnalysis":{"$ref":"#/components/schemas/RiskAnalysis"},"phone":{"type":"string","nullable":true,"example":null},"wechatId":{"type":"string","nullable":true,"example":null},"peerScoreToggle":{"type":"boolean","nullable":true,"example":null},"resilienceScoreToggle":{"type":"boolean","nullable":true,"example":null}},"example":null},"UserLanguage":{"type":"string","enum":["en","de","fr","it","ch"],"example":null},"UserSettings":{"required":["_system_","user"],"type":"object","properties":{"user":{"$ref":"#/components/schemas/UserAttributes"},"_system_":{"$ref":"#/components/schemas/UserSystemAttributes"}},"example":null},"UserSystemAttributes":{"required":["incognitoOnboarding","onboardingFlowComplete"],"type":"object","properties":{"onboardingFlowComplete":{"type":"boolean","example":null},"incognitoOnboarding":{"type":"boolean","example":null},"joinCustomer":{"type":"integer","format":"int32","nullable":true,"example":null},"supplierOnboardingData":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/SupplierOnboardingData"}],"example":null}},"example":null},"ExposureFilter":{"required":["overviewTiers","riskTargetIds","targetIds"],"type":"object","properties":{"overviewTiers":{"type":"integer","format":"int32","example":null},"query":{"type":"string","nullable":true,"example":null},"exposedQuery":{"type":"string","nullable":true,"example":null},"riskTargetIds":{"type":"array","items":{"type":"integer","format":"int32","example":null},"example":null},"targetIds":{"type":"array","items":{"type":"integer","format":"int32","example":null},"example":null}},"example":null},"BaseTarget":{"required":["commodities","id","name","riskTargets","type"],"type":"object","properties":{"id":{"type":"integer","format":"int32","example":null},"name":{"type":"string","example":null},"type":{"$ref":"#/components/schemas/TargetTypeDTO"},"riskTargets":{"type":"array","items":{"$ref":"#/components/schemas/ExposureRiskTarget"},"example":null},"commodities":{"type":"array","items":{"$ref":"#/components/schemas/ExposureCommodity"},"example":null},"numberShipments":{"type":"integer","format":"int32","nullable":true,"example":null}},"example":null},"ExposureCommodity":{"required":["id","name"],"type":"object","properties":{"id":{"type":"integer","format":"int32","example":null},"name":{"type":"string","example":null}},"example":null},"ExposureGraph":{"required":["aggregatedStats","baseTargetCount","baseTargets","graph","targets"],"type":"object","properties":{"graph":{"$ref":"#/components/schemas/ExplorerGraph"},"targets":{"type":"array","items":{"$ref":"#/components/schemas/ExposureTarget"},"example":null},"baseTargetCount":{"type":"integer","format":"int32","example":null},"baseTargets":{"type":"array","items":{"$ref":"#/components/schemas/BaseTarget"},"example":null},"aggregatedStats":{"type":"array","items":{"$ref":"#/components/schemas/ExposureTargetStat"},"example":null}},"example":null},"ExposureReason":{"required":["name","type"],"type":"object","properties":{"type":{"$ref":"#/components/schemas/ExposureReasonType"},"name":{"type":"string","example":null}},"example":null},"ExposureReasonType":{"type":"string","enum":["Collection","Target","Country","Tariff","ExportRestrictions"],"example":null},"ExposureRiskTarget":{"required":["commodities","commoditySources","id","name","reasons","tier","type"],"type":"object","properties":{"id":{"type":"integer","format":"int32","example":null},"tier":{"type":"integer","format":"int32","example":null},"name":{"type":"string","example":null},"type":{"$ref":"#/components/schemas/TargetTypeDTO"},"reasons":{"type":"array","items":{"$ref":"#/components/schemas/ExposureReason"},"example":null},"commodities":{"type":"array","items":{"$ref":"#/components/schemas/ExposureCommodity"},"example":null},"commoditySources":{"type":"object","additionalProperties":{"uniqueItems":true,"type":"array","items":{"$ref":"#/components/schemas/EdgeSource"}},"example":null},"numberShipments":{"type":"integer","format":"int32","nullable":true,"example":null}},"example":null},"ExposureTarget":{"required":["stats","target"],"type":"object","properties":{"target":{"$ref":"#/components/schemas/ExposureTargetDetails"},"stats":{"type":"array","items":{"$ref":"#/components/schemas/ExposureTargetStat"},"example":null}},"example":null},"ExposureTargetDetails":{"required":["baseSupplierCount","exposedDistinctCount","id","name","tier","type"],"type":"object","properties":{"tier":{"type":"integer","format":"int32","example":null},"id":{"type":"integer","format":"int32","example":null},"name":{"type":"string","example":null},"type":{"$ref":"#/components/schemas/TargetTypeDTO"},"edgeNumbers":{"type":"array","nullable":true,"items":{"$ref":"#/components/schemas/EdgeNumber"},"example":null},"baseSupplierCount":{"type":"integer","format":"int32","example":null},"exposedDistinctCount":{"type":"integer","format":"int32","example":null}},"example":null},"ExposureTargetStat":{"required":["count","tier"],"type":"object","properties":{"tier":{"type":"integer","format":"int32","example":null},"count":{"type":"integer","format":"int32","example":null}},"example":null},"PublicActionDTO":{"required":["actionId","assignees","createdAt","status","target","teams","title","type","updatedAt"],"type":"object","properties":{"actionId":{"type":"integer","description":"Public-facing action key","format":"int32","example":12345},"title":{"type":"string","description":"Action title","example":"Review supplier compliance"},"type":{"$ref":"#/components/schemas/PublicActionTypeDTO"},"status":{"$ref":"#/components/schemas/PublicActionStatusDTO"},"target":{"$ref":"#/components/schemas/PublicTargetRef"},"assignees":{"type":"array","description":"Assigned users","items":{"$ref":"#/components/schemas/PublicUserRefDTO"},"example":null},"teams":{"type":"array","description":"Assigned teams","items":{"$ref":"#/components/schemas/PublicTeamRefDTO"},"example":null},"organization":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/PublicTargetRef"}],"example":null},"dueDate":{"type":"string","description":"Due date (ISO 8601 timestamp)","format":"date-time","nullable":true,"example":"2024-12-31T23:59:59Z"},"createdAt":{"type":"string","description":"Creation timestamp (ISO 8601 timestamp)","format":"date-time","example":"2024-01-15T10:30:00Z"},"updatedAt":{"type":"string","description":"Last update timestamp (ISO 8601 timestamp)","format":"date-time","example":"2024-01-20T14:45:00Z"}},"description":"Public API v1 DTO for action list item","example":null},"PublicActionStatusDTO":{"required":["id","state","title"],"type":"object","properties":{"id":{"type":"integer","description":"Status ID","format":"int32","example":3},"title":{"type":"string","description":"Status title","example":"In Progress"},"state":{"type":"string","description":"Status state","example":"InProgress"}},"description":"Action status information","example":null},"PublicActionTypeDTO":{"required":["displayName","id"],"type":"object","properties":{"id":{"type":"integer","description":"Action type ID","format":"int32","example":5},"displayName":{"type":"string","description":"Action type display name","example":"Incident Review"}},"description":"Action type information","example":null},"PublicTeamRefDTO":{"required":["id","name"],"type":"object","properties":{"id":{"type":"integer","description":"Team ID","format":"int32","example":10},"name":{"type":"string","description":"Team name","example":"Compliance Team"}},"description":"Team reference information","example":null},"PublicUserRefDTO":{"required":["id","name"],"type":"object","properties":{"id":{"type":"integer","description":"User ID","format":"int32","example":100},"name":{"type":"string","description":"User full name","example":"John Doe"},"email":{"type":"string","description":"User email","nullable":true,"example":"john.doe@example.com"}},"description":"User reference information","example":null},"SchemaPublicActionDTO":{"type":"object","properties":{"totalPages":{"type":"integer","format":"int32","example":null},"totalElements":{"type":"integer","format":"int64","example":null},"size":{"type":"integer","format":"int32","example":null},"content":{"type":"array","items":{"$ref":"#/components/schemas/PublicActionDTO"},"example":null},"number":{"type":"integer","format":"int32","example":null},"numberOfElements":{"type":"integer","format":"int32","example":null},"sort":{"$ref":"#/components/schemas/SortObject"},"pageable":{"$ref":"#/components/schemas/Pageable"},"first":{"type":"boolean","example":null},"last":{"type":"boolean","example":null},"empty":{"type":"boolean","example":null}},"example":null},"PublicActionDetailDTO":{"required":["actionId","assignees","attachmentItems","createdAt","creator","status","target","teams","title","type","updatedAt"],"type":"object","properties":{"actionId":{"type":"integer","description":"Public-facing action key","format":"int32","example":12345},"title":{"type":"string","description":"Action title","example":"Review supplier compliance"},"description":{"type":"string","description":"Action description","nullable":true,"example":"Please review the compliance documentation"},"type":{"$ref":"#/components/schemas/PublicActionTypeDTO"},"status":{"$ref":"#/components/schemas/PublicActionStatusDTO"},"target":{"$ref":"#/components/schemas/PublicTargetRef"},"assignees":{"type":"array","description":"Assigned users","items":{"$ref":"#/components/schemas/PublicUserRefDTO"},"example":null},"teams":{"type":"array","description":"Assigned teams","items":{"$ref":"#/components/schemas/PublicTeamRefDTO"},"example":null},"organization":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/PublicTargetRef"}],"example":null},"creator":{"$ref":"#/components/schemas/PublicUserRefDTO"},"dueDate":{"type":"string","description":"Due date (ISO 8601 timestamp)","format":"date-time","nullable":true,"example":"2024-12-31T23:59:59Z"},"createdAt":{"type":"string","description":"Creation timestamp (ISO 8601 timestamp)","format":"date-time","example":"2024-01-15T10:30:00Z"},"updatedAt":{"type":"string","description":"Last update timestamp (ISO 8601 timestamp)","format":"date-time","example":"2024-01-20T14:45:00Z"},"mainItem":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/PublicActionItemDTO"}],"example":null},"executionItem":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/PublicActionItemDTO"}],"example":null},"attachmentItems":{"type":"array","description":"Attachment items","items":{"$ref":"#/components/schemas/PublicActionItemDTO"},"example":null},"skipInfo":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/PublicActionSkipDTO"}],"example":null}},"description":"Public API v1 DTO for detailed action response","example":null},"PublicActionItemDTO":{"required":["id","type"],"type":"object","properties":{"id":{"type":"integer","description":"Item ID","format":"int32","example":1001},"type":{"type":"string","description":"Item type","example":"Alert"},"entityId":{"type":"integer","description":"Entity ID this item references","format":"int32","nullable":true,"example":5001}},"description":"Action item information","example":null},"PublicActionSkipDTO":{"required":["reason"],"type":"object","properties":{"reason":{"type":"string","description":"Skip reason","example":"NotApplicable"},"otherText":{"type":"string","description":"Additional reason text","nullable":true,"example":"Supplier no longer active"},"endDate":{"type":"string","description":"End date for skip (ISO 8601 timestamp)","format":"date-time","nullable":true,"example":"2024-12-31T23:59:59Z"}},"description":"Action skip information","example":null},"ImpactLevelLevel":{"type":"string","enum":["company_poi_to_eoi","direct","related_target","company","industry","regional","tier2","tier3plus","in-company","commodity","country","mention"],"example":null},"ApiRateLimitTimeRequestLimit":{"type":"object","properties":{"requestLimit":{"type":"integer","description":"Maximum number of requests allowed in this time window","format":"int32","example":100},"timeInSeconds":{"type":"integer","description":"Time window duration in seconds","format":"int32","example":10}},"description":"Rate limit configuration for a specific time window","example":null},"ApiRateLimitResponse":{"type":"object","properties":{"error":{"type":"string","description":"Error type identifier","example":"RateLimitExceeded"},"message":{"type":"string","description":"Human-readable error message explaining the rate limit violation","example":"API rate limit exceeded. Please reduce your request rate."},"requestLimit":{"type":"integer","description":"Maximum number of requests allowed in the current time window","format":"int32","example":100},"requestCount":{"type":"integer","description":"Number of requests made in the current time window","format":"int32","example":101},"limits":{"type":"array","description":"All rate limits that apply to this endpoint, showing different time windows","items":{"$ref":"#/components/schemas/ApiRateLimitTimeRequestLimit"},"example":null},"currentTime":{"type":"string","description":"Current server time in ISO 8601 format","format":"date-time","example":"2026-01-19T10:30:00"},"nextResetAt":{"type":"string","description":"Time when the rate limit will reset in ISO 8601 format","format":"date-time","example":"2026-01-19T10:30:10"}},"description":"Response returned when API rate limit is exceeded (HTTP 429)","example":null},"AccessDeniedErrorDTO":{"required":["code","loggedIn","message"],"type":"object","properties":{"loggedIn":{"type":"boolean","example":null},"permission":{"type":"string","nullable":true,"example":null},"code":{"type":"string","description":"Error code","example":null},"message":{"type":"string","description":"Error message","example":null},"solution":{"type":"string","description":"Possible solution to the error","nullable":true,"example":null}},"example":null}},"securitySchemes":{"Token authentication":{"type":"apiKey","description":"Generate an API token at https://www.prewave.com/management/api and paste it in here.","name":"X-Auth-Token","in":"header"}}}}