---
title: "Create or update product variations"
method: POST
path: "/v5/products"
tags: ["Products V5"]
---

# Create or update product variations

`POST /v5/products`

Returns a process-id to query results. The limit for the number of product variations in one request is 500.

## Headers

- `X-Request-Timestamp` string, yyyy-MM-dd'T'HH:mm:ss.SSSXXX

## Request body

- ProductVariationProductsV5[]
  - `productReference` string, required — The productReference groups all variations, that you want to combine into one product. This is not visible to the customer. The productReference can be freely assigned and may consist of maximum 50 characters. You can only use the productReference once within your product catalog. You should therefore use a value that makes sense for all variations of the product and does not refer to any specifics of a particular variation. You will find the product reference, for example, in the product overview in the portal.
  - `sku` string, required — Identifier for a product variation, provided by the partner, must be unique for a partner. It is mandatory, may consist of a maximum of 50 characters and must not contain leading or trailing spaces or non-printable Unicode control characters.
  - `ean` string, required — External identifier of a product, must be unique in a partner assortment, must not start with a 2.
  - `pzn` string — Pharmazentralnummer, a german standard for identifying pharmaceutical products.
  - `mpn` string — Manufacturer part number, may consist of a maximum of 50 characters.
  - `moin` string — Is an identifier, generated by the OTTO marketplace, for a product variation together with the associated content. Is used in the context of "Wettbewerb am Artikel" to confirm the content of the existing variation and its correctness and to put the own offer live for this variation.
  - `releaseDate` string, date-time — ISO8601 Date (e.g. 2024-08-01T08:00:00+0100) on which the product is released by the manufacturer, e.g. computer games.
  - `productDescription` ProductDescriptionProductsV5, required — Extensive description of the product.
    - `category` string, required — Denotes the assortment type of the product, like 'bag' or 'shirt'. Mandatory. Must be identical for all variants of a product. Must be present in the Category service offered via Category endpoint
    - `brandId` string, required — Denotes the brand ID of a product. Brands and the mapping of their names to brand Ids should be done using the brand endpoint. Must be present in the Brand service offered via Brand endpoint. Must be identical for all variants of a product.
    - `productLine` string — Denotes the proper name of a product, like '501'. May contain a maximum of 70 characters. If provided, it must be identical for all variants of a product.
    - `productionDate` string, date-time — Denotes the ISO8601 date of manufacture of a product variant.
    - `multiPack` boolean — If the product variant is part of a set: 'true'; otherwise 'false'
    - `bundle` boolean — If the product variant is part of a bundle: 'true'; otherwise 'false'
    - `fscCertified` boolean — If the product variant is certified by the Forest Stewardship Council: 'true'; otherwise 'false'
    - `disposal` boolean — If true, otto.de will present information about the disposal of the product (or parts of it).
    - `productUrl` string — Refers to a representation of the product variant in a shop of the partner. Should be a valid URL.
    - `description` string — Represents a textual description of a product variant. May contain HTML elements. Should contain less than 2000 characters. Relevant for SEO.
    - `bulletPoints` string[] — May contain a minimum of 3 and a maximum of 180 characters.
    - `attributes` AttributeProductsV5[] — Lists all the descriptive information about a product variant a partner can provide. Must be provided in the form of a key values pair. Will be validated against the AttributeDefinitions from Category endpoint provided by Otto market.
      - `name` string — The name of the describing attribute, like 'color' or 'size'.
      - `values` string[] — The value for the given name, like 'blue' or 'S', as a JSON array
      - `additional` boolean — true, if the attribute is not defined by the marketplace.
  - `mediaAssets` MediaAssetProductsV5[], required — A list of media assets describing this product variation. Currently these may only be static images of the types JPG or PNG with a RGB color space. Furthermore the images have to have a minimum size of 500 x 1000 pixel and a maximum width of 4500 pixel. Requirements for media assets can be found at https://account.otto.market/s/article/Vorgaben-fuer-Produktbilder
    - `type` 'IMAGE' | 'DIMENSIONAL_DRAWING' | 'COLOR_VARIANT' | 'ENERGY_EFFICIENCY_LABEL' | 'MATERIAL_SAMPLE' | 'PRODUCT_DATASHEET' | 'USER_MANUAL' | 'MANUFACTURER_WARRANTY' | 'SAFETY_DATASHEET' | 'ASSEMBLY_INSTRUCTIONS' | 'WARNING_LABEL', required — The type of the provided media asset. At least one media asset of type 'IMAGE' must be provided. The number of media assets of type 'IMAGE' is not limited.
    - `location` string, uri, required — The partners location of the media asset as a valid URL (see http://www.ietf.org/rfc/rfc2396.txt and http://www.ietf.org/rfc/rfc2732.txt) with a maximum length of 2083 characters. OTTO market will use the link for downloading the media asset and providing it to otto.de. Please note that the image has to be of type JPG or PNG with a RGB color space an a minimum size of 500x1000 pixel and a maximum width of 4500 pixel.
  - `order` OrderProductsV5 — A Container holding order constraints
    - `maxOrderQuantity` MaxOrderQuantityProductsV5 — The maximum number of items a consumer may order during a specified time period. E.g. max 10 items every 7 days.
      - `quantity` integer — The maximum number of items a consumer may order during a specified time period. Quantity with allowed values from 1 to 50.
      - `periodInDays` integer — The period of time in days during which a consumer may order the specified maximum number of items. Period in days with allowed values from 1 to 90.
  - `pricing` PricingProductsV5, required — this container holds attributes for the different price types, currency and tax related information
    - `standardPrice` MonetaryAmountProductsV5, required
      - `amount` number — Holds the value of the monetary amount expressed in a currency, e.g. euros. The number format expects a decimal point, like 10.99. Numbers without a decimal point are taken as a unit of the given currency, e.g. 10 is taken as 10 euros. The value has to have no more than 2 decimal places. If you specify more decimal places, the product variation will be rejected. The same applies, if you use other characters than digits and an optional decimal point, e.g. '2E+4'
      - `currency` string — Holds the currency of the monetary amount expressed as a shortcut according to ISO 4217 and http://publications.europa.eu/code/de/de-5000700.htm. NOTE: Currently the only allowed currency code is "EUR". All other currency codes will be rejected.
    - `vat` 'FULL' | 'REDUCED' | 'FREE' | 'NONE', required — The value added tax that is included in the sales price. Currently "NONE" is just mentioned because of technical reasons, but will always result in a validation error.
    - `msrp` MonetaryAmountProductsV5
      - `amount` number — Holds the value of the monetary amount expressed in a currency, e.g. euros. The number format expects a decimal point, like 10.99. Numbers without a decimal point are taken as a unit of the given currency, e.g. 10 is taken as 10 euros. The value has to have no more than 2 decimal places. If you specify more decimal places, the product variation will be rejected. The same applies, if you use other characters than digits and an optional decimal point, e.g. '2E+4'
      - `currency` string — Holds the currency of the monetary amount expressed as a shortcut according to ISO 4217 and http://publications.europa.eu/code/de/de-5000700.htm. NOTE: Currently the only allowed currency code is "EUR". All other currency codes will be rejected.
    - `sale` SaleProductsV5
      - `salePrice` MonetaryAmountProductsV5
        - `amount` number — Holds the value of the monetary amount expressed in a currency, e.g. euros. The number format expects a decimal point, like 10.99. Numbers without a decimal point are taken as a unit of the given currency, e.g. 10 is taken as 10 euros. The value has to have no more than 2 decimal places. If you specify more decimal places, the product variation will be rejected. The same applies, if you use other characters than digits and an optional decimal point, e.g. '2E+4'
        - `currency` string — Holds the currency of the monetary amount expressed as a shortcut according to ISO 4217 and http://publications.europa.eu/code/de/de-5000700.htm. NOTE: Currently the only allowed currency code is "EUR". All other currency codes will be rejected.
      - `startDate` string, date-time — The start ISO8601 date for the sales.
      - `endDate` string, date-time — The end ISO8601 date for the sales.
    - `normPriceInfo` NormPriceInfoProductsV5 — The information about normed prices, must be provided completely, or not at all. The representation of the normprice has to contain the following values for normAmount and normUnit: 1 pcs,1 sqm,1 kg,1 l,1 m,100 ml,100 g,1 g,1000 g,1 pair,1 RM,1 dm3.
      - `normAmount` 1 | 100 | 1000 — The norm packaging size.
      - `normUnit` 'Stk' | 'qm' | 'kg' | 'l' | 'm' | 'ml' | 'g' | 'Paar' | 'RM' | 'dm3' — The name of the unit the norm price is based on.
      - `salesAmount` number — The packaging size of the sales unit.
      - `salesUnit` 'Stk' | 'qm' | 'kg' | 'l' | 'm' | 'ml' | 'g' | 'Paar' | 'RM' | 'dm3' — The name of the unit the sales price is based on.
  - `logistics` LogisticsProductsV5 — In case of using the logistic service of our marketplace, here you may provide information about the packaging of the goods
    - `packingUnitCount` integer — The number of packing units.
    - `packingUnits` PackingUnitProductsV5[] — The measurements of the packing units in g and mm.
      - `weight` integer — The weight of a packing unit in grams.
      - `width` integer — The width of a packing unit in millimeters.
      - `height` integer — The height of a packing unit in millimeters.
      - `length` integer — The depth of a packing unit in millimeters.
  - `compliance` ProductComplianceProductsV5, required — Compliance data must always be maintained. Must be used to provide information relevant for product compliance like e.g. addresses for product safety regulations. For the variations of a product, either the product safety container or the food/feed information container must be provided depending on the product category.
    - `productSafety` ProductSafetyProductsV5 — Should be used for providing information about the distributors and/or manufacturer of the product. https://account.otto.market/s/article/Verordnung-ueber-die-allgemeine-Produktsicherheit-EU
      - `addresses` ProductSafetyAddressProductsV5[] — The addresses of the distributors and/or manufacturer. If an address is maintained, name, address, email or url and roles are mandatory.
        - `name` string, required — The company name of the manufacturer or the distributor. Maximum length: 100 characters.
        - `address` string, required — The complete address including street, postal code, city, country. Without any formatting, comma separation, no line breaks. Maximum length: 200 characters.
        - `regionCode` string — Allowed values are all country codes in ISO-3166 Alpha-2 format. Important for validation of the address.
        - `email` string — A valid and complete email address. Maximum length: 100 characters. **Mandatory** if no URL is specified.
        - `url` string — Valid URL to the contact information of the manufacturer or distributor (see http://www.ietf.org/rfc/rfc2396.txt and http://www.ietf.org/rfc/rfc2732.txt). Maximum length: 200 characters. **Mandatory** if no email is specified.
        - `phone` string — A valid phone number. Maximum length: 20 characters.
        - `roles` ProductSafetyAddressRoleProductsV5[], required — The role(s) of the economic agent to which the address belongs. Allowed values are 'DISTRIBUTOR' and 'MANUFACTURER'. At least one distributor must be specified.
        - `components` string[] — Can be used in the case of set products for the correct assignment of addresses to set components, e.g. use components “mouse” and “keyboard” when selling a set of both.
    - `foodInformation` FoodInformationProductsV5 — Should be used for providing information about the food or animal feed business operator of the product. The affected assortment can be found in this article: https://account.otto.market/s/article/Weitere-Informationen-Sortimente-mit-besonderen-Anforderungen.
      - `addresses` FoodInformationAddressProductsV5[] — The addresses of the food or animal feed business operator. If an address is maintained, name, address and roles are mandatory.
        - `name` string, required — The company name of the food or animal feed business operator. Maximum length: 100 characters.
        - `address` string, required — The complete address including street, postal code, city, country. Without any formatting, with comma separation, no line breaks. Maximum length: 200 characters.
        - `regionCode` string — Allowed values are all country codes in ISO-3166 Alpha-2 format. Important for validation of the address.
        - `email` string — A valid and complete email address. Maximum length: 100 characters.
        - `url` string — Valid URL to the contact information of the food or animal feed business operator (see http://www.ietf.org/rfc/rfc2396.txt and http://www.ietf.org/rfc/rfc2732.txt). Maximum length: 200 characters.
        - `phone` string — A valid phone number. Maximum length: 20 characters.
        - `roles` FoodInformationAddressRoleProductsV5[], required — The role of the business operator to which the address belongs. Allowed values are 'FOOD_BUSINESS_OPERATOR' or 'FEED_BUSINESS_OPERATOR'. Every variation within a product must have the same role.
        - `components` string[] — Can be used in the case of set products for the correct assignment of addresses to set components, e.g. use components “Salad” and “Dressing” when selling a set of both.

## Response `202`

The request for a modification of the specified product variations was accepted and will be executed

- ProductProcessProgressProductsV5
  - `state` 'pending' | 'done' — the current state of the process
  - `message` string — a human-readable message describing the current state of the process
  - `total` integer — the total work to complete for this process
  - `progress` integer — the fraction of work that is already completed, as compared to the total work
  - `succeeded` integer — the number of successfully processed variations
  - `failed` integer — the number of failed processed variations
  - `unchanged` integer — the number of unchanged and not processed variations
  - `pingAfter` string, date-time — recommendation when to poll this resource again to receive a meaningful update - ISO8601 date
  - `links` ProductProcessResultLinkProductsV5[] — a list of links that can be used to access detailed information about the process result
    - `rel` 'self' | 'failed' | 'succeeded' | 'unchanged' — link relation type
    - `href` string — the linked reference as URI

## Other responses

- `401` — The technical user could not be authenticated
- `403` — The technical user is not authorized to modify the specified product variations. This may be the case, if the user has not the necessary role.

---

[API](https://skmtc.dev/otto/apis/otto-market-api.md) · [All operations](https://skmtc.dev/otto/apis/otto-market-api/llms.txt) · [OpenAPI document](https://skmtc-service-production.skmtc.workers.dev/v1/apis/otto/otto-market-api/revisions/b1bc133112bd/schema)
