# Otto Price Monitoring API

> Monitor otto.de prices per variationId: live price, retailPrice, priceSaving, shippingPrice and delivery message for furniture, appliances and fashion.

- URL: https://everydata.io/otto-price-monitoring-api
- Updated: 2026-09-30
- Publisher: everydata.io (https://everydata.io)

Status note: otto.de currently blocks automated access to product pages, so /ott/otto-lookup-product answers 502 (not charged) until that is resolved; search-side prices via /ott/otto-search-by-keyword work normally. Otto's price dynamics are different from a marketplace's: most articles are sold by Otto itself, price changes come from planned campaigns – the Otto sale, Black Week, seasonal furniture promotions – and the interesting ticket sizes are large. A sofa that drops from 1,299 to 899 EUR, a washing machine whose shipping surcharge disappears, or a mattress whose 140×200 variation is discounted while 180×200 is not. The everydata.io Otto Price Monitoring API is the product-details endpoint polled on your schedule: it returns price, retailPrice, priceSaving, shippingPrice and the delivery promise for the exact variationId you watch.

## Key facts

- Platform: [Otto API](https://everydata.io/apis/otto) (live)
- Main endpoint: `GET /ott/otto-lookup-product`
- Quota: A call to the Otto API counts as 2 requests against the monthly quota (Search products: 1 request).
- Pricing: 100 free requests a month; paid plans from €30 a month for 5,000 requests (€1.00–€6.00 per 1,000 requests). One quota is shared across all 35 platforms; failed requests (5xx, blocked pages) are not counted.

## What you get

There is no separate price-history endpoint for otto.de. Instead, every call to GET /ott/otto-lookup-product fetches the live page and hands you the current numbers; you store each observation with a timestamp and build the history yourself. That is deliberate honesty rather than a limitation – the value you keep is exactly what you polled, and you decide the cadence per product.

Because Otto prices per variation, the response is variation-aware. price and retailPrice describe the variationId in your URL, priceSaving carries Otto's own badge ("-36%"), shippingPrice tells you whether a Speditionszuschlag currently applies, and warehouseAvailability gives the German delivery sentence. The variations array adds price, retailPrice and available for every sibling, so one call captures the whole size or colour ladder.

- Live price and crossed-out retailPrice in EUR for the selected variationId
- priceSaving badge exactly as displayed, so you can flag campaign discounts versus permanent markdowns
- shippingPrice to catch free-delivery promotions on furniture and large appliances
- warehouseAvailability with Otto's delivery promise – "lieferbar - in 2-3 Werktagen bei dir" or a longer lead time
- Per-sibling price and available flags in variations[] to monitor a full size run from one request
- Search-side prices via /ott/otto-search-by-keyword for category sweeps with preis-aufsteigend
- Realtime on every poll – nothing is served from a stale catalogue

## How it works

Store the otto.de URL including #variationId for every item on your watch list and call the product endpoint at the interval you choose. The example watches one colour of a discounted running shoe; the response has been reduced to the fields a monitor actually persists.

```bash
curl -s "https://api.everydata.io/ott/otto-lookup-product?url=https%3A%2F%2Fwww.otto.de%2Fp%2Freebok-astroride-trail-gt-x-2-0-laufschuh-damen-laufschuh-C887844716%2F%23variationId%3D887846268" \
  -H "x-api-key: YOUR_API_KEY"
```

Response (shortened):

```json
{
  "responseStatus": "PRODUCT_FOUND_RESPONSE",
  "productTitle": "Reebok Astroride Trail GT-X 2.0 Laufschuh Damen Laufschuh",
  "manufacturer": "Reebok",
  "productId": "887844716",
  "variationId": "887846268",
  "price": 69.99,
  "retailPrice": 110,
  "priceSaving": "-36%",
  "shippingPrice": 0,
  "warehouseAvailability": "lieferbar - in 2-3 Werktagen bei dir",
  "soldBy": null,
  "variations": [
    {
      "variationName": "size",
      "values": [
        {
          "value": "5 US - 35 EU - 2.5 UK",
          "asin": "S097Q0IYYLE2",
          "available": false,
          "price": 69.97,
          "retailPrice": 0
        }
      ]
    }
  ]
}
```

Building the history: write one row per poll with observedAt, productId, variationId, price, retailPrice, priceSaving, shippingPrice and warehouseAvailability. Index on (variationId, observedAt). From that table you compute the 30- and 90-day minimum, detect a campaign start (retailPrice appears and priceSaving changes from "" to "-36%") and spot a shipping promotion (shippingPrice moves from 29.95 to 0). Keep the raw JSON if you want to backfill new metrics later.

Cadence guidance from Otto's behaviour: campaign prices typically switch at midnight or early morning, so one poll after 06:00 CET catches most changes; add a second in the evening for electronics during Black Week. Polling every ten minutes buys little on otto.de and burns quota.

A 404 means the article disappeared from otto.de – record it as delisted rather than as a price of 0. If Otto blocks or times out you receive a 502/503 that is not billed; retry on the next cycle instead of immediately.

## What teams build with this

### Furniture and appliance deal alerts

Consumer sites watch large-ticket items – sofas, wardrobes, washing machines – and push a notification when price drops below the 90-day minimum in the user's own table or when shippingPrice becomes 0.

### Brand price and promotion compliance

Manufacturers check that their retailPrice on otto.de matches the UVP they communicated and log each priceSaving badge as evidence of a promotion window.

### Competitive pricing for German retailers

Shops that compete with Otto in furniture or home electronics poll the same models daily and feed the price into their repricing rules, keeping variation sizes aligned.

### Discount-depth analytics

Analysts aggregate their own observation table per category to measure how deep and how long Otto's sale periods run, and how often a retailPrice is reinstated afterwards.

## Pricing

Every poll is one product request and counts 2 quota units. Watching 150 variations once a day is about 4,500 requests or 9,000 units a month – the Production plan (50,000 units, €80); Starter (5,000 units, €30) covers about 80 variations daily. Production supports roughly 400 variations twice daily, Business (300,000, €300) an assortment of 2,500 items twice a day. Otto-side errors are never deducted.

## FAQ

### Is there a price-history endpoint for otto.de?

No. Price monitoring on Otto works by re-polling GET /ott/otto-lookup-product and storing each response. The How-it-works section above describes a minimal schema for building the history yourself.

### Does the price belong to the variation in my URL?

Yes. price, retailPrice and priceSaving describe the variationId you passed (or Otto's default if you omitted the fragment). Sibling prices are listed in variations[].values[].price so you can monitor all sizes from one call.

### How do I detect a shipping promotion?

Compare shippingPrice between polls. Furniture and white goods often carry a Speditionszuschlag that Otto waives during campaigns; a change to 0 is the signal.

### Can I monitor a whole category instead of single items?

Use GET /ott/otto-search-by-keyword with sortBy=preis-aufsteigend to sweep a term and record price and retailPrice per productId from the result tiles. For shipping and stock details drill into individual products.

### How often should I poll?

For most otto.de articles once or twice a day is enough; campaign prices usually change overnight. Your rate limit (10 to 250 requests per minute depending on plan) is the only technical cap.

### Are prices shown with German VAT?

Yes. otto.de displays consumer prices in EUR including 19% (or 7%) VAT, and the API returns them unchanged. There is no net-price field.

## Related use cases

- [Otto Product Data API](https://everydata.io/otto-product-data-api)
- [Otto Search API](https://everydata.io/otto-search-api)
- [Kaufland Price Monitoring API](https://everydata.io/kaufland-price-monitoring-api)
- [Amazon Price Tracker & Price History API](https://everydata.io/amazon-price-tracker-api)

## More

- [All platforms](https://everydata.io/apis) · [Pricing](https://everydata.io/pricing) · [API reference](https://everydata.io/docs) · [Getting started](https://everydata.io/docs/getting-started) · [MCP server](https://everydata.io/docs/mcp) · [Status](https://everydata.io/status)
- Machine-readable: [llms.txt](https://everydata.io/llms.txt), [llms-full.txt](https://everydata.io/llms-full.txt), [OpenAPI](https://api.everydata.io/openapi.json)
