# Trendyol Scraper: Products, Prices, Sellers & Barcodes (`kyungminlee/trendyol-products-scraper`) Actor

Unofficial Trendyol (Turkey) scraper for category, brand and product URLs. Prices, discounts, ratings, barcode (GTIN), every seller's offer and a review sample. No login, no keyword search.

- **URL**: https://apify.com/kyungminlee/trendyol-products-scraper.md
- **Developed by:** [Kyungmin Lee](https://apify.com/kyungminlee) (community)
- **Categories:** E-commerce, Marketing, Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.50 / 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

### What does Trendyol Scraper: Products, Prices, Sellers & Barcodes do?

**Trendyol Scraper** collects public product data from **Trendyol.com**, Turkey's largest online marketplace, for the **categories, brands and products you choose**. Paste a category or brand URL (for example `https://www.trendyol.com/cep-telefonu-x-c103498`) or product URLs/IDs and get one clean dataset. No Trendyol account, API key or browser is needed. It is an **unofficial** tool and is **not affiliated with, endorsed by or sponsored by Trendyol** (DSM Grup).

For each product you get:

- **Listing data**: product ID, name, brand, category, **current price, original price and discount %**, the 30-day lowest price Trendyol discloses, currency (TRY), **rating and rating count**, favorite and order counters, free-shipping flag, badges (best seller #N, most favourite #N, fast seller...), promotions, a **sponsored** flag, position in the listing, image URLs.
- **Product details** (on by default): **barcode (GTIN/EAN)**, product code, full category path, exact favorite count, review count, stock, purchase limit, **shipping fee**, delivery days, return window, rankings, all **attributes**, size/colour **variants with their own barcodes and stock**.
- **Sellers' offers**: the buy-box seller and **every other seller's offer** (up to ~20 per product): seller store name, seller score, price, original price, discount, free shipping, fast delivery, stock, barcode. For incorporated sellers (A.Ş., Ltd. Şti.) the legally published company name, tax office/number, trade registry number, address and KEP address.
- **Review sample** (optional): rating, text, date, photo count, verified-purchase flag and the seller it was bought from.

**What it does not do — and why.** Trendyol's `robots.txt` disallows **keyword search** (`/sr?q=`), **sorting** (`sst=`), **price and attribute filters**, store pages and the API host that serves the **full review history**. This Actor follows robots.txt: it reads the live file at the start of every run and checks every URL (and every redirect) against it. So you start from category or brand pages in Trendyol's default order, and reviews are a **sample** (up to ~40 per product), not the full history.

**Privacy by design:** reviewer names and IDs are **never collected**; e-mail addresses and phone numbers inside review text are masked. Sellers that are sole proprietors keep only their store name and score: their legal name, tax number and address are not collected.

### Why use this Trendyol scraper?

- **Price and buy-box monitoring** — see every seller's price for the same barcode, who holds the buy box, and how far below the original price each offer is.
- **Assortment and market research** — export whole categories or brands with ratings, favorites and best-seller ranks.
- **Catalogue matching** — barcodes (GTIN) and product codes make it easy to join Trendyol data with your own catalogue or other marketplaces.
- **Reliable runs** — no residential proxy, no browser, polite per-IP pacing that stays under Trendyol's rate limit, automatic retries and a fallback page for each product. One bad page never fails the run, and nothing that failed is charged.

### How to scrape Trendyol

1. Open Trendyol in your browser, click a category or brand in the menu, and copy the page URL (it contains `-x-c<number>` or `-x-b<number>`). Paste it into **Category or brand URLs**. Brand+category (`…-x-b794-c164461`) and gender+category (`…-x-g2-c109`) pages work too.
2. Optionally paste **Product URLs or IDs** (`…-p-881465224` or just `881465224`).
3. Set **Max products per category/brand URL** (36 products per page).
4. Keep **Include product details and all sellers' offers** on (barcode, sellers) or turn it off for a fast listing-only scrape.
5. Turn on **Include a review sample** if you need review texts.
6. Click **Start** and download the results as JSON, CSV, Excel or via the API.

The Actor reads one listing page per 36 products and, with details on, one product page per product (plus one review page when more reviews are needed). Trendyol answers "too many requests" (HTTP 429) once one IP opens about 30 pages a minute, so the Actor keeps every IP below 24 pages a minute, paces requests with random jitter, and moves to a new Apify Proxy (datacenter) session when an IP's share is used up. Failed requests are retried with back-off; a 403/429 slows the run down and switches the IP. Typical speed with the default settings: **2,000 listing products in about 2 minutes**, **160 products with details in about 2.5 minutes**.

### Input

| Field | Description |
|---|---|
| `listingUrls` | Category or brand listing URLs (or the path after `trendyol.com/`, e.g. `samsung-x-b794`). `?pi=N` starts at page N. |
| `productUrls` | Product URLs or numeric product IDs. |
| `maxProductsPerListing` | Products per category/brand URL (default 100). |
| `includeDetails` | Product page data: barcode, sellers' offers, attributes, variants, shipping (default on). |
| `includeReviews` | Review sample as separate items (default off). |
| `maxReviewsPerProduct` | 1–60 (default 20). |
| `proxyConfiguration` | Apify Proxy (datacenter) by default. Turn it off to use the run's own IP at about 24 pages per minute. |

Example:

```json
{
  "listingUrls": ["https://www.trendyol.com/cep-telefonu-x-c103498", "https://www.trendyol.com/samsung-x-b794"],
  "productUrls": ["881465224"],
  "maxProductsPerListing": 200,
  "includeDetails": true,
  "includeReviews": true,
  "maxReviewsPerProduct": 20
}
```

### Output

All results go to one dataset. Every item has a `type`:

- **`product`** — one item per product. `detailsIncluded` tells whether the product page data (barcode, `offers`, attributes...) is included.
- **`review`** — one item per review of the sample, linked by `productId`, `productName` and `productUrl`.

Use the **Products** and **Review sample** views in the Output tab, or filter on `type`. A `SUMMARY` record in the key-value store lists counts, skipped inputs with the reason, and request statistics.

Product example (shortened):

```json
{
  "type": "product", "productId": 881465224,
  "name": "Galaxy A16 128 GB 4 GB Ram Siyah Cep Telefonu (Samsung Türkiye Garantili)",
  "brand": "Samsung", "brandId": 794, "category": "Android Cep Telefonu",
  "categoryPath": ["Elektronik", "Telefon", "Akıllı Cep Telefonu", "Android Cep Telefonu"],
  "price": 12379, "originalPrice": 12379, "discountPercent": null, "currency": "TRY",
  "rating": 4.49, "ratingCount": 1034, "reviewCount": 463, "favoriteCount": 51291,
  "barcode": "8806095822303", "productCode": "SM-A16S4128GB", "shippingFee": 49.99,
  "deliveryDaysMin": 1, "deliveryDaysMax": 3, "returnDays": 15,
  "rankings": [{"list": "bestSeller", "rank": 1}],
  "sellerName": "Trendyol", "offerCount": 19, "lowestOfferPrice": 12379,
  "offers": [
    {"sellerId": 968, "sellerName": "Trendyol", "sellerScore": 9.3, "isBuyBox": true, "price": 12379, "freeShipping": false, "rushDelivery": true},
    {"sellerId": 138196, "sellerName": "242castle", "sellerScore": 9.4, "isBuyBox": false, "price": 12999, "freeShipping": true, "rushDelivery": true}
  ],
  "listingName": "Cep Telefonu", "position": 1, "sponsored": false,
  "url": "https://www.trendyol.com/samsung/galaxy-a16-128-gb-4-gb-ram-siyah-cep-telefonu-samsung-turkiye-garantili-p-881465224"
}
```

Review example:

```json
{
  "type": "review", "productId": 881465224, "rating": 4, "text": "güzel ama hemen ısınıyor",
  "date": "2026-07-25", "source": "photo-reviews", "photoCount": 1, "verifiedPurchase": true, "soldBy": "Trendyol"
}
```

### Data fields

**Product (always):** `productId`, `url`, `name`, `brand`, `brandId`, `category`, `categoryId`, `price` (what shoppers pay, after basket promotions), `originalPrice`, `discountPercent`, `discountType`, `lowestRecentPrice`, `currency`, `rating`, `ratingCount`, `favoriteCountText`, `orderCountText`, `freeShipping`, `sellerId`, `sellerName`, `productGroupId`, `variant`, `badges`, `rankings`, `promotions`, `sponsored`, `hasPhotoReviews`, `imageUrl`, `images`, `listingUrl`, `listingName`, `listingCategoryPath`, `listingTotal`, `page`, `position`, `inputUrl`, `detailsIncluded`, `scrapedAt`.

**Product (with details):** `barcode`, `productCode`, `categoryPath`, `reviewCount`, `favoriteCount`, `inStock`, `maxSaleLimit`, `rushDeliveryHours`, `shippingFee`, `deliveryDaysMin`, `deliveryDaysMax`, `returnDays`, `attributes`, `variantAttributes`, `variants` (`value`, `inStock`, `price`, `barcode`), `seller` (`sellerId`, `name`, `sellerScore`, `city`, `country`, `isCompany`, `companyName`, `taxNumber`, `taxOffice`, `registrationNumber`, `companyAddress`, `kepEmail` — company fields only for incorporated sellers), `offers` (`sellerId`, `sellerName`, `sellerScore`, `isBuyBox`, `price`, `originalPrice`, `discountPercent`, `freeShipping`, `rushDelivery`, `rushDeliveryHours`, `fulfilmentType`, `inStock`, `barcode`, `promotions`), `offerCount`, `lowestOfferPrice`.

**Review:** `productId`, `productName`, `productUrl`, `reviewId` (photo reviews), `rating`, `text`, `date`, `source` (`top-reviews` = shown on the product page, `photo-reviews` = from the review page), `photoCount`, `verifiedPurchase`, `soldBy`, `scrapedAt`.

Not collected: reviewer names and IDs, review photos themselves, sole proprietors' legal details. Size/colour of the reviewed item is not part of the public review sample.

### Pricing

This Actor uses **pay per event** — you pay only for items that were saved:

| Event | Proposed price | What it covers |
|---|---|---|
| `product` | **$0.50 per 1,000 products** ($0.0005 each) | One product item with listing data |
| `product-detail` | **$1.20 per 1,000 products** ($0.0012 each) | One product item with details and sellers' offers. **Replaces** the `product` event for that item — it is not added on top |
| `review` | **$0.20 per 1,000 reviews** ($0.0002 each) | One review item |

The prices shown on the Actor's Store page are the ones that apply. There is no start fee. Failed or refused pages, unknown products, skipped inputs and duplicates are never charged. If a product page cannot be loaded, the product is still saved from its listing data and charged as a basic `product`. The run's maximum charge is checked before every item, so the Actor stops cleanly at your limit.

Example: 1,000 products with details and 20 reviews each = 1,000 × $0.0012 + 20,000 × $0.0002 = **$5.20**.

### Tips

- **Bigger categories:** Trendyol shows at most 100,000 products per listing. Use subcategories or brand+category pages (`…-x-b794-c164461`) to reach deeper.
- **Daily price tracking:** schedule the Actor with a few category or brand URLs and details on; compare `price`, `offers` and `lowestOfferPrice` per `barcode` over time.
- **Fast catalogue snapshot:** turn details off; one request returns 36 products.
- **Start later in a listing:** add `?pi=10` to start at page 10.
- **Product IDs** are the number after `-p-` in a product URL.
- **Marketplace data for other countries:** [China (Taobao & Tmall)](https://apify.com/kyungminlee/taobao-catalog-scraper), [Korea (Naver Shopping)](https://apify.com/kyungminlee/naver-shopping-search-scraper), [Russia (Wildberries)](https://apify.com/kyungminlee/wildberries-product-reviews-scraper).

### FAQ

**Is this an official Trendyol API?** No. It is an unofficial scraper of publicly visible Trendyol pages and is not affiliated with Trendyol. Trendyol can change its website at any time; the Actor is maintained, but results may briefly break after such changes.

**Why can't I search by keyword or sort by price?** Trendyol's robots.txt disallows the search pages (`/sr`), sorting (`sst=`) and price/attribute filters, and this Actor respects robots.txt. Such URLs are skipped with a clear message. Use the category or brand page instead — after a search on Trendyol, click the matching category on the left and copy that URL.

**Why only a sample of reviews?** The product page shows up to 20 top reviews and the review page up to about 20 photo reviews. The full review list comes from a Trendyol API host whose robots.txt disallows all crawling, so it is not used. `ratingCount` and `reviewCount` still give the full totals.

**Why are reviewer names missing?** On purpose: you can analyse feedback without handling personal data. Please do not use review text to identify or contact reviewers.

**Do I need a proxy?** The default Apify Proxy (datacenter) setting is all you need; residential proxies are not required. Datacenter sessions let the Actor spread requests over several IPs and stay under Trendyol's per-IP limit. Without a proxy the run works too, just slower (about 24 pages a minute), and it switches to Apify Proxy by itself if Trendyol starts refusing it.

**Why do a few products have no details?** Trendyol serves a small share of product pages (about 2–3% in our tests) and the review pages of products with few reviews from a `/pd/` address that its robots.txt disallows. The Actor does not open those: such products are saved with their listing data (`detailsIncluded: false`) and charged as a basic `product`. Some brand pages (for example Apple) redirect to the search page, which robots.txt also disallows; they are skipped with a message in the log and the `SUMMARY` record.

**Can I scrape other countries' Trendyol stores?** This Actor reads the Turkish storefront (prices in TRY). Links to `/en/` or other language versions are read from the Turkish store.

# Actor input Schema

## `listingUrls` (type: `array`):

Trendyol (Turkey) category or brand listing pages, e.g. https://www.trendyol.com/cep-telefonu-x-c103498 (category), https://www.trendyol.com/samsung-x-b794 (brand), https://www.trendyol.com/erkek-spor-ayakkabi-x-g2-c109 (gender + category) or https://www.trendyol.com/samsung-android-cep-telefonu-x-b794-c164461 (brand + category). The part after trendyol.com/ also works on its own (cep-telefonu-x-c103498). Add ?pi=3 to start at page 3. Products are read in Trendyol's default order. Keyword search URLs (/sr?q=), sorting (sst=) and price/attribute filter URLs are not accepted because Trendyol's robots.txt disallows them: open a category in your browser and paste its plain URL instead. A few brand pages (for example apple-x-b107) redirect to the search page, which robots.txt also disallows; they are skipped with a message.

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

Trendyol product pages (https://www.trendyol.com/samsung/galaxy-a16-128-gb-4-gb-ram-siyah-cep-telefonu-samsung-turkiye-garantili-p-881465224) or the numeric product ID after -p- (881465224). Each product is saved once per run.

## `maxProductsPerListing` (type: `integer`):

How many products to save from each category or brand URL, in Trendyol's default order (36 per page). Products already saved from an earlier URL in the same run are skipped and not charged. Sponsored placements that Trendyol shows inside the listing are included and flagged with sponsored = true.

## `includeDetails` (type: `boolean`):

Open each product page to add the barcode (GTIN), product code, full category path, exact favorite count, review count, stock, shipping fee and delivery time, attributes, size/colour variants with their barcodes, the buy-box seller (with company details for incorporated sellers) and every other seller's offer (price, free shipping, fast delivery, seller score). A product with details is charged as one product-detail event instead of a product event. Turn off for a fast listing-only scrape. A small share of product pages is served from a /pd/ address that robots.txt disallows; those products keep their listing data and are charged as a basic product.

## `includeReviews` (type: `boolean`):

Save a sample of each product's reviews as separate dataset items (type = review): the up to 20 top reviews shown on the product page plus the photo reviews shown on its review page (usually 15-22). This is a sample, not the full review history: Trendyol loads the rest from an API host that its robots.txt disallows. Reviewer names and IDs are never collected; e-mail addresses and phone numbers in review text are masked.

## `maxReviewsPerProduct` (type: `integer`):

Upper limit of review items per product when the review sample is on. Each review is a separate review event. When the product page already provides enough top reviews, the review page is not requested.

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

Apify Proxy (datacenter) is on by default. Trendyol limits how many pages one IP may open per minute (it answers HTTP 429 after about 30), so the Actor keeps every IP below that limit and moves to a new proxy session when an IP's share is used up. That keeps runs fast and free of errors. If you turn the proxy off, the run uses its own IP at about 24 pages per minute (slower, same results); if Trendyol still refuses it, the Actor switches to Apify Proxy by itself. Residential proxies are not needed.

## Actor input object example

```json
{
  "listingUrls": [
    "https://www.trendyol.com/cep-telefonu-x-c103498"
  ],
  "maxProductsPerListing": 10,
  "includeDetails": true,
  "includeReviews": true,
  "maxReviewsPerProduct": 10,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

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

No description

## `reviews` (type: `string`):

No description

## `allItems` (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 = {
    "listingUrls": [
        "https://www.trendyol.com/cep-telefonu-x-c103498"
    ],
    "maxProductsPerListing": 10,
    "includeReviews": true,
    "maxReviewsPerProduct": 10,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("kyungminlee/trendyol-products-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 = {
    "listingUrls": ["https://www.trendyol.com/cep-telefonu-x-c103498"],
    "maxProductsPerListing": 10,
    "includeReviews": True,
    "maxReviewsPerProduct": 10,
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("kyungminlee/trendyol-products-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 '{
  "listingUrls": [
    "https://www.trendyol.com/cep-telefonu-x-c103498"
  ],
  "maxProductsPerListing": 10,
  "includeReviews": true,
  "maxReviewsPerProduct": 10,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call kyungminlee/trendyol-products-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,kyungminlee/trendyol-products-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/2zlN8jZjjiOK99Gfu/builds/ZJQ20KN18ch5Y959f/openapi.json
