> For the complete documentation index, see [llms.txt](https://dev.skladon.com/main/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://dev.skladon.com/main/integration/api/products.md).

# Products

You may find descriptions of endpoints for work with products below.

## Filter products (grid)

> Paged product search. Body: \`#/definitions/V21GridRequestGeneric\`.\
> Use \*\*product\*\* column names in \`columns\`, \`sorts\[].column\`, and filter \`column\` (listed under that definition).<br>

```json
{"openapi":"3.1.1","info":{"title":"GWMS API v2.1 (v21)","version":"2.1.0"},"tags":[{"name":"Products","description":"Products, availability, grid (no separate product-sets endpoints)"}],"servers":[{"url":"https://gw.new.skladon.net/v21"}],"security":[{"authorization":[],"XApiKey":[]}],"components":{"securitySchemes":{"authorization":{"type":"apiKey","name":"authorization","in":"header"}},"parameters":{"HeaderXApiKey":{"schema":{"type":"string"},"name":"x-api-key","in":"header","required":true,"description":"Eshop API key from onboarding"},"HeaderAuthorization":{"schema":{"type":"string"},"name":"authorization","in":"header","required":true,"description":"Bearer JWT from POST /v21/users/login"}},"schemas":{"V21GenericGridResponse":{"type":"object","description":"Grid result envelope. `data.data` is an array of row objects (shape depends on requested `columns`).\n`data.request` echoes the grid request. `data.totalCount` is the total number of matching rows (for pagination).\n","required":["statusCode","message"],"properties":{"statusCode":{"type":"number"},"message":{"type":"string"},"data":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object"}},"request":{"type":"object"},"totalCount":{"type":"number"}}}}},"ErrorMessageResponse":{"type":"object","description":"Shape of every 4xx and 5xx response under `/v21`. See the \"Error response format\" section in the API description.","properties":{"statusCode":{"type":"number","description":"Repeats the HTTP status code of the response."},"error":{"type":"string","description":"Standard HTTP status text for `statusCode`."},"message":{"type":"string","description":"Human readable detail of what went wrong."}},"required":["statusCode","error","message"]},"V21GridRequestGeneric":{"type":"object","description":"Paged list / search body for all `POST …/filter` endpoints.\n\n**Top-level fields**\n- `page` (integer ≥ 1, default 1)\n- `items` (page size, 1–1000, default 10)\n- `columns` (string[]): which fields each row should include; **empty array = all columns** for that grid\n- `sorts`: array of `{ column, direction }`; `direction` is `ASC`, `DESC`, `asc`, or `desc`\n- `filters`: **OR of AND-groups**. Outer array = OR. Each inner array = AND of conditions. Each condition = `{ column, operator, value }`.\n\n**Filter operators** (unless noted for stock movements only)\n- `eq` / `neq` — equal / not equal\n- `gt` / `gte` / `lt` / `lte` — comparisons\n- `in` / `nin` — value must be an **array** of scalars in `value`\n- `like` / `nlike` — substring match / not match\n- `between` / `nbetween` — `value` must be an **array of two** endpoints\n- `null` / `notnull` — column IS NULL / IS NOT NULL\n- `empty` / `notempty` — null or empty string / neither\n- **Stock movements only** (this endpoint’s filters): `likein` is also allowed (same family as `like`).\n\n**`value` type**: string, number, boolean, array, or `null`, depending on `operator` (e.g. `in`/`nin`/`between` expect arrays as above).\n\n---\n\n**Columns that are filter only**: a few columns can be filtered and sorted on but are not part of\nthe response — orders `method` (internal delivery marker, always `DEL`), products\n`insertToProductId` (the response exposes the resolved `insertToProductSkus` and\n`insertToCountries` instead) and claims `note` (a Skladon-internal note that v2.1 no longer returns).\n\n**Sorting and `NULL` values**: sorting is delegated to MySQL `ORDER BY` without an explicit\n`NULLS FIRST` / `NULLS LAST` clause, so rows with `NULL` in the sorted column come **first** for\n`ASC` and **last** for `DESC`. Rows that compare equal have no guaranteed order between pages —\nwhen paging through a full export, always append a stable tiebreaker such as\n`{\"column\": \"id\", \"direction\": \"ASC\"}` as the last sort.\n\n---\n\n**Column names for `POST /products/filter`** (also use these in `sorts[].column` and filter `column`):\n`id`, `customField1`, `customField2`, `customField3`, `description`, `ean`, `eanLockedByDcix`, `expMethod`, `guid`, `hsCode`, `isbn`, `mpn`, `name`, `note`, `price`, `productType`, `rop`, `sku`, `upc`, `active`, `scanImeiSn`, `originCountry`, `snRegex`, `unitPrice`, `weight`, `width`, `height`, `length`, `insertToProductId`, `insertType`, `insertByOrderType`, `insertPriceFrom`, `insertPriceTo`, `expirationDays`, `createdAt`, `updatedAt`, `dimensionsChangedAt`, `deletedAt`, `quantityConversion`, `isDeleted`, `ageCheck`, `batteryType`, `sourceSys`.\n\n**Column names for `POST /orders/filter`**:\n`id`, `addressId`, `allowExpedition`, `billingAddressAdditionalInfo`, `billingAttentionName`, `billingCity`, `billingCompanyId`, `billingCompanyName`, `billingEmail`, `billingName`, `billingPhone`, `billingPostCode`, `billingProvinceCode`, `billingState`, `billingStreet`, `billingTaxId`, `codCurrency`, `codPrice`, `codRefNumber`, `currency`, `eshopOrderId`, `invoiceDate`, `requiredExpeditionDate`, `invoiceNumber`, `marketplace`, `message`, `method`, `note`, `orderType`, `paid`, `partnerOrderId`, `paymentMethod`, `price`, `printFiles`, `holdByQuality`, `pickFromCustomsWarehouse`, `underSanction`, `recipientAddressAdditionalInfo`, `recipientAttentionName`, `recipientCity`, `recipientCompanyId`, `recipientCompanyName`, `recipientEmail`, `recipientName`, `recipientPhone`, `recipientPostCode`, `recipientProvinceCode`, `recipientState`, `recipientStreet`, `recipientTaxId`, `shipper`, `shipperServiceCode`, `branchId`, `shippingPrice`, `status`, `timestamp`, `trackingNumbers`, `recipientGln`, `billingGln`, `deliveredAt`, `updatedAt`, `disableShippingReorder`, `waitingForPaymentAt`, `productsNotAvailableAt`, `suspendedAt`, `releaseFromSuspendedAt`, `incorrectAt`, `waitingForShipmentAt`, `shipmentOrderedAt`, `inProcessAt`, `packedAt`, `waitingForCarrierAt`, `shippedAt`, `atPickupPointAt`, `returningBackAt`, `returnedBackAt`, `preReceivedAt`, `parentOrderId`, `parentEshopOrderId`, `returnTrackingNumber`, `exchangeTrackingNumber`, `eshopNote`, `orderBoxCount`, `incorrectOrderMessage`, `canceledAt`, `slaDate`, `scannedAt`, `preorderReleaseAt`, `printReturnLabel`, `sourceSys`, `weight`.\n\n**Column names for `POST /receivings/filter`**:\n`id`, `asn`, `createdAt`, `slaDate`, `quantity`, `received`, `diffQuantity`, `driverCompanyOtherName`, `canceledAt`, `confirmedAt`, `unloadedAt`, `receivedAt`, `eshopReceivingId`, `deliveryNoteNumber`, `deliveryType`, `description`, `driverCompany`, `driverDispatcherContact`, `driverName`, `driverPhone`, `driverTrailerLicensePlate`, `duty`, `estimatedDelivery`, `status`, `supplier`, `trackingNumber`, `unitsAmount`, `urgent`, `eshopNote`, `asnLabelEmail`, `priority`, `containerNumber`, `announcedPalletsCount`, `receivingType`, `realDelivery`, `slaSuspended`, `photoDocumentationTaken`, `deliveredPalletsCount`, `deliveredCartonsCount`, `incoterms`, `returnedEurPalletsCount`, `deliveredStandardPalletsCount`, `returnedStandardPalletsCount`, `deliveredOtherPalletsCount`, `deliveredBrokenPalletsCount`, `skladonNote`.\n\n**Column names for `POST /returns/filter`**:\n`id`, `description`, `eshopReturnId`, `eshopOrderId`, `note`, `orderType`, `shipper`, `shipperServiceCode`, `status`, `trackingNumber`, `rma`, `createdAt`, `eshopNote`, `canceledAt`, `confirmedAt`, `receivedAt`, `sourceSys`, `transportPaidBy`, `orderId`, `partnerOrderId`, `recipientName`, `senderStreet`, `senderCity`, `senderState`, `senderPostcode`, `senderPhone`, `orderShipper`, `orderShipperServiceCode`, `orderTrackingNumber`.\n\n**Column names for `POST /claims/filter`**:\n`id`, `fcn`, `eshopClaimId`, `eshopOrderId`, `orderId`, `orderType`, `shipper`, `trackingNumber`, `returnTrackingNumber`, `cctv`, `description`, `note`, `claimCause`, `causeOtherType`, `status`, `createdAt`, `closedAt`, `inProcessAt`, `moreInfoNeededAt`, `informationAddedAt`, `rejectedAt`, `canceledAt`, `acceptedExpectCompensationAt`, `acceptedPendingClientCompensationAt`, `resolutionText`, `resolver`, `transportPrice`, `goodsPrice`, `totalServicePrice`, `compensationCurrency`, `eshopNote`.\n\n**Column names for `POST /stock-movements/filter`**:\n`count`, `createdAt`, `updatedAt`, `expirationDate`, `id`, `lot`, `sku`, `type`.\n","properties":{"page":{"type":"integer","minimum":1,"default":1},"items":{"type":"integer","minimum":1,"maximum":1000,"default":10},"columns":{"type":"array","items":{"type":"string"}},"sorts":{"type":"array","items":{"type":"object","required":["column","direction"],"properties":{"column":{"type":"string"},"direction":{"type":"string","enum":["ASC","DESC","asc","desc"]}}}},"filters":{"type":"array","description":"Outer array = OR of groups. Each inner array = AND of `{ column, operator, value }`.\nOperators and allowed `column` values are documented on `V21GridRequestGeneric`.\n","items":{"type":"array","items":{"type":"object","required":["column","operator","value"],"properties":{"column":{"type":"string"},"operator":{"type":"string","description":"Filter operator; see `V21GridRequestGeneric` for the full list.\nStock-movement filters also support `likein`.\n"},"value":{"description":"Scalar, array, or null — depends on operator (e.g. `in`/`nin`/`between` use arrays)."}}}}}}}}},"paths":{"/products/filter":{"post":{"tags":["Products"],"summary":"Filter products (grid)","description":"Paged product search. Body: `#/definitions/V21GridRequestGeneric`.\nUse **product** column names in `columns`, `sorts[].column`, and filter `column` (listed under that definition).\n","operationId":"v21_postProductsFilter","parameters":[{"$ref":"#/components/parameters/HeaderXApiKey"},{"$ref":"#/components/parameters/HeaderAuthorization"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/V21GenericGridResponse"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessageResponse"}}}}},"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/V21GridRequestGeneric"}}},"required":true}}}}}
```

## Create product

> For a \*\*bundle/set\*\* (\`productType\` \`pack\`), \*\*\`productSetItems\` is required\*\* (≥1 component line: \`sku\` + \`count\`).\
> Do not send \`scanSerialNumber\`.<br>

```json
{"openapi":"3.1.1","info":{"title":"GWMS API v2.1 (v21)","version":"2.1.0"},"tags":[{"name":"Products","description":"Products, availability, grid (no separate product-sets endpoints)"}],"servers":[{"url":"https://gw.new.skladon.net/v21"}],"security":[{"authorization":[],"XApiKey":[]}],"components":{"securitySchemes":{"authorization":{"type":"apiKey","name":"authorization","in":"header"}},"parameters":{"HeaderXApiKey":{"schema":{"type":"string"},"name":"x-api-key","in":"header","required":true,"description":"Eshop API key from onboarding"},"HeaderAuthorization":{"schema":{"type":"string"},"name":"authorization","in":"header","required":true,"description":"Bearer JWT from POST /v21/users/login"}},"schemas":{"V21ProductResponseEnvelope":{"type":"object","required":["statusCode","message"],"properties":{"statusCode":{"type":"number"},"message":{"type":"string"},"data":{"$ref":"#/components/schemas/V21ProductResponse"}}},"V21ProductResponse":{"allOf":[{"$ref":"#/components/schemas/V21ProductCreate"},{"type":"object","properties":{"id":{"type":"integer"},"eanLockedByDcix":{"type":"integer","enum":[0,1],"readOnly":true,"description":"Read-only. 1 = EANs of this product are managed by Skladon, so `ean` and `eans` sent by the eshop are ignored unless your API key has the special EAN edit permission."},"weight":{"type":"number"},"width":{"type":"number"},"height":{"type":"number"},"length":{"type":"number"},"insertToProductSkus":{"type":"array","items":{"type":"string"}},"insertToCountries":{"type":"array","items":{"type":"string","minLength":2,"maxLength":2}},"insertType":{"type":"string"},"insertByOrderType":{"type":"string","enum":["all","b2c","b2b"]},"insertPriceFrom":{"type":"number"},"insertPriceTo":{"type":"number"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"},"dimensionsChangedAt":{"type":"string"},"deletedAt":{"type":"string"},"quantityConversion":{"type":"integer"},"isDeleted":{"type":"boolean","description":"Whether the product has been soft-deleted."},"sourceSys":{"type":"string","description":"System the product record originated from."}}}]},"V21ProductCreate":{"type":"object","required":["sku","name","expMethod","productType","active","scanImeiSn"],"properties":{"sku":{"type":"string","minLength":1},"guid":{"type":"string"},"name":{"type":"string","minLength":1},"description":{"type":"string"},"price":{"type":"number"},"hsCode":{"type":"string"},"upc":{"type":"string"},"ean":{"type":"string"},"eans":{"type":"array","items":{"$ref":"#/components/schemas/V21ProductEan"},"description":"All EANs of the product (active and inactive). The array replaces the current list. Ignored for products with `eanLockedByDcix` = 1 unless your API key has the special EAN edit permission."},"rop":{"type":"integer","default":0},"expMethod":{"type":"string","enum":["FIFO","FEFO"]},"mpn":{"type":"string"},"isbn":{"type":"string"},"note":{"type":"string"},"productType":{"type":"string","enum":["pack","packagingMaterial","semiProduct","finalProduct","promoMaterial","virtual","serviceProduct"]},"customField1":{"type":"string"},"customField2":{"type":"string"},"customField3":{"type":"string"},"ageCheck":{"type":"boolean","default":false},"active":{"type":"boolean"},"scanImeiSn":{"type":"integer","enum":[0,1,2],"description":"Scan mode: 0=No scanning, 1=Serial numbers, 2=IMEI (with automatic regex ^[0-9]{14,16}$ when snRegex is empty). Same as GWMS v2."},"originCountry":{"type":"string"},"isDeleted":{"type":"boolean"},"batteryType":{"type":"string","enum":["no","device","device_lr41","package","alone"]},"snRegex":{"type":"string","default":""},"unitPrice":{"type":"string","description":"Product currency code (ISO 4217, 3 letters). Null or empty string allowed."},"expirationDays":{"type":"integer","default":0},"productSetItems":{"type":"array","items":{"$ref":"#/components/schemas/V21ProductSetItem"},"description":"Component lines for a **pack** (`productType` `pack`): **required on create** (at least one line with `sku` and `count`).\nOn **PATCH**, required when the body sets `productType` to `pack` (same request must include non-empty `productSetItems`).\nIf you send a non-empty array with any other `productType`, the API returns **400** (ignored by core would be misleading).\n"},"files":{"type":"array","items":{"$ref":"#/components/schemas/V21ProductAttachmentFile"}}}},"V21ProductEan":{"type":"object","required":["ean","active"],"properties":{"ean":{"type":"string","minLength":1,"description":"EAN barcode value."},"active":{"type":"boolean","description":"Inactive EANs stay in history but are not used for scanning."}}},"V21ProductSetItem":{"type":"object","required":["sku","count"],"properties":{"sku":{"type":"string","minLength":1},"count":{"type":"integer","minimum":1}}},"V21ProductAttachmentFile":{"type":"object","required":["type","fileName","fileType"],"properties":{"id":{"type":"integer","minimum":1},"data":{"type":"string"},"type":{"type":"string","enum":["instruction","label","other"]},"fileName":{"type":"string","minLength":1},"fileType":{"type":"string","minLength":1},"fileSize":{"type":"string"},"createdAt":{"type":"string","format":"date-time","description":"Upload timestamp from files.CREATED_AT"},"creatorRole":{"type":"string","enum":["skladon_employee","client"],"description":"Who uploaded the file (Skladon employee or client)"}}},"ErrorMessageResponse":{"type":"object","description":"Shape of every 4xx and 5xx response under `/v21`. See the \"Error response format\" section in the API description.","properties":{"statusCode":{"type":"number","description":"Repeats the HTTP status code of the response."},"error":{"type":"string","description":"Standard HTTP status text for `statusCode`."},"message":{"type":"string","description":"Human readable detail of what went wrong."}},"required":["statusCode","error","message"]}}},"paths":{"/products":{"post":{"tags":["Products"],"summary":"Create product","description":"For a **bundle/set** (`productType` `pack`), **`productSetItems` is required** (≥1 component line: `sku` + `count`).\nDo not send `scanSerialNumber`.\n","operationId":"v21_postProducts","parameters":[{"$ref":"#/components/parameters/HeaderXApiKey"},{"$ref":"#/components/parameters/HeaderAuthorization"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/V21ProductResponseEnvelope"}}}},"400":{"description":"Zod validation or Core error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessageResponse"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessageResponse"}}}}},"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/V21ProductCreate"}}},"required":true}}}}}
```

## GET /products/{sku}

> Get product by SKU

```json
{"openapi":"3.1.1","info":{"title":"GWMS API v2.1 (v21)","version":"2.1.0"},"tags":[{"name":"Products","description":"Products, availability, grid (no separate product-sets endpoints)"}],"servers":[{"url":"https://gw.new.skladon.net/v21"}],"security":[{"authorization":[],"XApiKey":[]}],"components":{"securitySchemes":{"authorization":{"type":"apiKey","name":"authorization","in":"header"}},"schemas":{"V21ProductResponseEnvelope":{"type":"object","required":["statusCode","message"],"properties":{"statusCode":{"type":"number"},"message":{"type":"string"},"data":{"$ref":"#/components/schemas/V21ProductResponse"}}},"V21ProductResponse":{"allOf":[{"$ref":"#/components/schemas/V21ProductCreate"},{"type":"object","properties":{"id":{"type":"integer"},"eanLockedByDcix":{"type":"integer","enum":[0,1],"readOnly":true,"description":"Read-only. 1 = EANs of this product are managed by Skladon, so `ean` and `eans` sent by the eshop are ignored unless your API key has the special EAN edit permission."},"weight":{"type":"number"},"width":{"type":"number"},"height":{"type":"number"},"length":{"type":"number"},"insertToProductSkus":{"type":"array","items":{"type":"string"}},"insertToCountries":{"type":"array","items":{"type":"string","minLength":2,"maxLength":2}},"insertType":{"type":"string"},"insertByOrderType":{"type":"string","enum":["all","b2c","b2b"]},"insertPriceFrom":{"type":"number"},"insertPriceTo":{"type":"number"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"},"dimensionsChangedAt":{"type":"string"},"deletedAt":{"type":"string"},"quantityConversion":{"type":"integer"},"isDeleted":{"type":"boolean","description":"Whether the product has been soft-deleted."},"sourceSys":{"type":"string","description":"System the product record originated from."}}}]},"V21ProductCreate":{"type":"object","required":["sku","name","expMethod","productType","active","scanImeiSn"],"properties":{"sku":{"type":"string","minLength":1},"guid":{"type":"string"},"name":{"type":"string","minLength":1},"description":{"type":"string"},"price":{"type":"number"},"hsCode":{"type":"string"},"upc":{"type":"string"},"ean":{"type":"string"},"eans":{"type":"array","items":{"$ref":"#/components/schemas/V21ProductEan"},"description":"All EANs of the product (active and inactive). The array replaces the current list. Ignored for products with `eanLockedByDcix` = 1 unless your API key has the special EAN edit permission."},"rop":{"type":"integer","default":0},"expMethod":{"type":"string","enum":["FIFO","FEFO"]},"mpn":{"type":"string"},"isbn":{"type":"string"},"note":{"type":"string"},"productType":{"type":"string","enum":["pack","packagingMaterial","semiProduct","finalProduct","promoMaterial","virtual","serviceProduct"]},"customField1":{"type":"string"},"customField2":{"type":"string"},"customField3":{"type":"string"},"ageCheck":{"type":"boolean","default":false},"active":{"type":"boolean"},"scanImeiSn":{"type":"integer","enum":[0,1,2],"description":"Scan mode: 0=No scanning, 1=Serial numbers, 2=IMEI (with automatic regex ^[0-9]{14,16}$ when snRegex is empty). Same as GWMS v2."},"originCountry":{"type":"string"},"isDeleted":{"type":"boolean"},"batteryType":{"type":"string","enum":["no","device","device_lr41","package","alone"]},"snRegex":{"type":"string","default":""},"unitPrice":{"type":"string","description":"Product currency code (ISO 4217, 3 letters). Null or empty string allowed."},"expirationDays":{"type":"integer","default":0},"productSetItems":{"type":"array","items":{"$ref":"#/components/schemas/V21ProductSetItem"},"description":"Component lines for a **pack** (`productType` `pack`): **required on create** (at least one line with `sku` and `count`).\nOn **PATCH**, required when the body sets `productType` to `pack` (same request must include non-empty `productSetItems`).\nIf you send a non-empty array with any other `productType`, the API returns **400** (ignored by core would be misleading).\n"},"files":{"type":"array","items":{"$ref":"#/components/schemas/V21ProductAttachmentFile"}}}},"V21ProductEan":{"type":"object","required":["ean","active"],"properties":{"ean":{"type":"string","minLength":1,"description":"EAN barcode value."},"active":{"type":"boolean","description":"Inactive EANs stay in history but are not used for scanning."}}},"V21ProductSetItem":{"type":"object","required":["sku","count"],"properties":{"sku":{"type":"string","minLength":1},"count":{"type":"integer","minimum":1}}},"V21ProductAttachmentFile":{"type":"object","required":["type","fileName","fileType"],"properties":{"id":{"type":"integer","minimum":1},"data":{"type":"string"},"type":{"type":"string","enum":["instruction","label","other"]},"fileName":{"type":"string","minLength":1},"fileType":{"type":"string","minLength":1},"fileSize":{"type":"string"},"createdAt":{"type":"string","format":"date-time","description":"Upload timestamp from files.CREATED_AT"},"creatorRole":{"type":"string","enum":["skladon_employee","client"],"description":"Who uploaded the file (Skladon employee or client)"}}},"ErrorMessageResponse":{"type":"object","description":"Shape of every 4xx and 5xx response under `/v21`. See the \"Error response format\" section in the API description.","properties":{"statusCode":{"type":"number","description":"Repeats the HTTP status code of the response."},"error":{"type":"string","description":"Standard HTTP status text for `statusCode`."},"message":{"type":"string","description":"Human readable detail of what went wrong."}},"required":["statusCode","error","message"]}}},"paths":{"/products/{sku}":{"get":{"tags":["Products"],"summary":"Get product by SKU","operationId":"v21_getProductBySku","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/V21ProductResponseEnvelope"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessageResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessageResponse"}}}}}}}}}
```

## GET /products/guid/{guid}

> Get product by GUID

```json
{"openapi":"3.1.1","info":{"title":"GWMS API v2.1 (v21)","version":"2.1.0"},"tags":[{"name":"Products","description":"Products, availability, grid (no separate product-sets endpoints)"}],"servers":[{"url":"https://gw.new.skladon.net/v21"}],"security":[{"authorization":[],"XApiKey":[]}],"components":{"securitySchemes":{"authorization":{"type":"apiKey","name":"authorization","in":"header"}},"schemas":{"V21ProductResponseEnvelope":{"type":"object","required":["statusCode","message"],"properties":{"statusCode":{"type":"number"},"message":{"type":"string"},"data":{"$ref":"#/components/schemas/V21ProductResponse"}}},"V21ProductResponse":{"allOf":[{"$ref":"#/components/schemas/V21ProductCreate"},{"type":"object","properties":{"id":{"type":"integer"},"eanLockedByDcix":{"type":"integer","enum":[0,1],"readOnly":true,"description":"Read-only. 1 = EANs of this product are managed by Skladon, so `ean` and `eans` sent by the eshop are ignored unless your API key has the special EAN edit permission."},"weight":{"type":"number"},"width":{"type":"number"},"height":{"type":"number"},"length":{"type":"number"},"insertToProductSkus":{"type":"array","items":{"type":"string"}},"insertToCountries":{"type":"array","items":{"type":"string","minLength":2,"maxLength":2}},"insertType":{"type":"string"},"insertByOrderType":{"type":"string","enum":["all","b2c","b2b"]},"insertPriceFrom":{"type":"number"},"insertPriceTo":{"type":"number"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"},"dimensionsChangedAt":{"type":"string"},"deletedAt":{"type":"string"},"quantityConversion":{"type":"integer"},"isDeleted":{"type":"boolean","description":"Whether the product has been soft-deleted."},"sourceSys":{"type":"string","description":"System the product record originated from."}}}]},"V21ProductCreate":{"type":"object","required":["sku","name","expMethod","productType","active","scanImeiSn"],"properties":{"sku":{"type":"string","minLength":1},"guid":{"type":"string"},"name":{"type":"string","minLength":1},"description":{"type":"string"},"price":{"type":"number"},"hsCode":{"type":"string"},"upc":{"type":"string"},"ean":{"type":"string"},"eans":{"type":"array","items":{"$ref":"#/components/schemas/V21ProductEan"},"description":"All EANs of the product (active and inactive). The array replaces the current list. Ignored for products with `eanLockedByDcix` = 1 unless your API key has the special EAN edit permission."},"rop":{"type":"integer","default":0},"expMethod":{"type":"string","enum":["FIFO","FEFO"]},"mpn":{"type":"string"},"isbn":{"type":"string"},"note":{"type":"string"},"productType":{"type":"string","enum":["pack","packagingMaterial","semiProduct","finalProduct","promoMaterial","virtual","serviceProduct"]},"customField1":{"type":"string"},"customField2":{"type":"string"},"customField3":{"type":"string"},"ageCheck":{"type":"boolean","default":false},"active":{"type":"boolean"},"scanImeiSn":{"type":"integer","enum":[0,1,2],"description":"Scan mode: 0=No scanning, 1=Serial numbers, 2=IMEI (with automatic regex ^[0-9]{14,16}$ when snRegex is empty). Same as GWMS v2."},"originCountry":{"type":"string"},"isDeleted":{"type":"boolean"},"batteryType":{"type":"string","enum":["no","device","device_lr41","package","alone"]},"snRegex":{"type":"string","default":""},"unitPrice":{"type":"string","description":"Product currency code (ISO 4217, 3 letters). Null or empty string allowed."},"expirationDays":{"type":"integer","default":0},"productSetItems":{"type":"array","items":{"$ref":"#/components/schemas/V21ProductSetItem"},"description":"Component lines for a **pack** (`productType` `pack`): **required on create** (at least one line with `sku` and `count`).\nOn **PATCH**, required when the body sets `productType` to `pack` (same request must include non-empty `productSetItems`).\nIf you send a non-empty array with any other `productType`, the API returns **400** (ignored by core would be misleading).\n"},"files":{"type":"array","items":{"$ref":"#/components/schemas/V21ProductAttachmentFile"}}}},"V21ProductEan":{"type":"object","required":["ean","active"],"properties":{"ean":{"type":"string","minLength":1,"description":"EAN barcode value."},"active":{"type":"boolean","description":"Inactive EANs stay in history but are not used for scanning."}}},"V21ProductSetItem":{"type":"object","required":["sku","count"],"properties":{"sku":{"type":"string","minLength":1},"count":{"type":"integer","minimum":1}}},"V21ProductAttachmentFile":{"type":"object","required":["type","fileName","fileType"],"properties":{"id":{"type":"integer","minimum":1},"data":{"type":"string"},"type":{"type":"string","enum":["instruction","label","other"]},"fileName":{"type":"string","minLength":1},"fileType":{"type":"string","minLength":1},"fileSize":{"type":"string"},"createdAt":{"type":"string","format":"date-time","description":"Upload timestamp from files.CREATED_AT"},"creatorRole":{"type":"string","enum":["skladon_employee","client"],"description":"Who uploaded the file (Skladon employee or client)"}}},"ErrorMessageResponse":{"type":"object","description":"Shape of every 4xx and 5xx response under `/v21`. See the \"Error response format\" section in the API description.","properties":{"statusCode":{"type":"number","description":"Repeats the HTTP status code of the response."},"error":{"type":"string","description":"Standard HTTP status text for `statusCode`."},"message":{"type":"string","description":"Human readable detail of what went wrong."}},"required":["statusCode","error","message"]}}},"paths":{"/products/guid/{guid}":{"get":{"tags":["Products"],"summary":"Get product by GUID","operationId":"v21_getProductByGuid","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/V21ProductResponseEnvelope"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessageResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessageResponse"}}}}}}}}}
```

## PUT /products/guid/{guid}

> Update product by GUID

```json
{"openapi":"3.1.1","info":{"title":"GWMS API v2.1 (v21)","version":"2.1.0"},"tags":[{"name":"Products","description":"Products, availability, grid (no separate product-sets endpoints)"}],"servers":[{"url":"https://gw.new.skladon.net/v21"}],"security":[{"authorization":[],"XApiKey":[]}],"components":{"securitySchemes":{"authorization":{"type":"apiKey","name":"authorization","in":"header"}},"schemas":{"V21ProductResponseEnvelope":{"type":"object","required":["statusCode","message"],"properties":{"statusCode":{"type":"number"},"message":{"type":"string"},"data":{"$ref":"#/components/schemas/V21ProductResponse"}}},"V21ProductResponse":{"allOf":[{"$ref":"#/components/schemas/V21ProductCreate"},{"type":"object","properties":{"id":{"type":"integer"},"eanLockedByDcix":{"type":"integer","enum":[0,1],"readOnly":true,"description":"Read-only. 1 = EANs of this product are managed by Skladon, so `ean` and `eans` sent by the eshop are ignored unless your API key has the special EAN edit permission."},"weight":{"type":"number"},"width":{"type":"number"},"height":{"type":"number"},"length":{"type":"number"},"insertToProductSkus":{"type":"array","items":{"type":"string"}},"insertToCountries":{"type":"array","items":{"type":"string","minLength":2,"maxLength":2}},"insertType":{"type":"string"},"insertByOrderType":{"type":"string","enum":["all","b2c","b2b"]},"insertPriceFrom":{"type":"number"},"insertPriceTo":{"type":"number"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"},"dimensionsChangedAt":{"type":"string"},"deletedAt":{"type":"string"},"quantityConversion":{"type":"integer"},"isDeleted":{"type":"boolean","description":"Whether the product has been soft-deleted."},"sourceSys":{"type":"string","description":"System the product record originated from."}}}]},"V21ProductCreate":{"type":"object","required":["sku","name","expMethod","productType","active","scanImeiSn"],"properties":{"sku":{"type":"string","minLength":1},"guid":{"type":"string"},"name":{"type":"string","minLength":1},"description":{"type":"string"},"price":{"type":"number"},"hsCode":{"type":"string"},"upc":{"type":"string"},"ean":{"type":"string"},"eans":{"type":"array","items":{"$ref":"#/components/schemas/V21ProductEan"},"description":"All EANs of the product (active and inactive). The array replaces the current list. Ignored for products with `eanLockedByDcix` = 1 unless your API key has the special EAN edit permission."},"rop":{"type":"integer","default":0},"expMethod":{"type":"string","enum":["FIFO","FEFO"]},"mpn":{"type":"string"},"isbn":{"type":"string"},"note":{"type":"string"},"productType":{"type":"string","enum":["pack","packagingMaterial","semiProduct","finalProduct","promoMaterial","virtual","serviceProduct"]},"customField1":{"type":"string"},"customField2":{"type":"string"},"customField3":{"type":"string"},"ageCheck":{"type":"boolean","default":false},"active":{"type":"boolean"},"scanImeiSn":{"type":"integer","enum":[0,1,2],"description":"Scan mode: 0=No scanning, 1=Serial numbers, 2=IMEI (with automatic regex ^[0-9]{14,16}$ when snRegex is empty). Same as GWMS v2."},"originCountry":{"type":"string"},"isDeleted":{"type":"boolean"},"batteryType":{"type":"string","enum":["no","device","device_lr41","package","alone"]},"snRegex":{"type":"string","default":""},"unitPrice":{"type":"string","description":"Product currency code (ISO 4217, 3 letters). Null or empty string allowed."},"expirationDays":{"type":"integer","default":0},"productSetItems":{"type":"array","items":{"$ref":"#/components/schemas/V21ProductSetItem"},"description":"Component lines for a **pack** (`productType` `pack`): **required on create** (at least one line with `sku` and `count`).\nOn **PATCH**, required when the body sets `productType` to `pack` (same request must include non-empty `productSetItems`).\nIf you send a non-empty array with any other `productType`, the API returns **400** (ignored by core would be misleading).\n"},"files":{"type":"array","items":{"$ref":"#/components/schemas/V21ProductAttachmentFile"}}}},"V21ProductEan":{"type":"object","required":["ean","active"],"properties":{"ean":{"type":"string","minLength":1,"description":"EAN barcode value."},"active":{"type":"boolean","description":"Inactive EANs stay in history but are not used for scanning."}}},"V21ProductSetItem":{"type":"object","required":["sku","count"],"properties":{"sku":{"type":"string","minLength":1},"count":{"type":"integer","minimum":1}}},"V21ProductAttachmentFile":{"type":"object","required":["type","fileName","fileType"],"properties":{"id":{"type":"integer","minimum":1},"data":{"type":"string"},"type":{"type":"string","enum":["instruction","label","other"]},"fileName":{"type":"string","minLength":1},"fileType":{"type":"string","minLength":1},"fileSize":{"type":"string"},"createdAt":{"type":"string","format":"date-time","description":"Upload timestamp from files.CREATED_AT"},"creatorRole":{"type":"string","enum":["skladon_employee","client"],"description":"Who uploaded the file (Skladon employee or client)"}}},"ErrorMessageResponse":{"type":"object","description":"Shape of every 4xx and 5xx response under `/v21`. See the \"Error response format\" section in the API description.","properties":{"statusCode":{"type":"number","description":"Repeats the HTTP status code of the response."},"error":{"type":"string","description":"Standard HTTP status text for `statusCode`."},"message":{"type":"string","description":"Human readable detail of what went wrong."}},"required":["statusCode","error","message"]}}},"paths":{"/products/guid/{guid}":{"put":{"tags":["Products"],"summary":"Update product by GUID","operationId":"v21_putProductByGuid","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/V21ProductResponseEnvelope"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessageResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessageResponse"}}}}},"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/V21ProductCreate"}}},"required":true}}}}}
```

## PUT /products/{sku}

> Update product by SKU (full body)

```json
{"openapi":"3.1.1","info":{"title":"GWMS API v2.1 (v21)","version":"2.1.0"},"tags":[{"name":"Products","description":"Products, availability, grid (no separate product-sets endpoints)"}],"servers":[{"url":"https://gw.new.skladon.net/v21"}],"security":[{"authorization":[],"XApiKey":[]}],"components":{"securitySchemes":{"authorization":{"type":"apiKey","name":"authorization","in":"header"}},"schemas":{"V21ProductResponseEnvelope":{"type":"object","required":["statusCode","message"],"properties":{"statusCode":{"type":"number"},"message":{"type":"string"},"data":{"$ref":"#/components/schemas/V21ProductResponse"}}},"V21ProductResponse":{"allOf":[{"$ref":"#/components/schemas/V21ProductCreate"},{"type":"object","properties":{"id":{"type":"integer"},"eanLockedByDcix":{"type":"integer","enum":[0,1],"readOnly":true,"description":"Read-only. 1 = EANs of this product are managed by Skladon, so `ean` and `eans` sent by the eshop are ignored unless your API key has the special EAN edit permission."},"weight":{"type":"number"},"width":{"type":"number"},"height":{"type":"number"},"length":{"type":"number"},"insertToProductSkus":{"type":"array","items":{"type":"string"}},"insertToCountries":{"type":"array","items":{"type":"string","minLength":2,"maxLength":2}},"insertType":{"type":"string"},"insertByOrderType":{"type":"string","enum":["all","b2c","b2b"]},"insertPriceFrom":{"type":"number"},"insertPriceTo":{"type":"number"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"},"dimensionsChangedAt":{"type":"string"},"deletedAt":{"type":"string"},"quantityConversion":{"type":"integer"},"isDeleted":{"type":"boolean","description":"Whether the product has been soft-deleted."},"sourceSys":{"type":"string","description":"System the product record originated from."}}}]},"V21ProductCreate":{"type":"object","required":["sku","name","expMethod","productType","active","scanImeiSn"],"properties":{"sku":{"type":"string","minLength":1},"guid":{"type":"string"},"name":{"type":"string","minLength":1},"description":{"type":"string"},"price":{"type":"number"},"hsCode":{"type":"string"},"upc":{"type":"string"},"ean":{"type":"string"},"eans":{"type":"array","items":{"$ref":"#/components/schemas/V21ProductEan"},"description":"All EANs of the product (active and inactive). The array replaces the current list. Ignored for products with `eanLockedByDcix` = 1 unless your API key has the special EAN edit permission."},"rop":{"type":"integer","default":0},"expMethod":{"type":"string","enum":["FIFO","FEFO"]},"mpn":{"type":"string"},"isbn":{"type":"string"},"note":{"type":"string"},"productType":{"type":"string","enum":["pack","packagingMaterial","semiProduct","finalProduct","promoMaterial","virtual","serviceProduct"]},"customField1":{"type":"string"},"customField2":{"type":"string"},"customField3":{"type":"string"},"ageCheck":{"type":"boolean","default":false},"active":{"type":"boolean"},"scanImeiSn":{"type":"integer","enum":[0,1,2],"description":"Scan mode: 0=No scanning, 1=Serial numbers, 2=IMEI (with automatic regex ^[0-9]{14,16}$ when snRegex is empty). Same as GWMS v2."},"originCountry":{"type":"string"},"isDeleted":{"type":"boolean"},"batteryType":{"type":"string","enum":["no","device","device_lr41","package","alone"]},"snRegex":{"type":"string","default":""},"unitPrice":{"type":"string","description":"Product currency code (ISO 4217, 3 letters). Null or empty string allowed."},"expirationDays":{"type":"integer","default":0},"productSetItems":{"type":"array","items":{"$ref":"#/components/schemas/V21ProductSetItem"},"description":"Component lines for a **pack** (`productType` `pack`): **required on create** (at least one line with `sku` and `count`).\nOn **PATCH**, required when the body sets `productType` to `pack` (same request must include non-empty `productSetItems`).\nIf you send a non-empty array with any other `productType`, the API returns **400** (ignored by core would be misleading).\n"},"files":{"type":"array","items":{"$ref":"#/components/schemas/V21ProductAttachmentFile"}}}},"V21ProductEan":{"type":"object","required":["ean","active"],"properties":{"ean":{"type":"string","minLength":1,"description":"EAN barcode value."},"active":{"type":"boolean","description":"Inactive EANs stay in history but are not used for scanning."}}},"V21ProductSetItem":{"type":"object","required":["sku","count"],"properties":{"sku":{"type":"string","minLength":1},"count":{"type":"integer","minimum":1}}},"V21ProductAttachmentFile":{"type":"object","required":["type","fileName","fileType"],"properties":{"id":{"type":"integer","minimum":1},"data":{"type":"string"},"type":{"type":"string","enum":["instruction","label","other"]},"fileName":{"type":"string","minLength":1},"fileType":{"type":"string","minLength":1},"fileSize":{"type":"string"},"createdAt":{"type":"string","format":"date-time","description":"Upload timestamp from files.CREATED_AT"},"creatorRole":{"type":"string","enum":["skladon_employee","client"],"description":"Who uploaded the file (Skladon employee or client)"}}},"ErrorMessageResponse":{"type":"object","description":"Shape of every 4xx and 5xx response under `/v21`. See the \"Error response format\" section in the API description.","properties":{"statusCode":{"type":"number","description":"Repeats the HTTP status code of the response."},"error":{"type":"string","description":"Standard HTTP status text for `statusCode`."},"message":{"type":"string","description":"Human readable detail of what went wrong."}},"required":["statusCode","error","message"]}}},"paths":{"/products/{sku}":{"put":{"tags":["Products"],"summary":"Update product by SKU (full body)","operationId":"v21_putProductBySku","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/V21ProductResponseEnvelope"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessageResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessageResponse"}}}},"409":{"description":"Request conflicts with the current state of the entity","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessageResponse"}}}}},"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/V21ProductCreate"}}},"required":true}}}}}
```

## PATCH /products/guid/{guid}

> Patch product by GUID

```json
{"openapi":"3.1.1","info":{"title":"GWMS API v2.1 (v21)","version":"2.1.0"},"tags":[{"name":"Products","description":"Products, availability, grid (no separate product-sets endpoints)"}],"servers":[{"url":"https://gw.new.skladon.net/v21"}],"security":[{"authorization":[],"XApiKey":[]}],"components":{"securitySchemes":{"authorization":{"type":"apiKey","name":"authorization","in":"header"}},"schemas":{"V21ProductResponseEnvelope":{"type":"object","required":["statusCode","message"],"properties":{"statusCode":{"type":"number"},"message":{"type":"string"},"data":{"$ref":"#/components/schemas/V21ProductResponse"}}},"V21ProductResponse":{"allOf":[{"$ref":"#/components/schemas/V21ProductCreate"},{"type":"object","properties":{"id":{"type":"integer"},"eanLockedByDcix":{"type":"integer","enum":[0,1],"readOnly":true,"description":"Read-only. 1 = EANs of this product are managed by Skladon, so `ean` and `eans` sent by the eshop are ignored unless your API key has the special EAN edit permission."},"weight":{"type":"number"},"width":{"type":"number"},"height":{"type":"number"},"length":{"type":"number"},"insertToProductSkus":{"type":"array","items":{"type":"string"}},"insertToCountries":{"type":"array","items":{"type":"string","minLength":2,"maxLength":2}},"insertType":{"type":"string"},"insertByOrderType":{"type":"string","enum":["all","b2c","b2b"]},"insertPriceFrom":{"type":"number"},"insertPriceTo":{"type":"number"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"},"dimensionsChangedAt":{"type":"string"},"deletedAt":{"type":"string"},"quantityConversion":{"type":"integer"},"isDeleted":{"type":"boolean","description":"Whether the product has been soft-deleted."},"sourceSys":{"type":"string","description":"System the product record originated from."}}}]},"V21ProductCreate":{"type":"object","required":["sku","name","expMethod","productType","active","scanImeiSn"],"properties":{"sku":{"type":"string","minLength":1},"guid":{"type":"string"},"name":{"type":"string","minLength":1},"description":{"type":"string"},"price":{"type":"number"},"hsCode":{"type":"string"},"upc":{"type":"string"},"ean":{"type":"string"},"eans":{"type":"array","items":{"$ref":"#/components/schemas/V21ProductEan"},"description":"All EANs of the product (active and inactive). The array replaces the current list. Ignored for products with `eanLockedByDcix` = 1 unless your API key has the special EAN edit permission."},"rop":{"type":"integer","default":0},"expMethod":{"type":"string","enum":["FIFO","FEFO"]},"mpn":{"type":"string"},"isbn":{"type":"string"},"note":{"type":"string"},"productType":{"type":"string","enum":["pack","packagingMaterial","semiProduct","finalProduct","promoMaterial","virtual","serviceProduct"]},"customField1":{"type":"string"},"customField2":{"type":"string"},"customField3":{"type":"string"},"ageCheck":{"type":"boolean","default":false},"active":{"type":"boolean"},"scanImeiSn":{"type":"integer","enum":[0,1,2],"description":"Scan mode: 0=No scanning, 1=Serial numbers, 2=IMEI (with automatic regex ^[0-9]{14,16}$ when snRegex is empty). Same as GWMS v2."},"originCountry":{"type":"string"},"isDeleted":{"type":"boolean"},"batteryType":{"type":"string","enum":["no","device","device_lr41","package","alone"]},"snRegex":{"type":"string","default":""},"unitPrice":{"type":"string","description":"Product currency code (ISO 4217, 3 letters). Null or empty string allowed."},"expirationDays":{"type":"integer","default":0},"productSetItems":{"type":"array","items":{"$ref":"#/components/schemas/V21ProductSetItem"},"description":"Component lines for a **pack** (`productType` `pack`): **required on create** (at least one line with `sku` and `count`).\nOn **PATCH**, required when the body sets `productType` to `pack` (same request must include non-empty `productSetItems`).\nIf you send a non-empty array with any other `productType`, the API returns **400** (ignored by core would be misleading).\n"},"files":{"type":"array","items":{"$ref":"#/components/schemas/V21ProductAttachmentFile"}}}},"V21ProductEan":{"type":"object","required":["ean","active"],"properties":{"ean":{"type":"string","minLength":1,"description":"EAN barcode value."},"active":{"type":"boolean","description":"Inactive EANs stay in history but are not used for scanning."}}},"V21ProductSetItem":{"type":"object","required":["sku","count"],"properties":{"sku":{"type":"string","minLength":1},"count":{"type":"integer","minimum":1}}},"V21ProductAttachmentFile":{"type":"object","required":["type","fileName","fileType"],"properties":{"id":{"type":"integer","minimum":1},"data":{"type":"string"},"type":{"type":"string","enum":["instruction","label","other"]},"fileName":{"type":"string","minLength":1},"fileType":{"type":"string","minLength":1},"fileSize":{"type":"string"},"createdAt":{"type":"string","format":"date-time","description":"Upload timestamp from files.CREATED_AT"},"creatorRole":{"type":"string","enum":["skladon_employee","client"],"description":"Who uploaded the file (Skladon employee or client)"}}},"ErrorMessageResponse":{"type":"object","description":"Shape of every 4xx and 5xx response under `/v21`. See the \"Error response format\" section in the API description.","properties":{"statusCode":{"type":"number","description":"Repeats the HTTP status code of the response."},"error":{"type":"string","description":"Standard HTTP status text for `statusCode`."},"message":{"type":"string","description":"Human readable detail of what went wrong."}},"required":["statusCode","error","message"]},"V21ProductPatch":{"type":"object","description":"Any non-empty subset of V21ProductCreate fields (at least one). Matches partial strict Zod.","minProperties":1,"additionalProperties":true}}},"paths":{"/products/guid/{guid}":{"patch":{"tags":["Products"],"summary":"Patch product by GUID","operationId":"v21_patchProductByGuid","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/V21ProductResponseEnvelope"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessageResponse"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessageResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessageResponse"}}}}},"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/V21ProductPatch"}}},"required":true}}}}}
```

## PATCH /products/{sku}

> Partial update product by SKU (at least one field)

```json
{"openapi":"3.1.1","info":{"title":"GWMS API v2.1 (v21)","version":"2.1.0"},"tags":[{"name":"Products","description":"Products, availability, grid (no separate product-sets endpoints)"}],"servers":[{"url":"https://gw.new.skladon.net/v21"}],"security":[{"authorization":[],"XApiKey":[]}],"components":{"securitySchemes":{"authorization":{"type":"apiKey","name":"authorization","in":"header"}},"schemas":{"V21ProductResponseEnvelope":{"type":"object","required":["statusCode","message"],"properties":{"statusCode":{"type":"number"},"message":{"type":"string"},"data":{"$ref":"#/components/schemas/V21ProductResponse"}}},"V21ProductResponse":{"allOf":[{"$ref":"#/components/schemas/V21ProductCreate"},{"type":"object","properties":{"id":{"type":"integer"},"eanLockedByDcix":{"type":"integer","enum":[0,1],"readOnly":true,"description":"Read-only. 1 = EANs of this product are managed by Skladon, so `ean` and `eans` sent by the eshop are ignored unless your API key has the special EAN edit permission."},"weight":{"type":"number"},"width":{"type":"number"},"height":{"type":"number"},"length":{"type":"number"},"insertToProductSkus":{"type":"array","items":{"type":"string"}},"insertToCountries":{"type":"array","items":{"type":"string","minLength":2,"maxLength":2}},"insertType":{"type":"string"},"insertByOrderType":{"type":"string","enum":["all","b2c","b2b"]},"insertPriceFrom":{"type":"number"},"insertPriceTo":{"type":"number"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"},"dimensionsChangedAt":{"type":"string"},"deletedAt":{"type":"string"},"quantityConversion":{"type":"integer"},"isDeleted":{"type":"boolean","description":"Whether the product has been soft-deleted."},"sourceSys":{"type":"string","description":"System the product record originated from."}}}]},"V21ProductCreate":{"type":"object","required":["sku","name","expMethod","productType","active","scanImeiSn"],"properties":{"sku":{"type":"string","minLength":1},"guid":{"type":"string"},"name":{"type":"string","minLength":1},"description":{"type":"string"},"price":{"type":"number"},"hsCode":{"type":"string"},"upc":{"type":"string"},"ean":{"type":"string"},"eans":{"type":"array","items":{"$ref":"#/components/schemas/V21ProductEan"},"description":"All EANs of the product (active and inactive). The array replaces the current list. Ignored for products with `eanLockedByDcix` = 1 unless your API key has the special EAN edit permission."},"rop":{"type":"integer","default":0},"expMethod":{"type":"string","enum":["FIFO","FEFO"]},"mpn":{"type":"string"},"isbn":{"type":"string"},"note":{"type":"string"},"productType":{"type":"string","enum":["pack","packagingMaterial","semiProduct","finalProduct","promoMaterial","virtual","serviceProduct"]},"customField1":{"type":"string"},"customField2":{"type":"string"},"customField3":{"type":"string"},"ageCheck":{"type":"boolean","default":false},"active":{"type":"boolean"},"scanImeiSn":{"type":"integer","enum":[0,1,2],"description":"Scan mode: 0=No scanning, 1=Serial numbers, 2=IMEI (with automatic regex ^[0-9]{14,16}$ when snRegex is empty). Same as GWMS v2."},"originCountry":{"type":"string"},"isDeleted":{"type":"boolean"},"batteryType":{"type":"string","enum":["no","device","device_lr41","package","alone"]},"snRegex":{"type":"string","default":""},"unitPrice":{"type":"string","description":"Product currency code (ISO 4217, 3 letters). Null or empty string allowed."},"expirationDays":{"type":"integer","default":0},"productSetItems":{"type":"array","items":{"$ref":"#/components/schemas/V21ProductSetItem"},"description":"Component lines for a **pack** (`productType` `pack`): **required on create** (at least one line with `sku` and `count`).\nOn **PATCH**, required when the body sets `productType` to `pack` (same request must include non-empty `productSetItems`).\nIf you send a non-empty array with any other `productType`, the API returns **400** (ignored by core would be misleading).\n"},"files":{"type":"array","items":{"$ref":"#/components/schemas/V21ProductAttachmentFile"}}}},"V21ProductEan":{"type":"object","required":["ean","active"],"properties":{"ean":{"type":"string","minLength":1,"description":"EAN barcode value."},"active":{"type":"boolean","description":"Inactive EANs stay in history but are not used for scanning."}}},"V21ProductSetItem":{"type":"object","required":["sku","count"],"properties":{"sku":{"type":"string","minLength":1},"count":{"type":"integer","minimum":1}}},"V21ProductAttachmentFile":{"type":"object","required":["type","fileName","fileType"],"properties":{"id":{"type":"integer","minimum":1},"data":{"type":"string"},"type":{"type":"string","enum":["instruction","label","other"]},"fileName":{"type":"string","minLength":1},"fileType":{"type":"string","minLength":1},"fileSize":{"type":"string"},"createdAt":{"type":"string","format":"date-time","description":"Upload timestamp from files.CREATED_AT"},"creatorRole":{"type":"string","enum":["skladon_employee","client"],"description":"Who uploaded the file (Skladon employee or client)"}}},"ErrorMessageResponse":{"type":"object","description":"Shape of every 4xx and 5xx response under `/v21`. See the \"Error response format\" section in the API description.","properties":{"statusCode":{"type":"number","description":"Repeats the HTTP status code of the response."},"error":{"type":"string","description":"Standard HTTP status text for `statusCode`."},"message":{"type":"string","description":"Human readable detail of what went wrong."}},"required":["statusCode","error","message"]},"V21ProductPatch":{"type":"object","description":"Any non-empty subset of V21ProductCreate fields (at least one). Matches partial strict Zod.","minProperties":1,"additionalProperties":true}}},"paths":{"/products/{sku}":{"patch":{"tags":["Products"],"summary":"Partial update product by SKU (at least one field)","operationId":"v21_patchProductBySku","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/V21ProductResponseEnvelope"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessageResponse"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessageResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessageResponse"}}}},"409":{"description":"Request conflicts with the current state of the entity","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorMessageResponse"}}}}},"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/V21ProductPatch"}}},"required":true}}}}}
```
