# Tesco Hungary Scraper — Grocery Products & Prices (`studio-amba/tesco-hu-scraper`) Actor

Scrape the full Tesco Hungary (bevasarlas.tesco.hu) groceries catalogue: product names, HUF prices, Clubcard offers, price per unit, EAN codes, images, ratings and categories. Search by keyword, walk the department tree or scrape one category. No login, no cookies.

- **URL**: https://apify.com/studio-amba/tesco-hu-scraper.md
- **Developed by:** [Studio Amba](https://apify.com/studio-amba) (community)
- **Categories:** E-commerce
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.00 / 1,000 result scrapeds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## Tesco Hungary Groceries Scraper

Scrape Tesco Hungary's grocery range (bevasarlas.tesco.hu): product names, HUF prices, Clubcard offers, price per unit, EAN codes, images, ratings, stock and full category paths. Search by keyword, scrape one category, or walk the entire catalogue. No login, no cookies.

### Why use this actor?

Tesco is one of Hungary's largest grocers, and its online range is one of the biggest price datasets in Hungarian retail. This actor gives you a clean, structured feed of the Tesco Hungary grocery catalogue for price monitoring, competitor benchmarking, product matching, market research, or building a grocery price comparison. You get the same data the Tesco website shows shoppers, including Clubcard prices, without needing an account or a delivery slot.

**Two data paths, both first-class.** Keyword searches go straight to Tesco's own search API, the same one the bevasarlas.tesco.hu site uses, so search runs are fast and return clean structured data including the real brand name. Category and full-catalogue runs read the authoritative listing data embedded in Tesco's rendered pages, including the exact product total for every category.

**Complete past the 10,000 cap.** Every Tesco listing is capped at 10,000 results, so a single broad crawl can silently truncate large departments. This actor walks the category tree (superdepartment → department → aisle → shelf) and, whenever a node's total hits the cap, descends into its child categories until every listing stays under 10,000. Products are deduped by Tesco product id (TPNC), and the run ends with a self-checking completeness assertion that compares per-category distinct coverage against the authoritative totals.

Tesco Hungary sits behind Akamai Bot Manager with hard IP-reputation blocking, so ordinary scrapers get an "Access Denied" before any product loads. For category scraping this actor routes every request through the Bright Data Web Unlocker, which solves the Akamai challenge and returns the fully rendered page, so you get reliable results run after run. Keyword search does not need Bright Data at all.

Note: the grocery catalogue lives on **bevasarlas.tesco.hu** ("Tesco Otthonról"). The separate tesco.hu site is a general corporate/home page, not the grocery shop.

### How to scrape Tesco Hungary data

1. Add this actor to your Apify account.
2. Choose what to scrape:
   - Set `searchQuery` to scrape a keyword, e.g. `tej` (milk) or `kenyer` (bread). This path needs no Bright Data key.
   - Set `categoryUrl` to scrape one category, e.g. `tejtermek-tojas/all` or a full `https://bevasarlas.tesco.hu/shop/hu-HU/browse/...` URL.
   - Or paste a list of listing URLs into `startUrls`.
   - Leave everything empty to walk the whole grocery catalogue (all 12 grocery superdepartments).
3. For category or full-catalogue runs, provide a Bright Data API key (field `brightDataApiKey`, stored as a secret) or set the `BRIGHT_DATA_API_KEY` environment variable.
4. Set `maxProducts` to cap the run (default 100, prefilled 20 for a quick test). Set it high, e.g. `25000`, for a full-catalogue pull.
5. Run the actor. Results stream to the dataset and can be exported as JSON, CSV, Excel or fed to an API.

For category runs the actor reads the authoritative product total of every listing and paginates 200 products per page. Whenever a listing's total hits Tesco's 10,000 cap, the actor drills into that category's children so no shelf is ever truncated. Set `enumerateOnly: true` to walk the tree and report the exact catalogue size without scraping products, a cheap way to verify completeness before a full run.

### Input

| Field | Type | Required | Description |
|-------|------|----------|-------------|
| `searchQuery` | String | No | Search Tesco Hungary groceries by keyword (no Bright Data key needed) |
| `categoryUrl` | String | No | A Tesco Hungary category URL or slug to scrape |
| `startUrls` | Array | No | One or more Tesco Hungary listing URLs |
| `maxProducts` | Integer | No | Maximum products to return (default 100) |
| `brightDataApiKey` | String (secret) | For categories | Bright Data Web Unlocker API key. Falls back to `BRIGHT_DATA_API_KEY` env var. |
| `enumerateOnly` | Boolean | No | Walk the tree and report the authoritative catalogue size without scraping products |
| `requestDelaySecs` | Integer | No | Minimum pause between category page fetches (for very large paced runs) |
| `proxyConfiguration` | Object | No | Proxy settings for the search API path |

#### Example input

```json
{
    "searchQuery": "tej",
    "maxProducts": 100
}
```

Or a category run:

```json
{
    "categoryUrl": "tejtermek-tojas/all",
    "maxProducts": 500
}
```

### Output

| Field | Type | Example | Description |
|-------|------|---------|-------------|
| `name` | String | `Tesco UHT félzsíros tej 2,8% 1 l` | Product name |
| `brand` | String | `Magyar Tej` | Brand name (search API) or own-brand detection |
| `price` | Number | `477` | Current shelf price in HUF |
| `currency` | String | `HUF` | Always HUF |
| `pricePerUnit` | String | `477 HUF/litre` | Unit price |
| `discount` | String | `Clubcard ár` | Clubcard / promotion text if present |
| `ean` | String | `05998200557682` | Barcode (GTIN) where available |
| `sku` | String | `210263880` | Tesco base product number (TPNB) |
| `productId` | String | `210263880` | Tesco consumer product number (TPNC) |
| `inStock` | Boolean | `true` | Availability flag |
| `rating` | Number | `4.5` | Average review rating (0-5) |
| `reviewCount` | Integer | `12` | Number of reviews |
| `category` | String | `Tejtermék-tojás > Tejek, tejitalok` | Full category path |
| `imageUrl` | String | `https://digitalcontent.api.tesco.com/...` | Primary product image |
| `url` | String | `https://bevasarlas.tesco.hu/shop/hu-HU/products/210263880` | Product page URL |
| `scrapedAt` | String | `2026-07-06T12:00:00.000Z` | Timestamp |

#### Example output

```json
{
    "name": "Magyar Tej ESL tej 2,8% 1 l",
    "brand": "Magyar Tej",
    "price": 477,
    "currency": "HUF",
    "pricePerUnit": "477 HUF/litre",
    "ean": "05998200557682",
    "sku": "210263880",
    "productId": "210263880",
    "inStock": true,
    "rating": 4.5,
    "reviewCount": 12,
    "imageUrl": "https://digitalcontent.api.tesco.com/v2/media/ghs/222e466a-426d-4fe4-abf9-004017d832b0/494e4769-971c-4bf4-8dcf-3cd9f94db7f1.jpeg",
    "category": "Tejtermék-tojás > Tejek, tejitalok",
    "categories": ["Tejtermék-tojás", "Tejek, tejitalok"],
    "url": "https://bevasarlas.tesco.hu/shop/hu-HU/products/210263880",
    "scrapedAt": "2026-07-06T12:00:00.000Z"
}
```

### Cost estimate

Keyword searches fetch up to 200 products per request, so even large keyword pulls cost only a few cents of platform usage. Category runs go through the Bright Data Web Unlocker (about $0.0015 per page fetch on Bright Data's side) and also return up to 200 products per page, so a full-catalogue pull of the Tesco Hungary range needs only a few hundred unlocker requests.

### Limitations / known issues

- Tesco Hungary's website does not expose historical prices; each run captures a snapshot (use scheduled runs to build a price history).
- `rating` and `reviewCount` are only present for products that have reviews.
- On the category (browse) path, `brand` is populated for own-brand lines and any product whose brand Tesco exposes in the rendered page; the keyword-search path returns the brand for every product.
- The `discount` field carries the promotion text exactly as Tesco publishes it.
- Category scraping requires a Bright Data Web Unlocker key; keyword search does not.
- A full-catalogue walk is a long run. The actor persists its progress and survives Apify server migrations: already-pushed products are never duplicated and completed categories are skipped on resume.
- The own-range guard keeps any third-party marketplace items out of the output if Tesco Hungary ever adds a marketplace.

### Related Scrapers

- [Tesco Scraper](https://apify.com/studio-amba/tesco-scraper) — Tesco UK groceries (GBP), the flagship sibling this actor is built from.
- [Tesco Ireland Groceries Scraper](https://apify.com/studio-amba/tesco-ie-scraper) — Tesco Ireland groceries (EUR), same platform and code path.
- Looking for other grocery price data? Studio AMBA builds grocery and retail scrapers across Europe — check the store profile for the full range.

# Actor input Schema

## `searchQuery` (type: `string`):

Search Tesco Hungary groceries by keyword (e.g., 'tej', 'kenyer', 'sajt'). Search runs through Tesco's own search API — fast and no Bright Data key needed.

## `categoryUrl` (type: `string`):

A Tesco Hungary category to scrape. Full URL (https://bevasarlas.tesco.hu/shop/hu-HU/browse/tejtermek-tojas/all) or a slug (tejtermek-tojas/all).

## `startUrls` (type: `array`):

One or more Tesco Hungary category or search listing URLs to scrape.

## `maxProducts` (type: `integer`):

Maximum number of products to return across all seeds. Set high (e.g., 30000) for a full-catalogue pull.

## `requestDelaySecs` (type: `integer`):

Minimum pause between category page fetches. Bright Data rate-limits rapid-fire requests to Tesco; a delay of 15-30s keeps a full-catalogue run under the limit (slower but reliable). 0 = full speed. Does not apply to keyword search.

## `enumerateOnly` (type: `boolean`):

Walk the category tree and report the authoritative catalogue size (summed leaf totals) without paginating or pushing products. Cheap completeness check.

## `brightDataApiKey` (type: `string`):

Bright Data API key for the Web Unlocker zone. Required for category and full-catalogue scraping — Tesco Hungary is behind Akamai Bot Manager. Keyword search works without it. Falls back to the BRIGHT\_DATA\_API\_KEY environment variable.

## `proxyConfiguration` (type: `object`):

Proxy settings for the Tesco search API. Category page access goes through the Bright Data Web Unlocker instead.

## Actor input object example

```json
{
  "searchQuery": "tej",
  "maxProducts": 20,
  "requestDelaySecs": 0,
  "enumerateOnly": false,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "HU"
  }
}
```

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "searchQuery": "tej",
    "maxProducts": 20,
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ],
        "apifyProxyCountry": "HU"
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("studio-amba/tesco-hu-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "searchQuery": "tej",
    "maxProducts": 20,
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
        "apifyProxyCountry": "HU",
    },
}

# Run the Actor and wait for it to finish
run = client.actor("studio-amba/tesco-hu-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "searchQuery": "tej",
  "maxProducts": 20,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "HU"
  }
}' |
apify call studio-amba/tesco-hu-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=studio-amba/tesco-hu-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/YabjO3D7j5uWVTcrm/builds/n23y3iCkzHeMTPqJH/openapi.json
