# Hepsiburada Scraper - Products, Prices, Sellers & Stock (`atesen-software/hepsiburada-scraper`) Actor

Scrape Hepsiburada.com search results, category pages and product pages: prices, discounts, sellers, stock, ratings, review counts, barcodes and images. No browser. Price & stock monitoring: changes-only mode returns just new, changed and removed products.

- **URL**: https://apify.com/atesen-software/hepsiburada-scraper.md
- **Developed by:** [Atesen Software](https://apify.com/atesen-software) (community)
- **Categories:** E-commerce
- **Stats:** 3 total users, 2 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.00 / 1,000 products

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/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
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.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## 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.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Hepsiburada Scraper - Products, Prices & Sellers

Scrape **Hepsiburada.com**, one of Turkey's biggest marketplaces. Give it search keywords, category URLs or product URLs and get clean JSON/CSV/Excel rows with **prices, discounts, sellers, ratings, review counts, images** and, if you want them, **barcodes (GTIN), full category paths, stock and every seller's price**. For **price & stock monitoring**, turn on *changes only* and schedule it: each run returns just the new, changed and removed products.

Fast HTTP scraper, no browser. It connects directly first and switches to a Turkish residential proxy only if Hepsiburada blocks it.

### What you can use it for

- **Price monitoring** and competitor price tracking on Hepsiburada: schedule it daily with **Changes only** on and pay only for what changed.
- **Seller / buybox analysis**: find which merchants sell a product and at what price.
- **Market research**: brands, ratings and review counts per category.
- **Product catalog and GTIN matching** across Trendyol, Hepsiburada, Amazon.com.tr and others.

### Input

| Field | Description |
|---|---|
| `searchQueries` | Keywords, e.g. `airfryer`, `iphone 15` |
| `startUrls` | Search `https://www.hepsiburada.com/ara?q=...`, category `https://www.hepsiburada.com/fritozler-c-22017` (filters and sorting in the URL are kept), or product `...-pm-HBC...` URLs |
| `maxProductsPerSource` | Products per keyword/URL (default 50, max 1,800 = 50 pages x 36) |
| `includeProductDetails` | Also open each product page: barcode, category path, stock, all sellers and their prices |
| `skipSponsored` | Drop sponsored (ad) listings |
| `proxyConfiguration` | Optional; residential TR is used automatically if needed |
| `changesOnly` | Off by default. On: save only new, changed and removed products since the previous run; unchanged ones are free (see [Price & stock monitoring](#price--stock-monitoring)) |
| `monitorKey` | Optional name of the watch list; empty = derived from the input |

```json
{
  "searchQueries": ["airfryer"],
  "startUrls": ["https://www.hepsiburada.com/fritozler-c-22017"],
  "maxProductsPerSource": 100,
  "includeProductDetails": false
}
```

### Output

```json
{
  "productId": "HBC00002TGQ5G",
  "sku": "HBCV00002TGQ5H",
  "name": "Luxell Lxaf-01 Fast Fryer Xxl 7.5 Litre Sıcak Hava Fritözü - Airfryer",
  "brand": "Luxell",
  "url": "https://www.hepsiburada.com/...-pm-HBC00002TGQ5G",
  "price": 2999,
  "originalPrice": 2999,
  "discountRate": 0,
  "currency": "TRY",
  "merchantName": "dtmexpress",
  "isMultiSeller": true,
  "rating": 4.7,
  "reviewCount": 1092,
  "installmentText": "Peşin fiyatına 3 x 999 TL",
  "isSponsored": false,
  "attributes": { "Renk": "Gri" },
  "imageUrl": "https://productimages.hepsiburada.net/s/777/1500-1500/110001839088941.jpg",
  "position": 1,
  "sourceInput": "airfryer",
  "detailsIncluded": false
}
```

With `includeProductDetails` the row also contains `barcode`, `categoryPath`, `categoryName`, `inStock`, `merchantCity`, `sellerCount` and `sellers[]` (the buybox winner first, then other sellers: merchant name/id/city, price, original price, buybox order, free/fast shipping, fulfilled by Hepsiburada).

#### Status rows

The run never fails because of bad input. Problems come back as rows with `type: "status"` and are **not charged**:

| status | meaning |
|---|---|
| `invalid_input` | No keywords or URLs given |
| `unsupported_url` | Not a Hepsiburada search/category/product URL (store `/magaza/` pages are not supported yet) |
| `no_results` | The search/category has no products |
| `no_listing_data` | The page has no product list |
| `not_found` | Product or page does not exist (404) |
| `blocked` / `failed` | Hepsiburada refused the request after retries |

The `RUN_SUMMARY` key-value record has counts, retries and whether the residential proxy was used.

### Price & stock monitoring

Turn on **Changes only** (`changesOnly: true`) and schedule the Actor. Each run is compared with the previous run of the same input (or the same **Monitor name**, `monitorKey`), and only what changed is saved. Unchanged products are **not saved and not charged**; new and changed products cost the normal per-product price.

| `changeType` | Meaning | Charged |
| --- | --- | --- |
| `new` | first time this product is seen (every product on the first run) | yes, as a normal product |
| `price_changed` | price went up or down (`previousPrice`, `priceChange`, `priceChangePercent`) | yes |
| `unavailable` | still listed but sold out — temporarily unavailable | yes |
| `back_in_stock` | sold out last time, buyable again | yes |
| `removed` | product is gone: its page returns 404 (`removedReason: not_found`), or it was missing from a fully crawled search or category (all pages read, fewer products than the limit) two runs in a row (`not_listed`) | **free** |
| unchanged | not saved | **free** |

Every changed row keeps all the normal product fields and adds `changeType`, a `changes` list (e.g. `{"field": "price", "from": 1299, "to": 1149}`), `previousPrice`, `priceChange`, `priceChangePercent`, `previousInStock`, `previousSeenAt` and `firstSeenAt`. Products are matched by Hepsiburada's stable product ID (`productId`, the HBC… code), so a renamed product is not reported as new. A product that could not be loaded in one run (timeout, block) is never reported as removed. The **Changes** view in the Output tab shows just these columns; the run summary (`RUN_SUMMARY`) counts new, changed, unchanged and removed products.

Schedule example — every morning, get only the price and stock changes:

```json
{
  "startUrls": ["https://www.hepsiburada.com/fritozler-c-22017"],
  "maxProductsPerSource": 300,
  "changesOnly": true,
  "monitorKey": "airfryer-daily"
}
```

Save the input as a task, then in Apify Console open **Schedules → Create new**, set cron `0 7 * * *` (07:00 every day) and add the task. Connect a webhook, Google Sheets or Slack integration to receive only the changes. Keep the input the same between runs: a different input or monitor name starts a new watch list (all products `new` again).

### Pricing

Pay per event, no monthly fee:

- **$0.001 per product** saved
- **+$0.0015 per product** when product details are included (product URLs always include details)

Status rows are free. Set a maximum cost per run and the scraper stops cleanly at it.

### Tips

- Sorting and filters: set them on hepsiburada.com and paste the resulting URL into `startUrls`.
- Hepsiburada only exposes 50 pages per listing. To get more, split by sub-category or price filter.
- Duplicate products across sources are saved once.

### Related

- [Trendyol Scraper](https://apify.com/atesen-software/trendyol-scraper)
- [Trendyol Reviews Scraper](https://apify.com/atesen-software/trendyol-reviews-scraper)

### Disclaimer

Only public product data is collected. No personal data is collected. Use it responsibly and follow Hepsiburada's terms and applicable law.

# Actor input Schema

## `searchQueries` (type: `array`):

Keywords to search on Hepsiburada, e.g. "airfryer" or "iphone 15". Each keyword is one source.

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

Search (https://www.hepsiburada.com/ara?q=...), category (e.g. https://www.hepsiburada.com/fritozler-c-22017, filters in the URL are kept) or product URLs (...-pm-HBC...). A ?sayfa=N parameter starts from that page.

## `maxProductsPerSource` (type: `integer`):

Stop after this many products for each keyword or listing URL. Hepsiburada shows at most 50 pages x 36 products (1,800).

## `includeProductDetails` (type: `boolean`):

Open every product page to add barcode/GTIN, full category path, stock status, the main seller's city and the list of all sellers with their prices. Slower, and charged as an extra 'product-details' event. Product URLs always include details.

## `skipSponsored` (type: `boolean`):

Leave out products marked as ads (sponsored listings) in search results.

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

Optional. By default the scraper connects directly and switches to Apify Proxy RESIDENTIAL (Turkey) automatically if Hepsiburada blocks it.

## `autoResidentialFallback` (type: `boolean`):

When no proxy is set and Hepsiburada refuses the connection, retry through Apify Proxy RESIDENTIAL (TR).

## `changesOnly` (type: `boolean`):

Compare every product with the previous run that used the same input (or the same monitor name) and write only **new** products and products whose **price or stock changed** (each row gets a changeType: new, price_changed, stock_changed, variants_changed, unavailable, back_in_stock). Products that disappeared are written as free 'removed' rows. Unchanged products are skipped and not charged. Off (default) = normal full scrape. Schedule the Actor with this on to get a daily change feed.

## `monitorKey` (type: `string`):

Optional. Runs with the same name share one snapshot. Leave empty to derive it automatically from your search keywords and URLs, so the same input always continues the same watch list.

## Actor input object example

```json
{
  "searchQueries": [
    "airfryer"
  ],
  "maxProductsPerSource": 50,
  "includeProductDetails": false,
  "skipSponsored": false,
  "proxyConfiguration": {
    "useApifyProxy": false
  },
  "autoResidentialFallback": true,
  "changesOnly": false
}
```

# Actor output Schema

## `products` (type: `string`):

No description

## `changes` (type: `string`):

No description

## `allFields` (type: `string`):

No description

## `summary` (type: `string`):

No description

# 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 = {
    "searchQueries": [
        "airfryer"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("atesen-software/hepsiburada-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 = { "searchQueries": ["airfryer"] }

# Run the Actor and wait for it to finish
run = client.actor("atesen-software/hepsiburada-scraper").call(run_input=run_input)

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

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

```

## CLI example

```bash
echo '{
  "searchQueries": [
    "airfryer"
  ]
}' |
apify call atesen-software/hepsiburada-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,atesen-software/hepsiburada-scraper"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

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