Zalando is Europe's largest online fashion retailer, and the thing to know before pointing a proxy at it is that its status codes do not tell you what you got. On 28 September 2026 zalando.it answered a plain HTTP client through an Italian residential exit with 200 OK, 570,402 bytes and 266 words; rendered, the same URL cost 1,607,265 bytes and returned 268 words. During the same hour our catalogue collector received a 200 that carried an Akamai interstitial instead of products, retried it from a fresh residential exit, and delivered 10 products with EU Omnibus reference prices in 3.6 seconds. The setting that works on Zalando is residential, plain HTTP, country matched to the domain, and a content check on every response instead of a status check.
The home gives a plain client 266 words, and the browser adds two
Zalando's home is server-rendered by what its own header calls rendering-engine/gender-split-stackset, behind Akamai. The seo_audit tool in our MCP server fetched it twice, as a pure HTTP bot and fully rendered, and the diff between the two views is two words. The no-JS page carries the title, the meta description and a self-referencing canonical; it carries no h1, no JSON-LD and no Open Graph tags, and neither does the rendered page. Zalando's home is a navigation surface, not a data surface, on both passes.
| Fetch (28 September 2026) | Status | Bytes returned | Time | Words | Notes |
|---|---|---|---|---|---|
| zalando.it, plain HTTP, Italian exit | 200 | 570,402 | 8.4 s | 266 | Title, description, canonical; no h1, no JSON-LD |
| zalando.it, rendered, Italian exit | 200 | 1,607,265 | 39.1 s | 268 | Same title, description and canonical; still no h1 |
| zalando.it, plain HTTP, German exit | 200 | n/a | 11.3 s (audit) | 266 | Identical Italian page; no redirect to zalando.de |
| zalando.it/robots.txt | 200 | 573 | 0.4 s | n/a | Last modified 8 September 2026 |
On 26 September the same audit counted 266 and 275; the render count moves with which teaser tiles have loaded at capture, the no-JS count does not move at all. Nothing in the diff justifies 2.8 times the bytes and 4.7 times the wall-clock. Read Zalando's HTML over plain HTTP and keep the browser for the one job where the page is actually built in the client, which on this site is not the home.
A 200 from Zalando is a claim, not a page
The build guide that ranks for "zalando scraper" says a plain fetch of a product page returns a 200 with the fields blank, or a challenge. We saw the sharper version of that in our own collector log. On one of the requests behind the run below, Zalando answered HTTP 200 with an Akamai bot interstitial in place of the catalogue. Nothing about the status distinguished it from a real page. The collector classified the body, discarded it, retried from a fresh residential exit, and got the catalogue on the second try. The whole run, including that retry, took 3.62 seconds.
This is the practical rule for anyone reading Zalando through a proxy of any brand: never accept a response on its status code. Check for the thing you came for, a product grid, an article SKU in the URL pattern, a price, and treat its absence as a miss to retry from a different exit. A status-only pipeline will log a 100 percent success rate and deliver a folder of interstitials. Our WAF detector will tell you Akamai sits in front; only a content check tells you whether this response got past it.
The collector reads the catalogue with the prices the law requires
We ran the Zalando collector once on 28 September 2026 with the query "nike air max" and max_results 10. It delivered 10 rows in 3.62 seconds, one retry included. Each row carries the brand, the product name with its colourway, the article SKU read from the product URL, the packshot image, the current price in euro and two fields most scrapers skip: Zalando's EU Omnibus reference prices, the 30-day median and the 30-day low, each with its own discount percentage.
| Field in the run | What came back for 10 rows |
|---|---|
| Current price | 10 of 10, from 71.99 € to 159.99 €; 4 flagged price_from, meaning the card shows a "da" price for the cheapest variant |
| 30-day median reference | 8 of 10 carried one, from 89.99 € to 159.99 €, with stated discounts of 20, 25 and 30 percent |
| 30-day low reference | 1 of 10 carried one, 119.99 € against a current 111.99 €, a 7 percent discount |
| SKU | 10 of 10, config id plus colour code, for example NI112O0BT-Q12 |
| Brand | 9 Nike Sportswear, 1 Nike Performance |
The Omnibus fields are the reason to prefer a collector over a card parser on this site. The EU price-indication rules require a retailer to show the prior price when it advertises a discount, and Zalando shows it as a median or a low with its own percentage; the two are not interchangeable, and a card may state either, both or neither. The collector labels which one it read. It also notes that rank is this response's order, because Zalando re-ranks between requests, so a monitor should key on SKU, not position. At $0.001 per delivered product, the run cost one cent.
What robots.txt closes, and what the country changes
Zalando's robots.txt is 573 bytes and was last modified on 8 September 2026. It disallows the whole site to ClaudeBot, AI2Bot, Bytespider, GPTBot, Google-Extended and Applebot-Extended. For everyone else it disallows any URL with three or more ampersands, the cart, wardrobe and account areas, /opinions, /reco-catalog/, /assistant and, with two named exceptions, everything under /api/: /api/navigation and /api/graphql/ are explicitly allowed, /api/navigation/* and /api/* are not. A crawler that stays on catalogue and product URLs with at most two filters is inside the file; one that hits the JSON endpoints behind the grid is not. The CGV page, fetched over plain HTTP at 620,167 bytes, governs purchases and returns; the automated-access rules live in robots.txt.
The country question on Zalando is answered by the domain, not the exit. Zalando runs one shop per market, 30 of them, and zalando.it fetched through a German residential exit returned the same Italian title, description and canonical and the same 266 words, with no redirect to zalando.de. The number that changes when you pick the wrong exit is, on the home, zero. Pin the exit to the market of the domain anyway, country=it for zalando.it, because prices, sizes and stock are per shop and a session that arrives from a different country than the shop it browses is the one pattern no real customer produces.
What we do not do on Zalando is the other intent in the autocomplete, "zalando order grabbing": bots that reserve limited drops. Automated checkout on a retailer is the retailer's decision, not a proxy setting, and we build nothing for it.
Cost math with real numbers
Prices from our pricing page: residential Basic $0.80/GB, Premium $2.20/GB, the web scraping API from $0.0002 per page ($0.001 rendered) and the Zalando collector at $0.001 per delivered product. One gigabyte is counted as 10^9 bytes.
| Approach | Bytes per page | Pages per GB | Cost per 1,000 |
|---|---|---|---|
| Plain HTTP over residential Basic ($0.80/GB) | 570,402 | about 1,753 | about $0.46 per 1,000 pages |
| Plain HTTP over residential Premium ($2.20/GB) | 570,402 | about 1,753 | about $1.25 per 1,000 pages |
| Rendered over residential Basic | 1,607,265 | about 622 | about $1.29 per 1,000 pages |
| Web scraping API, plain HTTP | n/a | n/a | $0.20 per 1,000 pages |
| zalando_search collector | n/a | n/a | $1.00 per 1,000 products, 24 per catalogue page, Omnibus prices parsed |
Byte figures are decoded HTML; wire transfer is lower and headers add a little back. The row that changes a decision is the collector: a thousand products is about 42 catalogue pages, so raw bandwidth for them is under two cents, and what the dollar buys is the retry on the false 200, the SKU, and the reference prices read correctly. For a marketplace where the raw page is cheap and stable, see Subito through residential proxies; for one where the render is not wasteful but shut out entirely, Idealista.
The setting that works on Zalando
- Network: residential, Basic at $0.80/GB. The interstitial we saw was resolved by a fresh residential exit, not by a more expensive tier; Premium at $2.20/GB is for jobs where the exit must stay fixed for a session.
- Fetch mode: engine: tls, plain HTTP. 266 words in 8.4 seconds; the rendered page returns 268 words for 1,607,265 bytes and 39.1 seconds. Validate every response on content, never on the status code.
- Country: the country of the shop, country=it for zalando.it. The exit does not change the page (266 words from Germany, no redirect); pin it so prices, sizes and stock belong to one market.
- When the proxy is not enough: the zalando_search collector, 10 products in 3.6 seconds with SKU, current price, the 30-day median and 30-day low Omnibus references and their discount percentages, $0.001 per delivered product, retries on interstitials included.
- Every account gets $2 of free API usage per month, and failed requests are never billed.