# Trendyol Scraper (`solidcode/trendyol-scraper`) Actor

\[💰 $1.0 / 1K] Extract products and customer reviews from Trendyol — Turkey's largest marketplace. Search by keyword, paste category or seller pages, or supply direct product URLs. Reviews are opt-in and emitted as separate dataset rows.

- **URL**: https://apify.com/solidcode/trendyol-scraper.md
- **Developed by:** [SolidCode](https://apify.com/solidcode) (community)
- **Categories:** E-commerce, Developer tools, Automation
- **Stats:** 35 total users, 6 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?

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

## Trendyol Scraper

Pull products and customer reviews from Trendyol — Turkey's largest e-commerce marketplace — at scale, with brand, seller, pricing, discount, rating, favorite count, breadcrumb category path, variants, badges, customer images, verified-purchase flags, and the name of the store behind every single listing. Built for Turkish e-commerce sellers, cross-border dropshippers, brand managers, and market researchers who need a clean Trendyol catalog and review feed without wrestling with Turkish SPA pagination one tab at a time.

### Why This Scraper?

- **Products and reviews in one run** — opt into reviews per product (cap or unlimited) without spawning a second actor. One run, one dataset, two `recordType` rows: `product` and `review`.
- **Three Trendyol storefronts in one input** — Turkey (TL), Azerbaijan (AZN), and the International store (USD/EUR). Flip a single dropdown to switch — currency, language, and `/en/` path prefixes are handled for you.
- **Seven sort orders that match Trendyol's own UI** — Best match, Newest, Price low-to-high, Price high-to-low, Best sellers, Most favorited, Most rated.
- **Six purpose-built filters** — minimum star rating (3 / 4 / 4.5+), min and max price in the storefront's currency, free shipping, Trendyol's Hızlı Teslimat fast-delivery badge, and discounted-only.
- **Mix any URL type in one list** — search result pages (`/sr?q=...`), category pages (`/<slug>-x-c<id>`), seller / merchant pages (`/magaza/...-m-<id>`), and direct product URLs in either form Trendyol hands out, the full `/<brand>/<slug>-p-<id>` link or the short `/p/<id>` one. The actor auto-detects the URL shape.
- **Full Turkish UTF-8 preserved** — `ı`, `ş`, `ğ`, `ç`, `ö`, `ü` in product names, category breadcrumbs, and review text are never ASCII-folded.
- **Split per-result pricing — $1.00 per 1,000 products plus $0.80 per 1,000 reviews.** Reviews are off by default; turn them on only when you need them. No compute or platform-bandwidth surprises.
- **Per-source caps, not a single global limit** — `maxProductsPerSource` defaults to 100, so a 10-URL run is bounded at 1,000 rows, never 50,000.
- **Size-level variant roll-ups and full category breadcrumbs** — every direct-product-URL row for a product sold in sizes carries a `variants[]` array with the size name (`Beden` on apparel, `Boyut/Ebat` on home textiles), the value, and that size's own price, stock flag and barcode, plus a `variantCount` total and a `categoryPath` resolved all the way up to the storefront root. Made-to-measure lines such as curtains publish hundreds of width x height permutations, so the array carries the first 100 and `variantCount` still reports every one.
- **Every row names its seller, not just a numeric id** — search, category and `/magaza/` rows all resolve `sellerId` to the store's display name, so you can group a category by marketplace seller without a second lookup.

### Use Cases

**Price & Discount Monitoring**

- Track competitor prices, strike-through `originalPrice`, and `discountPercent` across a category
- Watch a seller's full catalog (`/magaza/...`) for repricing events
- Compare the same product across Turkey, Azerbaijan, and the International storefront

**Market & Trend Research**

- Map Turkish consumer demand by category — phones, beauty, fashion, home goods
- Rank top brands and top sellers in any category using `rating`, `reviewCount`, and `favoriteCount`
- Detect emerging best-sellers via the Best sellers / Most favorited / Most rated sort orders

**Cross-Border Sourcing & Dropshipping**

- Build a product feed for resale on Etsy, eBay, Amazon, or Shopify
- Pull product images, full category breadcrumbs, and brand names ready for catalog import
- Filter for `freeShippingOnly` to find sellers already absorbing the shipping cost

**Review Sentiment & Product Quality Tracking**

- Pull up to about 5,000 reviews from a single flagship product with rating, text, verified-purchase flag, helpful count, customer images, and the variant the reviewer actually bought
- Spot quality issues by mining 1-star reviews across a brand's catalog
- Quantify trust signals — `Trendyol Elite` reviewers and verified-purchase ratios

**Brand & Seller Outreach**

- Build named seller catalogs from `/magaza/` pages — every row carries the store name and id
- Identify high-volume Trendyol-only brands for direct partnership
- Trace 1-star reviews back to the exact store that fulfilled the order via `sellerName` on review rows

### Getting Started

#### Simple keyword search

The cheapest path — products only, no reviews:

```json
{
    "searchQueries": ["erkek spor ayakkabı"],
    "maxProductsPerSource": 100
}
```

#### Products plus reviews with a cap

Enrich each product with up to 50 reviews:

```json
{
    "searchQueries": ["kahve makinesi", "iPhone 15"],
    "maxProductsPerSource": 50,
    "includeReviews": true,
    "maxReviewsPerProduct": 50
}
```

#### Direct product URLs with a tight rating filter

Paste any Trendyol product URL and add minimum rating and a price band:

```json
{
    "startUrls": [
        "https://www.trendyol.com/apple/iphone-15-128-gb-p-755253562",
        "https://www.trendyol.com/samsung/galaxy-s24-256-gb-p-829145673"
    ],
    "minRating": "4.5",
    "minPrice": 30000,
    "maxPrice": 80000,
    "includeReviews": true,
    "maxReviewsPerProduct": 100
}
```

#### Category sweep on the International storefront

Sort by best sellers, switch to the International store, capture EUR prices:

```json
{
    "startUrls": [
        "https://www.trendyol.com/en/sr?q=coffee+maker"
    ],
    "sort": "best_seller",
    "country": "international",
    "discountedOnly": true,
    "maxProductsPerSource": 200
}
```

### Input Reference

#### Sources

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `searchQueries` | string\[] | `["erkek spor ayakkabı"]` | Turkish or English search terms. Each keyword runs as its own search. Leave empty if you only use URLs below. |
| `startUrls` | string\[] | `[]` | Trendyol URLs to scrape. Mix search pages, category pages, seller pages, and direct product URLs (full `/<brand>/<slug>-p-<id>` or short `/p/<id>`) in one list — the URL shape is auto-detected. |

#### Limits

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `maxProductsPerSource` | integer | `100` | Maximum product rows per search keyword, category URL, or seller URL. Direct product URLs always return exactly one product and ignore this cap. Set to `0` for unlimited. A source then runs to our own safety limit, which in live testing produced between about 2,400 and 4,700 products depending on sort order and how often Trendyol repeats products between result pages. Repeats are removed and never billed twice. |
| `includeReviews` | boolean | `false` | When on, fetch customer reviews for every product returned and emit them as separate `recordType: "review"` rows. Off by default — reviews are billed at a separate per-row rate. |
| `maxReviewsPerProduct` | integer | `50` | Maximum review rows per product. Ignored when `includeReviews` is off. Set to `0` to take everything Trendyol serves, which tops out around 5,000 reviews on any one product no matter how many the product page counts. |

#### Sort & filter

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `sort` | select | `Best match (default)` | `Best match (default)`, `Newest first`, `Price: low to high`, `Price: high to low`, `Best sellers`, `Most favorited`, or `Most rated`. Ignored on direct product URLs. |
| `minPrice` | integer | (none) | Only include products priced at or above this value, in the storefront's currency. |
| `maxPrice` | integer | (none) | Only include products priced at or below this value, in the storefront's currency. |
| `minRating` | select | `Any rating` | `Any rating`, `3 stars and up`, `4 stars and up`, or `4.5 stars and up`. |
| `freeShippingOnly` | boolean | `false` | Only include products eligible for free shipping. |
| `fastDeliveryOnly` | boolean | `false` | Only include products tagged with Trendyol's fast-delivery / same-day badge. Turkey storefront only; switched off automatically on the International and Azerbaijan storefronts, which do not carry the badge. |
| `discountedOnly` | boolean | `false` | Only include products currently on sale (showing a strike-through original price). |

#### Localization

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `country` | select | `Turkey (trendyol.com — TL)` | Storefront to target. `Turkey (trendyol.com — TL)`, `Azerbaijan (trendyol.az — AZN)`, or `International (trendyol.com/en — USD/EUR)`. Determines currency, language, and which catalog is searched. |

### Output

Every row carries a `recordType` field — `product` or `review` — so you can filter or split the dataset cleanly downstream.

#### Product (`recordType: "product"`)

```json
{
    "recordType": "product",
    "productId": "755253562",
    "productUrl": "https://www.trendyol.com/apple/iphone-15-128-gb-p-755253562",
    "productName": "Apple iPhone 15 128 GB (Apple Türkiye Garantili)",
    "brandName": "Apple",
    "brandId": 110197,
    "sellerName": "Apple Authorized Reseller",
    "sellerId": "968413",
    "price": 49999.0,
    "originalPrice": 59999.0,
    "discountPercent": 17,
    "currency": "TRY",
    "rating": 4.7,
    "reviewCount": 3113,
    "favoriteCount": 57000,
    "inStock": true,
    "imageUrl": "https://cdn.dsmcdn.com/ty1234/product/media/images/iphone-15.jpg",
    "images": ["https://cdn.dsmcdn.com/ty1234/product/media/images/iphone-15.jpg"],
    "categoryPath": ["Elektronik", "Telefon", "Cep Telefonu"],
    "variants": [],
    "variantCount": 0,
    "productCode": "MTP63TU/A",
    "badges": ["FastDelivery", "FreeShipping"],
    "sourceUrl": "https://www.trendyol.com/sr?q=iPhone+15",
    "scrapedAt": "2026-05-16T10:30:00Z"
}
```

##### Core fields

| Field | Type | Description |
|-------|------|-------------|
| `recordType` | string | Always `"product"` |
| `productId` | string | Trendyol's internal product id (extracted from URL `-p-<id>`) |
| `productUrl` | string | Canonical product detail URL |
| `productName` | string | Full product title |
| `productCode` | string | Merchant SKU or model code when shown (direct-product-URL rows only) |
| `inStock` | boolean | At least one variant is buyable |
| `imageUrl` | string | Primary product image (CDN URL) |
| `images` | string\[] | All product image URLs |
| `categoryPath` | string\[] | Breadcrumb e.g. `["Erkek", "Ayakkabı", "Spor Ayakkabı"]` |
| `badges` | string\[] | Visible badges (e.g., `["FastDelivery", "FreeShipping", "Discounted"]`) |
| `variants` | object\[] | The buyable variants of a direct-product-URL row, e.g. `{ "attributeName": "Beden", "attributeValue": "42", "price": 999.9, "inStock": true, "sku": "8682693688936" }`. Trendyol varies apparel and footwear by `Beden` (size) and home textiles by `Boyut/Ebat` (dimensions), each with its own price, stock flag and barcode. Capped at the first 100 entries so one made-to-measure curtain cannot dominate your dataset; compare against `variantCount` to see whether a row was capped. One-size items such as phones, cosmetics and sofas have nothing to choose, so the array is empty — as in the example above. |
| `variantCount` | integer | How many buyable variants the product has in total, before the 100-entry cap on `variants[]` — 932 on a made-to-measure curtain, 28 on a running shoe, 0 on a one-size item. `null` on search, category and seller rows, where Trendyol's listing feed carries no per-variant price, stock or barcode to roll up. |
| `sourceUrl` | string | The search / category / seller URL this row was discovered from |
| `scrapedAt` | string | ISO 8601 timestamp of extraction |

##### Brand & seller

| Field | Type | Description |
|-------|------|-------------|
| `brandName` | string | Brand name (e.g. "Nike", "Apple") |
| `brandId` | integer | Trendyol brand id when available |
| `sellerName` | string | Merchant / store name — resolved on search, category, `/magaza/` and direct-product rows alike |
| `sellerId` | string | Merchant id |

##### Price & popularity

| Field | Type | Description |
|-------|------|-------------|
| `price` | number | Current sale price |
| `originalPrice` | number | Strike-through price when discounted |
| `discountPercent` | integer | 0–100 percent off |
| `currency` | string | `TRY`, `AZN`, `USD`, or `EUR` depending on storefront |
| `rating` | number | Average customer rating 0.0–5.0. Along with `reviewCount` and `favoriteCount` this is empty on almost every **Newest first** row: a listing published today has not collected shopper activity yet. Sort by Best sellers or Most favorited when you need these three populated |
| `reviewCount` | integer | Total reviews on the product |
| `favoriteCount` | integer | How many shoppers have favorited the product (from Trendyol's social-proof bar; populated for listing-sourced rows). Empty on **Newest first** runs — see the note under `rating` |

##### Direct product URL extras

These fields are only present on rows extracted from a direct product URL (`startUrls` containing `...-p-<id>` or `/p/<id>`):

| Field | Type | Description |
|-------|------|-------------|
| `slugDrift` | boolean | `true` when Trendyol returned a different product id than the one in the input URL (the original may have been delisted). Use this to filter unexpected rows. |
| `requestedProductId` | string | The product id that was in your input URL — for joining against `productId` when slug drift occurs. |

#### Review (`recordType: "review"`)

Emitted only when `includeReviews: true`. Capped at `maxReviewsPerProduct` per product.

```json
{
    "recordType": "review",
    "reviewId": "412598834",
    "productId": "755253562",
    "productUrl": "https://www.trendyol.com/apple/iphone-15-128-gb-p-755253562",
    "productName": "Apple iPhone 15 128 GB (Apple Türkiye Garantili)",
    "rating": 5,
    "reviewText": "Ürün hızlı geldi, kutusu sağlamdı. Renk fotoğraftaki gibi.",
    "reviewDate": "2026-04-22",
    "reviewerName": "M*** S.",
    "reviewerLevel": null,
    "isVerifiedPurchase": true,
    "helpfulCount": 14,
    "sellerName": "Apple Authorized Reseller",
    "sellerId": "968413",
    "images": ["https://cdn.dsmcdn.com/ty1234/review/images/iphone-15-buyer-1.jpg"],
    "variantInfo": null,
    "scrapedAt": "2026-05-16T10:30:05Z"
}
```

| Field | Type | Description |
|-------|------|-------------|
| `recordType` | string | Always `"review"` |
| `reviewId` | string | Trendyol's review id |
| `productId` | string | Parent product id (denormalized for joins) |
| `productUrl` | string | Parent product URL |
| `productName` | string | Parent product name (denormalized) |
| `rating` | integer | 1–5 stars for this review |
| `reviewText` | string | Customer comment (may be empty for star-only reviews) |
| `reviewDate` | string | ISO date the review was posted |
| `reviewerName` | string | Display name (often initials, e.g. "M\*\*\* S.") |
| `reviewerLevel` | string | Set to `Trendyol Elite` or `Influencer` for the small minority of reviewers Trendyol badges that way; `null` for everyone else |
| `isVerifiedPurchase` | boolean | True when Trendyol marks the reviewer as a verified buyer |
| `helpfulCount` | integer | Helpful / like count on the review |
| `sellerName` | string | Store that sold the reviewed item |
| `sellerId` | string | Merchant id of that store |
| `images` | string\[] | Customer-uploaded image URLs (common on apparel and electronics) |
| `variantInfo` | string | Which variant the reviewer bought, e.g. `"Beden: 42, Renk: Siyah"`. Populated on products sold in sizes or colours such as apparel and footwear; `null` on one-size items like phones and accessories. |
| `scrapedAt` | string | ISO 8601 timestamp of extraction |

### Tips for Best Results

- **Start small.** Set `maxProductsPerSource` to 20–50 on your first run to confirm the data matches your needs, then scale up.
- **Use the most specific URL you have.** Paste the exact Trendyol category URL from the site breadcrumb (`/<slug>-x-c<id>`) instead of a broad keyword — you'll get a tighter, more consistent catalog sweep.
- **Reviews are the cost driver.** Leave `includeReviews` off when you're only price-tracking. Turn it on with a tight `maxReviewsPerProduct` (e.g. 20) when you need sentiment data without paying for every comment on a 3,000-review flagship.
- **Storefront determines currency.** The Turkey store returns TRY, Azerbaijan returns AZN, and the International store returns USD or EUR depending on geo — pick the storefront that matches your analytics. The `currency` field is always populated so you never have to guess.
- **Sort matters for limited runs.** With `maxProductsPerSource: 50`, `sort: "best_seller"` gives you the 50 most-bought items, while `sort: "most_rated"` gives you the 50 with the most review activity — very different lists.
- **"Newest first" trades social proof for freshness.** A listing published today has no ratings, reviews or favorites yet, so those three columns come back empty on roughly 99 out of 100 new-arrival rows. That is exactly what makes the sort useful for spotting fresh inventory before anyone else — just don't reach for it when you need popularity signals.
- **Tight filters need a higher cap.** Filters like `minRating: "4.5"` plus `discountedOnly: true` are applied to each result page after fetch — Trendyol may need to scan several pages before your cap fills. Raise `maxProductsPerSource` by 2–3× when stacking strict filters.
- **Mix every source type in one run.** Two search keywords, three category URLs, and ten direct product URLs can all live in the same input — one billed start, one combined dataset.
- **Direct product URLs can drift.** Trendyol occasionally reassigns an old product id to a different SKU. When that happens you'll see `slugDrift: true` and `requestedProductId` on the row plus a one-line note in the final status message — filter on `slugDrift` to quarantine those rows.

### Pricing

**$1.00 per 1,000 products plus $0.80 per 1,000 reviews.** Reviews are opt-in via `includeReviews` and capped via `maxReviewsPerProduct` — you control review cost.

The review columns below use the review counts our own test runs actually produced at two different caps: with `maxReviewsPerProduct: 20` the average came out at 13.5 reviews per product, and with `maxReviewsPerProduct: 200` it came out at 138. Turkish marketplace products carry far more reviews than most catalogs, so budget from these figures rather than from a rule of thumb.

| Products | Reviews off | `maxReviewsPerProduct: 20` (13.5/product) | `maxReviewsPerProduct: 200` (138/product) |
|----------|-------------|-------------------------------------------|--------------------------------------------|
| 100 | $0.10 | $1.18 | $11.14 |
| 1,000 | $1.00 | $11.80 | $111.40 |
| 10,000 | $10.00 | $118.00 | $1,114.00 |
| 100,000 | $100.00 | $1,180.00 | $11,140.00 |

A "product" is any row with `recordType: "product"`; a "review" is any row with `recordType: "review"`. Leave `includeReviews` off and you only pay the product rate — 1,000 products is `1,000 × $0.001 = $1.00`. On top of that each run carries a $0.00005 start charge per gigabyte of memory, which is rounding error on anything but a one-row run. Platform fees (compute, storage) are billed by Apify, not by this actor.

### Integrations

Export data in JSON, CSV, Excel, XML, or RSS. Connect to 1,500+ apps via:

- **Zapier** / **Make** / **n8n** — Workflow automation
- **Google Sheets** — Direct spreadsheet export
- **Slack** / **Email** — Notifications on new results
- **Webhooks** — Trigger custom APIs on run completion
- **Apify API** — Full programmatic access

### Legal & Ethical Use

This actor is designed for legitimate market research, competitive intelligence, lead generation, and catalog enrichment. Users are responsible for complying with applicable laws and Trendyol's terms of service, including making reasonable-rate requests and respecting any content usage rules for product images, descriptions, and customer reviews. Do not use extracted data for spam, harassment, defamation, or any illegal purpose. Be especially mindful when handling customer review content — treat reviewer names and uploaded images as personal data.

# Actor input Schema

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

Trendyol product search terms (e.g., 'erkek spor ayakkabı', 'kahve makinesi', 'iPhone 15'). Each keyword runs as a separate search. The same keyword listed twice runs once and is charged once. Leave empty if you only want to use URLs below.

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

Paste Trendyol URLs directly. Accepts search result pages (trendyol.com/sr?q=...), category pages (trendyol.com/<category>-x-c<id>), seller / merchant pages (trendyol.com/magaza/...), and direct product URLs — both the full trendyol.com/<brand>/<product>-p-<id> form and the short trendyol.com/p/<id> form. Mix any types in one list. The price, rating and badge filters below apply to every link you paste, including direct product links — a link that does not match them is skipped and named in the run log. Paste the whole address, not just the product number — Trendyol numbers sellers the same way, so a bare number is ambiguous. The same source given twice is scanned and charged once, whichever way it is written: two spellings of one product link (the full link and the short /p/<id> one), or the same search, category or seller page repeated with a trailing slash, without the https://, or with different tracking parameters on the end. Every repeat is named in the run log.

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

Cap on the number of product rows returned per search keyword, category URL, or seller URL. Leave empty and each source stops at 100 products. Direct product URLs always return exactly one product and are unaffected by this cap. Set to 0 for unlimited — a source then runs until it hits our safety limit, which in live testing came out between about 2,400 and 4,700 products depending on the sort order and on how often Trendyol repeats products between result pages (repeats are never billed twice). When the price, rating or badge filters are on we keep looking past your cap to try to fill it, scanning up to five times as many products before giving up.

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

When on, the actor fetches customer reviews for every product it returns and emits them as separate rows (recordType="review"). Off by default to keep runs lean — reviews are billed at a separate per-row rate.

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

Cap on review rows extracted from each product. Leave empty for 50 per product. Ignored when 'Also extract customer reviews' is off. Set to 0 to take every review Trendyol serves for a product (thousands, on popular items). Trendyol stops serving after roughly 5,000 reviews on any one product, however many the product page counts, so 0 means 'up to about 5,000'.

## `sort` (type: `string`):

Result ordering for search keywords and category URLs. 'Best match' is Trendyol's default ranking. Ignored when scraping direct product URLs. Note on 'Newest first': brand-new listings have not collected shopper activity yet, so rating, review count and favorite count come back empty on almost every row (about 1 in 100 carries them, against 99 in 100 on the other sort orders). That is what Trendyol publishes for new arrivals, not a gap in the data. Pick 'Best sellers' or 'Most favorited' when you need those numbers.

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

Only include products priced at or above this value in Turkish Lira. Leave empty for no minimum.

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

Only include products priced at or below this value in Turkish Lira. Leave empty for no maximum.

## `minRating` (type: `string`):

Only include products whose average customer rating is at least this many stars. Leave empty for no minimum.

## `freeShippingOnly` (type: `boolean`):

Only include products eligible for free shipping.

## `fastDeliveryOnly` (type: `boolean`):

Only include products carrying Trendyol's Hızlı Teslimat (fast delivery) badge. Turkey storefront only — Trendyol never marks fast delivery on the International or Azerbaijan storefronts, so this filter is switched off automatically there and the run tells you it did. On Turkey, fast-moving categories like phones and fashion see around 8 in 10 products qualify; bulky ones like furniture fewer than 1 in 10.

## `discountedOnly` (type: `boolean`):

Only include products currently on sale (showing a strike-through original price).

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

Which Trendyol storefront to target. The default Turkey marketplace (trendyol.com) is the broadest catalog with all reviews available. Other storefronts have smaller catalogs and different currencies. The International storefront sells only part of the Turkish catalogue, so a product link you copied from trendyol.com may not exist there — the run says so instead of returning an empty result.

## Actor input object example

```json
{
  "searchQueries": [
    "erkek spor ayakkabı"
  ],
  "startUrls": [],
  "maxProductsPerSource": 100,
  "maxReviewsPerProduct": 50,
  "sort": "best_match",
  "minRating": "any",
  "country": "tr"
}
```

# Actor output Schema

## `overview` (type: `string`):

Every scraped row in one table — filterable by recordType.

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

Just the product rows (price, brand, seller, rating).

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

Just the customer review rows.

# 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": [
        "erkek spor ayakkabı"
    ],
    "startUrls": [],
    "maxProductsPerSource": 100,
    "includeReviews": false,
    "maxReviewsPerProduct": 50,
    "sort": "best_match",
    "minRating": "any",
    "freeShippingOnly": false,
    "fastDeliveryOnly": false,
    "discountedOnly": false,
    "country": "tr"
};

// Run the Actor and wait for it to finish
const run = await client.actor("solidcode/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 = {
    "searchQueries": ["erkek spor ayakkabı"],
    "startUrls": [],
    "maxProductsPerSource": 100,
    "includeReviews": False,
    "maxReviewsPerProduct": 50,
    "sort": "best_match",
    "minRating": "any",
    "freeShippingOnly": False,
    "fastDeliveryOnly": False,
    "discountedOnly": False,
    "country": "tr",
}

# Run the Actor and wait for it to finish
run = client.actor("solidcode/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 '{
  "searchQueries": [
    "erkek spor ayakkabı"
  ],
  "startUrls": [],
  "maxProductsPerSource": 100,
  "includeReviews": false,
  "maxReviewsPerProduct": 50,
  "sort": "best_match",
  "minRating": "any",
  "freeShippingOnly": false,
  "fastDeliveryOnly": false,
  "discountedOnly": false,
  "country": "tr"
}' |
apify call solidcode/trendyol-scraper --silent --output-dataset

```

## MCP server setup

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