# Otto.de API scraper — search Germany's Otto.de marketplace: product search & filters, category browse, product facts, deals, new arrivals, brands and the department tree (DE / EUR)

> Keyword product search on Otto.de with brand, price, rating, condition and availability filters, sort order and offset pagination. Returns product cards (name, brand, price in EUR, condition, availability, rating, review count, image, URL).
> ReefAPI engine `otto` · 9 endpoints · clean JSON, no scraping or browsers to manage.

## How to call
- **Endpoint:** `POST https://api.reefapi.com/otto/v1/<action>` with a JSON body.
- **Auth:** header `x-api-key: <YOUR_REEFAPI_KEY>` — create one free (1,000 credits, no card): https://reefapi.com/signup
- **Response (every call):** `{ ok: boolean, data: ..., meta: { record_count, credits, ... }, error: { code, message } }` — branch on `ok`. Failed or blocked calls are free.
- **One key + one shared credit pool** across every ReefAPI API. Per-call credits are listed on each endpoint below.
- **Use it from an AI agent (MCP):** connect `https://api.reefapi.com/mcp` (remote streamable-http, `Authorization: Bearer <key>`) and your assistant can call these actions directly.

## Endpoints

### POST /otto/v1/search — 1 credit
Keyword product search on Otto.de with brand, price, rating, condition and availability filters, sort order and offset pagination. Returns product cards (name, brand, price in EUR, condition, availability, rating, review count, image, URL).

**Parameters:**
- `query` (string, required) — Search keyword, e.g. iphone, sneaker, kaffeevollautomat.
- `sort` (enum, optional) — Sort order (Otto 'sortierung' keys). [one of: beliebtheit, preis-aufsteigend, preis-absteigend, bewertung, neuheiten]
- `brand` (string, optional) — Filter by brand slug (lowercased), e.g. apple, samsung, hp.
- `price_min` (number, optional) — Minimum price (EUR).
- `price_max` (number, optional) — Maximum price (EUR).
- `preis` (string, optional) — Advanced: raw Otto price range 'lo-hi' (overrides price_min/price_max).
- `min_rating` (integer, optional) — Minimum star rating filter (1-5).
- `condition` (string, optional) — Otto Zustand filter (German value, e.g. neu, gebraucht).
- `availability` (string, optional) — Otto Verfuegbarkeit filter (German value, e.g. sofort-lieferbar).
- `offset` (integer, optional, default 0) — Pagination offset (skip N, page size 72). Page with meta.next_offset.

**Returns:** products[] (name, brand, price, currency, condition, availability, rating, review_count, image, url), offset, has_more, next_offset

**Example request body:**
```json
{
  "query": "iphone"
}
```

### POST /otto/v1/browse — 1 credit
Browse an Otto.de category landing (e.g. moebel, technik/computer, mode) with the same brand / price / rating / sort filters and offset pagination as search.

**Parameters:**
- `category` (string, required) — Otto category path, e.g. moebel or technik/computer (discover paths via the categories action).
- `sort` (enum, optional) — Sort order (Otto 'sortierung' keys). [one of: beliebtheit, preis-aufsteigend, preis-absteigend, bewertung, neuheiten]
- `brand` (string, optional) — Filter by brand slug (lowercased), e.g. apple, samsung, hp.
- `price_min` (number, optional) — Minimum price (EUR).
- `price_max` (number, optional) — Maximum price (EUR).
- `preis` (string, optional) — Advanced: raw Otto price range 'lo-hi' (overrides price_min/price_max).
- `min_rating` (integer, optional) — Minimum star rating filter (1-5).
- `condition` (string, optional) — Otto Zustand filter (German value, e.g. neu, gebraucht).
- `availability` (string, optional) — Otto Verfuegbarkeit filter (German value, e.g. sofort-lieferbar).
- `offset` (integer, optional, default 0) — Pagination offset (skip N, page size 72). Page with meta.next_offset.

**Returns:** products[], category, offset, has_more, next_offset

### POST /otto/v1/product — 1 credit
Product facts for one Otto.de item by variation id — name, brand, price (EUR), condition, availability, aggregate rating, review count, image and URL. Read from the search grid because Otto's standalone product page is Kasada anti-bot walled; individual review text, GTIN and the full spec table are not available on this tier.

**Parameters:**
- `id` (string, required) — Otto variation id (e.g. 1786938267), as returned in search/browse products[].variation_id.
- `query` (string, required) — Keyword the variation appears under (the PDP is anti-bot walled, so the item is located via the search grid).

**Returns:** product{} — variation_id, product_id, name, brand, price, currency, condition, availability, rating, review_count, image, url

**Example request body:**
```json
{
  "id": "1786938267",
  "query": "iphone"
}
```

### POST /otto/v1/deals — 1 credit
Current Otto.de deal / sale campaign products (e.g. Deal des Monats, Super Sale). Auto-discovers the active campaigns from the storefront and returns their product cards. Pick a specific campaign with the campaign param.

**Parameters:**
- `campaign` (string, optional) — Specific deal campaign slug (e.g. deal-des-monats, super-sale). Omit to auto-pick the first active campaign; the full list is returned in available_campaigns.

**Returns:** products[], campaign, available_campaigns[]

### POST /otto/v1/new_arrivals — 1 credit
Newest products on Otto.de — keyword or category sorted newest-first (sortierung=neuheiten). Pass query OR category; supports the same filters and offset pagination.

**Parameters:**
- `query` (string, optional) — Keyword to pull newest items for, e.g. sneaker.
- `category` (string, optional) — Category path to pull newest items for (alternative to query).
- `brand` (string, optional) — Filter by brand slug (lowercased), e.g. apple, samsung, hp.
- `price_min` (number, optional) — Minimum price (EUR).
- `price_max` (number, optional) — Maximum price (EUR).
- `preis` (string, optional) — Advanced: raw Otto price range 'lo-hi' (overrides price_min/price_max).
- `min_rating` (integer, optional) — Minimum star rating filter (1-5).
- `condition` (string, optional) — Otto Zustand filter (German value, e.g. neu, gebraucht).
- `availability` (string, optional) — Otto Verfuegbarkeit filter (German value, e.g. sofort-lieferbar).
- `offset` (integer, optional, default 0) — Pagination offset (skip N, page size 72). Page with meta.next_offset.

**Returns:** products[] (newest first), query|category, offset, has_more, next_offset

### POST /otto/v1/brands — 1 credit
Brand filter links available on an Otto.de category landing page — feed the slug to search/browse as the brand filter.

**Parameters:**
- `category` (string, required) — Otto category path to list brand filters for, e.g. technik.

**Returns:** brands[] {name, slug, url}, category

### POST /otto/v1/categories — 1 credit
Otto.de department tree — top-level departments from the homepage, or the child categories of a parent path (e.g. parent=technik). Feed paths to browse / brands.

**Parameters:**
- `parent` (string, optional) — Parent category path to list children of (omit for the top-level departments).

**Returns:** categories[] {name, slug, path, url}, parent

### POST /otto/v1/filters — 1 credit
Discover the sort orders and filter query params supported by Otto.de search/browse, with a live probe showing the available deal campaigns.

**Parameters:** none

**Returns:** sort_options[], supported_filters{}, available_campaigns[], notes[]

### POST /otto/v1/reviews — 1 credit
Aggregate customer rating for an Otto.de item — average star rating and total review count from the search-embedded data. Individual review TEXT is only on the standalone product page, which is Kasada anti-bot walled, so it is not available on this bare-curl tier (reviews[] is returned empty with text_available=false, honestly).

**Parameters:**
- `id` (string, required) — Otto variation id (from search/browse products[].variation_id).
- `query` (string, required) — Keyword the variation appears under.

**Returns:** rating{average, count}, reviews[] (empty on this tier), text_available, variation_id

**Example request body:**
```json
{
  "id": "1786938267",
  "query": "iphone"
}
```

## More
- Try it live, no code: https://reefapi.com/playground?engine=otto
- Human docs page: https://reefapi.com/docs/otto
- Every ReefAPI API in one file (for your AI): https://reefapi.com/llms-full.txt
