Otto Products Scraper

A German retailer's catalogue,
one product per row.

Otto is one of Germany's largest general-merchandise retailers, and its product pages are assembled in the browser rather than served whole. This service loads them the way a browser does and returns seventeen columns per product URL - the same schema our other catalogue scrapers use, so one importer reads them all.

one-time 500 free rowsthen $0.002 per rowseventeen columns per productCSV · JSON · Excel
How it works

A list of URLs in, a spreadsheet out.

  1. STEP 1Sign in to the platform.
  2. STEP 2Open the Otto Products Scraper.
  3. STEP 3Paste the Otto product URLs you want, one per line.
  4. STEP 4Choose your output format (CSV / JSON / XLSX).
  5. STEP 5Run the job.
  6. STEP 6Download the results - one row per URL, seventeen columns.
What to know

What shapes a run against Otto.

The listings are assembled in the browser

Request https://www.otto.de with an ordinary client and you get a working page of around 320 KB carrying seventy-odd script tags and no product links in the served markup. The catalogue arrives afterwards, from JavaScript. Anything built on an HTTP library and an HTML parser reads a valid page and finds no products in it - this service loads the page the way a browser does instead.

A consumer retailer, not a trade distributor

Otto sells to the public, which is worth saying because the other catalogues on this schema - BiggestBook, Vistaprint, Waxie - are trade sites whose price columns come back empty for reasons specific to each of them. A consumer storefront publishes its prices to everyone. We have not measured Otto's, so we will not promise them either, but the reasons those pages give for empty money columns do not transfer here.

Seventeen columns, some of them in pairs

The export carries price and parsed_price, sku and sku_code, image and images, url and product_url. One of each pair is for reading and one for computing, and knowing which is which before you write the importer saves a rewrite.

The same shape as the rest of the family

Livescraper runs this schema across a series of retail and supply sources. The seventeen names and their order are identical, so one importer reads them all, and adding a second source is a configuration change rather than a project.

Every row says whether it worked

The last column is status, written by our exporter rather than by the site. A row that could not be retrieved still arrives, carrying the reason. You reconcile against your input list instead of discovering a silent gap three weeks later.

We say what we did not measure

The two runs behind this page both submitted a placeholder URL that returned a 404, so we hold no Otto product data whatsoever. The column list below is real - it is the header row of those exports. The values are not described, because we have not seen any.

What you get back

Seventeen columns, per product.

Read from the header row of a real export of this service, in sheet order. The two runs we hold returned no data under that header - see the note below the table - so each entry says what the column is for, and stops there.

query
The Otto URL you submitted, echoed on every row so an export covering many products stays separable. Keep it: it is the only record of which input the rest of the row answers.
sku_code
The article code as the catalogue prints it. Pairs with sku below - check both before choosing a join key, because across this schema family they are filled independently and have been observed both identical and different.
product_url
The canonical product page. Distinct from url, which reports the address the row was actually produced from; the two diverge whenever a submitted link redirects.
name
The product title as the page states it. Expect German, since this is a German storefront - plan the collation and encoding of that column accordingly.
description
The description text. Expect a long free-text field rather than a short label, and give it a wide column or a text type in your database.
parsed_price
The price as a bare number, without symbol or thousands separator - the one to use for arithmetic, sorting and thresholds.
price
The price as displayed. Use it when you need to show a customer exactly what the page said; use parsed_price when you need to compute. On a German storefront the displayed form will not be the one your spreadsheet parses by default.
currency
The currency the price is quoted in. Read it rather than assuming it - assuming is how a euro figure ends up added to a dollar one.
availability
The stock state as published on the page. Treat it as the catalogue's claim at the moment of the scrape, not as a live inventory feed.
rating
The average rating, where the page publishes one. Not every product carries one, so write the importer to accept an empty cell rather than failing on it.
reviews
The number of reviews, with the same caveat as rating. Where both are present they belong together; a score with no count behind it is not enough to rank on.
images
Every image the page carries, in one field. Split it before storing if you need one row per asset - and check what the separator actually is before you split, because in this schema family that has bitten people.
brand
The manufacturer or brand. This is the field to group on for assortment work: which brands a retailer lists, and how deep each line goes.
sku
The item number. The other half of the identifier pair with sku_code.
url
The address the row was produced from. Compare with query to detect redirects, and with product_url to detect canonicalisation.
image
The primary image on its own, so the common case - one thumbnail per product - needs no string splitting.
status
A per-row flag written by our exporter, not by Otto. It reports whether the row was retrieved. Both runs behind this page read http 404 here, because the URL submitted was a placeholder that does not exist.

Seventeen columns per row · CSV, JSON or Excel

Behind this page are two runs, from 14 and 15 July 2026, whose payloads are byte-identical. Both submitted https://www.example.com/product/123 - a placeholder, not an Otto address - and both returned a single row reading http 404 with all fourteen data columns empty. So we can give you the schema with confidence and nothing at all about Otto's values, and this page does not pretend otherwise. The seventeen names appear in the same order in our BiggestBook, Vistaprint and Waxie exports, and the Waxie runs are populated, which is how we know the schema is live rather than a stub. We deliberately do not describe Otto's columns using those pages' values: they are trade sites whose money columns are empty for reasons particular to each, and Otto is a consumer retailer. Borrowing their measurements would be a guess wearing the clothes of a fact.

Common workflows

What a retail catalogue is good for.

Price monitoring

Watch a range, not a single item

Submit the URLs of the products you care about on a schedule and keep parsed_price, currency and the run date. The value is not in any one figure but in the series - a retailer usually moves a whole range at once, and a table shows that where a browser tab does not.

Pricing · Monitoring
Assortment analysis

See which brands a retailer actually carries

Group an export by brand and count. The depth per brand tells you where a retailer has committed and where it is only testing - the same question a buyer asks before adding a supplier, answered from the catalogue itself.

Category buying · Assortment
Catalogue enrichment

Fill the fields your own records are missing

Product databases tend to be strong on identifiers and thin on copy and imagery. description, image and images close that gap against an identifier you already hold, without re-photographing anything.

Ecommerce ops · Catalogue
Market entry research

Read a German storefront from outside Germany

A national retailer's catalogue is the cheapest available picture of what a market stocks and at what price point. Keep name, brand and parsed_price and you have the shape of a category without commissioning a study.

Strategy · Market research
Pricing

Pay only for what you actually use.

Free tier

First 500 rows are free

One time, on signup. No card, and nothing to cancel afterwards.

One-time, on signup
Rate

then $0.002 per row

Billed on rows actually returned. A row that comes back with a status other than a successful one is not a row of product data, and is not charged as one.

Billed on rows returned
No subscription

Nothing recurring

Credits do not expire on a monthly cycle. Run a catalogue sweep in March and nothing until September if that is the shape of the work.

No monthly expiry
10% off your first paid run.Use code LIVESCRAPER10 at checkout.
Register
Pairs well with

Other catalogues, the same seventeen columns.

The legal bit

Is it legal to scrape Otto?

Product facts on a publicly reachable page are ordinary competitive information. The caveats worth naming here are about reuse and about a German site being a German site.

A price, a product name, a brand and a stock state are facts about goods offered for sale. Reading them from a page served to any visitor is the same activity a buyer performs by hand, at a useful speed. Nothing in the seventeen columns describes a person: no name, no email address, no phone number, no account - so the data-protection questions that shape our people-facing services do not arise here. It is worth being explicit about that on a German site, because GDPR is the first thing anyone asks about, and it governs personal data - which a product row is not.

Two caveats are worth naming. First, reuse: descriptions and product photography are somebody's copyrighted work. Using them internally for price monitoring, assortment analysis or reconciliation against your own records is ordinary practice; republishing them as your own catalogue is a different question with a different answer. Second, the site's own stated preferences. Otto publishes a robots.txt, and for a general crawler it carries only a handful of narrow exclusions rather than a blanket one, so product pages are not among the paths it asks crawlers to avoid. We read that file rather than assuming, we stay on publicly available pages, and we run at a considerate rate.

Our own terms are the same as on every other service here. Publicly available pages only, nothing behind a login, no third-party trackers on the data layer, and exports auto-delete after 30 days. Your first 500 rows are free and need no credit card.

livescraper.app · what shapes a run
One product URL per row
The page is rendered, not just fetched
Anonymous access only
No Otto values measured - schema only
Exports auto-delete after 30 days
We can tell you the shape of the table with certainty. What Otto puts in it, we have not yet seen.
Common questions

What people ask before signing up.

What columns does the export contain?+
Seventeen, in this order: query, sku_code, product_url, name, description, parsed_price, price, currency, availability, rating, reviews, images, brand, sku, url, image and status. One row per product URL you submit.
Is there sample Otto data on this page?+
No, and we will not invent any. Both runs behind this page submitted a placeholder URL that returned http 404, so every data column came back empty. That is enough to establish the seventeen column names and nothing more - which is why this page describes what each column is for and never what its values look like.
Will the price columns be populated?+
We have not measured them, so we are not going to promise. What we can say is that the reasons our other catalogue pages give for empty price columns do not apply here: those are trade sites that quote per account or per quantity, and Otto is a consumer retailer that publishes prices to everyone. That makes it likely rather than certain, and we would rather mark the difference than claim a measurement we do not have.
Why does Otto need more than a simple HTTP request?+
Because the listings are assembled in the browser. A request to https://www.otto.de with an ordinary client returns a working page of roughly 320 KB carrying about seventy script tags and no product links in the served markup. The catalogue is fetched and rendered afterwards, so a scraper built on an HTML parser alone sees a valid page with nothing in it.
Will the data come back in German?+
Expect so - name and description are whatever the storefront prints, and this is a German storefront. Plan the encoding and collation of those columns accordingly, and remember that the displayed price will use German number formatting even though parsed_price is there to be computed on.
Why are there two price and two identifier columns?+
One of each pair is for reading and one for computing. price is the price as displayed and parsed_price the same figure as a bare number; sku and sku_code are filled independently across this schema family and have been observed both identical and different, so check both before choosing a join key. The same doubling applies to image and images, and to url and product_url.
What does the status column mean?+
It is written by our exporter, not by Otto, and reports whether the row was retrieved. A failed row still arrives carrying the reason, so you can reconcile the export against your input list instead of discovering a silent gap later. Both runs behind this page read http 404 there.
How much does it cost?+
Your first 500 rows are free, one time, no card. After that it is $0.002 per row, billed on rows actually returned, with no subscription and no monthly expiry on credits.
What formats can I export?+
CSV, JSON or Excel. The seventeen columns and their order are the same in all three.

Read the catalogue as a table.

Seventeen columns per product, from a storefront that assembles itself in the browser. Your first 500 rows are free, then $0.002 each.

Activates instantly · no card required

Scrape Otto product data

Otto is one of Germany's largest general-merchandise retailers, selling clothing, furniture, electronics and household goods to the public through otto.de. That it is a consumer storefront rather than a trade distributor matters more than it sounds, because the other catalogues sharing this schema - BiggestBook, Vistaprint, Waxie - are all trade sites, and each of them has its own reason for returning empty price columns. A retailer that sells to everyone publishes its prices to everyone. We have not measured Otto's, so this page will not promise them, but the reasoning that applies to those pages does not transfer to this one and we would rather say so than let the family resemblance imply something we did not test.

The practical obstacle is how the site is built. A request to https://www.otto.de from an ordinary HTTP client returns a successful response of roughly 320 KB carrying around seventy script tags and no product links in the markup it serves - the listings are assembled client side, after that shell arrives. Anything built on an HTTP library and an HTML parser will therefore read a valid page and find nothing in it, which is the most common reason a homegrown scraper appears to work and returns empty rows. This service loads the page the way a browser does, so the products are present by the time anything is read.

The export is seventeen columns per product URL: query, sku_code, product_url, name, description, parsed_price, price, currency, availability, rating, reviews, images, brand, sku, url, image and status. Four of those are pairs - price as displayed against price as a number, two identifier fields, primary image against all images, requested URL against canonical URL - and knowing which half to use before you write the importer is the difference between a clean load and a rewrite. That the identifier pair is worth checking is not theoretical: on our Waxie export, which uses this same schema, the two columns held genuinely different numbers, the distributor's item number and the manufacturer's. Expect German text in name and description, and German number formatting in the displayed price.

We are deliberately plain about the limits of what we can show. The two runs behind this page, from 14 and 15 July 2026, both submitted a placeholder address rather than an Otto one, and both came back with a 404 and every data column empty. That establishes the schema - a header row is a real header row even with no data beneath it - and it establishes nothing about Otto's values, so you will find no sample prices, article numbers or ratings anywhere on this page. On the legal side, a product row contains no personal data, which is the question a German site usually raises first; descriptions and photography are a separate matter of copyright and reuse. Otto publishes a robots.txt and for a general crawler it lists only a handful of narrow exclusions rather than a blanket one, so product pages are not among the paths it asks crawlers to avoid. Publicly available pages only, no third-party trackers on the data layer, and exports auto-delete after 30 days. Your first 500 rows are free and need no credit card.