Zalando.ch
2 endpoints: search and product details. Each reads one page URL per request, from your agent or the REST API, and answers in structured or raw format. Every account starts with 200 free trial credits.
Search
Search one Zalando country shop or language site with /<catalogue path>/?q=keyword (e.g. /herren/, /skor/; search runs in the site's language). First page only: the 24 products the page shows with name, brand and price, plus how many it lists; no filters, sorting or pagination.
- ID
zalando.search_items- Version
1- Price
- 5 credits / page
- State
- Available
- Typical time
- About 60 s (estimate)
What it does
Reads one search results page (or up to the page limit) and returns one record per product card, in page order. Works on zalando.ch; other hosts are rejected before anything runs.
Input
One page URL per request, shaped like https://www.zalando.ch/katalog/?q=sneaker.
Price
5 credits / page. Failed requests are free; a page that loaded but had nothing on it still costs credits. Set max_credits to refuse anything dearer before it runs.
Output
The default, "format": "structured". Every shop answers in the same fields, mapped from the page to the product_summary@1 schema. Fields are null when the page doesn't show them, and a record that can't be mapped is read best-effort from its raw fields. Products are in products, up to 50 a page; follow next_cursor with GET /v1/requests/{id} (MCP: get_results).
| Field | Type | Description |
|---|---|---|
product_id | string or null | Opaque id. Pass it to get_product (or capability "product") to read the product again. |
title | string | Product title as the shop shows it. |
url | string or null | The product page on the shop. |
shop | string or null | The shop’s hostname, without www. |
price | object or null | amount (number), currency (ISO 4217, or null when the shop doesn’t say) and text (the shop’s own wording when it is the same amount, else null). |
original_price | object or null | The price before a discount, in the same shape as price. |
rating | number or null | Average rating, on the shop’s own scale. |
review_count | integer or null | Number of reviews or ratings. |
image_url | string or null | Main product image. |
availability | string or null | in_stock, out_of_stock, or the shop’s own stock wording. |
sponsored | boolean or null | true for an ad the shop marks as sponsored; null when the page doesn’t say. |
{
"request_id": "string",
"status": "done",
"products": [
{
"product_id": "string or null",
"title": "string",
"url": "string or null",
"shop": "string or null",
"price": {
"amount": "number",
"currency": "string or null",
"text": "string or null"
},
"original_price": {
"amount": "number",
"currency": "string or null",
"text": "string or null"
},
"rating": "number or null",
"review_count": "integer or null",
"image_url": "string or null",
"availability": "string or null",
"sponsored": "boolean or null"
}
],
"next_cursor": "string or null",
"meta": {
"as_of": "date-time",
"country": "string",
"credits_used": "integer",
"credits_left": "integer"
}
}Over the Jobs API, GET /v1/jobs/{id}/results?format=structured returns the full product_summary@1 records.
With "format": "raw", the answer keeps the structured fields and adds raw: this endpoint's own records, unchanged, one per item, in the schema below. It is the data the endpoint extracted from the page, not the page's HTML. Same price as structured.
| Field | Type | Description |
|---|---|---|
id | string required | Config SKU (one colour of one article) |
title | string required | — |
url | string (uri) required | — |
market | "zalando.at" | "zalando.be" | "zalando.ch" | "zalando.de" | "zalando.dk" | "zalando.es" | "zalando.fi" | "zalando.ie" | "zalando.it" | "zalando.lt" | "zalando.lu" | "zalando.nl" | "zalando.no" | "zalando.pl" | "zalando.se" | "zalando.si" | "zalando.co.uk" | "fr.zalando.be" | "fr.zalando.ch" | "it.zalando.ch" | "en.zalando.de" required | — |
currency | "EUR" | "CHF" | "DKK" | "NOK" | "PLN" | "SEK" required | — |
source | "catalog_data" required | — |
position | integer required | Minimum 1 |
data | object required | The product card from the page's embedded catalogue data, in schema.org Product shape (name, sku, brand, url, image, one offer with price, priceCurrency and listPrice when reduced); prices stay in the shop's currency and are not converted. |
{
"id": "string",
"title": "string",
"url": "string (uri)",
"market": "zalando.at | zalando.be | zalando.ch | zalando.de | zalando.dk | zalando.es | zalando.fi | zalando.ie | zalando.it | zalando.lt | zalando.lu | zalando.nl | zalando.no | zalando.pl | zalando.se | zalando.si | zalando.co.uk | fr.zalando.be | fr.zalando.ch | it.zalando.ch | en.zalando.de",
"currency": "EUR | CHF | DKK | NOK | PLN | SEK",
"source": "catalog_data",
"position": "integer",
"data": "object"
}Raw needs this endpoint: a search with format: "raw" doesn't fall back to shopping search, and answers raw_unavailable where no endpoint can run. Over the Jobs API, results are raw by default; format=both gives each raw record with its structured form.
Request
Run exactly this endpoint with capability: "endpoint"; there is no fallback, and a failed run is free. Set format to "raw" for the raw records too. For a keyword instead of a URL, search_products with this shop as site builds the search URL, tries the shop's endpoint first and then shopping search.
curl https://api.datawebot.com/v1/requests \
-H "Authorization: Bearer $DATAWEBOT_API_KEY" \
-H "Content-Type: application/json" \
-d '{"capability":"endpoint","endpoint":"zalando.search_items","url":"https://www.zalando.ch/katalog/?q=sneaker","format":"structured"}'submit_job {
"endpoint": "zalando.search_items",
"url": "https://www.zalando.ch/katalog/?q=sneaker",
"format": "structured"
}If the answer says "status": "working", read it again with GET /v1/requests/{id} (MCP: get_results) after check_after_seconds.
Product details
Fetch one Zalando product page, /<name>-<config sku>.html, on one of 17 country shops or 4 language sites (fr.zalando.be, fr.zalando.ch, it.zalando.ch, en.zalando.de). Prices in the shop's currency.
- ID
zalando.product_details- Version
1- Price
- 1 credit / page
- State
- Available
- Typical time
- About 30 s (estimate)
What it does
Reads one product page and returns that product. Works on zalando.ch; other hosts are rejected before anything runs.
Input
One page URL per request, shaped like https://www.zalando.ch/lacoste-storm-96-3k-2262-sma-sneaker-low-whtlt-gry-la212p06d-a11.html.
Price
1 credit / page. Failed requests are free; a page that loaded but had nothing on it still costs credits. Set max_credits to refuse anything dearer before it runs.
Output
The default, "format": "structured". Every shop answers in the same fields, mapped from the page to the product@1 schema. Fields are null when the page doesn't show them, and a record that can't be mapped is read best-effort from its raw fields. The product is in product.
| Field | Type | Description |
|---|---|---|
product_id | string or null | Opaque id. Pass it to get_product (or capability "product") to read the product again. |
title | string | Product title as the shop shows it. |
url | string or null | The product page on the shop. |
shop | string or null | The shop’s hostname, without www. |
price | object or null | amount (number), currency (ISO 4217, or null when the shop doesn’t say) and text (the shop’s own wording when it is the same amount, else null). |
original_price | object or null | The price before a discount, in the same shape as price. |
rating | number or null | Average rating, on the shop’s own scale. |
review_count | integer or null | Number of reviews or ratings. |
image_url | string or null | Main product image. |
availability | string or null | in_stock, out_of_stock, or the shop’s own stock wording. |
sponsored | boolean or null | true for an ad the shop marks as sponsored; null when the page doesn’t say. |
product.details, when the shop's page maps to product@1:
| Field | Type | Description |
|---|---|---|
brand | string or null | Brand as the page names it. |
category_path | array of strings | Breadcrumb categories, top first. |
description | string or null | Plain-text description. |
feature_bullets | array of strings | Listed features. |
price_min, price_max | number or null | Lowest and highest variant price. |
discount_label | string or null | Discount wording, such as "-20%". |
stock | integer or null | Units in stock, when the page shows a number. |
sold_count, sold_count_basis | integer or null; "total", "monthly" or null | Units sold, and whether that is a total or per month. |
identifiers | array of {type, value} | asin, parent_asin, walmart_item_id, gtin, mpn, isbn or source_sku. |
specs_raw | array of {name, value} | The specification table as shown. |
images, image_count | array of {url, alt}; integer | Every product image. |
option_names | array of strings | Option names such as Size or Colour. |
variants, variant_count | array (up to 100); integer or null | Each variant: id, name, options, sku, final_price, price_before_discount, discount_label, available, stock, image_url. |
seller | object or null | id, name, url and type (official or marketplace). |
rating_scale | number or null | The top of the rating scale, such as 5. |
warnings | array of strings | Fields the page didn’t give, such as currency_missing. |
{
"request_id": "string",
"status": "done",
"product": {
"product_id": "string or null",
"title": "string",
"url": "string or null",
"shop": "string or null",
"price": {
"amount": "number",
"currency": "string or null",
"text": "string or null"
},
"original_price": {
"amount": "number",
"currency": "string or null",
"text": "string or null"
},
"rating": "number or null",
"review_count": "integer or null",
"image_url": "string or null",
"availability": "string or null",
"sponsored": "boolean or null",
"details": {
"brand": "string or null",
"variants": [
"…"
],
"…": "…"
}
},
"meta": {
"as_of": "date-time",
"country": "string",
"credits_used": "integer",
"credits_left": "integer"
}
}Over the Jobs API, GET /v1/jobs/{id}/results?format=structured returns the full product@1 records.
With "format": "raw", the answer keeps the structured fields and adds raw: this endpoint's own records, unchanged, one per item, in the schema below. It is the data the endpoint extracted from the page, not the page's HTML. Same price as structured.
| Field | Type | Description |
|---|---|---|
id | string required | Config SKU (one colour of one article) |
title | string required | — |
url | string (uri) required | — |
market | "zalando.at" | "zalando.be" | "zalando.ch" | "zalando.de" | "zalando.dk" | "zalando.es" | "zalando.fi" | "zalando.ie" | "zalando.it" | "zalando.lt" | "zalando.lu" | "zalando.nl" | "zalando.no" | "zalando.pl" | "zalando.se" | "zalando.si" | "zalando.co.uk" | "fr.zalando.be" | "fr.zalando.ch" | "it.zalando.ch" | "en.zalando.de" required | — |
currency | "EUR" | "CHF" | "DKK" | "NOK" | "PLN" | "SEK" required | — |
source | "json_ld_product" required | — |
data | object required | Projection of the page's schema.org JSON-LD product; prices stay in the shop's currency and are not converted. |
{
"id": "string",
"title": "string",
"url": "string (uri)",
"market": "zalando.at | zalando.be | zalando.ch | zalando.de | zalando.dk | zalando.es | zalando.fi | zalando.ie | zalando.it | zalando.lt | zalando.lu | zalando.nl | zalando.no | zalando.pl | zalando.se | zalando.si | zalando.co.uk | fr.zalando.be | fr.zalando.ch | it.zalando.ch | en.zalando.de",
"currency": "EUR | CHF | DKK | NOK | PLN | SEK",
"source": "json_ld_product",
"data": "object"
}Over the Jobs API, results are raw by default; format=both gives each raw record with its structured form.
Request
Read a product page with capability: "product"; it runs this endpoint for the page's shop. Set format to "raw" for the raw records too.
curl https://api.datawebot.com/v1/requests \
-H "Authorization: Bearer $DATAWEBOT_API_KEY" \
-H "Content-Type: application/json" \
-d '{"capability":"product","url":"https://www.zalando.ch/lacoste-storm-96-3k-2262-sma-sneaker-low-whtlt-gry-la212p06d-a11.html","format":"structured"}'get_product {
"url": "https://www.zalando.ch/lacoste-storm-96-3k-2262-sma-sneaker-low-whtlt-gry-la212p06d-a11.html",
"format": "structured"
}If the answer says "status": "working", read it again with GET /v1/requests/{id} (MCP: get_results) after check_after_seconds.