# HOFER Austria prices, weekly offers and product labels

> Search products, browse a category, read a dated offer (Angebote) or page the whole online assortment; optionally one store's range.
> ReefAPI engine `hofer` · 6 endpoints · clean JSON, no scraping or browsers to manage.

## How to call
- **Endpoint:** `POST https://api.reefapi.com/hofer/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 calls are free except verified SHEIN NOT_FOUND on product/detail and price (4 credits).
- **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). Send the key as `Authorization: Bearer <key>`, or put it in the URL (`?key=<key>`) when the client has no header field, as ChatGPT does.

## Endpoints

### POST https://api.reefapi.com/hofer/v1/search — 2 credits
Search products, browse a category, read a dated offer (Angebote) or page the whole online assortment; optionally one store's range.

**Parameters:**
- `query` (string, optional) — Keyword (German). Leave query, categoryKey and promotionKey all empty to page the whole online assortment.
- `categoryKey` (string, optional) — Category id from categories (or from a /produkte/.../k/<id> URL).
- `promotionKey` (string, optional) — Offer date YYYY-MM-DD from promotions ("Angebote ab ...").
- `url` (string, optional) — A https://www.hofer.at listing URL (/produkte/.../k/<id>, /angebote/<date>, /suchergebnisse?q=, /produkte); its filters are applied, explicit parameters win.
- `brandName` (array, optional) — Exact brand values from facets; several values use OR.
- `categoryTree` (array, optional) — Category facet keys from the current search response.
- `theme` (array, optional) — Exact theme keys from promotions or facets, sent unmodified.
- `store_id` (string, optional) — Optional HOFER store id from the stores action. Narrows the listing to that store's range (prices are national and do not change). Unknown ids return INVALID_PARAM.
- `sort` (enum, optional, default "relevance") — Ordering. Use price_asc for complete sweeps; an unknown sort is rejected because the source would silently ignore it. [one of: relevance, name_asc, name_desc, price_asc, price_desc]
- `page` (integer, optional, default 1) — One-based page. A page past the end returns INVALID_PARAM.
- `limit` (enum, optional, default 30) — Page size; the source accepts only these values. [one of: 12, 16, 24, 30, 32, 48, 60]

**Returns:** Products with EUR shelf price, unit price (Grundpreis) and its basis, was-price and discount on offers, deposit, pack size, brand, badges, offer start date, pagination and live facets.

**Example request body:**
```json
{
  "query": "milch",
  "limit": 12
}
```

### POST https://api.reefapi.com/hofer/v1/offers — 3 credits
List a current offer range HOFER PREIS,-WOCHEN / HOFER Preis - Dauerhaft Günstiger.

**Parameters:**
- `type` (enum, optional, default "weekly") — Offer range, resolved by name from the live category tree. [one of: weekly, permanent_low]
- `brandName` (array, optional) — Exact brand values from facets; several values use OR.
- `categoryTree` (array, optional) — Category facet keys from the current search response.
- `theme` (array, optional) — Exact theme keys from promotions or facets, sent unmodified.
- `store_id` (string, optional) — Optional HOFER store id from the stores action. Narrows the listing to that store's range (prices are national and do not change). Unknown ids return INVALID_PARAM.
- `sort` (enum, optional, default "relevance") — Ordering. Use price_asc for complete sweeps; an unknown sort is rejected because the source would silently ignore it. [one of: relevance, name_asc, name_desc, price_asc, price_desc]
- `page` (integer, optional, default 1) — One-based page. A page past the end returns INVALID_PARAM.
- `limit` (enum, optional, default 30) — Page size; the source accepts only these values. [one of: 12, 16, 24, 30, 32, 48, 60]

**Returns:** The range's products with prices, was-prices and pagination, plus the resolved category.

**Example request body:**
```json
{
  "type": "permanent_low",
  "limit": 12
}
```

### POST https://api.reefapi.com/hofer/v1/promotions — 1 credit
List current and upcoming offer dates (Angebote ab ...) and their themes.

**Parameters:** none

**Returns:** Offer dates (use as promotionKey in search), titles, themes and storefront URLs.

### POST https://api.reefapi.com/hofer/v1/product/detail — 1 credit
Read one product: prices, description and label.

**Parameters:**
- `id` (string, required) — 18-digit product id from search (keep the leading zeros) or a https://www.hofer.at/produkt/... URL. A retailer id, not an EAN.

**Returns:** Identity, prices, unit price, description, ingredients, allergens, nutrition, storage, origin, images and badges.

**Example request body:**
```json
{
  "id": "000000000000100778"
}
```

### POST https://api.reefapi.com/hofer/v1/categories — 1 credit
Get the live category tree with the offer ranges marked.

**Parameters:** none

**Returns:** Category ids, names, storefront URLs, offer_type and nested children.

### POST https://api.reefapi.com/hofer/v1/stores — 1 credit
Find HOFER stores by town, postcode or coordinates (store ids for search).

**Parameters:**
- `query` (string, optional) — Town, postcode or street for the store finder. Use query OR latitude+longitude.
- `latitude` (number, optional) — Latitude; requires longitude. Results then carry a distance.
- `longitude` (number, optional) — Longitude; requires latitude.
- `page` (integer, optional, default 1) — One-based page.
- `limit` (integer, optional, default 10) — Stores per page (1-50).

**Returns:** Stores with id, address, coordinates, distance (coordinate mode) and pagination.

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

## At scale
- **Volume:** 5M+ requests a day, measured at 60 requests a second across the fleet with no
  central bottleneck. Per-key limits are raised for high-volume accounts; volume pricing on request.
- **Missing a source:** tell us a site we do not cover and it becomes an engine. A customer asked
  for bestprice.gr on 21 Sep 2026 and it was in the catalog on 22 Sep.
- **Support:** 2 minute median time from a question in the live chat to the first answer. Setup
  help included, no support tier to buy.
- **One key, one credit pool** across every API. No per-site plans, no separate subscriptions.

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