Bulk upsert of packaging units, keyed on internalRef. A row may carry its additional sizes (sizes[]) and the additive articleNumbers / componentCodes directives in the same call. A row without internalRef is always a create — the server assigns the next PU-<n>, and read the generated references back with GET /api/v1/ppwr/units (or GET /api/v1/ppwr/units?internalRef=…) before importing links or article links. Same fill-only column policy and overwrite confirmation as the component intake. At most 1000 rows per request (400 otherwise). A request may additionally carry at most 1000 sizes entries across all its rows. Requires packaging:write; customer workspace with the PPWR module enabled — see the guide.
API key generated in Settings > API Keys. Include as Authorization: Bearer <key>.
Body
application/json
object[]
object
One packaging-unit row for POST /api/v1/ppwr/units. Upsert key: internalRef. A row without internalRef can match nothing and is therefore ALWAYS a create — the server names the unit with the next generated PU-<n>; replaying such a row creates another unit. Cells are coerced exactly as the in-app CSV/Excel importer coerces them, so a JSON-native value and its string spelling are equivalent (12 = "12", ["plastic"] = "plastic;paper_board", true = "yes"/"ja"/"1"). An empty or omitted field is a no-op — it never clears a stored value.
Your reference for the unit — the upsert key, unique within your company. Omit it only for rows you never intend to replay (see the schema description).
Resolved to one of your suppliers by fuzzy name match (case, umlauts, punctuation and legal-form tokens are ignored). A name that matches two or more distinct suppliers fails the row with ambiguousSupplierName — the import never guesses. A name that matches none creates a name-only supplier (no email, data incomplete) once per distinct name in the request and links the record to it; the created names are returned in suppliersCreated. A blank cell resolves to no supplier (your own bucket).
The flat spelling of a size: several rows sharing one internalRef, each with its own sizeReference, fold into ONE unit with N sizes. Blank (or equal to internalRef) marks the UNIT row. Prefer sizes[].
Blank = false on a create; on an update a blank/absent value leaves the stored value unchanged and an explicit false switches a stored true off (an overwrite).
Blank = false on a create; on an update a blank/absent value leaves the stored value unchanged and an explicit false switches a stored true off (an overwrite).
Art. 11 reusable packaging. Blank = false on a create; on an update a blank/absent value leaves the stored value unchanged and an explicit false switches a stored true off (an overwrite).
Links the unit to existing articles by internal article number. On a SIZE row the link is to that size. An unmatched number is skipped silently (counted in articleNumbersUnmatched), never created and never a row error — unlike POST /api/v1/ppwr/article-links, which errors.
Builds the bill of materials with quantity 1. An unknown code auto-creates a minimal placeholder component (other, name = code, counted in componentStubsCreated). A code naming two or more live components fails the whole row with ambiguousComponentMatch — the cell has no supplier column to disambiguate with, and the oldest match is never picked. POST /api/v1/ppwr/links reports the same key, so it is not an escape hatch: make the code unique instead.
The unit's ADDITIONAL sizes — the primary way to send sizes. On a CREATE the row is one transaction: a refused size (duplicateFormatReference, formatCapReached) rolls the unit back too. On a row matching an EXISTING unit each size is upserted on its own; sizes the payload omits are never deleted.
Single-part packaging (big bag, pallet, paper sack): the unit's own material family. A row with a material gives its unit ONE component (code = internalRef, name = name, this material) when the unit has no component yet — on a create or on an existing unit; a replay never adds a second. Cannot be combined with componentCodes (row is invalid with materialWithComponentCodes).
Single-part packaging: the unit's own mass in grams, written onto the component material creates. Requires material (else the row is invalid with materialsRequired).
Antwort
Intake result (partial accept — see the schema).
Result of a synchronous PPWR intake. Partial accept: valid rows commit even when other rows are invalid or failed — the one exception is the 409 overwrite confirmation, which is all-or-nothing. Idempotent: replaying an identical request changes nothing (matched rows return as skipped), except unit rows without internalRef, which are always creates.
Rows the upsert engine rejected (unknown reference, ambiguous match, a new unit over the plan's unit quota → packagingUnitQuotaReached, …). A row refused before its write (these, and a new unit over the quota) writes nothing — not even the supplier it names; a unit written whose component or article link then failed is reported here with that link's key. Its error values are stable machine keys.
Rows rejected by schema validation before the engine ran. Most error values are stable machine keys, but a field with no custom message falls back to the validator's own English text — match on the key, fall back to displaying the string.
Unit intake only: units created with neither componentCodes nor a material. They hold no component yet, so no regulated value can be recorded on them — send componentCodes, or material for single-part packaging.
Unit intake only: main-part components created from rows' material (one per unit that had no component yet).
{"docsConfig":{"theme":"mint","$schema":"https://mintlify.com/docs.json","name":"Polygon One Helpcenter","colors":{"primary":"#15803D","light":"#07C983","dark":"#15803D"},"logo":{"light":"https://mintcdn.com/polygonone/AMoRp9VbcW46gNsT/logo/light.svg?fit=max\u0026auto=format\u0026n=AMoRp9VbcW46gNsT\u0026q=85\u0026s=4a316da81d50e49c7f9f6480a235558e","dark":"https://mintcdn.com/polygonone/AMoRp9VbcW46gNsT/logo/dark.svg?fit=max\u0026auto=format\u0026n=AMoRp9VbcW46gNsT\u0026q=85\u0026s=2f010ff600ff4880f154678933ee7214"},"favicon":"https://mintcdn.com/polygonone/ySkQMGGRhMNkPSTt/favicon.svg?fit=max\u0026auto=format\u0026n=ySkQMGGRhMNkPSTt\u0026q=85\u0026s=90cbe4fd3ee2dbffcb8de6167a8d47f3","api":{"playground":{"display":"simple"}},"navbar":{"links":[{"href":"mailto:help@polygon-one.eu","label":"Support"}],"primary":{"type":"button","label":"App","href":"https://app.polygon-one.com/"}},"footer":{"socials":{"website":"https://polygon-one.com"}},"search":{"prompt":"Suche..."},"integrations":{"posthog":{"apiKey":"phc_uKa9gMArvxxjzGfYWUWS4YLP7yT7gPETBzA3ktR7mUTD","apiHost":"https://eu.i.posthog.com","sessionRecording":false}},"contextual":{"options":["copy","view","chatgpt","claude","perplexity","mcp","cursor","vscode"],"display":"header"},"styling":{"latex":false},"navigation":{"global":{"anchors":[]},"languages":[{"language":"de","default":true,"href":""},{"language":"en","href":"en"},{"language":"fr","href":"fr/lieferanten/start"},{"language":"es","href":"es/lieferanten/start"},{"language":"zh","href":"zh/lieferanten/start"}]}},"deployment":{"deploymentMetadataValue":{"subdomain":"polygonone","hasAudioNarration":false,"actualSubdomain":"polygonone","customDomains":["help.polygon-one.com"],"gitSource":{"type":"github","owner":"polygon-one","repo":"docs","deployBranch":"main","contentDirectory":"","isPrivate":true,"mountPath":"","label":""},"chroma":{"liveDeploymentHistoryId":"6ae347b2c5540a38c09062a7","collectionId":"e8876d2f-5d9d-4622-9ba5-e42c563f9dac","schemaVersion":"v3","latestBuiltDeploymentHistoryId":"6ae347b2c5540a38c09062a7"},"entitlements":{},"buildId":"6ae347b2c5540a38c09062a7","clientVersion":"0.0.4006","searchFilterCounts":[{"language":"de","tag":"API-Referenz","count":62},{"language":"en","tag":"API Reference","count":62},{"language":"de","tag":"EUDR","count":54},{"language":"en","tag":"EUDR","count":54},{"language":"de","tag":"Für Lieferanten","count":28},{"language":"en","tag":"For suppliers","count":28},{"language":"es","tag":"Para proveedores","count":28},{"language":"fr","tag":"Pour les fournisseurs","count":28},{"language":"zh","tag":"供应商帮助","count":28},{"language":"de","tag":"PPWR","count":25},{"language":"en","tag":"PPWR","count":25},{"language":"de","tag":"API-Dokumentation","count":10},{"language":"en","tag":"API Documentation","count":10},{"language":"de","tag":"PPWR – Verpackungsdaten","count":9},{"language":"de","tag":"Ihr Datenformat","count":9},{"language":"en","tag":"PPWR – Packaging Data","count":9},{"language":"en","tag":"Your data format","count":9},{"language":"es","tag":"Su formato de datos","count":9},{"language":"fr","tag":"Votre format de données","count":9},{"language":"zh","tag":"数据格式指南","count":9},{"language":"de","tag":"Datensammlung (Art. 9 EUDR)","count":8},{"language":"de","tag":"DDS \u0026 Bestellungen (Art. 3 EUDR)","count":8},{"language":"de","tag":"Optional","count":8},{"language":"en","tag":"Data Collection (Art. 9 EUDR)","count":8},{"language":"en","tag":"DDS \u0026 Orders (Art. 3 EUDR)","count":8},{"language":"en","tag":"Optional","count":8},{"language":"es","tag":"Solicitud EUDR","count":7},{"language":"fr","tag":"Demande EUDR","count":7},{"language":"zh","tag":"EUDR 请求","count":7},{"language":"es","tag":"Espacio del proveedor","count":4},{"language":"es","tag":"Solicitud PPWR","count":4},{"language":"fr","tag":"Espace fournisseur","count":4},{"language":"fr","tag":"Demande PPWR","count":4},{"language":"zh","tag":"供应商工作区","count":4},{"language":"zh","tag":"PPWR 请求","count":4},{"language":"es","tag":"Resolver un problema","count":3},{"language":"fr","tag":"Résoudre un problème","count":3},{"language":"zh","tag":"更正、审核和状态","count":3},{"language":"es","tag":"Empiece aquí","count":1},{"language":"fr","tag":"Commencer ici","count":1},{"language":"zh","tag":"从这里开始","count":1}]},"assistantConfig":{"enableAskAiButton":false,"enableStarterQuestions":false,"enableAskAiSearchBar":true},"basePath":"","hasChatPermissions":false,"hasWebMcpPermissions":false,"toggles":[{"name":"kill-isr","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-mintlify-slack","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-integrations-settings","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-pr-grouping","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-prefix","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"analytics-v7","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"user-flows-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"no-publish-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-onboarding","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"llms-txt-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"pause-universal-search-reconcile","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving-live","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"stripTemperatureMiddleware","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"per-site-search-delta","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"support-platform-pylon-zendesk","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"instant-rollback","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications-server","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-private-page-search","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-fable","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fixed-ai-action-pricing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automation-resolve-merge-conflict","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"scoped-publishing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"mintql","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"page-level-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-version-history-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-page-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workspace-projects","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"assistant-v5","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"byok-sep-25","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fork-pr-previews","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"revalidation-jwt","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"vite-origin","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-updated-9-15","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-sso-scim","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"hobby-abuse-scan","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"dashboard-inbox","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-signup","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-enabled","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"googleFontsInlined":false},"customCss":[{"filePath":"style.css","content":"html:has(#content[data-page-href$=\"/lieferanten/start\"]) #pagination,html:has(#content[data-page-href*=\"/lieferanten/\"]) #mobile-nav #navigation-items>div:has(>#localization-select-trigger)>div:has(>button[aria-haspopup=menu]),html:has(#content[data-page-href*=\"/lieferanten/\"]) #navbar div:has(>div>a[href$=\"/lieferanten/start\"]),html:has(#content[data-page-href*=\"/lieferanten/\"]) #navbar li:has(>a[href=\"https://app.polygon-one.com/\"]),html:has(#content[data-page-href*=\"/lieferanten/\"]) [role=dialog] li:has(>a[href=\"https://app.polygon-one.com/\"]){display:none!important}"}],"page":{"pagePath":"api-reference/endpoint/ppwr/units/upsert","slug":"/api-reference/endpoint/ppwr/units/upsert","pageMetadata":{"title":"Verpackungseinheiten anlegen \u0026 aktualisieren","openapi":"POST /api/v1/ppwr/units","description":"Bulk upsert of packaging units, keyed on `internalRef`. A row may carry its additional sizes (`sizes[]`) and the additive `articleNumbers` / `componentCodes` directives in the same call. **A row without `internalRef` is always a create** — the server assigns the next `PU-\u003cn>`, and read the generated references back with `GET /api/v1/ppwr/units` (or `GET /api/v1/ppwr/units?internalRef=…`) before importing links or article links. Same fill-only column policy and `overwrite` confirmation as the component intake. At most 1000 rows per request (`400` otherwise). A request may additionally carry at most 1000 `sizes` entries across all its rows. Requires `packaging:write`; customer workspace with the PPWR module enabled — see the guide.","href":"/api-reference/endpoint/ppwr/units/upsert"},"description":{"compiledSource":"\"use strict\";\nconst {jsx: _jsx, jsxs: _jsxs} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n code: \"code\",\n p: \"p\",\n strong: \"strong\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsxs(_components.p, {\n children: [\"Bulk upsert of packaging units, keyed on \", _jsx(_components.code, {\n children: \"internalRef\"\n }), \". A row may carry its additional sizes (\", _jsx(_components.code, {\n children: \"sizes[]\"\n }), \") and the additive \", _jsx(_components.code, {\n children: \"articleNumbers\"\n }), \" / \", _jsx(_components.code, {\n children: \"componentCodes\"\n }), \" directives in the same call. \", _jsxs(_components.strong, {\n children: [\"A row without \", _jsx(_components.code, {\n children: \"internalRef\"\n }), \" is always a create\"]\n }), \" — the server assigns the next \", _jsx(_components.code, {\n children: \"PU-\u003cn>\"\n }), \", and read the generated references back with \", _jsx(_components.code, {\n children: \"GET /api/v1/ppwr/units\"\n }), \" (or \", _jsx(_components.code, {\n children: \"GET /api/v1/ppwr/units?internalRef=…\"\n }), \") before importing links or article links. Same fill-only column policy and \", _jsx(_components.code, {\n children: \"overwrite\"\n }), \" confirmation as the component intake. At most 1000 rows per request (\", _jsx(_components.code, {\n children: \"400\"\n }), \" otherwise). A request may additionally carry at most 1000 \", _jsx(_components.code, {\n children: \"sizes\"\n }), \" entries across all its rows. Requires \", _jsx(_components.code, {\n children: \"packaging:write\"\n }), \"; customer workspace with the PPWR module enabled — see the guide.\"]\n });\n}\nfunction MDXContent(props = {}) {\n const {wrapper: MDXLayout} = {\n ..._provideComponents(),\n ...props.components\n };\n return MDXLayout ? _jsx(MDXLayout, {\n ...props,\n children: _jsx(_createMdxContent, {\n ...props\n })\n }) : _createMdxContent(props);\n}\nreturn {\n default: MDXContent\n};\n","frontmatter":{},"scope":{}},"pageType":"default","mdx":{"mdxSource":{"compiledSource":"\"use strict\";const{Fragment:_Fragment,jsx:_jsx}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){return _jsx(_Fragment,{})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent}","frontmatter":{},"scope":{"config":{},"pageMetadata":{"title":"Verpackungseinheiten anlegen \u0026 aktualisieren","openapi":"POST /api/v1/ppwr/units","description":"Bulk upsert of packaging units, keyed on `internalRef`. A row may carry its additional sizes (`sizes[]`) and the additive `articleNumbers` / `componentCodes` directives in the same call. **A row without `internalRef` is always a create** — the server assigns the next `PU-\u003cn>`, and read the generated references back with `GET /api/v1/ppwr/units` (or `GET /api/v1/ppwr/units?internalRef=…`) before importing links or article links. Same fill-only column policy and `overwrite` confirmation as the component intake. At most 1000 rows per request (`400` otherwise). A request may additionally carry at most 1000 `sizes` entries across all its rows. Requires `packaging:write`; customer workspace with the PPWR module enabled — see the guide.","href":"/api-reference/endpoint/ppwr/units/upsert"}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[],"codeExamples":{}},"jsLinks":[],"openApiReferenceData":{"operation":{"operationId":"upsertPpwrUnits","summary":"Upsert Packaging Units","description":"Bulk upsert of packaging units, keyed on `internalRef`. A row may carry its additional sizes (`sizes[]`) and the additive `articleNumbers` / `componentCodes` directives in the same call. **A row without `internalRef` is always a create** — the server assigns the next `PU-\u003cn>`, and read the generated references back with `GET /api/v1/ppwr/units` (or `GET /api/v1/ppwr/units?internalRef=…`) before importing links or article links. Same fill-only column policy and `overwrite` confirmation as the component intake. At most 1000 rows per request (`400` otherwise). A request may additionally carry at most 1000 `sizes` entries across all its rows. Requires `packaging:write`; customer workspace with the PPWR module enabled — see the guide.","tags":["PPWR Packaging Data"],"requestBody":"e6738b58-c1de-4146-81fe-9ed338673850","responses":{"200":"2349ea93-8b55-421a-a1c7-9ed33bd62a21","400":"c7d261fa-5c2d-467d-870c-f11dfe3220c0","401":"675570a0-d8c9-4d8d-93b3-0a3c7997436f","403":"d33b94f9-bb14-4957-ae9e-426325f89d27","409":"f5f7f63a-9acd-4c4b-824a-aa4b2904b46b","429":"e20798f9-06c4-4ba8-af77-9c9ec9503ee6","500":"c7c509cc-4ca7-4ca5-abff-93adb78bfa63"},"method":"post","type":"path","servers":["525ee7a2-0b29-4150-83c9-6311c95aea37"],"security":["bae4c7a0-d716-46dc-bfdc-909a8704f12f"],"path":"/api/v1/ppwr/units","baseUrlOptions":["https://app.polygon-one.com"],"title":"Upsert Packaging Units","codeSamples":[],"requiredOnlyExamples":false,"requestExampleType":"generated","responseExampleType":"generated"},"dependencies":{"parameters":{},"requestBody":{"required":true,"content":{"application/json":{"schema":{"oneOf":[{"type":"array","items":{"type":"object","properties":{"name":{"type":"string","minLength":1,"description":"Name of the packaging unit.","isRequired":true,"uniqueKey":"oneOf.0.items.[INDEX].name","typeLabel":"string"},"packagingType":{"type":"string","enum":["sales","grouped","transport","ecommerce","service"],"description":"Packaging category: `sales`, `grouped`, `transport`, `ecommerce` or `service`.","isRequired":true,"uniqueKey":"oneOf.0.items.[INDEX].packagingType","typeLabel":"enum\u003cstring>"},"role":{"type":"string","enum":["manufacturer","importer","distributor","authorised_representative","supplier","fulfilment_service_provider"],"description":"Your economic-operator role for this unit: `manufacturer`, `importer`, `distributor`, `authorised_representative`, `supplier` or `fulfilment_service_provider`.","isRequired":true,"uniqueKey":"oneOf.0.items.[INDEX].role","typeLabel":"enum\u003cstring>"},"notes":{"type":"string","minLength":1,"description":"**Required** — description and intended use of the packaging. A row without it fails as `descriptionRequired`, including fill-only updates.","isRequired":true,"uniqueKey":"oneOf.0.items.[INDEX].notes","typeLabel":"string"},"internalRef":{"oneOf":[{"type":"string","maxLength":120,"description":"Your reference for the unit — the upsert key, unique within your company. Omit it only for rows you never intend to replay (see the schema description).","uniqueKey":"oneOf.0.items.[INDEX].internalRef.oneOf.0","typeLabel":"string"},{"type":"null","maxLength":120,"description":"Your reference for the unit — the upsert key, unique within your company. Omit it only for rows you never intend to replay (see the schema description).","uniqueKey":"oneOf.0.items.[INDEX].internalRef.oneOf.1","typeLabel":"null"}],"uniqueKey":"oneOf.0.items.[INDEX].internalRef","typeLabel":"string | null"},"supplierName":{"oneOf":[{"type":"string","description":"Resolved to one of your suppliers by fuzzy name match (case, umlauts, punctuation and legal-form tokens are ignored). A name that matches **two or more** distinct suppliers fails the row with `ambiguousSupplierName` — the import never guesses. A name that matches **none** creates a name-only supplier (no email, data incomplete) once per distinct name in the request and links the record to it; the created names are returned in `suppliersCreated`. A blank cell resolves to *no supplier* (your own bucket).","uniqueKey":"oneOf.0.items.[INDEX].supplierName.oneOf.0","typeLabel":"string"},{"type":"null","description":"Resolved to one of your suppliers by fuzzy name match (case, umlauts, punctuation and legal-form tokens are ignored). A name that matches **two or more** distinct suppliers fails the row with `ambiguousSupplierName` — the import never guesses. A name that matches **none** creates a name-only supplier (no email, data incomplete) once per distinct name in the request and links the record to it; the created names are returned in `suppliersCreated`. A blank cell resolves to *no supplier* (your own bucket).","uniqueKey":"oneOf.0.items.[INDEX].supplierName.oneOf.1","typeLabel":"null"}],"uniqueKey":"oneOf.0.items.[INDEX].supplierName","typeLabel":"string | null"},"format":{"oneOf":[{"type":"string","description":"Packaging form (free text).","uniqueKey":"oneOf.0.items.[INDEX].format.oneOf.0","typeLabel":"string"},{"type":"null","description":"Packaging form (free text).","uniqueKey":"oneOf.0.items.[INDEX].format.oneOf.1","typeLabel":"null"}],"uniqueKey":"oneOf.0.items.[INDEX].format","typeLabel":"string | null"},"recyclabilityGrade":{"oneOf":[{"type":"string","enum":["A","B","C","non_recyclable",null],"description":"A supplied grade is stored as supplier-declared.","uniqueKey":"oneOf.0.items.[INDEX].recyclabilityGrade.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","enum":["A","B","C","non_recyclable",null],"description":"A supplied grade is stored as supplier-declared.","uniqueKey":"oneOf.0.items.[INDEX].recyclabilityGrade.oneOf.1","typeLabel":"null"}],"uniqueKey":"oneOf.0.items.[INDEX].recyclabilityGrade","typeLabel":"enum\u003cstring> | null"},"recyclabilityReference":{"oneOf":[{"type":"string","maxLength":2000,"description":"What the recyclability grade rests on — the supplier sheet or test report it was taken from (free text, at most 2000 characters).","uniqueKey":"oneOf.0.items.[INDEX].recyclabilityReference.oneOf.0","typeLabel":"string"},{"type":"null","maxLength":2000,"description":"What the recyclability grade rests on — the supplier sheet or test report it was taken from (free text, at most 2000 characters).","uniqueKey":"oneOf.0.items.[INDEX].recyclabilityReference.oneOf.1","typeLabel":"null"}],"uniqueKey":"oneOf.0.items.[INDEX].recyclabilityReference","typeLabel":"string | null"},"gtin":{"oneOf":[{"type":"string","pattern":"^(\\d{8}|\\d{12}|\\d{13}|\\d{14})$","description":"GTIN of the unit's PRIMARY size.","uniqueKey":"oneOf.0.items.[INDEX].gtin.oneOf.0","typeLabel":"string"},{"type":"null","pattern":"^(\\d{8}|\\d{12}|\\d{13}|\\d{14})$","description":"GTIN of the unit's PRIMARY size.","uniqueKey":"oneOf.0.items.[INDEX].gtin.oneOf.1","typeLabel":"null"}],"uniqueKey":"oneOf.0.items.[INDEX].gtin","typeLabel":"string | null"},"supplierReference":{"oneOf":[{"type":"string","maxLength":120,"description":"The supplier's own reference for the unit's primary size (on a size row: for that size), at most 120 characters.","uniqueKey":"oneOf.0.items.[INDEX].supplierReference.oneOf.0","typeLabel":"string"},{"type":"null","maxLength":120,"description":"The supplier's own reference for the unit's primary size (on a size row: for that size), at most 120 characters.","uniqueKey":"oneOf.0.items.[INDEX].supplierReference.oneOf.1","typeLabel":"null"}],"uniqueKey":"oneOf.0.items.[INDEX].supplierReference","typeLabel":"string | null"},"widthMm":{"oneOf":[{"type":"string","description":"Width of the primary size, in mm.","uniqueKey":"oneOf.0.items.[INDEX].widthMm.oneOf.0","typeLabel":"string"},{"type":"null","description":"Width of the primary size, in mm.","uniqueKey":"oneOf.0.items.[INDEX].widthMm.oneOf.1","typeLabel":"null"}],"uniqueKey":"oneOf.0.items.[INDEX].widthMm","typeLabel":"string | null"},"heightMm":{"oneOf":[{"type":"string","description":"Height of the primary size, in mm.","uniqueKey":"oneOf.0.items.[INDEX].heightMm.oneOf.0","typeLabel":"string"},{"type":"null","description":"Height of the primary size, in mm.","uniqueKey":"oneOf.0.items.[INDEX].heightMm.oneOf.1","typeLabel":"null"}],"uniqueKey":"oneOf.0.items.[INDEX].heightMm","typeLabel":"string | null"},"depthMm":{"oneOf":[{"type":"string","description":"Depth of the primary size, in mm.","uniqueKey":"oneOf.0.items.[INDEX].depthMm.oneOf.0","typeLabel":"string"},{"type":"null","description":"Depth of the primary size, in mm.","uniqueKey":"oneOf.0.items.[INDEX].depthMm.oneOf.1","typeLabel":"null"}],"uniqueKey":"oneOf.0.items.[INDEX].depthMm","typeLabel":"string | null"},"sizeReference":{"oneOf":[{"type":"string","maxLength":120,"description":"The flat spelling of a size: several rows sharing one `internalRef`, each with its own `sizeReference`, fold into ONE unit with N sizes. Blank (or equal to `internalRef`) marks the UNIT row. Prefer `sizes[]`.","uniqueKey":"oneOf.0.items.[INDEX].sizeReference.oneOf.0","typeLabel":"string"},{"type":"null","maxLength":120,"description":"The flat spelling of a size: several rows sharing one `internalRef`, each with its own `sizeReference`, fold into ONE unit with N sizes. Blank (or equal to `internalRef`) marks the UNIT row. Prefer `sizes[]`.","uniqueKey":"oneOf.0.items.[INDEX].sizeReference.oneOf.1","typeLabel":"null"}],"uniqueKey":"oneOf.0.items.[INDEX].sizeReference","typeLabel":"string | null"},"sizeLabel":{"oneOf":[{"type":"string","maxLength":120,"description":"Human name of the size. Only a SIZE row may carry it — on a unit row it fails as `conflictingSizeRow`.","uniqueKey":"oneOf.0.items.[INDEX].sizeLabel.oneOf.0","typeLabel":"string"},{"type":"null","maxLength":120,"description":"Human name of the size. Only a SIZE row may carry it — on a unit row it fails as `conflictingSizeRow`.","uniqueKey":"oneOf.0.items.[INDEX].sizeLabel.oneOf.1","typeLabel":"null"}],"uniqueKey":"oneOf.0.items.[INDEX].sizeLabel","typeLabel":"string | null"},"marketMemberStates":{"oneOf":[{"type":"array","items":{"type":"string","pattern":"^[A-Z]{2}$","uniqueKey":"oneOf.0.items.[INDEX].marketMemberStates.oneOf.0.items.[INDEX]","typeLabel":"string"},"description":"ISO alpha-2 codes (case-insensitive, stored upper-case). A blank column imports as an empty list and is NOT back-filled from your PPWR default.","uniqueKey":"oneOf.0.items.[INDEX].marketMemberStates.oneOf.0","typeLabel":"string[]"},{"type":"null","items":{"type":"string","pattern":"^[A-Z]{2}$"},"description":"ISO alpha-2 codes (case-insensitive, stored upper-case). A blank column imports as an empty list and is NOT back-filled from your PPWR default.","uniqueKey":"oneOf.0.items.[INDEX].marketMemberStates.oneOf.1","typeLabel":"null"}],"uniqueKey":"oneOf.0.items.[INDEX].marketMemberStates","typeLabel":"string[] | null"},"placedUnderOwnBrand":{"oneOf":[{"type":"boolean","description":"Blank = `false` on a create; on an update a blank/absent value leaves the stored value unchanged and an explicit `false` switches a stored `true` off (an overwrite).","uniqueKey":"oneOf.0.items.[INDEX].placedUnderOwnBrand.oneOf.0","typeLabel":"boolean"},{"type":"null","description":"Blank = `false` on a create; on an update a blank/absent value leaves the stored value unchanged and an explicit `false` switches a stored `true` off (an overwrite).","uniqueKey":"oneOf.0.items.[INDEX].placedUnderOwnBrand.oneOf.1","typeLabel":"null"}],"uniqueKey":"oneOf.0.items.[INDEX].placedUnderOwnBrand","typeLabel":"boolean | null"},"modifiesConformity":{"oneOf":[{"type":"boolean","description":"Blank = `false` on a create; on an update a blank/absent value leaves the stored value unchanged and an explicit `false` switches a stored `true` off (an overwrite).","uniqueKey":"oneOf.0.items.[INDEX].modifiesConformity.oneOf.0","typeLabel":"boolean"},{"type":"null","description":"Blank = `false` on a create; on an update a blank/absent value leaves the stored value unchanged and an explicit `false` switches a stored `true` off (an overwrite).","uniqueKey":"oneOf.0.items.[INDEX].modifiesConformity.oneOf.1","typeLabel":"null"}],"uniqueKey":"oneOf.0.items.[INDEX].modifiesConformity","typeLabel":"boolean | null"},"reusable":{"oneOf":[{"type":"boolean","description":"Art. 11 reusable packaging. Blank = `false` on a create; on an update a blank/absent value leaves the stored value unchanged and an explicit `false` switches a stored `true` off (an overwrite).","uniqueKey":"oneOf.0.items.[INDEX].reusable.oneOf.0","typeLabel":"boolean"},{"type":"null","description":"Art. 11 reusable packaging. Blank = `false` on a create; on an update a blank/absent value leaves the stored value unchanged and an explicit `false` switches a stored `true` off (an overwrite).","uniqueKey":"oneOf.0.items.[INDEX].reusable.oneOf.1","typeLabel":"null"}],"uniqueKey":"oneOf.0.items.[INDEX].reusable","typeLabel":"boolean | null"},"articleNumbers":{"oneOf":[{"type":"array","items":{"type":"string","uniqueKey":"oneOf.0.items.[INDEX].articleNumbers.oneOf.0.items.[INDEX]","typeLabel":"string"},"description":"Links the unit to existing articles by internal article number. On a SIZE row the link is to that size. **An unmatched number is skipped silently** (counted in `articleNumbersUnmatched`), never created and never a row error — unlike `POST /api/v1/ppwr/article-links`, which errors.","uniqueKey":"oneOf.0.items.[INDEX].articleNumbers.oneOf.0","typeLabel":"string[]"},{"type":"null","items":{"type":"string"},"description":"Links the unit to existing articles by internal article number. On a SIZE row the link is to that size. **An unmatched number is skipped silently** (counted in `articleNumbersUnmatched`), never created and never a row error — unlike `POST /api/v1/ppwr/article-links`, which errors.","uniqueKey":"oneOf.0.items.[INDEX].articleNumbers.oneOf.1","typeLabel":"null"}],"uniqueKey":"oneOf.0.items.[INDEX].articleNumbers","typeLabel":"string[] | null"},"componentCodes":{"oneOf":[{"type":"array","items":{"type":"string","uniqueKey":"oneOf.0.items.[INDEX].componentCodes.oneOf.0.items.[INDEX]","typeLabel":"string"},"description":"Builds the bill of materials with quantity 1. An unknown code auto-creates a minimal placeholder component (`other`, name = code, counted in `componentStubsCreated`). A code naming **two or more** live components fails the whole row with `ambiguousComponentMatch` — the cell has no supplier column to disambiguate with, and the oldest match is never picked. `POST /api/v1/ppwr/links` reports the same key, so it is not an escape hatch: make the code unique instead.","uniqueKey":"oneOf.0.items.[INDEX].componentCodes.oneOf.0","typeLabel":"string[]"},{"type":"null","items":{"type":"string"},"description":"Builds the bill of materials with quantity 1. An unknown code auto-creates a minimal placeholder component (`other`, name = code, counted in `componentStubsCreated`). A code naming **two or more** live components fails the whole row with `ambiguousComponentMatch` — the cell has no supplier column to disambiguate with, and the oldest match is never picked. `POST /api/v1/ppwr/links` reports the same key, so it is not an escape hatch: make the code unique instead.","uniqueKey":"oneOf.0.items.[INDEX].componentCodes.oneOf.1","typeLabel":"null"}],"uniqueKey":"oneOf.0.items.[INDEX].componentCodes","typeLabel":"string[] | null"},"sizes":{"type":"array","items":{"type":"object","properties":{"reference":{"type":"string","minLength":1,"maxLength":120,"description":"The size's identifier, unique within your company.","isRequired":true,"uniqueKey":"oneOf.0.items.[INDEX].sizes.items.[INDEX].reference","typeLabel":"string"},"gtin":{"oneOf":[{"type":"string","pattern":"^(\\d{8}|\\d{12}|\\d{13}|\\d{14})$","description":"GTIN of the size: 8, 12, 13 or 14 digits.","uniqueKey":"oneOf.0.items.[INDEX].sizes.items.[INDEX].gtin.oneOf.0","typeLabel":"string"},{"type":"null","pattern":"^(\\d{8}|\\d{12}|\\d{13}|\\d{14})$","description":"GTIN of the size: 8, 12, 13 or 14 digits.","uniqueKey":"oneOf.0.items.[INDEX].sizes.items.[INDEX].gtin.oneOf.1","typeLabel":"null"}],"uniqueKey":"oneOf.0.items.[INDEX].sizes.items.[INDEX].gtin","typeLabel":"string | null"},"supplierReference":{"oneOf":[{"type":"string","maxLength":120,"description":"The supplier's own reference for the size (at most 120 characters).","uniqueKey":"oneOf.0.items.[INDEX].sizes.items.[INDEX].supplierReference.oneOf.0","typeLabel":"string"},{"type":"null","maxLength":120,"description":"The supplier's own reference for the size (at most 120 characters).","uniqueKey":"oneOf.0.items.[INDEX].sizes.items.[INDEX].supplierReference.oneOf.1","typeLabel":"null"}],"uniqueKey":"oneOf.0.items.[INDEX].sizes.items.[INDEX].supplierReference","typeLabel":"string | null"},"label":{"oneOf":[{"type":"string","maxLength":120,"description":"Human-readable name of the size (at most 120 characters).","uniqueKey":"oneOf.0.items.[INDEX].sizes.items.[INDEX].label.oneOf.0","typeLabel":"string"},{"type":"null","maxLength":120,"description":"Human-readable name of the size (at most 120 characters).","uniqueKey":"oneOf.0.items.[INDEX].sizes.items.[INDEX].label.oneOf.1","typeLabel":"null"}],"uniqueKey":"oneOf.0.items.[INDEX].sizes.items.[INDEX].label","typeLabel":"string | null"},"widthMm":{"oneOf":[{"type":"number","minimum":0,"description":"Width in mm.","uniqueKey":"oneOf.0.items.[INDEX].sizes.items.[INDEX].widthMm.oneOf.0","typeLabel":"number"},{"type":"null","minimum":0,"description":"Width in mm.","uniqueKey":"oneOf.0.items.[INDEX].sizes.items.[INDEX].widthMm.oneOf.1","typeLabel":"null"}],"uniqueKey":"oneOf.0.items.[INDEX].sizes.items.[INDEX].widthMm","typeLabel":"number | null"},"heightMm":{"oneOf":[{"type":"number","minimum":0,"description":"Height in mm.","uniqueKey":"oneOf.0.items.[INDEX].sizes.items.[INDEX].heightMm.oneOf.0","typeLabel":"number"},{"type":"null","minimum":0,"description":"Height in mm.","uniqueKey":"oneOf.0.items.[INDEX].sizes.items.[INDEX].heightMm.oneOf.1","typeLabel":"null"}],"uniqueKey":"oneOf.0.items.[INDEX].sizes.items.[INDEX].heightMm","typeLabel":"number | null"},"depthMm":{"oneOf":[{"type":"number","minimum":0,"description":"Depth in mm.","uniqueKey":"oneOf.0.items.[INDEX].sizes.items.[INDEX].depthMm.oneOf.0","typeLabel":"number"},{"type":"null","minimum":0,"description":"Depth in mm.","uniqueKey":"oneOf.0.items.[INDEX].sizes.items.[INDEX].depthMm.oneOf.1","typeLabel":"null"}],"uniqueKey":"oneOf.0.items.[INDEX].sizes.items.[INDEX].depthMm","typeLabel":"number | null"}},"required":["reference"],"uniqueKey":"oneOf.0.items.[INDEX].sizes.items.[INDEX]","typeLabel":"object"},"maxItems":49,"description":"The unit's ADDITIONAL sizes — the primary way to send sizes. On a CREATE the row is one transaction: a refused size (`duplicateFormatReference`, `formatCapReached`) rolls the unit back too. On a row matching an EXISTING unit each size is upserted on its own; sizes the payload omits are never deleted.","uniqueKey":"oneOf.0.items.[INDEX].sizes","typeLabel":"object[]"},"material":{"oneOf":[{"type":"string","enum":["plastic","paper_board","glass","metal","wood","composite","other",null],"description":"Single-part packaging (big bag, pallet, paper sack): the unit's own material family. A row with a `material` gives its unit ONE component (code = `internalRef`, name = `name`, this material) when the unit has no component yet — on a create or on an existing unit; a replay never adds a second. Cannot be combined with `componentCodes` (row is `invalid` with `materialWithComponentCodes`).","uniqueKey":"oneOf.0.items.[INDEX].material.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","enum":["plastic","paper_board","glass","metal","wood","composite","other",null],"description":"Single-part packaging (big bag, pallet, paper sack): the unit's own material family. A row with a `material` gives its unit ONE component (code = `internalRef`, name = `name`, this material) when the unit has no component yet — on a create or on an existing unit; a replay never adds a second. Cannot be combined with `componentCodes` (row is `invalid` with `materialWithComponentCodes`).","uniqueKey":"oneOf.0.items.[INDEX].material.oneOf.1","typeLabel":"null"}],"uniqueKey":"oneOf.0.items.[INDEX].material","typeLabel":"enum\u003cstring> | null"},"massGrams":{"oneOf":[{"type":"string","description":"Single-part packaging: the unit's own mass in grams, written onto the component `material` creates. Requires `material` (else the row is `invalid` with `materialsRequired`).","uniqueKey":"oneOf.0.items.[INDEX].massGrams.oneOf.0","typeLabel":"string"},{"type":"null","description":"Single-part packaging: the unit's own mass in grams, written onto the component `material` creates. Requires `material` (else the row is `invalid` with `materialsRequired`).","uniqueKey":"oneOf.0.items.[INDEX].massGrams.oneOf.1","typeLabel":"null"}],"uniqueKey":"oneOf.0.items.[INDEX].massGrams","typeLabel":"string | null"}},"required":["name","packagingType","role","notes"],"description":"One packaging-unit row for `POST /api/v1/ppwr/units`. Upsert key: `internalRef`. **A row without `internalRef` can match nothing and is therefore ALWAYS a create** — the server names the unit with the next generated `PU-\u003cn>`; replaying such a row creates another unit. Cells are coerced exactly as the in-app CSV/Excel importer coerces them, so a JSON-native value and its string spelling are equivalent (`12` = `\"12\"`, `[\"plastic\"]` = `\"plastic;paper_board\"`, `true` = `\"yes\"`/`\"ja\"`/`\"1\"`). An empty or omitted field is a no-op — it never clears a stored value.","uniqueKey":"oneOf.0.items.[INDEX]","typeLabel":"object"},"description":"Bare array form.","maxItems":1000,"uniqueKey":"oneOf.0","typeLabel":"object[]"},{"type":"object","description":"Envelope form for the unit intake. At most 1000 `sizes` entries across all rows.","required":["rows"],"properties":{"rows":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string","minLength":1,"description":"Name of the packaging unit.","isRequired":true,"uniqueKey":"oneOf.1.rows.items.[INDEX].name","typeLabel":"string"},"packagingType":{"type":"string","enum":["sales","grouped","transport","ecommerce","service"],"description":"Packaging category: `sales`, `grouped`, `transport`, `ecommerce` or `service`.","isRequired":true,"uniqueKey":"oneOf.1.rows.items.[INDEX].packagingType","typeLabel":"enum\u003cstring>"},"role":{"type":"string","enum":["manufacturer","importer","distributor","authorised_representative","supplier","fulfilment_service_provider"],"description":"Your economic-operator role for this unit: `manufacturer`, `importer`, `distributor`, `authorised_representative`, `supplier` or `fulfilment_service_provider`.","isRequired":true,"uniqueKey":"oneOf.1.rows.items.[INDEX].role","typeLabel":"enum\u003cstring>"},"notes":{"type":"string","minLength":1,"description":"**Required** — description and intended use of the packaging. A row without it fails as `descriptionRequired`, including fill-only updates.","isRequired":true,"uniqueKey":"oneOf.1.rows.items.[INDEX].notes","typeLabel":"string"},"internalRef":{"oneOf":[{"type":"string","maxLength":120,"description":"Your reference for the unit — the upsert key, unique within your company. Omit it only for rows you never intend to replay (see the schema description).","uniqueKey":"oneOf.1.rows.items.[INDEX].internalRef.oneOf.0","typeLabel":"string"},{"type":"null","maxLength":120,"description":"Your reference for the unit — the upsert key, unique within your company. Omit it only for rows you never intend to replay (see the schema description).","uniqueKey":"oneOf.1.rows.items.[INDEX].internalRef.oneOf.1","typeLabel":"null"}],"uniqueKey":"oneOf.1.rows.items.[INDEX].internalRef","typeLabel":"string | null"},"supplierName":{"oneOf":[{"type":"string","description":"Resolved to one of your suppliers by fuzzy name match (case, umlauts, punctuation and legal-form tokens are ignored). A name that matches **two or more** distinct suppliers fails the row with `ambiguousSupplierName` — the import never guesses. A name that matches **none** creates a name-only supplier (no email, data incomplete) once per distinct name in the request and links the record to it; the created names are returned in `suppliersCreated`. A blank cell resolves to *no supplier* (your own bucket).","uniqueKey":"oneOf.1.rows.items.[INDEX].supplierName.oneOf.0","typeLabel":"string"},{"type":"null","description":"Resolved to one of your suppliers by fuzzy name match (case, umlauts, punctuation and legal-form tokens are ignored). A name that matches **two or more** distinct suppliers fails the row with `ambiguousSupplierName` — the import never guesses. A name that matches **none** creates a name-only supplier (no email, data incomplete) once per distinct name in the request and links the record to it; the created names are returned in `suppliersCreated`. A blank cell resolves to *no supplier* (your own bucket).","uniqueKey":"oneOf.1.rows.items.[INDEX].supplierName.oneOf.1","typeLabel":"null"}],"uniqueKey":"oneOf.1.rows.items.[INDEX].supplierName","typeLabel":"string | null"},"format":{"oneOf":[{"type":"string","description":"Packaging form (free text).","uniqueKey":"oneOf.1.rows.items.[INDEX].format.oneOf.0","typeLabel":"string"},{"type":"null","description":"Packaging form (free text).","uniqueKey":"oneOf.1.rows.items.[INDEX].format.oneOf.1","typeLabel":"null"}],"uniqueKey":"oneOf.1.rows.items.[INDEX].format","typeLabel":"string | null"},"recyclabilityGrade":{"oneOf":[{"type":"string","enum":["A","B","C","non_recyclable",null],"description":"A supplied grade is stored as supplier-declared.","uniqueKey":"oneOf.1.rows.items.[INDEX].recyclabilityGrade.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","enum":["A","B","C","non_recyclable",null],"description":"A supplied grade is stored as supplier-declared.","uniqueKey":"oneOf.1.rows.items.[INDEX].recyclabilityGrade.oneOf.1","typeLabel":"null"}],"uniqueKey":"oneOf.1.rows.items.[INDEX].recyclabilityGrade","typeLabel":"enum\u003cstring> | null"},"recyclabilityReference":{"oneOf":[{"type":"string","maxLength":2000,"description":"What the recyclability grade rests on — the supplier sheet or test report it was taken from (free text, at most 2000 characters).","uniqueKey":"oneOf.1.rows.items.[INDEX].recyclabilityReference.oneOf.0","typeLabel":"string"},{"type":"null","maxLength":2000,"description":"What the recyclability grade rests on — the supplier sheet or test report it was taken from (free text, at most 2000 characters).","uniqueKey":"oneOf.1.rows.items.[INDEX].recyclabilityReference.oneOf.1","typeLabel":"null"}],"uniqueKey":"oneOf.1.rows.items.[INDEX].recyclabilityReference","typeLabel":"string | null"},"gtin":{"oneOf":[{"type":"string","pattern":"^(\\d{8}|\\d{12}|\\d{13}|\\d{14})$","description":"GTIN of the unit's PRIMARY size.","uniqueKey":"oneOf.1.rows.items.[INDEX].gtin.oneOf.0","typeLabel":"string"},{"type":"null","pattern":"^(\\d{8}|\\d{12}|\\d{13}|\\d{14})$","description":"GTIN of the unit's PRIMARY size.","uniqueKey":"oneOf.1.rows.items.[INDEX].gtin.oneOf.1","typeLabel":"null"}],"uniqueKey":"oneOf.1.rows.items.[INDEX].gtin","typeLabel":"string | null"},"supplierReference":{"oneOf":[{"type":"string","maxLength":120,"description":"The supplier's own reference for the unit's primary size (on a size row: for that size), at most 120 characters.","uniqueKey":"oneOf.1.rows.items.[INDEX].supplierReference.oneOf.0","typeLabel":"string"},{"type":"null","maxLength":120,"description":"The supplier's own reference for the unit's primary size (on a size row: for that size), at most 120 characters.","uniqueKey":"oneOf.1.rows.items.[INDEX].supplierReference.oneOf.1","typeLabel":"null"}],"uniqueKey":"oneOf.1.rows.items.[INDEX].supplierReference","typeLabel":"string | null"},"widthMm":{"oneOf":[{"type":"string","description":"Width of the primary size, in mm.","uniqueKey":"oneOf.1.rows.items.[INDEX].widthMm.oneOf.0","typeLabel":"string"},{"type":"null","description":"Width of the primary size, in mm.","uniqueKey":"oneOf.1.rows.items.[INDEX].widthMm.oneOf.1","typeLabel":"null"}],"uniqueKey":"oneOf.1.rows.items.[INDEX].widthMm","typeLabel":"string | null"},"heightMm":{"oneOf":[{"type":"string","description":"Height of the primary size, in mm.","uniqueKey":"oneOf.1.rows.items.[INDEX].heightMm.oneOf.0","typeLabel":"string"},{"type":"null","description":"Height of the primary size, in mm.","uniqueKey":"oneOf.1.rows.items.[INDEX].heightMm.oneOf.1","typeLabel":"null"}],"uniqueKey":"oneOf.1.rows.items.[INDEX].heightMm","typeLabel":"string | null"},"depthMm":{"oneOf":[{"type":"string","description":"Depth of the primary size, in mm.","uniqueKey":"oneOf.1.rows.items.[INDEX].depthMm.oneOf.0","typeLabel":"string"},{"type":"null","description":"Depth of the primary size, in mm.","uniqueKey":"oneOf.1.rows.items.[INDEX].depthMm.oneOf.1","typeLabel":"null"}],"uniqueKey":"oneOf.1.rows.items.[INDEX].depthMm","typeLabel":"string | null"},"sizeReference":{"oneOf":[{"type":"string","maxLength":120,"description":"The flat spelling of a size: several rows sharing one `internalRef`, each with its own `sizeReference`, fold into ONE unit with N sizes. Blank (or equal to `internalRef`) marks the UNIT row. Prefer `sizes[]`.","uniqueKey":"oneOf.1.rows.items.[INDEX].sizeReference.oneOf.0","typeLabel":"string"},{"type":"null","maxLength":120,"description":"The flat spelling of a size: several rows sharing one `internalRef`, each with its own `sizeReference`, fold into ONE unit with N sizes. Blank (or equal to `internalRef`) marks the UNIT row. Prefer `sizes[]`.","uniqueKey":"oneOf.1.rows.items.[INDEX].sizeReference.oneOf.1","typeLabel":"null"}],"uniqueKey":"oneOf.1.rows.items.[INDEX].sizeReference","typeLabel":"string | null"},"sizeLabel":{"oneOf":[{"type":"string","maxLength":120,"description":"Human name of the size. Only a SIZE row may carry it — on a unit row it fails as `conflictingSizeRow`.","uniqueKey":"oneOf.1.rows.items.[INDEX].sizeLabel.oneOf.0","typeLabel":"string"},{"type":"null","maxLength":120,"description":"Human name of the size. Only a SIZE row may carry it — on a unit row it fails as `conflictingSizeRow`.","uniqueKey":"oneOf.1.rows.items.[INDEX].sizeLabel.oneOf.1","typeLabel":"null"}],"uniqueKey":"oneOf.1.rows.items.[INDEX].sizeLabel","typeLabel":"string | null"},"marketMemberStates":{"oneOf":[{"type":"array","items":{"type":"string","pattern":"^[A-Z]{2}$","uniqueKey":"oneOf.1.rows.items.[INDEX].marketMemberStates.oneOf.0.items.[INDEX]","typeLabel":"string"},"description":"ISO alpha-2 codes (case-insensitive, stored upper-case). A blank column imports as an empty list and is NOT back-filled from your PPWR default.","uniqueKey":"oneOf.1.rows.items.[INDEX].marketMemberStates.oneOf.0","typeLabel":"string[]"},{"type":"null","items":{"type":"string","pattern":"^[A-Z]{2}$"},"description":"ISO alpha-2 codes (case-insensitive, stored upper-case). A blank column imports as an empty list and is NOT back-filled from your PPWR default.","uniqueKey":"oneOf.1.rows.items.[INDEX].marketMemberStates.oneOf.1","typeLabel":"null"}],"uniqueKey":"oneOf.1.rows.items.[INDEX].marketMemberStates","typeLabel":"string[] | null"},"placedUnderOwnBrand":{"oneOf":[{"type":"boolean","description":"Blank = `false` on a create; on an update a blank/absent value leaves the stored value unchanged and an explicit `false` switches a stored `true` off (an overwrite).","uniqueKey":"oneOf.1.rows.items.[INDEX].placedUnderOwnBrand.oneOf.0","typeLabel":"boolean"},{"type":"null","description":"Blank = `false` on a create; on an update a blank/absent value leaves the stored value unchanged and an explicit `false` switches a stored `true` off (an overwrite).","uniqueKey":"oneOf.1.rows.items.[INDEX].placedUnderOwnBrand.oneOf.1","typeLabel":"null"}],"uniqueKey":"oneOf.1.rows.items.[INDEX].placedUnderOwnBrand","typeLabel":"boolean | null"},"modifiesConformity":{"oneOf":[{"type":"boolean","description":"Blank = `false` on a create; on an update a blank/absent value leaves the stored value unchanged and an explicit `false` switches a stored `true` off (an overwrite).","uniqueKey":"oneOf.1.rows.items.[INDEX].modifiesConformity.oneOf.0","typeLabel":"boolean"},{"type":"null","description":"Blank = `false` on a create; on an update a blank/absent value leaves the stored value unchanged and an explicit `false` switches a stored `true` off (an overwrite).","uniqueKey":"oneOf.1.rows.items.[INDEX].modifiesConformity.oneOf.1","typeLabel":"null"}],"uniqueKey":"oneOf.1.rows.items.[INDEX].modifiesConformity","typeLabel":"boolean | null"},"reusable":{"oneOf":[{"type":"boolean","description":"Art. 11 reusable packaging. Blank = `false` on a create; on an update a blank/absent value leaves the stored value unchanged and an explicit `false` switches a stored `true` off (an overwrite).","uniqueKey":"oneOf.1.rows.items.[INDEX].reusable.oneOf.0","typeLabel":"boolean"},{"type":"null","description":"Art. 11 reusable packaging. Blank = `false` on a create; on an update a blank/absent value leaves the stored value unchanged and an explicit `false` switches a stored `true` off (an overwrite).","uniqueKey":"oneOf.1.rows.items.[INDEX].reusable.oneOf.1","typeLabel":"null"}],"uniqueKey":"oneOf.1.rows.items.[INDEX].reusable","typeLabel":"boolean | null"},"articleNumbers":{"oneOf":[{"type":"array","items":{"type":"string","uniqueKey":"oneOf.1.rows.items.[INDEX].articleNumbers.oneOf.0.items.[INDEX]","typeLabel":"string"},"description":"Links the unit to existing articles by internal article number. On a SIZE row the link is to that size. **An unmatched number is skipped silently** (counted in `articleNumbersUnmatched`), never created and never a row error — unlike `POST /api/v1/ppwr/article-links`, which errors.","uniqueKey":"oneOf.1.rows.items.[INDEX].articleNumbers.oneOf.0","typeLabel":"string[]"},{"type":"null","items":{"type":"string"},"description":"Links the unit to existing articles by internal article number. On a SIZE row the link is to that size. **An unmatched number is skipped silently** (counted in `articleNumbersUnmatched`), never created and never a row error — unlike `POST /api/v1/ppwr/article-links`, which errors.","uniqueKey":"oneOf.1.rows.items.[INDEX].articleNumbers.oneOf.1","typeLabel":"null"}],"uniqueKey":"oneOf.1.rows.items.[INDEX].articleNumbers","typeLabel":"string[] | null"},"componentCodes":{"oneOf":[{"type":"array","items":{"type":"string","uniqueKey":"oneOf.1.rows.items.[INDEX].componentCodes.oneOf.0.items.[INDEX]","typeLabel":"string"},"description":"Builds the bill of materials with quantity 1. An unknown code auto-creates a minimal placeholder component (`other`, name = code, counted in `componentStubsCreated`). A code naming **two or more** live components fails the whole row with `ambiguousComponentMatch` — the cell has no supplier column to disambiguate with, and the oldest match is never picked. `POST /api/v1/ppwr/links` reports the same key, so it is not an escape hatch: make the code unique instead.","uniqueKey":"oneOf.1.rows.items.[INDEX].componentCodes.oneOf.0","typeLabel":"string[]"},{"type":"null","items":{"type":"string"},"description":"Builds the bill of materials with quantity 1. An unknown code auto-creates a minimal placeholder component (`other`, name = code, counted in `componentStubsCreated`). A code naming **two or more** live components fails the whole row with `ambiguousComponentMatch` — the cell has no supplier column to disambiguate with, and the oldest match is never picked. `POST /api/v1/ppwr/links` reports the same key, so it is not an escape hatch: make the code unique instead.","uniqueKey":"oneOf.1.rows.items.[INDEX].componentCodes.oneOf.1","typeLabel":"null"}],"uniqueKey":"oneOf.1.rows.items.[INDEX].componentCodes","typeLabel":"string[] | null"},"sizes":{"type":"array","items":{"type":"object","properties":{"reference":{"type":"string","minLength":1,"maxLength":120,"description":"The size's identifier, unique within your company.","isRequired":true,"uniqueKey":"oneOf.1.rows.items.[INDEX].sizes.items.[INDEX].reference","typeLabel":"string"},"gtin":{"oneOf":[{"type":"string","pattern":"^(\\d{8}|\\d{12}|\\d{13}|\\d{14})$","description":"GTIN of the size: 8, 12, 13 or 14 digits.","uniqueKey":"oneOf.1.rows.items.[INDEX].sizes.items.[INDEX].gtin.oneOf.0","typeLabel":"string"},{"type":"null","pattern":"^(\\d{8}|\\d{12}|\\d{13}|\\d{14})$","description":"GTIN of the size: 8, 12, 13 or 14 digits.","uniqueKey":"oneOf.1.rows.items.[INDEX].sizes.items.[INDEX].gtin.oneOf.1","typeLabel":"null"}],"uniqueKey":"oneOf.1.rows.items.[INDEX].sizes.items.[INDEX].gtin","typeLabel":"string | null"},"supplierReference":{"oneOf":[{"type":"string","maxLength":120,"description":"The supplier's own reference for the size (at most 120 characters).","uniqueKey":"oneOf.1.rows.items.[INDEX].sizes.items.[INDEX].supplierReference.oneOf.0","typeLabel":"string"},{"type":"null","maxLength":120,"description":"The supplier's own reference for the size (at most 120 characters).","uniqueKey":"oneOf.1.rows.items.[INDEX].sizes.items.[INDEX].supplierReference.oneOf.1","typeLabel":"null"}],"uniqueKey":"oneOf.1.rows.items.[INDEX].sizes.items.[INDEX].supplierReference","typeLabel":"string | null"},"label":{"oneOf":[{"type":"string","maxLength":120,"description":"Human-readable name of the size (at most 120 characters).","uniqueKey":"oneOf.1.rows.items.[INDEX].sizes.items.[INDEX].label.oneOf.0","typeLabel":"string"},{"type":"null","maxLength":120,"description":"Human-readable name of the size (at most 120 characters).","uniqueKey":"oneOf.1.rows.items.[INDEX].sizes.items.[INDEX].label.oneOf.1","typeLabel":"null"}],"uniqueKey":"oneOf.1.rows.items.[INDEX].sizes.items.[INDEX].label","typeLabel":"string | null"},"widthMm":{"oneOf":[{"type":"number","minimum":0,"description":"Width in mm.","uniqueKey":"oneOf.1.rows.items.[INDEX].sizes.items.[INDEX].widthMm.oneOf.0","typeLabel":"number"},{"type":"null","minimum":0,"description":"Width in mm.","uniqueKey":"oneOf.1.rows.items.[INDEX].sizes.items.[INDEX].widthMm.oneOf.1","typeLabel":"null"}],"uniqueKey":"oneOf.1.rows.items.[INDEX].sizes.items.[INDEX].widthMm","typeLabel":"number | null"},"heightMm":{"oneOf":[{"type":"number","minimum":0,"description":"Height in mm.","uniqueKey":"oneOf.1.rows.items.[INDEX].sizes.items.[INDEX].heightMm.oneOf.0","typeLabel":"number"},{"type":"null","minimum":0,"description":"Height in mm.","uniqueKey":"oneOf.1.rows.items.[INDEX].sizes.items.[INDEX].heightMm.oneOf.1","typeLabel":"null"}],"uniqueKey":"oneOf.1.rows.items.[INDEX].sizes.items.[INDEX].heightMm","typeLabel":"number | null"},"depthMm":{"oneOf":[{"type":"number","minimum":0,"description":"Depth in mm.","uniqueKey":"oneOf.1.rows.items.[INDEX].sizes.items.[INDEX].depthMm.oneOf.0","typeLabel":"number"},{"type":"null","minimum":0,"description":"Depth in mm.","uniqueKey":"oneOf.1.rows.items.[INDEX].sizes.items.[INDEX].depthMm.oneOf.1","typeLabel":"null"}],"uniqueKey":"oneOf.1.rows.items.[INDEX].sizes.items.[INDEX].depthMm","typeLabel":"number | null"}},"required":["reference"],"uniqueKey":"oneOf.1.rows.items.[INDEX].sizes.items.[INDEX]","typeLabel":"object"},"maxItems":49,"description":"The unit's ADDITIONAL sizes — the primary way to send sizes. On a CREATE the row is one transaction: a refused size (`duplicateFormatReference`, `formatCapReached`) rolls the unit back too. On a row matching an EXISTING unit each size is upserted on its own; sizes the payload omits are never deleted.","uniqueKey":"oneOf.1.rows.items.[INDEX].sizes","typeLabel":"object[]"},"material":{"oneOf":[{"type":"string","enum":["plastic","paper_board","glass","metal","wood","composite","other",null],"description":"Single-part packaging (big bag, pallet, paper sack): the unit's own material family. A row with a `material` gives its unit ONE component (code = `internalRef`, name = `name`, this material) when the unit has no component yet — on a create or on an existing unit; a replay never adds a second. Cannot be combined with `componentCodes` (row is `invalid` with `materialWithComponentCodes`).","uniqueKey":"oneOf.1.rows.items.[INDEX].material.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","enum":["plastic","paper_board","glass","metal","wood","composite","other",null],"description":"Single-part packaging (big bag, pallet, paper sack): the unit's own material family. A row with a `material` gives its unit ONE component (code = `internalRef`, name = `name`, this material) when the unit has no component yet — on a create or on an existing unit; a replay never adds a second. Cannot be combined with `componentCodes` (row is `invalid` with `materialWithComponentCodes`).","uniqueKey":"oneOf.1.rows.items.[INDEX].material.oneOf.1","typeLabel":"null"}],"uniqueKey":"oneOf.1.rows.items.[INDEX].material","typeLabel":"enum\u003cstring> | null"},"massGrams":{"oneOf":[{"type":"string","description":"Single-part packaging: the unit's own mass in grams, written onto the component `material` creates. Requires `material` (else the row is `invalid` with `materialsRequired`).","uniqueKey":"oneOf.1.rows.items.[INDEX].massGrams.oneOf.0","typeLabel":"string"},{"type":"null","description":"Single-part packaging: the unit's own mass in grams, written onto the component `material` creates. Requires `material` (else the row is `invalid` with `materialsRequired`).","uniqueKey":"oneOf.1.rows.items.[INDEX].massGrams.oneOf.1","typeLabel":"null"}],"uniqueKey":"oneOf.1.rows.items.[INDEX].massGrams","typeLabel":"string | null"}},"required":["name","packagingType","role","notes"],"description":"One packaging-unit row for `POST /api/v1/ppwr/units`. Upsert key: `internalRef`. **A row without `internalRef` can match nothing and is therefore ALWAYS a create** — the server names the unit with the next generated `PU-\u003cn>`; replaying such a row creates another unit. Cells are coerced exactly as the in-app CSV/Excel importer coerces them, so a JSON-native value and its string spelling are equivalent (`12` = `\"12\"`, `[\"plastic\"]` = `\"plastic;paper_board\"`, `true` = `\"yes\"`/`\"ja\"`/`\"1\"`). An empty or omitted field is a no-op — it never clears a stored value.","uniqueKey":"oneOf.1.rows.items.[INDEX]","typeLabel":"object"},"maxItems":1000,"description":"The rows, at most 1000 per request.","isRequired":true,"uniqueKey":"oneOf.1.rows","typeLabel":"object[]"},"overwrite":{"type":"boolean","default":false,"description":"Authorises overwriting values that are already filled (including supplier- and AI-attested ones). Without it a batch containing any such change is refused with `409 overwriteRequired` and **nothing** is written.","uniqueKey":"oneOf.1.overwrite","typeLabel":"boolean"}},"uniqueKey":"oneOf.1","typeLabel":"object"}],"uniqueKey":"","typeLabel":"object[] | object"},"example":{"rows":[{"internalRef":"U-1","name":"Tea filter folding box","packagingType":"sales","role":"manufacturer","recyclabilityGrade":"A","gtin":"2000000000015","widthMm":"120","heightMm":"75","depthMm":"60","marketMemberStates":["DE"],"notes":"Folding box for 20 tea filters; sales packaging for the retail shelf.","placedUnderOwnBrand":true,"articleNumbers":["ART-2001"],"componentCodes":["K-1"]}],"overwrite":false},"examples":{"Example":{"title":"Example","value":{"rows":[{"internalRef":"U-1","name":"Tea filter folding box","packagingType":"sales","role":"manufacturer","recyclabilityGrade":"A","gtin":"2000000000015","widthMm":"120","heightMm":"75","depthMm":"60","marketMemberStates":["DE"],"notes":"Folding box for 20 tea filters; sales packaging for the retail shelf.","placedUnderOwnBrand":true,"articleNumbers":["ART-2001"],"componentCodes":["K-1"]}],"overwrite":false}}},"exampleType":"examples"}},"exampleType":"examples"},"responses":{"2349ea93-8b55-421a-a1c7-9ed33bd62a21":{"description":"Intake result (partial accept — see the schema).","content":{"application/json":{"schema":{"type":"object","description":"Result of a synchronous PPWR intake. **Partial accept:** valid rows commit even when other rows are `invalid` or `failed` — the one exception is the `409` overwrite confirmation, which is all-or-nothing. **Idempotent:** replaying an identical request changes nothing (matched rows return as `skipped`), except unit rows without `internalRef`, which are always creates.","required":["imported","updated","skipped","failed","invalid"],"properties":{"imported":{"type":"integer","description":"ENTITIES created (units, components, links) — never sizes.","isRequired":true,"uniqueKey":"imported","typeLabel":"integer"},"updated":{"type":"array","items":{"type":"string","uniqueKey":"updated.items.[INDEX]","typeLabel":"string"},"description":"Identifiers of rows whose existing match changed. A size created on an existing unit appears as `\u003cunit ref> / \u003csize ref>`.","isRequired":true,"uniqueKey":"updated","typeLabel":"string[]"},"skipped":{"type":"array","items":{"type":"string","uniqueKey":"skipped.items.[INDEX]","typeLabel":"string"},"description":"Identifiers of rows that matched with nothing to change.","isRequired":true,"uniqueKey":"skipped","typeLabel":"string[]"},"failed":{"type":"array","items":{"type":"object","description":"A row the upsert engine rejected. Carries no `index` — the engine reports by identifier.","properties":{"identifier":{"type":"string","description":"Identifies the rejected row, e.g. its `code` (components) or `internalRef` (units).","uniqueKey":"failed.items.[INDEX].identifier","typeLabel":"string"},"error":{"type":"string","description":"Stable machine key (clamped: anything unexpected becomes `dbError`).","uniqueKey":"failed.items.[INDEX].error","typeLabel":"string"}},"uniqueKey":"failed.items.[INDEX]","typeLabel":"object"},"description":"Rows the upsert engine rejected (unknown reference, ambiguous match, a new unit over the plan's unit quota → `packagingUnitQuotaReached`, …). A row refused before its write (these, and a new unit over the quota) writes nothing — not even the supplier it names; a unit written whose component or article link then failed is reported here with that link's key. Its `error` values are stable machine keys.","isRequired":true,"uniqueKey":"failed","typeLabel":"object[]"},"invalid":{"type":"array","items":{"type":"object","description":"A row rejected before the upsert engine ran, reported by its position in the request.","properties":{"index":{"type":"integer","description":"0-based position of the row in the request.","uniqueKey":"invalid.items.[INDEX].index","typeLabel":"integer"},"identifier":{"type":"string","description":"The row's key as sent (`code`, `internalRef`, `specInternalRef` or `zsvrCategory`, depending on the endpoint); empty string when the row carried none.","uniqueKey":"invalid.items.[INDEX].identifier","typeLabel":"string"},"error":{"type":"string","description":"Usually a stable machine key; a field with no custom message falls back to the validator's own English text.","uniqueKey":"invalid.items.[INDEX].error","typeLabel":"string"}},"uniqueKey":"invalid.items.[INDEX]","typeLabel":"object"},"description":"Rows rejected by schema validation before the engine ran. Most `error` values are stable machine keys, but a field with no custom message falls back to the validator's own English text — match on the key, fall back to displaying the string.","isRequired":true,"uniqueKey":"invalid","typeLabel":"object[]"},"sizesCreated":{"type":"integer","description":"Unit intake only: sizes created for the rows' units.","uniqueKey":"sizesCreated","typeLabel":"integer"},"articleNumbersUnmatched":{"type":"integer","description":"Unit intake only: distinct `articleNumbers` no live article matched. Skipped, never a row error.","uniqueKey":"articleNumbersUnmatched","typeLabel":"integer"},"articleLinksCreated":{"type":"integer","description":"Unit intake only: unit⇄article links created from `articleNumbers`.","uniqueKey":"articleLinksCreated","typeLabel":"integer"},"componentLinksCreated":{"type":"integer","description":"Unit intake only: unit⇄component links created from `componentCodes`.","uniqueKey":"componentLinksCreated","typeLabel":"integer"},"componentStubsCreated":{"type":"integer","description":"Unit intake only: minimal placeholder components created for unknown `componentCodes`.","uniqueKey":"componentStubsCreated","typeLabel":"integer"},"suppliersCreated":{"type":"array","items":{"type":"string","uniqueKey":"suppliersCreated.items.[INDEX]","typeLabel":"string"},"description":"Unit + component intake: names of the name-only suppliers created for `supplierName`s that matched no existing supplier.","uniqueKey":"suppliersCreated","typeLabel":"string[]"},"unitsWithoutComponents":{"type":"integer","description":"Unit intake only: units created with neither `componentCodes` nor a `material`. They hold no component yet, so no regulated value can be recorded on them — send `componentCodes`, or `material` for single-part packaging.","uniqueKey":"unitsWithoutComponents","typeLabel":"integer"},"mainPartsCreated":{"type":"integer","description":"Unit intake only: main-part components created from rows' `material` (one per unit that had no component yet).","uniqueKey":"mainPartsCreated","typeLabel":"integer"}},"uniqueKey":"","typeLabel":"object"},"example":{"imported":1,"updated":[],"skipped":[],"failed":[],"invalid":[],"sizesCreated":0,"articleLinksCreated":1,"articleNumbersUnmatched":0,"componentLinksCreated":1,"componentStubsCreated":0,"suppliersCreated":[],"unitsWithoutComponents":0,"mainPartsCreated":0},"examples":{"Example":{"title":"Example","value":{"imported":1,"updated":[],"skipped":[],"failed":[],"invalid":[],"sizesCreated":0,"articleLinksCreated":1,"articleNumbersUnmatched":0,"componentLinksCreated":1,"componentStubsCreated":0,"suppliersCreated":[],"unitsWithoutComponents":0,"mainPartsCreated":0}}},"exampleType":"examples"}},"exampleType":"examples"},"c7d261fa-5c2d-467d-870c-f11dfe3220c0":{"description":"Invalid request data","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","description":"Human-readable message, or a stable machine key (e.g. `batchTooLarge`, `overwriteRequired`, `duplicate`) on the batch, PPWR and upload endpoints.","isRequired":true,"uniqueKey":"error","typeLabel":"string"},"code":{"type":"string","description":"Stable machine code on some `400` and `409` answers, e.g. `plot_geometry_invalid` or `FORK_HAS_ORDER`. Match on it rather than on `error`. Further flat keys may accompany it (e.g. `precisionDigits`, `field`).","uniqueKey":"code","typeLabel":"string"},"details":{"type":"array","items":{"type":"object","properties":{"code":{"type":"string","description":"Machine code of the issue, e.g. `invalid_type`, `too_small`, `custom`.","isRequired":true,"uniqueKey":"details.items.[INDEX].code","typeLabel":"string"},"path":{"type":"array","items":{"oneOf":[{"type":"string","uniqueKey":"details.items.[INDEX].path.items.[INDEX].oneOf.0","typeLabel":"string"},{"type":"number","uniqueKey":"details.items.[INDEX].path.items.[INDEX].oneOf.1","typeLabel":"number"}],"uniqueKey":"details.items.[INDEX].path.items.[INDEX]","typeLabel":"string | number"},"description":"Location of the offending value in the request: object keys and 0-based array positions.","isRequired":true,"uniqueKey":"details.items.[INDEX].path","typeLabel":"(string | number)[]"},"message":{"type":"string","description":"Human-readable English explanation. The wording may change; match on `code` and `path`.","isRequired":true,"uniqueKey":"details.items.[INDEX].message","typeLabel":"string"}},"required":["code","path","message"],"additionalProperties":{"oneOf":[{}],"uniqueKey":"details.items.[INDEX].additionalProperties","typeLabel":"any"},"description":"One validation issue. Issue-specific keys (e.g. `expected`, `minimum`) may accompany the three listed.","uniqueKey":"details.items.[INDEX]","typeLabel":"object"},"description":"The validation issues on a `400` validation error.","uniqueKey":"details","typeLabel":"object[]"},"warnings":{"type":"array","items":{"type":"object","properties":{"type":{"type":"string","enum":["duplicateName","duplicateEan"],"description":"`duplicateName`: a live article of your company already has this name. `duplicateEan`: a live article already has this EAN.","isRequired":true,"uniqueKey":"warnings.items.[INDEX].type","typeLabel":"enum\u003cstring>"},"existingInternalArticleNr":{"type":"string","description":"`duplicateName` only: internal article number of the existing article.","uniqueKey":"warnings.items.[INDEX].existingInternalArticleNr","typeLabel":"string"},"existingArticleName":{"type":"string","description":"`duplicateEan` only: name of the existing article.","uniqueKey":"warnings.items.[INDEX].existingArticleName","typeLabel":"string"}},"required":["type"],"uniqueKey":"warnings.items.[INDEX]","typeLabel":"object"},"description":"`POST /articles` `409` only: soft duplicate warnings. Resend with `acknowledgeWarnings: true` to create the article anyway.","uniqueKey":"warnings","typeLabel":"object[]"}},"required":["error"],"additionalProperties":{"oneOf":[{}],"uniqueKey":"additionalProperties","typeLabel":"any"},"description":"Error body of every endpoint except the `429` the edge answers. Some errors add flat machine-readable keys next to `error`, e.g. `maxBatchSize` on `413 batchTooLarge` or `confirmUpdateCount` on `409 overwriteRequired`.","uniqueKey":"","typeLabel":"object"},"example":{"error":"Validation failed","details":[{"origin":"string","code":"too_small","minimum":1,"inclusive":true,"path":["address","street"],"message":"Address is required."}]},"examples":{"Example":{"title":"Example","value":{"error":"Validation failed","details":[{"origin":"string","code":"too_small","minimum":1,"inclusive":true,"path":["address","street"],"message":"Address is required."}]}}},"exampleType":"examples"}},"exampleType":"examples"},"675570a0-d8c9-4d8d-93b3-0a3c7997436f":{"description":"Invalid or expired API key, or the key's user account is not active.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","description":"Human-readable message, or a stable machine key (e.g. `batchTooLarge`, `overwriteRequired`, `duplicate`) on the batch, PPWR and upload endpoints.","isRequired":true,"uniqueKey":"error","typeLabel":"string"},"code":{"type":"string","description":"Stable machine code on some `400` and `409` answers, e.g. `plot_geometry_invalid` or `FORK_HAS_ORDER`. Match on it rather than on `error`. Further flat keys may accompany it (e.g. `precisionDigits`, `field`).","uniqueKey":"code","typeLabel":"string"},"details":{"type":"array","items":{"type":"object","properties":{"code":{"type":"string","description":"Machine code of the issue, e.g. `invalid_type`, `too_small`, `custom`.","isRequired":true,"uniqueKey":"details.items.[INDEX].code","typeLabel":"string"},"path":{"type":"array","items":{"oneOf":[{"type":"string","uniqueKey":"details.items.[INDEX].path.items.[INDEX].oneOf.0","typeLabel":"string"},{"type":"number","uniqueKey":"details.items.[INDEX].path.items.[INDEX].oneOf.1","typeLabel":"number"}],"uniqueKey":"details.items.[INDEX].path.items.[INDEX]","typeLabel":"string | number"},"description":"Location of the offending value in the request: object keys and 0-based array positions.","isRequired":true,"uniqueKey":"details.items.[INDEX].path","typeLabel":"(string | number)[]"},"message":{"type":"string","description":"Human-readable English explanation. The wording may change; match on `code` and `path`.","isRequired":true,"uniqueKey":"details.items.[INDEX].message","typeLabel":"string"}},"required":["code","path","message"],"additionalProperties":{"oneOf":[{}],"uniqueKey":"details.items.[INDEX].additionalProperties","typeLabel":"any"},"description":"One validation issue. Issue-specific keys (e.g. `expected`, `minimum`) may accompany the three listed.","uniqueKey":"details.items.[INDEX]","typeLabel":"object"},"description":"The validation issues on a `400` validation error.","uniqueKey":"details","typeLabel":"object[]"},"warnings":{"type":"array","items":{"type":"object","properties":{"type":{"type":"string","enum":["duplicateName","duplicateEan"],"description":"`duplicateName`: a live article of your company already has this name. `duplicateEan`: a live article already has this EAN.","isRequired":true,"uniqueKey":"warnings.items.[INDEX].type","typeLabel":"enum\u003cstring>"},"existingInternalArticleNr":{"type":"string","description":"`duplicateName` only: internal article number of the existing article.","uniqueKey":"warnings.items.[INDEX].existingInternalArticleNr","typeLabel":"string"},"existingArticleName":{"type":"string","description":"`duplicateEan` only: name of the existing article.","uniqueKey":"warnings.items.[INDEX].existingArticleName","typeLabel":"string"}},"required":["type"],"uniqueKey":"warnings.items.[INDEX]","typeLabel":"object"},"description":"`POST /articles` `409` only: soft duplicate warnings. Resend with `acknowledgeWarnings: true` to create the article anyway.","uniqueKey":"warnings","typeLabel":"object[]"}},"required":["error"],"additionalProperties":{"oneOf":[{}],"uniqueKey":"additionalProperties","typeLabel":"any"},"description":"Error body of every endpoint except the `429` the edge answers. Some errors add flat machine-readable keys next to `error`, e.g. `maxBatchSize` on `413 batchTooLarge` or `confirmUpdateCount` on `409 overwriteRequired`.","uniqueKey":"","typeLabel":"object"},"example":{"error":"Invalid or expired API key"},"examples":{"Example":{"title":"Example","value":{"error":"Invalid or expired API key"}}},"exampleType":"examples"}},"exampleType":"examples"},"d33b94f9-bb14-4957-ae9e-426325f89d27":{"description":"Insufficient permissions for this resource","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","description":"Human-readable message, or a stable machine key (e.g. `batchTooLarge`, `overwriteRequired`, `duplicate`) on the batch, PPWR and upload endpoints.","isRequired":true,"uniqueKey":"error","typeLabel":"string"},"code":{"type":"string","description":"Stable machine code on some `400` and `409` answers, e.g. `plot_geometry_invalid` or `FORK_HAS_ORDER`. Match on it rather than on `error`. Further flat keys may accompany it (e.g. `precisionDigits`, `field`).","uniqueKey":"code","typeLabel":"string"},"details":{"type":"array","items":{"type":"object","properties":{"code":{"type":"string","description":"Machine code of the issue, e.g. `invalid_type`, `too_small`, `custom`.","isRequired":true,"uniqueKey":"details.items.[INDEX].code","typeLabel":"string"},"path":{"type":"array","items":{"oneOf":[{"type":"string","uniqueKey":"details.items.[INDEX].path.items.[INDEX].oneOf.0","typeLabel":"string"},{"type":"number","uniqueKey":"details.items.[INDEX].path.items.[INDEX].oneOf.1","typeLabel":"number"}],"uniqueKey":"details.items.[INDEX].path.items.[INDEX]","typeLabel":"string | number"},"description":"Location of the offending value in the request: object keys and 0-based array positions.","isRequired":true,"uniqueKey":"details.items.[INDEX].path","typeLabel":"(string | number)[]"},"message":{"type":"string","description":"Human-readable English explanation. The wording may change; match on `code` and `path`.","isRequired":true,"uniqueKey":"details.items.[INDEX].message","typeLabel":"string"}},"required":["code","path","message"],"additionalProperties":{"oneOf":[{}],"uniqueKey":"details.items.[INDEX].additionalProperties","typeLabel":"any"},"description":"One validation issue. Issue-specific keys (e.g. `expected`, `minimum`) may accompany the three listed.","uniqueKey":"details.items.[INDEX]","typeLabel":"object"},"description":"The validation issues on a `400` validation error.","uniqueKey":"details","typeLabel":"object[]"},"warnings":{"type":"array","items":{"type":"object","properties":{"type":{"type":"string","enum":["duplicateName","duplicateEan"],"description":"`duplicateName`: a live article of your company already has this name. `duplicateEan`: a live article already has this EAN.","isRequired":true,"uniqueKey":"warnings.items.[INDEX].type","typeLabel":"enum\u003cstring>"},"existingInternalArticleNr":{"type":"string","description":"`duplicateName` only: internal article number of the existing article.","uniqueKey":"warnings.items.[INDEX].existingInternalArticleNr","typeLabel":"string"},"existingArticleName":{"type":"string","description":"`duplicateEan` only: name of the existing article.","uniqueKey":"warnings.items.[INDEX].existingArticleName","typeLabel":"string"}},"required":["type"],"uniqueKey":"warnings.items.[INDEX]","typeLabel":"object"},"description":"`POST /articles` `409` only: soft duplicate warnings. Resend with `acknowledgeWarnings: true` to create the article anyway.","uniqueKey":"warnings","typeLabel":"object[]"}},"required":["error"],"additionalProperties":{"oneOf":[{}],"uniqueKey":"additionalProperties","typeLabel":"any"},"description":"Error body of every endpoint except the `429` the edge answers. Some errors add flat machine-readable keys next to `error`, e.g. `maxBatchSize` on `413 batchTooLarge` or `confirmUpdateCount` on `409 overwriteRequired`.","uniqueKey":"","typeLabel":"object"},"example":{"error":"Forbidden"},"examples":{"Example":{"title":"Example","value":{"error":"Forbidden"}}},"exampleType":"examples"}},"exampleType":"examples"},"f5f7f63a-9acd-4c4b-824a-aa4b2904b46b":{"description":"Unconfirmed overwrite — nothing was written.","content":{"application/json":{"schema":{"type":"object","description":"The batch contains at least one change that would overwrite an already-filled value. Nothing was written — resubmit with `overwrite: true`, or drop those rows.","required":["error","confirmUpdateCount"],"properties":{"error":{"type":"string","enum":["overwriteRequired"],"description":"Always `overwriteRequired`.","isRequired":true,"uniqueKey":"error","typeLabel":"enum\u003cstring>"},"confirmUpdateCount":{"type":"integer","description":"How many rows in the batch need confirmation.","isRequired":true,"uniqueKey":"confirmUpdateCount","typeLabel":"integer"}},"uniqueKey":"","typeLabel":"object"},"example":{"error":"overwriteRequired","confirmUpdateCount":1},"examples":{"Example":{"title":"Example","value":{"error":"overwriteRequired","confirmUpdateCount":1}}},"exampleType":"examples"}},"exampleType":"examples"},"e20798f9-06c4-4ba8-af77-9c9ec9503ee6":{"description":"Rate limit exceeded: currently 1000 requests per 60 seconds per client IP across all `/api` paths. Issued by the edge before the application runs, so the JSON body differs from every other error: `error` is an object. A `429` with an HTML body instead of JSON means the request carried no API key.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","enum":["rate_limited"],"description":"Always `rate_limited`.","isRequired":true,"uniqueKey":"error.code","typeLabel":"enum\u003cstring>"},"message":{"type":"string","description":"Human-readable explanation.","isRequired":true,"uniqueKey":"error.message","typeLabel":"string"}},"required":["code","message"],"description":"Unlike every other error body, `error` is an object here.","isRequired":true,"uniqueKey":"error","typeLabel":"object"}},"required":["error"],"uniqueKey":"","typeLabel":"object"},"example":{"error":{"code":"rate_limited","message":"…"}},"examples":{"Example":{"title":"Example","value":{"error":{"code":"rate_limited","message":"…"}}}},"exampleType":"examples"}},"exampleType":"examples"},"c7c509cc-4ca7-4ca5-abff-93adb78bfa63":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","description":"Human-readable message, or a stable machine key (e.g. `batchTooLarge`, `overwriteRequired`, `duplicate`) on the batch, PPWR and upload endpoints.","isRequired":true,"uniqueKey":"error","typeLabel":"string"},"code":{"type":"string","description":"Stable machine code on some `400` and `409` answers, e.g. `plot_geometry_invalid` or `FORK_HAS_ORDER`. Match on it rather than on `error`. Further flat keys may accompany it (e.g. `precisionDigits`, `field`).","uniqueKey":"code","typeLabel":"string"},"details":{"type":"array","items":{"type":"object","properties":{"code":{"type":"string","description":"Machine code of the issue, e.g. `invalid_type`, `too_small`, `custom`.","isRequired":true,"uniqueKey":"details.items.[INDEX].code","typeLabel":"string"},"path":{"type":"array","items":{"oneOf":[{"type":"string","uniqueKey":"details.items.[INDEX].path.items.[INDEX].oneOf.0","typeLabel":"string"},{"type":"number","uniqueKey":"details.items.[INDEX].path.items.[INDEX].oneOf.1","typeLabel":"number"}],"uniqueKey":"details.items.[INDEX].path.items.[INDEX]","typeLabel":"string | number"},"description":"Location of the offending value in the request: object keys and 0-based array positions.","isRequired":true,"uniqueKey":"details.items.[INDEX].path","typeLabel":"(string | number)[]"},"message":{"type":"string","description":"Human-readable English explanation. The wording may change; match on `code` and `path`.","isRequired":true,"uniqueKey":"details.items.[INDEX].message","typeLabel":"string"}},"required":["code","path","message"],"additionalProperties":{"oneOf":[{}],"uniqueKey":"details.items.[INDEX].additionalProperties","typeLabel":"any"},"description":"One validation issue. Issue-specific keys (e.g. `expected`, `minimum`) may accompany the three listed.","uniqueKey":"details.items.[INDEX]","typeLabel":"object"},"description":"The validation issues on a `400` validation error.","uniqueKey":"details","typeLabel":"object[]"},"warnings":{"type":"array","items":{"type":"object","properties":{"type":{"type":"string","enum":["duplicateName","duplicateEan"],"description":"`duplicateName`: a live article of your company already has this name. `duplicateEan`: a live article already has this EAN.","isRequired":true,"uniqueKey":"warnings.items.[INDEX].type","typeLabel":"enum\u003cstring>"},"existingInternalArticleNr":{"type":"string","description":"`duplicateName` only: internal article number of the existing article.","uniqueKey":"warnings.items.[INDEX].existingInternalArticleNr","typeLabel":"string"},"existingArticleName":{"type":"string","description":"`duplicateEan` only: name of the existing article.","uniqueKey":"warnings.items.[INDEX].existingArticleName","typeLabel":"string"}},"required":["type"],"uniqueKey":"warnings.items.[INDEX]","typeLabel":"object"},"description":"`POST /articles` `409` only: soft duplicate warnings. Resend with `acknowledgeWarnings: true` to create the article anyway.","uniqueKey":"warnings","typeLabel":"object[]"}},"required":["error"],"additionalProperties":{"oneOf":[{}],"uniqueKey":"additionalProperties","typeLabel":"any"},"description":"Error body of every endpoint except the `429` the edge answers. Some errors add flat machine-readable keys next to `error`, e.g. `maxBatchSize` on `413 batchTooLarge` or `confirmUpdateCount` on `409 overwriteRequired`.","uniqueKey":"","typeLabel":"object"},"example":{"error":"Internal server error"},"examples":{"Example":{"title":"Example","value":{"error":"Internal server error"}}},"exampleType":"examples"}},"exampleType":"examples"}},"security":{"bae4c7a0-d716-46dc-bfdc-909a8704f12f":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"API Key","description":"API key generated in Settings > API Keys. Include as `Authorization: Bearer \u003ckey>`.","scopes":[],"schemeName":"bearerAuth"}}},"servers":{"525ee7a2-0b29-4150-83c9-6311c95aea37":{"url":"https://app.polygon-one.com","description":"Production Server"}},"processedSecurityOptions":[{"schemes":[{"scheme":{"type":"http","scheme":"bearer","bearerFormat":"API Key","description":"API key generated in Settings > API Keys. Include as `Authorization: Bearer \u003ckey>`.","scopes":[],"schemeName":"bearerAuth"},"schema":{"title":"Bearer Auth","type":"string","isRequired":true,"description":"API key generated in Settings > API Keys. Include as `Authorization: Bearer \u003ckey>`.","format":"bearer","typeLabel":"string\u003cbearer>","deprecated":false},"schemeName":"bearerAuth","name":"Authorization"}],"title":"bearerAuth"}]},"originalFileLocation":"api-reference/openapi.json"},"subdomain":"polygonone","siteName":"Polygon One Helpcenter","title":"Verpackungseinheiten anlegen \u0026 aktualisieren - Polygon One Helpcenter","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{"de":{"href":"/api-reference/endpoint/ppwr/units/upsert","matchLevel":0},"en":{"href":"/en/api-reference/endpoint/ppwr/units/upsert","matchLevel":1},"fr":{"href":"/fr/lieferanten/start","matchLevel":4},"es":{"href":"/es/lieferanten/start","matchLevel":4},"zh":{"href":"/zh/lieferanten/start","matchLevel":4}}},"lastModified":"2026-10-06T10:25:27.441Z","originalFileLocation":"api-reference/endpoint/ppwr/units/upsert.mdx","locale":"de"},"headHtml":"\u003cscript data-mint-head>(function(){var d=document.documentElement,p=null;if(!p){try{p=localStorage.getItem(\"isDarkMode\")}catch(e){}if(p==='true')p='dark';else if(p==='false')p='light';if(p!=='light'\u0026\u0026p!=='dark'\u0026\u0026p!=='system')p=\"system\"}var r=p==='system'?(matchMedia(\"(prefers-color-scheme: dark)\").matches?'dark':'light'):p;d.classList.remove(r==='dark'?'light':'dark');d.classList.add(r);d.setAttribute(\"data-theme-preference\",p)})();\u003c/script>\u003cmeta data-mint-head name=\"description\" content=\"Bulk upsert of packaging units, keyed on internalRef. A row may carry its additional sizes (sizes[]) and the additive articleNumbers / componentCodes directives in the same call. A row without internalRef is always a create — the server assigns the next PU-, and read the generated references back with GET /api/v1/ppwr/units (or GET /api/v1/ppwr/units?internalRef=…) before importing links or article links. Same fill-only column policy and overwrite confirmation as the component intake. At most 1000 rows per request (400 otherwise). A request may additionally carry at most 1000 sizes entries across all its rows. Requires packaging:write; customer workspace with the PPWR module enabled — see the guide.\">\u003cmeta data-mint-head name=\"application-name\" content=\"Polygon One Helpcenter\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/polygonone/32k2Y3_9P8MpmQgs/_generated/favicon/android-chrome-192x192.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"180x180\" href=\"/mintlify-assets/_mintlify/favicons/polygonone/32k2Y3_9P8MpmQgs/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/polygonone/32k2Y3_9P8MpmQgs/_generated/favicon/favicon-16x16.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/polygonone/32k2Y3_9P8MpmQgs/_generated/favicon/favicon-32x32.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/polygonone/32k2Y3_9P8MpmQgs/_generated/favicon/favicon.ico\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/polygonone/32k2Y3_9P8MpmQgs/_generated/favicon-dark/android-chrome-192x192.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/polygonone/32k2Y3_9P8MpmQgs/_generated/favicon-dark/favicon-16x16.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/polygonone/32k2Y3_9P8MpmQgs/_generated/favicon-dark/favicon-32x32.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/polygonone/32k2Y3_9P8MpmQgs/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"Verpackungseinheiten anlegen \u0026amp; aktualisieren - Polygon One Helpcenter\">\u003cmeta data-mint-head property=\"og:description\" content=\"Bulk upsert of packaging units, keyed on internalRef. A row may carry its additional sizes (sizes[]) and the additive articleNumbers / componentCodes directives in the same call. A row without internalRef is always a create — the server assigns the next PU-, and read the generated references back with GET /api/v1/ppwr/units (or GET /api/v1/ppwr/units?internalRef=…) before importing links or article links. Same fill-only column policy and overwrite confirmation as the component intake. At most 1000 rows per request (400 otherwise). A request may additionally carry at most 1000 sizes entries across all its rows. Requires packaging:write; customer workspace with the PPWR module enabled — see the guide.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"Polygon One Helpcenter\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://help.polygon-one.com/api-reference/endpoint/ppwr/units/upsert\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://polygonone.mintlify.app/_mintlify/api/og/v2?division=PPWR+%E2%80%93+Verpackungsdaten\u0026amp;title=Verpackungseinheiten+anlegen+%26+aktualisieren\u0026amp;description=Bulk+upsert+of+packaging+units%2C+keyed+on+%60internalRef%60.+A+row+may+carry+its+additional+sizes+%28%60sizes%5B%5D%60%29+and+the+additive+%60articleNumbers%60+%2F+%60componentCodes%60+di\u0026amp;theme=0c175d962800f7cffd688852\u0026amp;signature=4ea65a96c3c72d9d7a46dc13212dd95065062a5b9027c11d67a5d9052a22ed6e\">\u003cmeta data-mint-head property=\"og:image:width\" content=\"1200\">\u003cmeta data-mint-head property=\"og:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"twitter:card\" content=\"summary_large_image\">\u003cmeta data-mint-head name=\"twitter:title\" content=\"Verpackungseinheiten anlegen \u0026amp; aktualisieren - Polygon One Helpcenter\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Bulk upsert of packaging units, keyed on internalRef. A row may carry its additional sizes (sizes[]) and the additive articleNumbers / componentCodes directives in the same call. A row without internalRef is always a create — the server assigns the next PU-, and read the generated references back with GET /api/v1/ppwr/units (or GET /api/v1/ppwr/units?internalRef=…) before importing links or article links. Same fill-only column policy and overwrite confirmation as the component intake. At most 1000 rows per request (400 otherwise). A request may additionally carry at most 1000 sizes entries across all its rows. Requires packaging:write; customer workspace with the PPWR module enabled — see the guide.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://polygonone.mintlify.app/_mintlify/api/og/v2?division=PPWR+%E2%80%93+Verpackungsdaten\u0026amp;title=Verpackungseinheiten+anlegen+%26+aktualisieren\u0026amp;description=Bulk+upsert+of+packaging+units%2C+keyed+on+%60internalRef%60.+A+row+may+carry+its+additional+sizes+%28%60sizes%5B%5D%60%29+and+the+additive+%60articleNumbers%60+%2F+%60componentCodes%60+di\u0026amp;theme=0c175d962800f7cffd688852\u0026amp;signature=4ea65a96c3c72d9d7a46dc13212dd95065062a5b9027c11d67a5d9052a22ed6e\">\u003cmeta data-mint-head name=\"twitter:image:width\" content=\"1200\">\u003cmeta data-mint-head name=\"twitter:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"msapplication-config\" content=\"/mintlify-assets/_mintlify/favicons/polygonone/32k2Y3_9P8MpmQgs/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"Polygon One Helpcenter\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#15803D\">\u003clink data-mint-head rel=\"canonical\" href=\"https://help.polygon-one.com/api-reference/endpoint/ppwr/units/upsert\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/api-reference/endpoint/ppwr/units/upsert.md\">\u003clink data-mint-head rel=\"alternate\" hreflang=\"de\" href=\"https://help.polygon-one.com/api-reference/endpoint/ppwr/units/upsert\">\u003clink data-mint-head rel=\"alternate\" hreflang=\"en\" href=\"https://help.polygon-one.com/en/api-reference/endpoint/ppwr/units/upsert\">\u003clink data-mint-head rel=\"alternate\" hreflang=\"x-default\" href=\"https://help.polygon-one.com/api-reference/endpoint/ppwr/units/upsert\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://help.polygon-one.com/#organization\",\"name\":\"Polygon One Helpcenter\",\"url\":\"https://help.polygon-one.com\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/polygonone/AMoRp9VbcW46gNsT/logo/light.svg?fit=max\u0026auto=format\u0026n=AMoRp9VbcW46gNsT\u0026q=85\u0026s=4a316da81d50e49c7f9f6480a235558e\"}},{\"@type\":\"WebSite\",\"@id\":\"https://help.polygon-one.com#website\",\"name\":\"Polygon One Helpcenter\",\"url\":\"https://help.polygon-one.com\",\"publisher\":{\"@id\":\"https://help.polygon-one.com/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://help.polygon-one.com/api-reference/endpoint/ppwr/units/upsert#webpage\",\"url\":\"https://help.polygon-one.com/api-reference/endpoint/ppwr/units/upsert\",\"name\":\"Verpackungseinheiten anlegen \u0026 aktualisieren\",\"description\":\"Bulk upsert of packaging units, keyed on internalRef. A row may carry its additional sizes (sizes[]) and the additive articleNumbers / componentCodes directives in the same call. A row without internalRef is always a create — the server assigns the next PU-, and read the generated references back with GET /api/v1/ppwr/units (or GET /api/v1/ppwr/units?internalRef=…) before importing links or article links. Same fill-only column policy and overwrite confirmation as the component intake. At most 1000 rows per request (400 otherwise). A request may additionally carry at most 1000 sizes entries across all its rows. Requires packaging:write; customer workspace with the PPWR module enabled — see the guide.\",\"dateModified\":\"2026-10-06T10:25:27.441Z\",\"isPartOf\":{\"@id\":\"https://help.polygon-one.com#website\"},\"breadcrumb\":{\"@id\":\"https://help.polygon-one.com/api-reference/endpoint/ppwr/units/upsert#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://help.polygon-one.com/api-reference/endpoint/ppwr/units/upsert#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"PPWR – Verpackungsdaten\",\"item\":\"https://help.polygon-one.com/api-reference/endpoint/ppwr/components/list\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Verpackungseinheiten anlegen \u0026 aktualisieren\",\"item\":\"https://help.polygon-one.com/api-reference/endpoint/ppwr/units/upsert\"}]},{\"@type\":[\"TechArticle\",\"APIReference\"],\"@id\":\"https://help.polygon-one.com/api-reference/endpoint/ppwr/units/upsert#apireference\",\"headline\":\"Verpackungseinheiten anlegen \u0026 aktualisieren\",\"name\":\"Verpackungseinheiten anlegen \u0026 aktualisieren\",\"description\":\"Bulk upsert of packaging units, keyed on internalRef. A row may carry its additional sizes (sizes[]) and the additive articleNumbers / componentCodes directives in the same call. A row without internalRef is always a create — the server assigns the next PU-, and read the generated references back with GET /api/v1/ppwr/units (or GET /api/v1/ppwr/units?internalRef=…) before importing links or article links. Same fill-only column policy and overwrite confirmation as the component intake. At most 1000 rows per request (400 otherwise). A request may additionally carry at most 1000 sizes entries across all its rows. Requires packaging:write; customer workspace with the PPWR module enabled — see the guide.\",\"url\":\"https://help.polygon-one.com/api-reference/endpoint/ppwr/units/upsert\",\"mainEntityOfPage\":{\"@id\":\"https://help.polygon-one.com/api-reference/endpoint/ppwr/units/upsert#webpage\"},\"dateModified\":\"2026-10-06T10:25:27.441Z\",\"publisher\":{\"@id\":\"https://help.polygon-one.com/#organization\"},\"isPartOf\":{\"@id\":\"https://help.polygon-one.com#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"Polygon One Helpcenter\",\"creator\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","siteName":"Polygon One Helpcenter","nav":{"global":{"anchors":[]},"languages":[{"language":"de","default":true,"tabs":[{"tab":"EUDR","pages":[{"title":"EUDR","href":""}]},{"tab":"PPWR","pages":[{"title":"PPWR","href":"/de/ppwr/uebersicht"}]},{"tab":"API-Referenz","groups":[{"group":"API-Dokumentation","pages":[{"title":"Einführung","href":"/api-reference/introduction"},{"title":"Schnellstart","href":"/api-reference/quickstart"},{"title":"Empfohlene Integrationsabläufe","sidebarTitle":"Integrationsabläufe","href":"/api-reference/integration-flows"},{"title":"Claude, ChatGPT und Copilot verbinden (MCP)","sidebarTitle":"KI-Assistenten (MCP)","href":"/api-reference/ki-assistenten"},{"title":"Stapelimport (asynchron)","href":"/api-reference/batch-import"},{"title":"Bestellungen: Zeilen, Positionsnummern, Status, Delta-Sync","sidebarTitle":"Bestellungen","href":"/api-reference/orders"},{"title":"PPWR: Verpackungsdaten, Mengen, Mengenmeldung","href":"/api-reference/ppwr"},{"title":"Geo-Analyse über die API","href":"/api-reference/geo-analysis"},{"title":"Fehler \u0026 Limits","href":"/api-reference/errors-and-limits"},{"title":"Änderungsprotokoll","href":"/api-reference/changelog"}]},{"group":"Artikel","pages":[{"title":"Artikel auflisten","openapi":"GET /api/v1/articles","href":"/api-reference/endpoint/articles/list"},{"title":"Artikel erstellen","openapi":"POST /api/v1/articles","href":"/api-reference/endpoint/articles/create"},{"title":"Artikel abrufen","openapi":"GET /api/v1/articles/{id}","href":"/api-reference/endpoint/articles/get"},{"title":"Artikel aktualisieren","openapi":"PATCH /api/v1/articles/{id}","href":"/api-reference/endpoint/articles/update"},{"title":"Artikel löschen","openapi":"DELETE /api/v1/articles/{id}","href":"/api-reference/endpoint/articles/delete"}]},{"group":"Lieferanten","pages":[{"title":"Lieferanten auflisten","openapi":"GET /api/v1/suppliers","href":"/api-reference/endpoint/suppliers/list"},{"title":"Lieferant erstellen","openapi":"POST /api/v1/suppliers","href":"/api-reference/endpoint/suppliers/create"},{"title":"Lieferant abrufen","openapi":"GET /api/v1/suppliers/{id}","href":"/api-reference/endpoint/suppliers/get"},{"title":"Lieferant aktualisieren","openapi":"PATCH /api/v1/suppliers/{id}","href":"/api-reference/endpoint/suppliers/update"},{"title":"Lieferant löschen","openapi":"DELETE /api/v1/suppliers/{id}","href":"/api-reference/endpoint/suppliers/delete"}]},{"group":"Parzellen","pages":[{"title":"Parzellen auflisten","openapi":"GET /api/v1/plots","href":"/api-reference/endpoint/plots/list"},{"title":"Parzelle erstellen","openapi":"POST /api/v1/plots","href":"/api-reference/endpoint/plots/create"},{"title":"Parzellengeometrie prüfen","openapi":"POST /api/v1/plots/validate","href":"/api-reference/endpoint/plots/validate"},{"title":"Parzelle abrufen","openapi":"GET /api/v1/plots/{id}","href":"/api-reference/endpoint/plots/get"},{"title":"Parzellenbericht herunterladen","openapi":"GET /api/v1/plots/{id}/report","href":"/api-reference/endpoint/plots/report"},{"title":"Parzelle verknüpfen","openapi":"PATCH /api/v1/plots/{id}","href":"/api-reference/endpoint/plots/update"},{"title":"Parzelle löschen","openapi":"DELETE /api/v1/plots/{id}","href":"/api-reference/endpoint/plots/delete"}]},{"group":"Nachweise","pages":[{"title":"Upload-URL für einen Nachweis anfordern","openapi":"POST /api/v1/evidence/upload-url","href":"/api-reference/endpoint/evidence/upload-url"},{"title":"Nachweis an Lieferantenartikel anhängen","openapi":"POST /api/v1/evidence","href":"/api-reference/endpoint/evidence/create"},{"title":"Nachweise auflisten","openapi":"GET /api/v1/evidence","href":"/api-reference/endpoint/evidence/list"}]},{"group":"Bestellungen","pages":[{"title":"Bestellungen auflisten","openapi":"GET /api/v1/orders","href":"/api-reference/endpoint/orders/list"},{"title":"Bestellungen erstellen","openapi":"POST /api/v1/orders","href":"/api-reference/endpoint/orders/create"},{"title":"Bestellung abrufen","openapi":"GET /api/v1/orders/{id}","href":"/api-reference/endpoint/orders/get"},{"title":"Bestellung aktualisieren","openapi":"PATCH /api/v1/orders/{id}","href":"/api-reference/endpoint/orders/update"},{"title":"Bestellung löschen","openapi":"DELETE /api/v1/orders/{id}","href":"/api-reference/endpoint/orders/delete"},{"title":"Herkunftsbestätigung anfragen","openapi":"POST /api/v1/orders/{id}/origin-confirmation","href":"/api-reference/endpoint/orders/origin-confirmation"}]},{"group":"Import-Jobs","pages":[{"title":"Import-Job abrufen","openapi":"GET /api/v1/import-jobs/{jobId}","href":"/api-reference/endpoint/import-jobs/get"}]},{"group":"DDS-Erklärungen","pages":[{"title":"DDS-Erklärungen auflisten","openapi":"GET /api/v1/dds-statements","href":"/api-reference/endpoint/dds-statements/list"},{"title":"DDS-Erklärung erstellen","openapi":"POST /api/v1/dds-statements","href":"/api-reference/endpoint/dds-statements/create"},{"title":"DDS-Erklärung abrufen","openapi":"GET /api/v1/dds-statements/{id}","href":"/api-reference/endpoint/dds-statements/get"},{"title":"DDS-Erklärung aktualisieren","openapi":"PATCH /api/v1/dds-statements/{id}","href":"/api-reference/endpoint/dds-statements/update"},{"title":"DDS-Erklärung löschen","openapi":"DELETE /api/v1/dds-statements/{id}","href":"/api-reference/endpoint/dds-statements/delete"}]},{"group":"PPWR – Verpackungsdaten","pages":[{"title":"Komponenten auflisten","openapi":"GET /api/v1/ppwr/components","href":"/api-reference/endpoint/ppwr/components/list"},{"title":"Komponenten anlegen \u0026 aktualisieren","openapi":"POST /api/v1/ppwr/components","href":"/api-reference/endpoint/ppwr/components/upsert"},{"title":"Komponente abrufen","openapi":"GET /api/v1/ppwr/components/{id}","href":"/api-reference/endpoint/ppwr/components/get"},{"title":"Verpackungseinheiten auflisten","openapi":"GET /api/v1/ppwr/units","description":"Retrieve your company's live packaging units — the endpoint that resolves a generated `PU-\u003cn>` reference back to the unit and to the UUID the detail route takes. Soft-deleted units are never returned. Rows are ordered by `name`, then by `id`, so paging can neither repeat nor skip a unit. Requires `packaging:read` (a `packaging:write` key satisfies it); customer workspace with the PPWR module enabled.","href":"/api-reference/endpoint/ppwr/units/list"},{"title":"Verpackungseinheiten anlegen \u0026 aktualisieren","openapi":"POST /api/v1/ppwr/units","href":"/api-reference/endpoint/ppwr/units/upsert"},{"title":"Verpackungseinheit abrufen","openapi":"GET /api/v1/ppwr/units/{id}","description":"Retrieve one packaging unit with its stored fields, all of its sizes (`formats`, primary first) and its bill of materials (`components`). A unit of another company, a soft-deleted unit and an `id` that is not a UUID all answer `404` — never `403`, which would confirm that the id exists somewhere. Requires `packaging:read` (a `packaging:write` key satisfies it); customer workspace with the PPWR module enabled.","href":"/api-reference/endpoint/ppwr/units/get"},{"title":"Größen anlegen \u0026 aktualisieren","openapi":"POST /api/v1/ppwr/formats","href":"/api-reference/endpoint/ppwr/formats/upsert"},{"title":"Verpackungsstückliste anlegen","openapi":"POST /api/v1/ppwr/links","href":"/api-reference/endpoint/ppwr/links/create"},{"title":"Artikelverknüpfungen anlegen","openapi":"POST /api/v1/ppwr/article-links","href":"/api-reference/endpoint/ppwr/article-links/create"}]},{"group":"PPWR – Dokumente","pages":[{"title":"Upload-URL für ein Dokument anfordern","openapi":"POST /api/v1/ppwr/documents/upload-url","href":"/api-reference/endpoint/ppwr/documents/upload-url"},{"title":"Dokument an Einheit oder Komponente anhängen","openapi":"POST /api/v1/ppwr/documents","href":"/api-reference/endpoint/ppwr/documents/create"}]},{"group":"PPWR – Konformitätserklärungen","pages":[{"title":"Konformitätserklärungen auflisten","openapi":"GET /api/v1/ppwr/declarations","href":"/api-reference/endpoint/ppwr/declarations/list"},{"title":"Konformitätserklärung abrufen","openapi":"GET /api/v1/ppwr/declarations/{id}","href":"/api-reference/endpoint/ppwr/declarations/get"},{"title":"Konformitätserklärung herunterladen","openapi":"GET /api/v1/ppwr/declarations/{id}/pdf","href":"/api-reference/endpoint/ppwr/declarations/pdf"}]},{"group":"PPWR – Mengen \u0026 Mengenmeldung","pages":[{"title":"Mengen übermitteln","openapi":"POST /api/v1/ppwr/quantities","href":"/api-reference/endpoint/ppwr/quantities/create"},{"title":"Tonnage übermitteln","openapi":"POST /api/v1/ppwr/tonnage","href":"/api-reference/endpoint/ppwr/tonnage/create"},{"title":"Tonnage löschen","openapi":"DELETE /api/v1/ppwr/tonnage","href":"/api-reference/endpoint/ppwr/tonnage/delete"},{"title":"Mengenmeldungen auflisten","openapi":"GET /api/v1/ppwr/mengenmeldung/reports","href":"/api-reference/endpoint/ppwr/mengenmeldung/list"},{"title":"Mengenmeldung erzeugen","openapi":"POST /api/v1/ppwr/mengenmeldung/reports","href":"/api-reference/endpoint/ppwr/mengenmeldung/create"},{"title":"Mengenmeldungs-Datei herunterladen","openapi":"GET /api/v1/ppwr/mengenmeldung/{reportId}/xml","href":"/api-reference/endpoint/ppwr/mengenmeldung/download"}]}]},{"tab":"Für Lieferanten","icon":"truck","pages":[{"title":"Für Lieferanten","href":"/de/lieferanten/start"}]}]},{"language":"en","pages":[{"title":"en","href":"/en/api-reference/endpoint/ppwr/units/upsert"}]},{"language":"fr","pages":[{"title":"fr","href":"/fr/lieferanten/start"}]},{"language":"es","pages":[{"title":"es","href":"/es/lieferanten/start"}]},{"language":"zh","pages":[{"title":"zh","href":"/zh/lieferanten/start"}]}]},"title":"Verpackungseinheiten anlegen \u0026 aktualisieren - Polygon One Helpcenter","buildId":"dpl_2xiSHD9XEvLsPGPcfoMtkLTB3dy9","deploymentId":"dpl_2xiSHD9XEvLsPGPcfoMtkLTB3dy9","dynamics":["c2aa737661","2b790eda92","b0f84f53ff","a9bb46feb3"],"chunks":["OpenApiReferenceProvider-DmVyH30O.js","utils-BHQqGGOd.js","cloneDeep-izs3Hzxb.js","_Uint8Array-BVIqJ90l.js","isObjectLike-C8vmzPEN.js","isArray-Dcu1dQ5t.js","utils-CD-E4BIt.js","toString-BX-iyh8G.js","isSymbol-CSH9U2Gm.js","addUniqueKeysToSchema-Bp5Lq9Ds.js","snippetPresets-C4xAVCFP.js","style-to-object-BY3JEAdk.js","v4-DIgz8zy6.js","ApiExamples-CgXVLxUC.js","isEqual-BfaiBbcl.js","usePlaygroundInputsStore-BF8I5oUf.js","shallow-Byd0lWnC.js","getApiPlaygroundDisplay-BGOZG1OK.js","CodeSnippet-CpvQL0CY.js","CodeSnippets-B8wkBKXa.js","Page-CBCH2P7b.js","getPastedJson-Ry3scI3Y.js","icon-D7a9HcdD.js","MethodPill-CJ8pmHhz.js","DuplicateIcon-rh1HJF0t.js","createIcon-DvGznqYs.js","DynamicMarkdown-Cc6AuSHS.js","SectionHeading-B4A0S-ep.js","axios-vUo_bRtp.js","Markdown-Cc16CX65.js","clsx-Cs6nMGht.js","lib-DuNMoZ05.js","lib-B8HbPgcC.js","html-void-elements-mCSPHezU.js","dist-zbf22OZA.js","katex-YMM-FMeD.js","marked.esm-CZWythHk.js","AssistantPageLink-C_fs-y5n.js"]}