Product Status Report API

The Product Status Report API (or PSR API) provides read access to product data, their onboarding and offering status. Query the PSR API to get up-to-date information about your assortment, such as validation status, current price, and available stock.

Possible data lags

The data served by the PSR API is near real-time and usually lags only by a few minutes. However, this lag may sometimes increase to a few hours for short periods.

PSR data is also available through the Article Listing in zDirect UI, but you must have a Merchant Partner account to access that portal.

Note that this API is read only. For information on product onboarding, setting prices, and setting stock levels, see Products and Product Onboarding, Manage Prices, and Manage Stock.

PSR API specification

Unlike other zDirect APIs, the PSR API is not a RESTful API. Instead, it uses the GraphQL framework. For more information, we recommend the Official GraphQL Documentation or Introduction to GraphQL from GitHub.

  • PSR API reference: Information on scopes, rate limiting, and sandbox behavior.
  • PSR API tutorial: Instructions about which clients to use locally for testing, building your first request payload, and how to use the interactive documentation to construct new requests.

Using the PSR API

In the PSR API, fields are named in the same way as in the APIs used for product onboarding, however they might not always correspond exactly. Refer to the interactive documentation for a detailed description of all available fields and values.

Key PSR Query Fields

Below are some of the most important PSR API query fields:

Option Description
query.psr.countries Lists available countries for the merchant.
query.psr.brands Lists available brands for the merchant.
query.psr.seasons Lists available seasons for the merchant.
query.psr.product_status_codes Lists product status codes.
query.psr.product_models Searches for product models, including all their configs, simples, and offers.

For a full list of query options, refer to the interactive documentation.

Product Data and Specific Offer Data

A product can have no offers or multiple offers, with each offer available on a different sales channel (such as zalando.de or zalando.co.uk). Each offer has its own status, which is separate from the overall product status and can be queried independently.

The product_models query returns product data, including model, config, and simple tier details such as name, IDs, size group, outline, target gender, and more. For an example of a product model, see the Status Cluster Filter Example. Offer data is included in the simple tier and contains information such as price, stock, and more. For an example of a product offer status, see the Country Code Filter and Offer Status Example.

A product's status can be found in the status parameter within product_simples. Once a product is submitted, it will have a status, but it may not necessarily have an offer status. The product status represents the overall state of the product:

  • If the product is in the onboarding process, it indicates whether the product is under review or has been rejected.
  • If the product has been created, it reflects the combined status across all offers.

Within product_simples, the optional offers data provides a list of all sales channels where the product is available. Each offer's status can be retrieved from the offer_status parameter. The offer status represents:

  • Whether the product is live or missing essential data (such as price or stock) for that specific sales channel.
  • Whether the product has an offer blocker for that sales channel.

Overall product status information

In general, the product status information consolidates both the product and offer statuses. The product status consists of the following fields:

Status Field Explanation
status_detail_code A unique code representing each status.
status_cluster The broad product lifecycle status. Possible values are "REJECTED", "IN_REVIEW", "BLOCKED", and "LIVE".
status_level Indicates the product tier level associated with the status. Possible values are "simple", "config", and "model".
short_description A brief, headline-like summary of the status.
description Provides a detailed explanation of the status code and may include guidance on how to resolve issues.
status_urls Optional documentation references to support status issue resolution dedicated for the Partner Program and Connected Retail.
issue_resolution_steps Provides a detailed explanation of the issue resolution steps and may include guidance on how to resolve issues.
issue_resolution_url Provides a URL which can be used to resolve the issue.

Recommended usage

For better status comprehension, we recommend including at least the status_detail_code,description, and status_urls, depending on the business model.

GraphQL gives you the power to get all this data in one call. But sometimes it makes sense to perform separate calls not to overwhelm the system (e.g. UI). For example, you can load all the relevant product data and EANs first, and then get the offer-specific data with subsequent requests.

For a complete list of returned data, see the interactive documentation. For an overview of the product data structure, refer to Understanding Products.

Product Update Data

Apart from the product and its offer data, the PSR API also exposes the status for product update requests. Differently from the process of onboarding new products, product update requests are any submitted change requests after a product was already onboarded to the Zalando platform.

Product update requests and their status will be exposed under the updates field within each tier (product_models.items, product_configs, and product_simples). This field would also offer guidance on how you can handle issues, in case of rejections.

What to expect

Field Description
updates[*].update_type Indicates the update type. Possible values are "ATTRIBUTE" and "VIDEO".
updates[*].updated_at A timestamp from when current status was last reported.
updates[*].status.status_detail_code A unique code representing the update status.
updates[*].status.status_urls Optional documentation references to support status issue resolution dedicated for the Partner Program and Connected Retail.
updates[*].status.update_status The broad update lifecycle status. Possible values are "FAILED", "PROCESSING", and "UPDATED".
updates[*].status.short_description A brief, headline-like summary of the update status.
updates[*].status.description Provides a detailed explanation of the status code and may include guidance on how to resolve issues.

For an example, see the Update Type Filter and Product Updates Status Example.

Pagination

PSR API uses cursor-based pagination through the cursor and limit parameters. The pagination is performed at the product model level.

  • Parameter limit specifies a limit on the number of product models to return. It defaults to 10 when not provided.
  • Parameter cursor defines your position in the pagination based on a previous response. The last page will have its value as null.

For an example on how to apply these parameters, see the Pagination Example.

Recommended pagination limit

We recommend using pagination limit of 10 models for better results, regarding response latency.

Example Queries

PSR API provides you information about every product you have submitted. This information will help you understand where your product is in the entire Product Lifecycle. In these examples, you find a summary of what we provide.

Status Cluster Filter Example

To get product data from a specific status cluster, use the status_clusters input. Possible values are "REJECTED", "IN_REVIEW", "BLOCKED", and "LIVE".

As an example, the following query will return the EANs and validation status codes of all REJECTED product simples from a specific product model. Queries like this are useful while onboarding new products.

{
  psr {
    product_models(
      input:
      { merchant_ids: ["YOUR_MERCHANT_ID"]
      , search_value: "YOUR_PARTNER_MODEL_ID"
      , status_clusters: [REJECTED]
      , brand_codes: []
      , country_codes: []
      , season_codes: []
      , limit: 10
      }) {
      items {
        product_configs {
          product_simples {
            ean
            status { 
               status_detail_code
               status_cluster
               description { en }
            }
          }
        }
      }
    }
  }
}

You will receive a reply similar to the following example:

{
  "data": {
    "psr": {
      "product_models": {
        "items": [
          {
            "product_configs": [
              {
                "product_simples": [
                  {
                    "ean": "4351261305360",
                    "status": [
                      {
                        "status_detail_code": "PSERR_110",
                        "status_cluster": "REJECTED",
                        "description": {
                          "en": "Article rejected, because the size chart is not included in the Partner Master Data. Please reach out to our Partner Care team."
                       }
                      }
                    ]
                  },
                  {
                    "ean": "4351261305361",
                    "status": [
                      {
                        "status_detail_code": "PSERR_110",
                        "status_cluster": "REJECTED",
                        "description": {
                          "en": "Article rejected, because the size chart is not included in the Partner Master Data. Please reach out to our Partner Care team."
                        }
                      }
                    ]
                  }
                ]
              }
            ]
          }
        ]
      }
    }
  }
}

When using this query to filter for LIVE products, for example, you can learn more about which products are selling and being back-filled, and how they are offered to customers. If you want to dive deeper, take a look at the offers section using the following Offer Status Example.

Status Detail Code Filter Example

To get product data with a specific status detail code, use the status_detail_codes input. As an example, the following query will return all product simples containing the queried CODE status detail code.

{
  psr {
    product_models(
      input:
      { merchant_ids: ["YOUR_MERCHANT_ID"]
      , status_detail_codes: ["CODE"]
      , brand_codes: []
      , country_codes: []
      , season_codes: []
      , limit: 10
      }) {
      items {
        product_configs {
          product_simples {
            ean
            status { status_detail_code }
          }
        }
      }
    }
  }
}

You will receive a reply similar to the following example:

{
  "data": {
    "psr": {
      "product_models": {
        "items": [
          {
            "product_configs": [
              {
                "product_simples": [
                  {
                    "ean": "4351261305362",
                    "status": [
                      {
                        "status_detail_code": "CODE"
                      }
                    ]
                  }
                ]
              }
            ]
          },
          {
            "product_configs": [
              {
                "product_simples": [
                  {
                    "ean": "4351261305370",
                    "status": [
                      {
                        "status_detail_code": "CODE"
                      }
                    ]
                  },
                  {
                    "ean": "4351261305371",
                    "status": [
                      {
                        "status_detail_code": "CODE"
                      }
                    ]
                  }
                ]
              }
            ]
          }
        ]
      }
    }
  }
}

Country Code Filter and Offer Status Example

To get product data from a specific sales channel, use the country_codes input. As an example, the following query will return all product simples from the German channel (DE) along with more detailed information about the offer status, when available:

{
  psr {
    product_models(
      input:
      { merchant_ids: ["YOUR_MERCHANT_ID"]
      , eans: ["4351261305360", "4351261305361"]
      , status_clusters: []
      , brand_codes: []
      , country_codes: ["DE"]
      , season_codes: []
      , limit: 10
      }) {
      items {
        product_configs {
          product_simples {
            ean
            zalando_product_simple_id
            offers {
              country { code }
              offer_status {
                status_detail_code
                status_cluster
                short_description { en }
              }
            }
          }
        }
      }
    }
  }
}

With this query, you will receive a response containing the status code and cluster for each offer that matches the query with a short description in English. For example:

{
  "data": {
    "psr": {
      "product_models": {
        "items": [
          {
            "product_configs": [
              {
                "product_simples": [
                  {
                    "ean": "4351261305360",
                    "zalando_product_simple_id": "VE042D04C-A60000M000",
                    "offers": [
                      {
                        "country": {
                          "code": "DE"
                        },
                        "offer_status": [
                          {
                            "status_detail_code": "ZAON_01",
                            "status_cluster": "LIVE",
                            "short_description": {
                              "en": "You are selling this EAN"
                            }
                          }
                        ]
                      }
                    ]
                  },
                  {
                    "ean": "4351261305361",
                    "zalando_product_simple_id": "VE042D04C-A6100XS000",
                    "offers": [
                      {
                        "country": {
                          "code": "DE"
                        },
                        "offer_status": [
                          {
                            "status_detail_code": "ZANOP_01",
                            "status_cluster": "BLOCKED",
                            "short_description": {
                              "en": "Price is missing"
                            }
                          }
                        ]
                      }
                    ]
                  }
                ]
              }
            ]
          }
        ]
      }
    }
  }
}

Offer Stock and Price Example

To get more detailed information about an offer's price and stock, use product_models query as in this example:

{
  psr {
    product_models(
      input:
      { merchant_ids: ["YOUR_MERCHANT_ID"]
      , eans: ["4351261305360"]
      , status_clusters: []
      , brand_codes: []
      , country_codes: []
      , season_codes: []
      , limit: 10
      }) {
      items {
        product_configs {
          product_simples {
            ean
            zalando_product_simple_id
            offers {
              offer_status {
                status_detail_code
                status_cluster
                short_description { en }
              }
              country { code }
              stock { amount }
              price {
                regular_price { amount currency }
                discounted_price { amount currency }
              }
              fulfillment_type
            }
          }
        }
      }
    }
  }
}

Price data shows the current values applied in a given sales channel. New price updates can take some time to be shown in the store, and they are updated here afterwards. More info about price updates can be found under Manage Prices.

Stock data shows the current stock levels that can be sold in a given sales channel. For ZFS stock (Zalando-fulfilled), however, this stock number does not reflect the physical count of items in the warehouse and more info can be found on the ZFS Stock API. The stock type can be identified by the fulfillment_type information:

  1. For ZFS stock, the fulfillment_type field will have ZFS fulfillment type value.
  2. For partner fulfilled stock, the fulfillment_type field will have PARTNER_FULFILLMENT fulfillment type value.

An overall offers data, containing different sales channels with price, stock, offer_status, and fulfillment_type can be seen in the following example response:

{
  "data": {
    "psr": {
      "product_models": {
        "items": [
          {
            "product_configs": [
              {
                "product_simples": [
                  {
                    "ean": "4351261305360",
                    "zalando_product_simple_id": "VE042D04C-A60000M000",
                    "offers": [
                      {
                        "offer_status": [
                          {
                            "status_detail_code": "ZAON_01",
                            "status_cluster": "LIVE",
                            "short_description": {
                              "en": "You are selling this EAN"
                            }
                          }
                        ],
                        "country": {
                          "code": "DE"
                        },
                        "stock": {
                          "amount": 42
                        },
                        "price": {
                          "regular_price": {
                            "amount": 69.95,
                            "currency": "EUR"
                          },
                          "discounted_price": {
                            "amount": 39.95,
                            "currency": "EUR"
                          }
                        },
                        "fulfillment_type": "ZFS"
                      },
                      {
                        "offer_status": [
                          {
                            "status_detail_code": "ZANOP_01",
                            "status_cluster": "BLOCKED",
                            "short_description": {
                              "en": "Price is missing"
                            }
                          }
                        ],
                        "country": {
                          "code": "NL"
                        },
                        "stock": {
                          "amount": 420
                        },
                        "price": null,
                        "fulfillment_type": "PARTNER_FULFILLMENT"
                      }
                    ]
                  }
                ]
              }
            ]
          }
        ]
      }
    }
  }
}

For more information, see the preceding Product Data and Specific Offer Data.

Update Type Filter and Product Updates Status Example

To get products containing a specific update type, use the optional update_types input. Possible values are "ATTRIBUTE" and "VIDEO". For example, the following query will return data from all tiers for all products with VIDEO update types:

{
  psr {
    product_models(
      input:
      { merchant_ids: ["YOUR_MERCHANT_ID"]
      , status_clusters: []
      , brand_codes: []
      , country_codes: []
      , season_codes: []
      , update_types: [VIDEO]
      , limit: 10
      }) {
      items {
        zalando_product_model_id
        updates {
          update_type
          updated_at
          status {
            status_detail_code
            update_status
            short_description { en }
            description { en }
          }
        }
        product_configs {
          zalando_product_config_id
          updates {
            update_type
            updated_at
            status {
              status_detail_code
              update_status
              short_description { en }
              description { en }
            }
          }
          product_simples {
            ean
            zalando_product_simple_id
            updates {
              update_type
              updated_at
              status {
                status_detail_code
                update_status
                short_description { en }
                description { en }
              }
            }
          }
        }
      }
    }
  }
}

With this query, you will receive a response containing update data for each article in the respective requested tier. For example:

{
  "data": {
    "psr": {
      "product_models": {
        "items": [
          {
            "zalando_product_model_id": "VE042D04C",
            "updates": [],
            "product_configs": [
              {
                "zalando_product_config_id": "VE042D04C-A60",
                "updates": [
                  {
                    "update_type": "VIDEO",
                    "updated_at": "2025-08-20T13:33:51Z",
                    "status": [
                      {
                        "status_detail_code" : "JETBL_04",
                        "update_status" : "PROCESSING",
                        "short_description": { "en": "Video and Preview Image are in review" },
                        "description": { "en": "Your submitted video <url> and preview image <url> are in review." }
                      }
                    ]
                  },
                  {
                    "update_type": "VIDEO",
                    "updated_at": "2025-08-20T14:12:40Z",
                    "status": [
                      {
                        "status_detail_code" : "ZAON_02",
                        "update_status" : "UPDATED",
                        "short_description": { "en": "Video and Preview Image are live" },
                        "description": { "en": "Your submitted video <url> and preview image <url> are now live on Zalando." }
                      }
                    ]
                  }
                ],
                "product_simples": [
                  {
                    "ean": "4351261305360",
                    "zalando_product_simple_id": "VE042D04C-A60000M000",
                    "updates": [
                      {
                        "update_type": "VIDEO",
                        "updated_at": "2025-06-04T08:30:00Z",
                        "status": [
                          {
                            "status_detail_code" : "PSERR_225",
                            "update_status" : "FAILED",
                            "short_description": { "en": "Preview image does not have a video attached" },
                            "description": { "en": "To upload your video <url>, please submit along with a preview image." }
                          }
                        ]
                      }
                    ]
                  }
                ]
              }
            ]
          }
        ]
      }
    }
  }
}

Sustainability Certificate Example

The has_approved_sustainability_related_claim input allows you to retrieve products filtering whether they have approved sustainability certificate or not. As an example, the following query will return product simples along with their sustainability certificate information only for the products that have it. When false is provided instead, you can obtain products without approved sustainability certificate.

{
  psr {
    product_models(
      input:
      { merchant_ids: ["YOUR_MERCHANT_ID"]
      , has_approved_sustainability_related_claim: true
      , brand_codes: []
      , country_codes: []
      , season_codes: []
      , limit: 10
      }) {
      items {
        product_configs {
          certificate {
            certificate_info
            certificate_test_institute
            certificate_approval_number
            certification_tier
            product_component {
              variant
              certified_percentage
            }
            has_approved_sustainability_related_claim
          }
          product_simples {
            ean
            zalando_product_simple_id
          }
        }
      }
    }
  }
}

An example response showing the certificate information:

{
  "data": {
    "psr": {
      "product_models": {
        "items": [
          {
            "product_configs": [
              {
                "certificate": {
                  "certificate_info": "home_labels_5111",
                  "certificate_test_institute": "Ecocert Greenlife SAS",
                  "certificate_approval_number": "EGL/000000/GOTS/000000/0",
                  "certification_tier": "brand",
                  "product_component": {
                    "variant": "non_material_variant:full_product",
                    "certified_percentage": 95.0
                  },
                  "has_approved_sustainability_related_claim": true
                },
                "product_simples": [
                  {
                    "ean": "5701586978572",
                    "zalando_product_simple_id": "CX742I007-Q12000L000"
                  }
                ]
              }
            ]
          }
        ]
      }
    }
  }
}

Pagination Example

To control how many models are returned in each response, you can use the cursor and limit pagination parameters. For the first page, cursor value does not need to be provided. As an example, the following query will return the first page containing 10 product models:

{
  psr {
    product_models(
      input:
      { merchant_ids: ["YOUR_MERCHANT_ID"]
      , brand_codes: []
      , country_codes: []
      , season_codes: []
      , limit: 10
      }) {
      cursor
      items { zalando_product_model_id }
    }
  }
}

The cursor value for the next page will be available in the response. By adding this cursor value in the next request, you will receive the result from the second page. The same process can be repeated to retrieve the following pages, if existent, until you receive an empty cursor. For example, if you receive a cursor with value LABWE-238498 in a response, the next request would be as follows:

{
  psr {
    product_models(
      input:
      { merchant_ids: ["YOUR_MERCHANT_ID"]
      , brand_codes: []
      , country_codes: []
      , season_codes: []
      , cursor: "LABWE-238498",
      , limit: 10
      }) {
      cursor
      items { zalando_product_model_id }
    }
  }
}
Contact Support