Trendyol Scraper: Products, Prices & Reviews (Apify Actor)

Scrape Trendyol.com search results, product pages and customer reviews. Rows include price in TRY with basket discount, seller, rating, stock, and size and variant for each review. Clear not-found rows. No login. Price: $0.90 per 1,000 products, $0.65 per 1,000 reviews, plus $0.01 per run start. Runs as an Apify Actor, callable from MCP clients via the Apify MCP server (https://mcp.apify.com/?tools=cliqtomedia/trendyol-scraper).

Servidor MCP alojado

npx add-mcp 'https://mcp.apify.com/?tools=cliqtomedia/trendyol-scraper'

Se instala en Claude Code, Codex, Cursor y más

Documentación

Trendyol Scraper: Products, Prices & Reviews (No login) (cliqtomedia/trendyol-scraper) Actor

Scrape Trendyol.com search results, product pages and customer reviews. No login. Prices in TRY with basket discount, seller, rating, stock, size and variant of each review. Clear not-found and error rows.

Pricing

from $0.63 / 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. Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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 section below.

Each client library has reference documentation the quickstart does not restate: JavaScript/TypeScript (npm install apify-client) and Python (pip install apify-client).

README

Trendyol Scraper gets products, prices and customer reviews from Trendyol.com, the largest online marketplace in Turkey. Add a keyword, a search URL or product URLs, and get a clean table with price in TRY, basket discount, seller, rating, stock and reviews. No login and no cookies are needed.

Start with one Turkish keyword, for example kulaklık (headphones), and 20 results. This run takes about 5 seconds and costs $0.028 on the Free plan.

Trendyol Scraper: search Trendyol by keyword or product URL and get products with price, discount, rating and seller, plus customer reviews with size and variant

Table of contents

What it does

The Actor reads the public Trendyol website. It has three modes:

ModeYou addYou get
searchkeywords or Trendyol search URLsone row per product in the search results, in the same order as on the site
productproduct URLs or product IDsone row per product, with data from the product page
reviewsproduct URLs or product IDsone row per customer review

It works without a Trendyol account. It does not need a Turkish IP address: it uses the Apify datacenter proxy by default.

Good fit

  • Check prices and discounts of your products and your competitors on Trendyol.
  • Find which products and sellers appear first for a keyword, including paid (ad) listings.
  • Read what buyers say about a product, with the size and variant they bought.

Not a fit

  • Other Trendyol countries (only trendyol.com, prices in TRY).
  • Questions and answers (Q&A), seller pages and short ty.gl links are not supported.
  • Personal data: the Actor does not return reviewer names, body measurements or the legal details of sellers.

What data you get

Products: product ID, name, brand, category, price, basket price, old (strikethrough) price, discount percent, promotions, seller ID, rating, number of ratings, stock, free shipping, ad flag, variant, URL and images.

With product pages (product mode, or includeDetails in search) you also get: seller name, seller score, full category path, number of reviews, number of favourites, all attributes and all variants with stock.

Reviews: review ID, star rating, text, date, size and variant bought, fit feedback, helpful votes, verified-buyer flag, seller, photo URLs and language.

Every row has source, sourceUrl and fetchedAt, so you always know where and when the data was read.

Quick start

  1. Open the Input tab.
  2. Keep Mode = search.
  3. In Queries, keep kulaklık or add your own keyword.
  4. Keep Max items = 20.
  5. Click Start.
  6. Open the Output tab and check the Products view: name, price, discountedPrice, rating.

Expected result: 20 product rows for the keyword, in the same order as on trendyol.com.

Input

FieldTypeDefaultAllowed valuesWhat it does
modestringsearchsearch, product, reviewsWhat to collect.
queriesarray of stringsempty (prefill kulaklık)up to 20search mode: keywords or Trendyol search URLs (https://www.trendyol.com/sr?q=...). From a search URL the Actor takes only the search words (q=); other URL filters are not used.
productUrlsarray of stringsemptyup to 100product and reviews modes: product URLs (...-p-123456789) or numeric product IDs.
maxItemsinteger100 (prefill 20)1–1000search: products per query. reviews: reviews per product. product mode always returns one row per URL.
sortstringrelevancerelevance, price_asc, price_desc, newest, best_seller, most_favourite, most_ratedOrder of search results.
includeDetailsbooleanfalsetrue / falsesearch mode: also open each product page for seller name, attributes, variants and counts. Slower, same price per product.
skipSponsoredbooleanfalsetrue / falsesearch mode: leave out paid (ad) listings. Ads always have isSponsored: true.
reviewSortstringrelevancerelevance, newestOrder of reviews.
proxyConfigurationobjectApify proxy onApify proxy settingsChange only if you see blocked errors.

Good to know:

  • The same keyword in another letter case (Kulaklık and kulaklık) is read and paid only once. The same product twice is read only once.
  • A value that is not a Trendyol product (another website, a URL without an ID) gets a free error row. The other values still run.
  • With includeDetails: true the Actor uses 512 MB of memory instead of 256 MB and is slower (about 300 products in 2–3 minutes).

Input examples

Search with a sort order

{
  "mode": "search",
  "queries": ["kulaklık", "https://www.trendyol.com/sr?q=laptop"],
  "maxItems": 100,
  "sort": "price_asc",
  "skipSponsored": true
}

Up to 100 products for each query, cheapest first, without ads.

Product pages

{
  "mode": "product",
  "productUrls": [
    "https://www.trendyol.com/tarcin/air-pro-2-anc-gurultu-engelleyici-bluetooth-kulaklik-ios-android-tum-telefonlar-ile-uyumlu-kulaklik-p-819066262",
    "946802869"
  ]
}

One row per product with seller name, seller score, category path, attributes and variants.

Newest reviews of a product

{
  "mode": "reviews",
  "productUrls": ["946802869"],
  "maxItems": 20,
  "reviewSort": "newest"
}

The 20 newest reviews, with size and variant.

Output

The dataset has two views: Products and Reviews. You can export it as JSON, CSV, Excel or HTML.

Product row example

From the quick start run (search, kulaklık, 20 items). The image list is shortened.

{
  "recordType": "product",
  "status": "complete",
  "errorMessage": null,
  "query": "kulaklık",
  "position": 4,
  "input": null,
  "productId": "666158167",
  "name": "Pro 5 Plus Kablosuz Bluetooth Kulaklık Bluetooth 5.3 TWS iOS Android Uyumlu HD Stereo Ses Dokunmatik Kılıf Hediyeli Şarj Kutulu",
  "brand": "TrkTech",
  "category": "Kulak içi TWS Bluetooth Kulaklık",
  "categoryPath": null,
  "price": 479.9,
  "discountedPrice": null,
  "originalPrice": 519.9,
  "discountPercentage": 8,
  "currency": "TRY",
  "promotions": [],
  "seller": null,
  "sellerId": "260497",
  "sellerScore": null,
  "rating": 3.76,
  "ratingCount": 28612,
  "reviewCount": null,
  "favoriteCount": null,
  "inStock": true,
  "freeShipping": true,
  "isSponsored": true,
  "variant": "Tek Ebat",
  "variants": null,
  "attributes": null,
  "url": "https://www.trendyol.com/trktech/pro-5-plus-kablosuz-bluetooth-kulaklik-bluetooth-5-3-tws-ios-android-uyumlu-hd-stereo-ses-dokunmatik-kilif-hediyeli-sarj-kutulu-p-666158167",
  "image": "https://cdn.dsmcdn.com/mnresize/400/-/ty1910/prod/QC_ENRICHMENT/20260728/10/9ec2e259-2706-3ae9-874d-68678b5a420a/1_org_zoom.jpg",
  "images": ["https://cdn.dsmcdn.com/mnresize/400/-/ty1910/prod/QC_ENRICHMENT/20260728/10/9ec2e259-2706-3ae9-874d-68678b5a420a/1_org_zoom.jpg"],
  "detailsIncluded": false,
  "source": "trendyol.com",
  "sourceUrl": "https://apigw.trendyol.com/discovery-sfint-search-service/api/search/products/?channelId=1&culture=tr-TR&countryCode=TR&storefrontId=1&language=tr&pageSize=36&pi=1&q=kulakl%C4%B1k&qt=kulakl%C4%B1k&st=kulakl%C4%B1k&os=1",
  "fetchedAt": "2026-10-14T15:05:47.817Z"
}

seller, categoryPath, reviewCount, favoriteCount, variants and attributes are null here because the run did not open product pages. Use product mode or includeDetails: true to fill them.

Review row example

From the newest-reviews example above.

{
  "recordType": "review",
  "status": "complete",
  "errorMessage": null,
  "input": "946802869",
  "productId": "946802869",
  "productUrl": "https://www.trendyol.com/x/y-p-946802869",
  "reviewId": "672788584",
  "rating": 4,
  "text": "guzel bir tisort ise yarar",
  "date": "2026-10-14T03:40:54.974Z",
  "lastModifiedAt": "2026-10-14T03:41:14.532Z",
  "size": "M",
  "variantAttribute": "Beden",
  "variant": "M",
  "fit": null,
  "seller": "TEE NOVA",
  "sellerId": "1146443",
  "likesCount": 0,
  "trusted": true,
  "photos": [],
  "language": "tr",
  "source": "trendyol.com",
  "sourceUrl": "https://apigw.trendyol.com/discovery-storefront-trproductgw-service/api/review-read/product-reviews/detailed?contentId=946802869&page=0&pageSize=50&order=DESC&orderBy=CreatedDate&channelId=1&countryCode=TR&culture=tr-TR&storefrontId=1&language=tr",
  "fetchedAt": "2026-10-14T15:06:55.037Z"
}

productUrl is a short link to the product. Trendyol redirects it to the full product page.

All output fields

null means "the site does not show this value" or "this mode does not read it". It never means zero.

FieldTypeRowsMeaning
recordTypestringallproduct or review.
statusstringallcomplete; partial (search data only, the product page could not be read); not_found (no product with this ID, free); error (bad input or source failure, free).
errorMessagestring or nullallWhy a row is partial, not_found or error.
querystring or nullproductSearch query that found the product.
positioninteger or nullproductPlace in the search results, starting at 1.
inputstring or nullallYour product URL or ID as you gave it (product and reviews modes).
productIdstring or nullallTrendyol product ID.
name, brand, categorystring or nullproductProduct name, brand and category.
categoryPathstring or nullproductFull category path, for example Elektronik > Giyilebilir Teknoloji > Kulaklıklar > .... Product pages only.
pricenumber or nullproductSelling price in TRY.
discountedPricenumber or nullproductLower basket or campaign price in TRY, when the site shows one.
originalPricenumber or nullproductOld (strikethrough) price in TRY, when the site shows one.
discountPercentagenumber or nullproductDiscount from the highest shown price to the lowest one, in percent. null when there is no discount.
currencystring or nullproductTRY.
promotionsarrayproductPromotion labels, for example 300 TL'ye %10 İndirim.
sellerstring or nullbothSeller name. In search mode only with includeDetails. For reviews: where the buyer bought the item.
sellerIdstring or nullbothSeller ID.
sellerScorenumber or nullproductSeller score from 0 to 10. Product pages only.
ratingnumber or nullbothAverage rating 1–5 for a product; stars for a review.
ratingCountinteger or nullproductNumber of ratings.
reviewCount, favoriteCountinteger or nullproductNumber of written reviews and of favourites. Product pages only.
inStock, freeShippingboolean or nullproductCan be bought now; free delivery.
isSponsoredboolean or nullproducttrue for paid (ad) listings in search results.
variantstring or nullbothSelected size or colour; for reviews, the variant the buyer bought.
variantsarray or nullproductAll variants with stock: [{"value": "M", "inStock": true}]. Product pages only.
attributesobject or nullproductProduct attributes, name → value. Product pages only.
url, image, imagesstring / arrayproductProduct page URL, main image and all images.
detailsIncludedbooleanproducttrue if the product page was read.
productUrlstring or nullreviewLink to the product.
reviewId, textstring or nullreviewReview ID and text.
date, lastModifiedAtstring or nullreviewReview date and last edit date (ISO 8601, UTC).
size, variantAttributestring or nullreviewSize bought and the variant type, for example Beden (size) or Renk (colour).
fitstring or nullreviewBuyer's size-fit feedback, when given.
likesCountinteger or nullreviewHow many users found the review helpful.
trustedboolean or nullreviewtrue if Trendyol marks the buyer as verified.
photosarrayreviewPhoto URLs in the review.
languagestring or nullreviewReview language, for example tr.
source, sourceUrl, fetchedAtstringalltrendyol.com, the exact URL the row came from, and when it was read (ISO 8601, UTC).

Run summary

Each run also saves RUN_SUMMARY in the key-value store. It shows the result for each query or product (complete, no_results, not_found or error), row counts, charged counts and request statistics. Open it from the Output tab or with the API.

Pricing

You pay per event (pay-per-event). Platform usage is included in the price.

EventWhenFree planBronzeSilverGold and higher
Actor startonce per run$0.01$0.01$0.01$0.01
Productone product row saved$0.0009$0.00082$0.00073$0.00065
Reviewone review row saved$0.00065$0.00055$0.00047$0.00045

Free rows: not_found and error rows cost nothing. A run where nothing is found costs only the start event ($0.01). Product pages with includeDetails cost the same as normal product rows.

Examples on the Free plan:

RunRowsCostTime
1 keyword, 20 products (quick start)20$0.028about 5 s
1 keyword, 100 products100$0.10under 20 s
1 keyword, 1,000 products1,000$0.91about 20 s
100 reviews of one product100$0.075under 20 s
1,000 reviews of one product1,000$0.66about 40 s
20 keywords with no results0$0.01about 45 s
100 products × 1,000 reviews100,000$65about 70 min

Times come from our test runs; Trendyol's speed changes during the day. Reviews are read at about 25 per second.

To limit the cost, use Max items and the Maximum cost per run option in the run settings. When the limit is reached, the Actor stops and keeps the rows it already saved.

Use cases

JobMode and inputKey fields
Price check for your productsproduct, your product URLsprice, discountedPrice, originalPrice, inStock, seller
Keyword and ad trackingsearch, your main keywordsposition, isSponsored, brand, sellerId, rating
Category price researchsearch, a product-type keyword, sort: price_ascprice, discountPercentage, ratingCount
Review analysisreviews, reviewSort: newestrating, text, size, fit, date
Size and fit problemsreviews for clothes or shoessize, variant, fit, rating

Scheduling and monitoring

Create a task with your input and add an Apify schedule, for example every morning. Each run gives a new dataset with fetchedAt, so you can compare prices and positions over time. Use reviewSort: newest with a small maxItems to get only the latest reviews.

API, export and AI agents (MCP)

  • Export: download the dataset as JSON, CSV, Excel or HTML from the Output tab.
  • API: start the Actor and read the dataset with the Apify API. The API tab shows ready code for Python, JavaScript and cURL.
  • Integrations: send results to Google Sheets, Slack, Make, Zapier or a webhook after each run.

Use with AI agents (MCP)

Connect this Actor to Claude, Cursor or another MCP client with the Apify MCP server:

https://mcp.apify.com?tools=cliqtomedia/trendyol-scraper

Smallest useful input:

{ "mode": "search", "queries": ["kulaklık"], "maxItems": 20 }

Main fields: name, price (TRY), discountedPrice (basket price), rating, url. A run with 20 products takes about 5 seconds and costs $0.028 on the Free plan. Limits: 20 queries or 100 products per run, 1,000 items per query or product.

Limits and partial results

  • Up to 20 queries per run and up to 1,000 products per query (20,000 products in about 13 minutes).
  • Up to 100 product URLs per run, and up to 1,000 reviews per product. 100,000 reviews take about 70 minutes; the default run timeout is 2 hours.
  • Search results can change between runs: Trendyol personalises and updates its listings.
  • discountedPrice is the basket price that Trendyol shows to all visitors. Coupons and personal prices are not included.
  • If a query or a product fails because of a source error, the rows already saved stay in the dataset, the failed item gets a free error row, and the run ends with status Failed so you notice it. RUN_SUMMARY shows which item failed.
  • With includeDetails, a product whose page could not be read keeps its search data with status: partial.

Troubleshooting

No rows for a keyword. Check RUN_SUMMARY: no_results means Trendyol has no products for this keyword. Try Turkish words (kulaklık, not headphones) or copy the search URL from trendyol.com.

A product row says not_found. The product was removed from Trendyol or the ID is wrong. This row is free.

An error row. Read errorMessage. INVALID_INPUT means the value is not a Trendyol product URL or ID. Other errors come from the source; run the same input again later.

The run failed with a blocked or rate-limit message. Trendyol limited the requests. Run again later. Keep the default Apify proxy or try another proxy group in Proxy configuration.

FAQ

Do I need a Trendyol account or cookies? No. The Actor reads only public pages.

Which prices do I get? price is the selling price, discountedPrice is the lower basket price (if any), and originalPrice is the old strikethrough price (if any). All in TRY.

Why is seller empty in search? The search page shows only the seller ID. Turn on includeDetails or use product mode to get the seller name.

Are reviewer names included? No. To protect privacy, the Actor does not return reviewer names.

Is the data fresh? Yes. Each run reads Trendyol live. fetchedAt shows the time.

Support

For a bug or a feature request, open an issue in the Issues tab. Add the run ID, the mode and the error message. Do not share tokens or other private data.

Changelog

This Actor's version history is a separate document: https://apify.com/cliqtomedia/trendyol-scraper/changelog.md

Actor input Schema

mode (type: string):

search: products for each query in Queries. product: one row per product URL/ID. reviews: customer reviews for each product URL/ID.

queries (type: array):

Search mode: up to 20 keywords (Turkish works best, e.g. kulaklık, laptop) or Trendyol search URLs (https://www.trendyol.com/sr?q=...). Each query gets up to Max items products.

productUrls (type: array):

Product and reviews modes: up to 100 Trendyol product URLs (…-p-123456789) or numeric product IDs. Short ty.gl links are not supported. Values that are not Trendyol products get a free error row.

maxItems (type: integer):

Search: max products per query. Reviews: max reviews per product. Product mode always returns one row per URL.

sort (type: string):

Order of search results (search mode).

includeDetails (type: boolean):

Search mode: also read each product's page to add seller name, seller score, category path, attributes, variants and review count. Slower; same price per product.

skipSponsored (type: boolean):

Search mode: leave out paid (ad) listings. Sponsored products are marked with isSponsored either way.

reviewSort (type: string):

Order of reviews (reviews mode).

proxyConfiguration (type: object):

Apify datacenter proxy works by default. Change only if you see blocked errors.

Actor input object example

{
  "mode": "search",
  "queries": [
    "kulaklık"
  ],
  "maxItems": 20,
  "sort": "relevance",
  "includeDetails": false,
  "skipSponsored": false,
  "reviewSort": "relevance",
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}

Actor output Schema

products (type: string):

Product rows as a table.

reviews (type: string):

Review rows as a table.

runSummary (type: string):

Run status, reason, per-query/per-product results and request statistics.

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

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 = {
    "mode": "search",
    "queries": [
        "kulaklık"
    ],
    "maxItems": 20,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("cliqtomedia/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

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 = {
    "mode": "search",
    "queries": ["kulaklık"],
    "maxItems": 20,
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("cliqtomedia/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

echo '{
  "mode": "search",
  "queries": [
    "kulaklık"
  ],
  "maxItems": 20,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call cliqtomedia/trendyol-scraper --silent --output-dataset

MCP server setup

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