# Hepsiburada Price Tracker – Turkish Price Comparison (`atesen-software/turkish-price-comparison`) Actor

Track live Hepsiburada prices: TRY price, seller, stock, rating and barcode per product URL or exact title. $0.002 per price row. Trendyol and n11 not included.

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

## Pricing

$2.00 / 1,000 price rows

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 Price Tracker – Turkish Price Comparison API

**Turkish price comparison** starter Actor that today tracks live **Hepsiburada prices** only. Give it Hepsiburada product URLs (recommended) or exact Hepsiburada product titles and it returns one row per matched product with the TRY price, seller, stock, rating, barcode and URL. **Trendyol and n11 are not included:** Trendyol is excluded after a terms review, and n11 returned HTTP 403 on robots.txt, so this is not a Trendyol vs Hepsiburada vs n11 comparison yet. Pricing: **$2 per 1,000 price rows ($0.002 per row)**. You pay only for rows with a matched price; misses and blocked sources are free and listed in the run's `REPORT`.

A missing value stays `null`; no invented prices, zero-price placeholders or inferred stock are returned. One marketplace is a single observation, not proof of the cheapest price in Turkey.

### Why use this Actor?

It supplies strict product identity checks, a stable JSON output, separate run diagnostics, and a small HTTP-only implementation. No browser, paid proxy, external paid API, login session or challenge bypass is used. Apify provides schedules, API access and integrations. There is no claim of three-source coverage.

#### Three use cases

1. **Procurement checks:** submit exact model, capacity and color names to prepare comparable supplier observations. Review `comparedSources` before choosing a supplier.
2. **Barcode-safe catalog checks:** submit Hepsiburada product URLs; product pages expose the barcode (GTIN), seller and stock, so similarly named models are never merged. Barcode-only search strings rarely match, because Hepsiburada search results do not expose barcodes.
3. **Price monitoring workflows:** submit a group of product URLs for each product, export matched observations, and route incomplete source coverage for manual review. Do not interpret an unavailable source as out of stock.

### Source access and compliance

Reviewed on 26 October 2026:

| Source | Current behavior | Evidence |
|---|---|---|
| Trendyol | Excluded; no requests | [Terms](https://www.trendyol.com/kullanim_kosullari) restrict copying and redistribution; [robots.txt](https://www.trendyol.com/robots.txt) disallows search paths. |
| Hepsiburada | Conditional public HTTP lookup | [Official hosted membership text](https://images.hepsiburada.net/assets/gif/hepsiburada/uyeliksozlesmesi.html) contains no explicit bot clause found in this review, but its current visitor applicability is unverified. [Robots](https://www.hepsiburada.com/robots.txt) is checked at runtime; forbidden paths are skipped. |
| n11 | Disabled; no product requests | [Robots](https://www.n11.com/robots.txt) returned HTTP 403 during direct preflight; [visitor terms](https://www.n11.com/uye-ol) could not be retrieved. This is an access limitation, not a claim that its terms prohibit scraping. |

Policy decisions cannot be overridden by input. HTTP errors and challenges stop that source for the rest of the run, without retrying through another route. Contact details, user profiles and reviews are not collected. Shop display names are the only seller field. Obtain appropriate source permission before enabling excluded sources in a future reviewed release.

### How to run Turkish price comparison locally

1. Install dependencies with `npm ci --ignore-scripts` (Node.js 22 or newer).
2. Put input in `storage/key_value_stores/default/INPUT.json`.
3. Run `apify run --user-agent apify-agent-skills/apify-actor-development`.
4. Inspect dataset items and the `REPORT` key in the local key-value store. `REPORT.status` can be `incomplete` even when execution exits normally.

See the input schema for full configuration options.

### Input: names, EAN/barcodes and product URLs

```json
{
  "products": ["Apple iPhone 15 128 GB Siyah", "0123456789012"],
  "productUrls": [],
  "maxProducts": 20,
  "requestDelayMillis": 2000,
  "requestTimeoutSecs": 20
}
```

The barcode above illustrates formatting, not a verified catalog identifier. Send barcodes as strings to preserve leading zeros, but note that Hepsiburada search pages usually do not expose barcodes, so barcode-only inputs often return no match; prefer product URLs. Names must match the complete normalized Hepsiburada title; partial or fuzzy names (for example `iPhone 15 128 GB`) are deliberately not accepted as proof of identity. Search-page matches may leave `seller` and `inStock` as `null`; direct product URLs return them when the page publishes them. Different colors, capacity, bundles and accessories must remain separate.

`productUrls` accepts a URL string per product, or an array of up to three URLs describing one product. Only HTTPS direct product URLs on the three named marketplaces are accepted; credentials, arbitrary hosts, account pages and checkout pages are rejected. Query strings are removed. Subsequent sources in a URL group must match the first observed title or barcode. A URL from an excluded source stays excluded.

`maxProducts` is 1–100; delay is 1,000–60,000 ms; timeout is 5–60 seconds. Unknown input keys, proxies and source-policy overrides are rejected.

### Output fields and missing data

| Field | Type | Meaning |
|---|---|---|
| `query`, `barcode`, `scrapedAt` | string / null | Input identity and observation time |
| `trendyol`, `hepsiburada`, `n11` | object | Each contains `price`, `currency`, `seller`, `inStock`, `rating`, `url`, `title`, `barcode`, `status`, `error` |
| `cheapestSource`, `cheapestSources`, `cheapestPrice` | string / array / number / null | Positive TRY offers with explicit in-stock availability only; ties retained |
| `comparedSources` | integer | Number of offers eligible for ranking |
| `complete`, `status` | boolean / string | All three matched, or `partial` / `unavailable` |

Shipping, coupons, member discounts and installment differences are not included. Unknown stock prevents cheapest ranking. Aggregate low-price ranges are not specific seller offers. Missing or invalid prices and unknown currencies stay in diagnostics.

Only rows with an exact matched product enter the dataset. Fully unavailable attempts go to `REPORT.diagnostics` and never become billable product rows. The report also includes source-policy evidence, processed counts and an explicit error when no source returns a match. You can download the dataset in various formats such as JSON, HTML, CSV, or Excel.

An unavailable diagnostic has this shape (illustrative; use `evidence/local-report.json` for the actual run):

```json
{
  "query": "Example Product 128 GB Black",
  "cheapestSource": null,
  "cheapestSources": [],
  "cheapestPrice": null,
  "comparedSources": 0,
  "complete": false,
  "status": "unavailable"
}
```

### Pricing

Pay per event: **$0.002 per price row ($2 per 1,000 rows)**, charged as the `result` event. A row is charged only when at least one source returned a matched, positive TRY price. Unmatched, blocked or excluded lookups are written to `REPORT.diagnostics` free of charge. Standard Apify platform usage is billed by Apify as usual.

### n8n example

Use a Manual Trigger → Apify “Run an Actor” node → Apify “Get Dataset Items” node. Select this Actor (build `latest`), pass the input JSON above and wait for completion. Use an IF node on `hepsiburada.status = matched` to store the price, and read `REPORT` from the run's default key-value store if the dataset is empty. Because only Hepsiburada is enabled, `complete` is always `false` and `status` is `partial` for priced rows. Keep credentials in n8n's credential store.

### Make example

Use a manual scenario trigger → Apify “Run an Actor” → Apify “Get Dataset Items” → iterator → spreadsheet row. Wait for the Actor to finish and filter on `hepsiburada.status = matched`. Add an empty-dataset route that reads the `REPORT` record using Apify “Get a Key-Value Store Record”. Store the Apify connection in Make; never paste tokens into input JSON.

### FAQ and support

#### Why is a product missing?

Check `REPORT`: the source may be excluded, blocked, robots-disallowed, unreadable, or unable to prove an exact product match. The Actor does not solve CAPTCHAs, reuse login cookies or try paid residential proxies. A changed page layout produces an explicit unreadable status.

#### Can this find the cheapest price across Trendyol, Hepsiburada and n11?

No. The source-policy and access restrictions above prevent that claim. Tests verify parser behavior, strict matching and safe failures; they do not establish live three-marketplace coverage. Today it returns Hepsiburada prices only. Report issues through the Actor's Issues tab; the API tab documents programmatic access.

# Actor input Schema

## `products` (type: `array`):

Exact full Hepsiburada product titles including variant. Partial names and barcode-only strings usually return no match; use product URLs instead.

## `productUrls` (type: `array`):

Recommended. Hepsiburada product URLs (one string per product) return price, seller, stock and barcode. Groups of up to three URLs are accepted; Trendyol and n11 URLs stay excluded.

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

Maximum number of unique input products.

## `requestDelayMillis` (type: `integer`):

Minimum milliseconds between requests; robots crawl-delay also applies.

## `requestTimeoutSecs` (type: `integer`):

Per-request timeout in seconds. No retries or proxies.

## Actor input object example

```json
{
  "products": [],
  "productUrls": [
    "https://www.hepsiburada.com/apple-iphone-15-128-gb-siyah-p-HBCV00004X9ZCH"
  ],
  "maxProducts": 20,
  "requestDelayMillis": 2000,
  "requestTimeoutSecs": 20
}
```

# Actor output Schema

## `dataset` (type: `string`):

No description

## `report` (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 = {
    "products": [],
    "productUrls": [
        "https://www.hepsiburada.com/apple-iphone-15-128-gb-siyah-p-HBCV00004X9ZCH"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("atesen-software/turkish-price-comparison").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 = {
    "products": [],
    "productUrls": ["https://www.hepsiburada.com/apple-iphone-15-128-gb-siyah-p-HBCV00004X9ZCH"],
}

# Run the Actor and wait for it to finish
run = client.actor("atesen-software/turkish-price-comparison").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 '{
  "products": [],
  "productUrls": [
    "https://www.hepsiburada.com/apple-iphone-15-128-gb-siyah-p-HBCV00004X9ZCH"
  ]
}' |
apify call atesen-software/turkish-price-comparison --silent --output-dataset

```

## MCP server setup

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

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/I9jPG3tZtF1PZQWFL/builds/SlhMPYCbUohuOzkaS/openapi.json
