# Kaufland Product Data API

> Any kaufland.de product as JSON: title, manufacturer, soldBy seller, price, shippingPrice, stock line, rating, images, specs and variants with own URLs.

- URL: https://everydata.io/kaufland-product-data-api
- Updated: 2026-09-30
- Publisher: everydata.io (https://everydata.io)

Kaufland.de is not a single-retailer shop. Behind most product pages stands a third-party merchant – the page names the seller in a "Verkauf durch …" line, several sellers can compete for the same article, and a Nintendo Switch Lite in turquoise is a different product id than the same console in yellow. The everydata.io Kaufland Product Data API takes a kaufland.de/product/<id>/ URL and returns the listing as one JSON document, including the seller currently holding the offer, the stock warning, the specification table and every colour variant with its own product URL.

## Key facts

- Platform: [Kaufland API](https://everydata.io/apis/kaufland) (live)
- Main endpoint: `GET /kfl/product/details`
- Quota: A call to the Kaufland API counts as 1 request against the monthly quota.
- 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

The response carries the product identity first: productTitle, manufacturer, productId (Kaufland's numeric id, repeated as asin for compatibility with our other retail endpoints) and the canonical url. productRating and countReview reflect the aggregate – 4.7 from 57 reviews in the example below – while productDescription and the productDetails key/value list (Modell, Hersteller, Maße, Lieferumfang) hold the German content the seller uploaded.

Marketplace context is where Kaufland differs from Otto or Lidl. soldBy names the merchant behind the current offer, warehouseAvailability carries the scarcity or stock sentence Kaufland shows – "Nur noch 1 zu diesem Preis" or "Nur noch 5 Stück auf Lager" – and price plus shippingPrice describe that merchant's offer in EUR. imageUrlList lists media.cdn.kaufland.de images in 1024×1024.

variations groups the colour or size dimension (variationName "Farbe") and each value carries its own dpUrl, asin, available flag, image and, where the seller sets one, price. Because Kaufland creates a separate product page per variant, dpUrl is what you pass into the next call to cover the whole family.

- productTitle, manufacturer, productDescription and the productDetails specification table
- soldBy – the marketplace merchant behind the displayed offer
- warehouseAvailability with Kaufland's stock and scarcity messages
- price and shippingPrice as numeric EUR fields, retailPrice where a strike-through price exists
- productRating and countReview aggregated across the listing
- imageUrlList and mainImage from media.cdn.kaufland.de
- variations[] with per-variant dpUrl, asin, available, imageUrl and price

## How it works

Call GET /kfl/product/details with the product URL. The short form https://www.kaufland.de/product/<id>/ is sufficient; the long browser URL with id_unit and tracking parameters works too. Only GET requests are needed – no session, no cookies, no proxy setup.

```bash
curl -s "https://api.everydata.io/kfl/product/details?url=https%3A%2F%2Fwww.kaufland.de%2Fproduct%2F461878680%2F" \
  -H "x-api-key: YOUR_API_KEY"
```

Response (shortened):

```json
{
  "responseStatus": "PRODUCT_FOUND_RESPONSE",
  "responseMessage": "Product successfully found!",
  "productTitle": "Nintendo Switch Lite Türkis (Japan-Spec)",
  "manufacturer": "Nintendo",
  "countReview": 57,
  "productRating": "4.7",
  "productId": "461878680",
  "variationId": "461878680",
  "url": "https://www.kaufland.de/product/461878680/",
  "soldBy": "Verkauf durch Schnaeppchen-Schuppen",
  "warehouseAvailability": "Nur noch 1 zu diesem Preis",
  "retailPrice": 0,
  "price": 219,
  "shippingPrice": 0,
  "imageUrlList": [
    "https://media.cdn.kaufland.de/product-images/1024x1024/da0ffe417ca13e74d7587ea5a9a3467f.jpg"
  ],
  "productDetails": [
    {
      "name": "Modell",
      "value": "Switch Lite"
    },
    {
      "name": "Hersteller",
      "value": "Nintendo"
    }
  ],
  "variations": [
    {
      "variationName": "Farbe",
      "values": [
        {
          "value": "Gelb",
          "dpUrl": "https://www.kaufland.de/product/461878683/",
          "selected": false,
          "available": true,
          "retailPrice": 0,
          "asin": "461878683"
        }
      ]
    }
  ]
}
```

soldBy is the field to read before you trust a price. Kaufland shows the cheapest eligible offer by default, so the seller can change between two calls while productId stays the same; the sentence includes the shop name exactly as Kaufland prints it ("Verkauf durch gobuytech"). sellerId is present but short and not always meaningful – key your seller table on the soldBy name.

warehouseAvailability is a free-text sentence, not a number. "Nur noch 1 zu diesem Preis" means the current offer is limited, not that the product is nearly gone – another seller may list more units at a higher price. Parse it for the digit if you need a quantity, but store the original text as well.

If the id does not exist you receive a 404 with statusMessage "not found for parameter". Manufacturer can be null when the seller did not fill it, and imageUrlList may be empty for thin listings – both are honest reflections of the page, not parser gaps.

## What teams build with this

### Marketplace seller monitoring

Brands re-fetch their catalogue on kaufland.de to see which merchant currently holds each offer, whether unauthorised resellers appear and whether product content was altered.

### Catalogue matching for cross-listing

Sellers who list on Amazon or Otto match their articles against kaufland.de listings via title, manufacturer, productDetails and images before creating or claiming an offer.

### Variant-family crawling

Start from one colour and follow every dpUrl in variations[] to collect the price, availability and seller for the whole product family in a handful of requests.

### Comparison-shopping feeds

Price comparison sites show the kaufland.de offer with seller name, shipping cost and the scarcity line, so users understand why an offer is cheap and how long it may last.

## Pricing

A product page is one request regardless of seller count or variant number. The free tier's 100 requests a month cover prototyping; Starter (5,000 requests, €30) refreshes about 160 Kaufland listings daily, Production (50,000, €80) about 1,600, and Business (300,000, €300) roughly 10,000. Upstream 5xx responses are never billed.

## FAQ

### Does the response list all sellers for a product?

It returns the offer Kaufland displays as the default – normally the cheapest – with its soldBy, price and shippingPrice. Other sellers' offers are not enumerated; polling over time shows you which merchants win the default slot.

### Which URL format should I pass?

https://www.kaufland.de/product/<productId>/ is enough. Long URLs with id_unit or campaign parameters are accepted and normalised into the url field of the response.

### Are colour or size variants separate products?

Yes. Each variant has its own productId and page; the variations array gives you every sibling with dpUrl, asin and available so you can request them individually.

### Is Kaufland only available for Germany?

This endpoint covers kaufland.de, the German marketplace, with prices in EUR including VAT and German-language content. There is no domainCode parameter.

### Where do I get the customer reviews?

GET /kfl/product/reviews with productId and an optional page returns the reviews with rating, title, text, date, the variant the reviewer bought and a verified flag.

## Related use cases

- [Otto Product Data API](https://everydata.io/otto-product-data-api)
- [Walmart Price Tracker & Product API](https://everydata.io/walmart-product-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)
