# Trendyol Scraper — Products, Prices, Sellers & Reviews (`tortuga/trendyol-scraper`) Actor

Scrape Trendyol products from search, category, brand, store and product URLs: price, discount, rating, favourites, seller, variants, stock, other sellers and reviews.

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

## Pricing

from $1.00 / 1,000 product 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/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

## Trendyol Scraper — Products, Prices, Sellers & Reviews

Scrape **Trendyol**, Turkey's largest online marketplace, from keyword searches, category, brand and seller-store pages,
and single product URLs. Every product comes with its price, struck-through price, discount, rating, number of
ratings, favourites, seller, official-seller flag, free-shipping and fast-delivery badges, campaigns, stock and images.
Add product details (seller name and score, every size / colour variant with price, stock and barcode, the other
sellers of the same product and their prices, attributes, description, delivery estimate) and customer reviews with
star rating, text, date, purchased variant and photos. Turkey and 19 of Trendyol's international sites are supported.
No login and no browser: the actor reads the same JSON endpoints the Trendyol website uses.

### What data does Trendyol Scraper extract?

**Products** (`type: "product"`, from any search, category, brand or store page):

| Field | Example | Notes |
|---|---|---|
| `productId` | `819066262` | Trendyol content id (the number after `-p-` in the URL) |
| `title`, `brand`, `url` | `Air Pro 2 Anc Gürültü Engelleyici…`, `TARÇIN` | |
| `price`, `originalPrice`, `discountPercent`, `currency` | `798.3`, `887`, `10`, `TRY` | `price` = what the shopper pays, incl. automatic basket discounts; `originalPrice` = the struck-through price, null when there is none |
| `rating`, `ratingCount`, `favoriteCount`, `orderCountText` | `4.37`, `13230`, `171000`, `1000+` | favourites are rounded on listings ("171K"), exact with details |
| `sellerId`, `isOfficialSeller` | `953397`, `true` | seller name comes with product details |
| `inStock`, `freeShipping`, `fastDelivery`, `nextDayDelivery`, `sameDayShipping`, `hasCoupon` | `true` | |
| `isSponsored`, `position`, `page` | `false`, `3`, `1` | sponsored (ad) cards are flagged; rank in the listing |
| `badges`, `categoryRank`, `campaignLabels`, `promotions` | `["Kargo Bedava", "Hızlı Satıcı"]`, `{"type": "BEST_SELLER", "rank": 1}`, `["Avantajlı Ürün"]`, `[{"name": "300 TL'ye %10 İndirim"}]` | |
| `category`, `categoryId`, `variant`, `attributes` | `Kulak içi TWS Bluetooth Kulaklık`, `1058`, `Tek Ebat`, `{"Mikrofon": "Var"}` | key attributes shown on the card |
| `image`, `images`, `groupId`, `itemNumber` | full-size photo URLs | |
| `searchTerm`, `sourceUrl`, `country`, `scrapedAt` | `kablosuz kulaklık`, `TR` | |

**With "Include product details" on (always for product URLs)**: `sellerName`, `sellerScore` (0-10), `sellerCity`,
`sellerOfficialName` (registered company name), `isAuthorizedSeller`, `sellerBadges`; `variants` (every size / colour
option with `price`, `inStock`, `barcode`) and `variantAttribute` (`Beden`, …); `otherSellers` (the other sellers of the
same product with their price, score, free shipping, stock) and `otherSellersCount`; the full `attributes` list,
`categoryPath`, `description` and `descriptionImages`, all `images`, `color`, `barcode`, `productCode`, exact
`reviewCount` and `favoriteCount`, `maxSaleLimit`, `stockLeft` (when Trendyol shows "running out"),
`estimatedDeliveryFrom` / `estimatedDeliveryTo` / `shipsBy` (for Trendyol's default delivery address),
`deliveryOptions` and `questionCount`.

**Reviews** (`type: "review"`, with "Include reviews" on or for review URLs):

| Field | Example |
|---|---|
| `rating`, `text`, `date`, `editedDate` | `5`, `her rengini aldım…`, `2025-12-08T04:42:19Z` |
| `reviewerName` | `Aylin Ç. A.` (as Trendyol shows it; null when Trendyol masks the name) |
| `productAttributes` | `{"Beden": "XL"}` (the variant the reviewer bought) |
| `sellerId`, `sellerName`, `helpfulCount`, `images`, `videos` | `1188`, `DeFacto`, `1`, photo URLs |
| `isTrusted`, `isEliteReviewer`, `isInfluencer`, `language`, `sellerReply` | |
| `reviewId`, `productId`, `productTitle`, `productUrl` | |

Products whose reviews are fetched also get `ratingDistribution` (`{"5": 10118, "4": 925, …}`), `reviewTopics`
(Trendyol's review topics with the share of positive mentions) and `reviewCount`.

### How to scrape Trendyol products

1. Enter keywords in **Search terms** (`kablosuz kulaklık`, `airfryer`, `elbise`), or paste Trendyol URLs into
   **Start URLs**: search pages, category pages (`…/kulaklik-x-c92`), brand pages (`…/defacto-x-b3268`), seller stores
   (`…/magaza/…-m-1188`), product pages (`…-p-819066262`) or review pages (`…-p-819066262/yorumlar`). Filters and sort
   you set on Trendyol (price range, brand, size, colour, rating…) are kept: copy the URL from your browser.
2. Set **Max items**, and optionally **Sort by**, **Min price** / **Max price** and the **Trendyol site** (Turkey by
   default; Germany, the Netherlands, the UK, Poland, Romania, Saudi Arabia, the UAE and other international sites).
3. Turn on **Include product details** and / or **Include reviews** if you need them.
4. Click **Start** and download the results from the **Dataset** tab as JSON, CSV or Excel, or read them through the API.

#### Input example

```json
{
  "searchTerms": ["kablosuz kulaklık"],
  "startUrls": [
    { "url": "https://www.trendyol.com/kadin-elbise-x-g1-c56?prc=200-800&sst=PRICE_BY_ASC" },
    { "url": "https://www.trendyol.com/tarcin/air-pro-2-anc-gurultu-engelleyici-bluetooth-kulaklik-ios-android-tum-telefonlar-ile-uyumlu-kulaklik-p-819066262" }
  ],
  "country": "TR",
  "maxItems": 200,
  "sortBy": "best_seller",
  "includeDetails": true,
  "includeReviews": true,
  "maxReviewsPerProduct": 10
}
```

#### Output example

A product with details (lists shortened):

```json
{
  "type": "product",
  "productId": "928751893",
  "title": "Bodycon Vücudu Saran Bisiklet Yaka Fitilli Kaşkorse Kısa Kollu Mini Elbise E7231AX25SP",
  "brand": "DeFacto",
  "url": "https://www.trendyol.com/defacto/bodycon-vucudu-saran-bisiklet-yaka-fitilli-kaskorse-kisa-kollu-mini-elbise-e7231ax25sp-p-928751893",
  "price": 200,
  "originalPrice": 499.99,
  "discountPercent": 60,
  "currency": "TRY",
  "rating": 3.82,
  "ratingCount": 17,
  "reviewCount": 5,
  "favoriteCount": 579,
  "sellerId": 1188,
  "sellerName": "DeFacto",
  "sellerScore": 8.4,
  "sellerCity": "İstanbul",
  "inStock": true,
  "freeShipping": false,
  "promotions": [{ "id": 30567511, "name": "Sepette %60 İndirim", "type": "DiscountOnBasket", "endsAt": "2026-10-13T23:00:00" }],
  "categoryPath": ["Giyim", "Elbise"],
  "attributes": { "Kumaş Tipi": "Örme", "Materyal": "Elastan", "Kalıp": "Bodycon", "Kol Boyu": "Kısa" },
  "variantAttribute": "Beden",
  "variants": [
    { "itemNumber": 1313240626, "value": "XS", "price": 200, "inStock": true, "barcode": "8683526863612", "selected": true },
    { "itemNumber": 1313240625, "value": "XL", "price": 200, "inStock": false, "barcode": "8683526863650", "selected": false }
  ],
  "otherSellersCount": 2,
  "otherSellers": [
    { "sellerId": 349369, "sellerName": "MarkaMola", "sellerScore": 9.2, "price": 594.99, "originalPrice": null,
      "freeShipping": true, "fastDelivery": true, "inStock": true, "badges": ["FAST_SELLER", "AUTHORIZED_SELLER"] }
  ],
  "barcode": "8683526863612",
  "description": "Ürün Bilgileri\nModelin Ölçüleri S Beden - 1,76cm - 77/57/88\nNumune Bedeni: S…",
  "estimatedDeliveryFrom": "2026-10-13",
  "estimatedDeliveryTo": "2026-10-15",
  "questionCount": 1,
  "images": ["https://cdn.dsmcdn.com/ty1836/prod/QC_ENRICHMENT/20260312/05/97806f9d-99ea-32b4-acdc-fd40de816bff/1_org_zoom.jpg"],
  "detailsScraped": true
}
```

A review:

```json
{
  "type": "review",
  "reviewId": "593966937",
  "productId": "928751893",
  "rating": 5,
  "text": "her rengini aldım o kadar beğendim ki birer de yedek yaptım çok iyi",
  "date": "2025-12-08T04:42:19Z",
  "reviewerName": "Aylin Ç. A.",
  "productAttributes": { "Beden": "XL" },
  "sellerName": "DeFacto",
  "helpfulCount": 1,
  "images": ["https://cdn.dsmcdn.com/mnresize/-/820/prod-product-review-media_1762732810909/img/2018925/2030889/2026901/928751893/16324904-1765168963209.jpeg"],
  "isTrusted": true,
  "productTitle": "Bodycon Vücudu Saran Bisiklet Yaka Fitilli Kaşkorse Kısa Kollu Mini Elbise E7231AX25SP"
}
```

### How to scrape Trendyol reviews

Turn on **Include reviews** for any search or URL, or paste review pages (`…-p-<id>/yorumlar`) into **Start URLs** to
get only reviews. Choose the **Review order** (recommended, newest, oldest, highest or lowest rating) and **Reviews per
product**. To collect only fresh reviews, set **Only reviews newer than** to a date (`2026-10-01`) or a period
(`7 days`): reviews are then read newest first and reading stops as soon as the reviews get older than that.

### Monitor changes on a schedule

Turn on **Only new or changed items** and save the input as a task with a daily
[Schedule](https://docs.apify.com/platform/schedules). Each run remembers what earlier runs of the same search returned
and outputs only products that are new or whose price, struck-through price or stock changed; unchanged products are
not output and not charged, and no details or reviews are fetched for them. Changed items carry
`changeType: "changed"` and `previousValues` with the old values (for example `{"price": 849}`); new ones carry
`changeType: "new"`. With reviews on, only reviews not seen in earlier runs are output. Use **Monitoring key** to keep
several watches of the same search apart, and turn off sponsored products for a stable watch, because ads rotate.

### Track Trendyol prices and sellers (buy box)

With **Include product details** on, each product lists the seller that currently wins the product page and every
`otherSellers` entry with its own price, score and stock, so you can see who undercuts whom on the same product. Combine
it with a brand page or a seller store URL and **Only new or changed items** to get a daily report of price drops,
discounts that ended and products that went out of stock.

### How much does it cost to scrape Trendyol?

You pay per result: per product, plus an extra event when product details are fetched, plus per review (see the
Pricing tab). Platform usage is small because one request returns 36 products: 1,000 listed products take about 28
requests and well under a minute of compute.

### Does it work without login or proxies?

Yes. Everything comes from Trendyol's public pages, without an account. The default Apify proxy (datacenter) works;
residential proxies are not needed.

### Is it legal to scrape Trendyol?

The actor collects only data that Trendyol shows publicly to every visitor: product listings, prices, public seller
profiles and published reviews with the reviewer name exactly as Trendyol displays it (masked names stay masked).
It does not log in and does not collect private data. Seller tax numbers, e-mail and street addresses that Trendyol
shows in its legal seller box are deliberately not exported. Check Trendyol's terms and the data-protection rules (KVKK,
GDPR) that apply to your use case before using the data.

# Actor input Schema

## `searchTerms` (type: `array`):

Keywords to search on Trendyol, one per line (e.g. "kablosuz kulaklık", "airfryer", "elbise"). Each term is searched separately and paginated automatically (36 products per page).

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

Trendyol URLs instead of (or in addition to) search terms: search pages (https://www.trendyol.com/sr?q=airfryer), category pages (https://www.trendyol.com/kulaklik-x-c92), brand pages (https://www.trendyol.com/defacto-x-b3268), seller stores (https://www.trendyol.com/magaza/...-m-1188) with any filters and sort you set on the site, product pages (...-p-819066262, returned with full details) or review pages (...-p-819066262/yorumlar, reviews only).

## `country` (type: `string`):

Which Trendyol storefront to read: Turkey (trendyol.com, prices in TRY) or one of Trendyol's international sites (prices, stock and language of that country). Applies to search terms and URLs.

## `maxItems` (type: `integer`):

Stop after this many items in total (products and reviews together, across all search terms and URLs). Keeps cost predictable.

## `sortBy` (type: `string`):

Result order for search terms and listing URLs that do not set their own sort: Trendyol's recommended order, price, newest, best sellers, most favourited or most rated.

## `minPrice` (type: `integer`):

Only products from this price (in the site's currency). Optional; a price filter already in a start URL wins.

## `maxPrice` (type: `integer`):

Only products up to this price (in the site's currency). Optional; a price filter already in a start URL wins.

## `includeSponsored` (type: `boolean`):

Keep products shown as ads in the results (flagged isSponsored). Each product is output once even though Trendyol repeats ads on every page. Turn off for organic results only.

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

Also fetch every product's details: seller name, score and city, all variants (size / colour with price, stock and barcode), other sellers of the same product with their prices, full attribute list, category path, description text and images, all photos, delivery estimate, question count, exact favourite count. Charged extra per product (see pricing). Product URLs always include details.

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

Add customer reviews for every product as separate items (type "review"): rating, text, date, reviewer name as shown, purchased size / variant, seller, helpful count, photos. Products also get the star distribution. Charged per review (see pricing).

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

Maximum reviews per product (and per review URL). Reviews are read 50 per request.

## `reviewSort` (type: `string`):

Which reviews come first: Trendyol's recommended order, newest, oldest, highest or lowest rating. 'Only reviews newer than' and monitoring always read newest first.

## `reviewsNewerThan` (type: `string`):

Only reviews newer than: a date (YYYY-MM-DD) or a period such as '7 days' or '24 hours'. Reviews are then read newest first and reading stops at the first page that is entirely older.

## `onlyNewOrChanged` (type: `boolean`):

Remember what earlier runs of this search returned and output only new items or items whose price/status changed. Use with a Schedule; unchanged items are not charged. Compared: price, struck-through price and stock (plus rating count when reviews are on); favourite and order counts are ignored. With this on, Max items is the number of products checked each run (the watched window), details / reviews are fetched only for new or changed products, and only reviews not seen before are output.

## `monitoringKey` (type: `string`):

Name for this watch, so several schedules on the same search stay separate; defaults to a key derived from the search input.

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

The default Apify proxy (datacenter) works: Trendyol's JSON endpoints answer it. Every request goes to the JSON gateway the Trendyol web app uses, about 36 products per listing request.

## Actor input object example

```json
{
  "searchTerms": [
    "kablosuz kulaklık"
  ],
  "startUrls": [],
  "country": "TR",
  "maxItems": 100,
  "sortBy": "relevance",
  "includeSponsored": true,
  "includeDetails": false,
  "includeReviews": false,
  "maxReviewsPerProduct": 20,
  "reviewSort": "recommended",
  "onlyNewOrChanged": false,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `results` (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 = {
    "searchTerms": [
        "kablosuz kulaklık"
    ],
    "startUrls": [],
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("tortuga/trendyol-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 = {
    "searchTerms": ["kablosuz kulaklık"],
    "startUrls": [],
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("tortuga/trendyol-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 '{
  "searchTerms": [
    "kablosuz kulaklık"
  ],
  "startUrls": [],
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call tortuga/trendyol-scraper --silent --output-dataset

```

## MCP server setup

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