eMAG Product Scraper
Pricing
from $1.62 / 1,000 results
eMAG Product Scraper
Extract product listings from eMAG.ro, Romania's largest marketplace. Scrape prices, stock status, ratings, reviews, seller info, EAN codes and full specifications from category pages, search results, or individual product URLs.
Pricing
from $1.62 / 1,000 results
Rating
5.0
(1)
Developer
Extractify Labs
Maintained by CommunityActor stats
1
Bookmarked
88
Total users
21
Monthly active users
22 days ago
Last modified
Categories
Share
🛒 eMAG Product Scraper
Extract product listings and full product details from emag.ro, Romania's largest e-commerce marketplace. Pull prices, stock status, ratings, reviews, seller information, category paths, images, EAN codes, and full specification tables. Runs out of the box on Apify: the default input is a ready-to-run emag.ro category job using an Apify Residential proxy.
📋 Overview
The eMAG Product Scraper accepts category URLs, search page URLs, individual product page URLs, or plain search terms, and returns structured data for every matching product. Behind the scenes it reads each product through eMAG's mobile catalog channel: one fast call per product returns the full structured record. Category, search, and searchTerms inputs are first resolved to product URLs, then each product is read via that same channel, so the rich field set is the same whether you point the scraper at a category, a keyword, or a direct /pd/ product URL.
🇷🇴 Every input path is supported — category URLs, searchTerms keywords, and direct /pd/ product URLs all return the full record, including review texts via includeReviewTexts.
Proxy: Apify Residential is the default — leave it on. eMAG refuses Apify's datacenter egress, so this is not a preference. Measured from the platform on 2026-09-21 against the same category input: no proxy → 0 products (4 of 4 runs, including a direct
/pd/URL, which skips discovery entirely**)**; Apify datacenter proxy → 0 products; ApifyRESIDENTIAL→ items every time (category, keyword search, direct product URL, review texts, and a mixed run). Residential traffic is charged to your own Apify account. Switch toNo proxyonly when running this Actor outside Apify from an ordinary connection.
Every output item carries a country field (ro) and a currency code (RON), so rows stay unambiguous when you merge this dataset with others.
Who is this for? E-commerce analysts and competitive intelligence teams that need current pricing, availability, and seller data from the Romanian market. Dropshipping researchers who source products from eMAG for resale. Price monitoring pipelines tracking promotional discounts. Developers integrating eMAG product data into inventory systems, comparison engines, or dashboards.
What makes it different? Depth per request. Each product is read through eMAG's mobile catalog channel, which returns a complete structured record in one call: brand, EAN, specification tables, pricing metadata, ratings, seller details, and marketplace offers. The same depth comes back for category pages, keyword searches, and direct product URLs alike — and because no proxy is needed, you pay only for Apify compute.
✨ Key Features
- 🔎 Category and search page scraping. Pass eMAG category URLs (
/csuffix), subcategory URLs (/sdsuffix), or search result URLs to extract listed products, with automatic pagination — reliably, with no proxy. - 📦 Direct product page support. Pass individual eMAG product page URLs (
/pd/CODE/) to extract a specific product. Direct URLs return the same full field set as category and search inputs — brand, EAN, specifications, offers, and more. - 💬 Keyword search. Supply one or more search terms via
searchTerms. Each term runs as a separate search on emag.ro, and the results are combined into a single dataset. - 📊 Deep product data. Beyond price and title you get brand, manufacturer, MPN, EAN, full specification tables, category breadcrumb, ratings, review counts, seller identity, marketplace offers, and EU price-history disclosure (lowest price in the last 30 days).
- ⭐ Customer reviews. Each product may include a few reviews by default. Set
includeReviewTexts: trueto fetch the full set of customer review texts (one extra request per product). Star rating and review count are always included. - 🎯 Global item cap. Set
maxItemsto limit the total number of products collected across all URLs and search terms combined. - ⚡ One request per product. Each product is read in a single catalog call, so runs stay fast and cheap on compute. An Apify Residential proxy ships as the default (charged to your own Apify account) because eMAG refuses datacenter egress.
🌍 Supported Sites
| Domain | Country | Currency | Supported input paths |
|---|---|---|---|
| emag.ro | Romania | RON | Category URLs, search URLs, searchTerms, product /pd/ URLs — all with no proxy |
Every output item carries the currency code (RON).
Romania only, since v2.0. Earlier versions also covered emag.bg and emag.hu. Those sites are no longer supported: a run pointed at them stops immediately with a message telling you to switch to Romania, rather than failing silently. If you were scraping Bulgaria or Hungary with this Actor, see the CHANGELOG.
🚀 Quick Start
Default run — top laptops from emag.ro (category page)
This is the actor's prefilled default input. Run it as-is to get a small, fast sample from Romania with no proxy.
{"startUrls": [{ "url": "https://www.emag.ro/laptopuri/c" }],"maxItems": 10}
Search for a product by keyword (Romania)
{"searchTerms": ["laptop lenovo"],"country": "ro","maxItems": 5}
Extract a specific product by its page URL
{"startUrls": [{ "url": "https://www.emag.ro/laptop-lenovo/pd/DBLL5H3BM/" }]}
🔧 Input Parameters
| Parameter | Type | Default | Description |
|---|---|---|---|
startUrls | array | required* | List of emag.ro URLs to scrape, each as a { "url": "…" } object. Accepts category pages (/c, /sd), search result pages (/search/…), or individual product pages (/pd/CODE/). At least one of startUrls or searchTerms must be provided. |
searchTerms | array of strings | required* | Keywords to search on emag.ro. Each term runs as a separate search; results from all terms are combined in the output. At least one of startUrls or searchTerms must be provided. |
country | string ("ro") | "ro" | Leave on Romania. "bg" and "hu" are still listed so that saved tasks from v1.x fail with an explanation instead of a validation error; selecting either stops the run. |
maxItems | integer | 10 (prefill) | Total products to collect across all URLs and search terms combined. Leave unset for no limit. |
includeReviewTexts | boolean | false | Fetch the full set of customer reviews for each product (one extra request per product). A few reviews may already be present by default; this flag returns the complete set. Star ratings and review counts are always included regardless. |
proxyType | string ("none", "apify") | "apify" | Network egress. Defaults to Apify Proxy because eMAG refuses Apify's datacenter egress: none measured 0 products on 4 of 4 platform runs and Apify datacenter proxy also returned 0 (2026-09-21). Keep the RESIDENTIAL group below. none is correct only when running outside Apify. Charged to your own Apify account. |
proxyConfiguration | object | { "useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"], "apifyProxyCountry": "RO" } | Apify Proxy settings. The RESIDENTIAL group is the load-bearing part — datacenter egress returns 0 products. Country RO matches the Romanian storefront and is optional. Charged to your own Apify account. |
* Required: At least one of startUrls or searchTerms must be provided. If neither is given, the actor stops immediately with a clear message.
How to find an eMAG category URL
- Go to emag.ro.
- Browse to the category you want to scrape.
- The URL ends in
/c(top-level category) or/sd(subcategory). Copy it directly intostartUrls.
Examples:
- Laptops Romania:
https://www.emag.ro/laptopuri/c - Phones Romania:
https://www.emag.ro/telefoane-mobile/c
Category URLs, subcategory URLs and search URLs are all reliable discovery paths, with no proxy.
How to find a product page URL
Open any product on emag.ro. The URL contains /pd/ followed by the product code (for example https://www.emag.ro/…/pd/DBLL5H3BM/). Copy it directly into startUrls.
📦 Output Data Schema
Every output item is a JSON object. The fields below are always present; fields with no value are null (or [] for array fields) rather than absent. Beyond the core product columns, the actor also captures the deeper fields the catalog exposes (EAN, specifications, marketplace offers, family variants, and more); availability of these richer fields varies by product and country.
Core product fields
| Field | Type | Example | Notes |
|---|---|---|---|
productId | string | "DBLL5H3BM" | eMAG internal product code (part-number key) |
title | string | "Laptop Lenovo Thinkbook 16 G7…" | Full product title |
url | string | "https://www.emag.ro/…/pd/DBLL5H3BM/" | Product page URL on the correct country domain |
price | float | 4815.92 | Current selling price |
originalPrice | float or null | 2549.99 | Pre-discount price; null when there is no real discount |
currency | string | "RON" | Currency code — always RON |
discountPercentage | integer or null | 14 | Discount as a percentage; null when no discount is active |
brand | string or null | "Lenovo" | Brand name |
category | string or null | "Laptop / Notebook" | Leaf-level category name |
categoryPath | array of strings | ["Laptop, Tablete & Telefoane", "Laptopuri si accesorii", "Laptop / Notebook"] | Full category breadcrumb from department to leaf |
imageUrl | string or null | "https://…/res_acfa2d.jpg?width=720&height=720" | Primary product image URL |
images | array of strings | ["https://…?width=200…", "https://…?width=720…"] | All available image URLs (multiple sizes) |
rating | float or null | 4.93 | Average star rating (0–5); null for products with no reviews |
reviewCount | integer or null | 103 | Total number of customer ratings |
inStock | boolean or null | true | Whether the product is currently available to order |
fulfilledByEmag | boolean or null | true | Whether the product is sold and shipped by eMAG directly |
sellerName | string or null | "INFLOO" | Third-party marketplace seller name, or null when sold directly by eMAG |
badges | array of strings | ["free_delivery", "genius_eligible"] | User-facing commercial flags, e.g. free_delivery, genius_eligible, gift_with_purchase |
recommendationRate | integer or null | 88 | Percentage of buyers who recommend this product |
offerId | integer or null | 304315905 | eMAG internal offer identifier |
country | string | "ro" | Country domain used for this product ("ro", "bg", or "hu") |
scrapedAt | string (ISO 8601) | "2026-06-18T20:26:04.877422+00:00" | UTC timestamp of when the item was scraped |
reviews | array of objects or null | [{"author": "Ion P.", "rating": 5, "title": "Great product", "text": "…", "date": "2026-04-20T13:06:43+00:00", "hasImages": false}] | Customer reviews. A few may be present by default; set includeReviewTexts: true for the full set. Each review has author, rating (1–5), title (or null), text, date, and hasImages |
Additional product detail fields
| Field | Type | Example | Notes |
|---|---|---|---|
ean | string or null | "195950853278" | EAN / barcode of the product |
specifications | object, array, or null | {"Tip produs": "Toner", "Culoare": "Negru"} | Product characteristics / specification table (grouped or flat, depending on country and product) |
manufacturer | string or null | "HP" | Manufacturer name (often the same as brand) |
mpn | string or null | "C8543X" | Manufacturer part number |
productNumericId | integer or null | 2911082 | Numeric eMAG catalog id (distinct from the SKU productId) |
priceNet | float or null | 404.20 | Net price (VAT excluded), where exposed |
priceInitial | float or null | 499.99 | Raw initial / list price as returned by eMAG (ungated; distinct from the gated originalPrice) |
lowestPrice30Days | float or null | 379.99 | Lowest price in the last 30 days (EU price-history disclosure) |
recommendedRetailPrice | float or null | 549.00 | Recommended retail price (RRP), where exposed |
priceBgnTransition | float or null | null | Legacy (emag.bg only). Always null since v2.0; kept so existing exports keep working |
currencyBgnTransition | string or null | null | Legacy (emag.bg only). Always null since v2.0; kept so existing exports keep working |
offersCount | integer or null | 3 | Number of offers attached to the product |
multipleOffersCount | integer or null | 2 | Number of competing marketplace offers |
offerCount | integer or null | 2 | Competing-offer count from the multiple-offers channel (emag.ro / .hu) |
offers | array or null | [{"id": …, "price": …, "seller": …}] | Competing marketplace offers (id, price, currency, seller, availability) |
minPriceOffers | float or null | 369.00 | Minimum price across competing offers |
maxPriceOffers | float or null | 421.50 | Maximum price across competing offers |
usedOffers | array or null | [{"price": …, "seller": …}] | Competing used / refurbished offers |
usedOffersCount | integer or null | 1 | Number of used / refurbished offers |
usedMinPrice | float or null | 299.00 | Minimum price across used / refurbished offers |
availabilityText | string or null | "Ultimele 3 produse" | Human-readable availability text |
stockMessage | string or null | "Ultimele 3 produse" | Stock / Genius message from the product page (emag.ro / .hu) |
sellerId | integer or null | 41205 | Marketplace seller identifier (publicly displayed) |
sellerSef | string or null | "infloo" | Seller SEF slug |
vendorType | integer or null | 2 | Vendor type code |
isGeniusEligible | boolean or null | true | Whether the offer is eMAG Genius eligible |
hasFreeDelivery | boolean or null | true | Whether the offer has free delivery |
hasPickup | boolean or null | false | Whether store pickup is available |
hasVideo | boolean or null | false | Whether the product has a video gallery |
hasImage360 | boolean or null | false | Whether the product has a 360-degree image |
isFamily | boolean or null | true | Whether the product is part of a product family (variants) |
familyVariants | array or null | [{"pnk": …, "label": "128 GB", "price": …, "url": …}] | Family / variant products (id, pnk, label, price, url, availability) |
itemCondition | string or null | "https://schema.org/NewCondition" | Item condition (new / used) |
ecreditInstallments | array or null | [{"months": 12, "monthlyPayment": …}] | eCredit installment plans |
ecreditProviders | array or null | [{"name": …}] | eCredit financing providers |
ratingDistribution | object or null | {"1": 0, "2": 0, "3": 0, "4": 1, "5": 1} | Rating distribution {star: count} |
positiveRatingPct | number or null | 100 | Percentage of positive ratings |
boughtCount | integer or null | 2 | Number of times the product was bought, where exposed |
questionCount | integer or null | 5 | Number of customer questions |
reviewCharacteristics | array or null | [{"name": …, "average": …}] | Per-characteristic average review ratings |
breadcrumbUrls | array of strings or null | [] | Legacy (emag.bg HTML path only). Always empty since v2.0 — use category for the emag.ro trail |
description | string or null | "Cartus cerneala HP 45, 51645AE Negru" | Product description, where exposed |
keywords | string, array, or null | "toner, c8543x, negru, emag.ro" | Product keywords, where exposed |
Sample output item
{"productId": "EH5MBBBBM","title": "Toner HP C8543X Negru","url": "https://www.emag.ro/toner-hp-negru-c8543x/pd/EH5MBBBBM/","price": 2078.99,"originalPrice": null,"currency": "RON","discountPercentage": null,"brand": "HP","manufacturer": "HP","mpn": "C8543X","ean": "195950853278","category": "Tonere imprimante laser","categoryPath": ["Imprimante, Scanere & Consumabile", "Tonere imprimante laser", "Tonere imprimante laser HP"],"specifications": {"Tip produs": "Toner","Brand compatibil": "HP","Consumabil": "Original","Randament pagini": "30000","Culoare": "Negru"},"imageUrl": "https://s13emagst.akamaized.net/products/9/8206/images/res_e4f3fd81.jpg?width=720&height=720","images": ["https://s13emagst.akamaized.net/products/9/8206/images/res_e4f3fd81.jpg?width=720&height=720","https://s13emagst.akamaized.net/products/9/8206/images/res_e4f3fd81.jpg?width=200&height=200"],"rating": null,"reviewCount": null,"inStock": true,"fulfilledByEmag": null,"sellerName": "VEXIO","stockMessage": "Ultimele 3 produse","badges": [],"recommendationRate": null,"offerId": null,"country": "ro","scrapedAt": "2026-06-18T20:42:14.020635+00:00","reviews": null}
💡 Use Cases
eMAG Price Monitoring
Track price changes on specific products or categories over time. Run the actor on a daily schedule using the Apify Scheduler, passing the category URLs for the segments you monitor. Compare each run's price, originalPrice, and lowestPrice30Days fields to detect promotions, flash sales, and price changes. The scrapedAt timestamp on every item makes it straightforward to join datasets across runs by date.
Competitor Pricing Intelligence
Compare eMAG pricing against your own or against competitors on other platforms. Run the actor on a category or search covering your product segment, then use sellerName, offers, and minPriceOffers to see who else is selling the same product and at what price. Filter by fulfilledByEmag: true for eMAG's own listings. Export results as CSV from the Apify console and load them into a spreadsheet or BI tool.
Product Sourcing and Catalogue Matching
Source products from emag.ro for resale or catalogue enrichment. The ean field lets you match the exact same product against other marketplaces, supplier feeds, or your own catalogue, while brand, manufacturer, mpn, and specifications give you enough to deduplicate confidently. Combine price, minPriceOffers, and offers to see where a product is cheapest before you commit to a supplier.
Inventory and Stock Monitoring
Monitor which products are in or out of stock for a given category. Set maxItems to a reasonable limit, schedule the actor to run hourly or daily, and filter items by inStock: false to detect stockouts. Combine with Apify Webhooks to trigger a Slack or email notification when a target product goes out of stock or comes back in.
Market Research and Catalogue Building
Build a product catalogue for a category by running the actor on the relevant category URLs. The structured categoryPath, brand, ean, specifications, rating, reviewCount, and price fields provide enough context for category analysis, brand coverage studies, and market sizing without additional enrichment. Use searchTerms to quickly gather products matching a keyword across all results pages on emag.ro.
Customer Sentiment Analysis
For a review analysis pipeline, set includeReviewTexts: true to retrieve the full set of customer reviews alongside the product metadata. The reviews field contains the author name, star rating (1–5), title, review text, and date, ready for sentiment classification, keyword extraction, or summarisation. The ratingDistribution and positiveRatingPct fields add an at-a-glance view of overall sentiment.
⚠️ Limitations and Known Issues
Romania only. This Actor covers emag.ro. Bulgaria (emag.bg) and Hungary (emag.hu) were supported through v1.2 and were retired in v2.0; pointing a run at them stops it immediately with an explanatory message.
rating is null for products with no reviews. Products that have not received any customer ratings return rating: null. Check reviewCount to confirm: when reviewCount is null or 0, the product has no ratings.
Non-Romanian URLs are skipped. If startUrls mixes emag.ro with emag.bg or emag.hu URLs, the Romanian ones are scraped normally and the others are skipped with a clear log message. A run containing only retired-domain URLs stops with an explanation rather than returning an empty dataset.
Field availability varies by product. Not every product exposes every field. Marketplace offers, usedOffers, and eCredit plans appear only where eMAG publishes them; otherwise the field is null or []. Three columns (priceBgnTransition, currencyBgnTransition, breadcrumbUrls) only ever populated on emag.bg and are now always empty — they stay in the schema so existing exports that select them keep working.
maxItems cap is approximate. The global maxItems limit may allow one or two items beyond the configured value due to Scrapy's async pipeline. For strict limits, filter the output dataset downstream. Very large single runs on emag.ro can hit eMAG's own rate gate at high concurrency; blocked products are skipped gracefully and the run still succeeds with the items that resolved. For high-volume needs, pace your runs.
A Residential proxy is required on Apify, and is now the default. Measured 2026-09-21: proxyType: "none" returned 0 products on 4 of 4 platform runs, including a direct /pd/ URL that bypasses discovery — so eMAG refuses Apify's datacenter egress rather than throttling a crawl. Apify datacenter proxy returned 0 as well, so it is not a cheaper workaround; it is the egress being refused. The shipped default is therefore proxyType: "apify" with apifyProxyGroups: ["RESIDENTIAL"] and apifyProxyCountry: "RO", which returned items on every run. Proxy traffic is billed to your own Apify account — this is the one running cost beyond compute. No proxy remains available and is correct outside Apify.
❓ FAQ
Which eMAG domains does this Actor cover?
emag.ro only. Category URLs, search terms, and product URLs all work with no proxy. Bulgaria (emag.bg) and Hungary (emag.hu) were covered through v1.2 and retired in v2.0 — a run aimed at either stops with a message telling you to switch to Romania, so an old saved task fails loudly instead of silently returning nothing. Every output item still carries a country field, now always ro.
What is the difference between startUrls and searchTerms?
startUrls accepts direct emag.ro URLs: category pages, search pages, or individual product pages. searchTerms accepts plain text keywords, each run as a search on emag.ro. Both inputs can be used together in a single run, and at least one must be provided.
Can I scrape a specific product by its product code?
Yes, and it is the most direct path. Find the product on eMAG and copy its URL (it contains /pd/ followed by the product code, e.g. https://www.emag.ro/…/pd/DBLL5H3BM/). Paste it into startUrls. Direct product URLs return the same full field set as category and search inputs, including brand, EAN, specifications, and marketplace offers.
How do I get customer review texts?
Each product may already include a few reviews by default. To fetch the full set, set includeReviewTexts: true; the actor then makes one extra request per product. Each item's reviews field contains an array of objects with author, rating (1–5), title (or null), text, date, and hasImages.
Does this actor require a proxy?
Yes on Apify, and it is already configured for you. The default input ships proxyType: "apify" with a RESIDENTIAL group and country RO, because eMAG refuses Apify's datacenter egress: measured 2026-09-21, none returned 0 products on 4 of 4 runs (including a direct /pd/ URL that skips discovery) and Apify datacenter proxy returned 0 as well. Residential returned items on every run. The proxy is charged to your own Apify account. If you run this Actor outside Apify from an ordinary connection, switch to No proxy.
What does it cost to run, and what about the free tier?
This actor uses Pay-Per-Result pricing: you are billed per product item delivered to the dataset. There is no charge for the actor simply starting. The actor respects your account's charge limit and stops gracefully when reached, so a free-tier run will not crash, it just stops once the limit is hit. If you enable Apify Proxy, that traffic is billed separately to your own Apify account.
Which currency are prices in?
Romanian lei (RON), reported in the currency field of every item.
What export formats are supported?
The actor outputs structured JSON to Apify's dataset. From the Apify console or API you can export as JSON, CSV, Excel (XLSX), or XML. The dataset also integrates with Google Sheets via the Apify Google Sheets integration, and connects to Zapier, Make, or any HTTP-based integration via the Apify API.
How fast is the scraper?
Each product is read with a single fast catalog call, and pagination for category and search inputs is automatic. Throughput depends on the Apify compute tier, the number of input URLs, and the maxItems limit. Enabling includeReviewTexts: true adds one extra request per product and reduces throughput proportionally. The default sample run (10 products from an emag.ro category) completes in well under a minute.
Is scraping eMAG legal?
The actor collects only publicly accessible product data, the same information visible to any visitor browsing the site. Scraping publicly available web data has legal precedent (see hiQ Labs v. LinkedIn). Review eMAG's current Terms of Service and make sure your use case complies with applicable data protection laws, including the GDPR, since Romania is an EU member state. You are responsible for how you use the collected data.
🔗 Related Actors
- E-commerce Scraping Tool — Scrapes product data across many e-commerce platforms including Amazon, Walmart, eBay, and others.
- Google Shopping Scraper — Extracts product listings from Google Shopping results, useful for cross-platform price comparison.
📌 Disclaimer
This is an unofficial scraper. It is not affiliated with, endorsed by, or sponsored by eMAG or any of its operating entities. "eMAG" and any related names are trademarks of their respective owners and are referenced here only to describe what this tool does; no third-party trademarks or logos are used or distributed by this actor.
The actor collects only data that eMAG publishes publicly. Some of that public data, such as marketplace seller names and customer review author names, may constitute personal data under the GDPR. Romania is an EU member state, so you are responsible for ensuring your collection and use of this data has a valid legal basis and complies with the GDPR and any other applicable laws, as well as with eMAG's Terms of Service.