eMAG Scraper - Product Prices & Ratings (RO, BG, HU)
Pricing
from $0.50 / 1,000 run start fees
eMAG Scraper - Product Prices & Ratings (RO, BG, HU)
eMAG scraper for search results and category listings in Romania, Bulgaria and Hungary. Per product: full title, numeric price in local currency, offer ID, rating, review count, category and stock wording. No seller account or API key. For price monitoring and assortment research.
Pricing
from $0.50 / 1,000 run start fees
Rating
0.0
(0)
Developer
SR
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
2
Monthly active users
5 days ago
Last modified
Categories
Share
eMAG Scraper
This eMAG scraper turns a search term or category page from emag.ro, emag.bg or emag.hu into product rows, for price monitoring and assortment research in Romania, Bulgaria and Hungary. It returns products from eMAG search results and category listings. Each product is a dataset row with its full title, numeric price, local currency, offer identifier, category, rating, review count and availability wording. Use it to compare current listings, follow category prices or collect a repeatable product snapshot. The actor reads listing cards; it does not open each product page for reviews, seller details or technical specifications.
eMAG Scraper input
Provide a search term in query or an eMAG search or category address in url. When both
are present, url determines the page to read and query remains on the output rows for
compatibility. Search terms use the selected market's language. Romanian searches use
emag.ro, Bulgarian searches use emag.bg and Hungarian searches use emag.hu.
| Field | Type | Default | Meaning |
|---|---|---|---|
query | string | none | Search term; the form prefills laptop |
market | string | ro | ro, bg or hu |
url | string | none | eMAG search or category URL; takes precedence over query |
limit | integer | 60 | Maximum products to return, from 1 to 1000 |
retries | integer | 3 | Attempts per source page, from 1 to 6 |
The following input was used for a real run:
{"query":"laptop","market":"ro","limit":60,"retries":3}
The search term has no default. Leaving both query and url empty produces a successful
empty run with a message explaining the missing input. The form's prefilled search term
is a convenience for the first run, not an implicit search performed when the field is
absent. Existing API calls keep the same parameter names and defaults.
An absolute URL on emag.ro, emag.bg or emag.hu selects its own market and currency.
This prevents a Bulgarian page from being reported with Romanian prices when market
was left at its default. Relative category paths use the selected market. Other hosts
are rejected. Category URLs can contain the filters selected on eMAG itself.
eMAG Scraper output
Every product row retains the original twenty fields. product_id identifies the product
and offer_id identifies the offer shown on its listing card. Both are strings, even
when their contents consist entirely of digits. position numbers delivered products
from one after duplicates have been removed; site_position preserves the card position
on its source page and can restart on another page.
title contains the full title from the listing card's structured attributes rather
than the visually shortened text. url points to the product page. price is a number
in currency: RON for Romania, EUR for Bulgaria and HUF for Hungary. price_text preserves
the site's wording and spaces. The price parser treats dots as thousands separators and
commas as decimal separators. Do not parse price_text as an English decimal number.
Category information appears in category, category_id and category_trail. Rating
and review totals are separated into rating and reviews_count. availability holds
the source wording, while availability_id remains a string. badges contains distinct
short labels in source order or null when none were present. image is the listing image.
Unavailable card values remain null; the actor does not infer them from another product.
market and query preserve the context of the request. Two additional fields make the
rows easier to combine with other data: country is RO, BG or HU, and fetched_at is the
UTC time when the page was fetched. Existing field names and JSON types are retained.
Here is one actual row from a measured run:
{"product_id": "114096973","offer_id": "315762855","url": "https://www.emag.ro/laptop-gaming-asus-rog-strix-g18-g814pp-cu-procesor-amd-ryzentm-9-8940hx-pana-la-5-3ghz-18-full-hd-wuxga-ips-144hz-32gb-ddr5-ram-1tb-ssd-nvidiar-geforce-rtxtm-5070-8gb-gddr7-no-os-eclipse-gray-g814pp-/pd/DJ08JW3BM/","title": "Laptop Gaming ASUS ROG Strix G18 G814PP cu procesor AMD Ryzen™ 9 8940HX pana la 5.3GHz, 18'', Full HD+, WUXGA, IPS, 144Hz, 32GB DDR5 RAM, 1TB SSD, NVIDIA® GeForce RTX™ 5070 8GB GDDR7, No OS, Eclipse Gray","price": 13999.99,"price_text": "13.999 , 99 Lei","currency": "RON","category": "Laptop / Notebook","category_id": "91","category_trail": "Laptop, Tablete & Telefoane/Laptopuri si accesorii/Laptop / Notebook","rating": 5.0,"reviews_count": 2,"availability": null,"availability_id": "2","badges": ["Electro Weekend","Easy BuyBack 200 lei BONUS","ASUS Perfect Warranty"],"image": "https://s13emagst.akamaized.net/products/100742/100741583/images/res_6ff3851613e1b38263c12394578067a8.png?width=720&height=720&hash=C37C1E39AFC9F6DA30DCFF2CEEBC3993","site_position": 1,"fetched_at": "2026-10-04T07:14:13.702Z","country": "RO","market": "ro","query": "laptop","position": 1}
The default key-value store also keeps a summary with delivered-product counts, page
counts, priced products, rated products and market information. Source errors are recorded
in errors. These records help distinguish an empty input, a missing category and an
incomplete collection. The dataset itself contains only product rows.
Use cases
- Price monitoring. Schedule the same search or category URL daily or weekly and compare
priceperproduct_idbetween runs. Because each row carriesfetched_at, the runs together form your own eMAG price history for the products you follow. - Assortment and category research. Read a whole category, filtered the way you would filter it on eMAG, and see which brands, price points and availability levels it contains.
- Competitor and brand tracking. Search for a brand or model name and check where its
products appear in
site_position, what they cost and how many reviews they have collected. - Cross-market comparison. Run the same term on
ro,bgandhuto compare how one product line is priced in RON, EUR and HUF across the three eMAG sites. - Feeding a spreadsheet or BI tool. Export the dataset as JSON, CSV or Excel from Apify, or read it through the Apify API from your own scripts and integrations.
eMAG Scraper compared with other options
The eMAG Marketplace API is meant for sellers on eMAG. It manages a seller's own offers, orders and stock and requires a seller account. It does not return the public search results or category listings that shoppers see, with competing offers, ratings and review counts. This actor reads exactly those public listing pages, without a seller account or API key.
Copying listings by hand or with a browser extension works for a single page. It becomes slow when you follow several categories, three countries or more than a few dozen products, and the numbers end up as text. Here the price is already a number, the currency is explicit and identifiers stay stable between runs, so results can be compared automatically.
Writing your own scraper gives full control, but you then maintain the parsing of three country sites, price formats with dots and commas, pagination and duplicate removal yourself. This actor keeps one stable set of fields for all three markets; apart from a small start fee you pay only for the products it delivers.
Other eMAG actors in the Apify Store differ in scope. Some cover only emag.ro, others also open product pages for specifications. This actor focuses on the listing pages of all three countries, with a fixed price per delivered row and the same output fields in every market.
Pricing
The existing pay-per-event price remains $0.0005 per run plus $0.0007 per delivered product. The start fee also applies to empty runs. A run returning no products has zero product charges. A sixty-product run therefore costs $0.0425 for these actor events. Apify platform charges, if applicable to your account, are separate from these prices.
Runs from users without a paid Apify plan receive at most ten product rows. Product
charges follow the rows actually delivered within that cap. Paying users retain their
requested limit, up to 1000. Set the maximum total charge in Apify when you need an
additional spending limit; delivery and actual event counts are reported in OUTPUT.
Pagination and empty results
The actor follows source pages automatically for larger limits and removes duplicates by
product_id. Customers using the Apify actor do not need to manage continuation tokens.
A missing category, a listing with no cards or an inaccessible source returns a successful
empty run with an English error message. If a later page fails, products already found
are retained and the source error is reported.
Search results follow eMAG's own search behavior. eMAG can return fuzzy matches for an unusual term, so a term that appears meaningless does not necessarily produce an empty dataset. The actor delivers those source cards without applying its own relevance filter. This preserves the behavior of existing queries and keeps the result set aligned with what the listing page actually contains.
FAQ
Does this work in all three countries?
Yes. Select ro, bg or hu, or supply an absolute URL from the corresponding eMAG site.
Currency and country follow the page's market. Amounts are not converted between currencies.
Can I scrape a filtered category instead of searching?
Yes. Put the category URL in url. It takes precedence over query, and the actor follows
the category's subsequent pages automatically up to the requested product limit.
Does this return product details or all sellers?
It returns the fields available on the listing cards. It does not promise every seller, all product images, individual reviews, GTINs or specifications from the product page. The offer identifier describes the offer represented by that card.
Why did I receive fewer products than the limit?
The source may have fewer distinct cards, repeat a page, or fail on a later page. Free
users are limited to ten delivered rows. Check summary, errors and OUTPUT to see
what the run delivered and whether any source page remained incomplete.
What happens when my search has no hits on eMAG?
The run still succeeds with an empty dataset, and errors explains why. When eMAG serves
the page without any product cards, for example a search page beyond the last result
page, the message reads: "eMAG served the page but it carried no product cards; the term
may have no hits." Such a run costs only the run start fee, never a product charge.
Is there an official eMAG API for product prices?
eMAG offers a Marketplace API for its sellers. It covers a seller's own catalog and orders, not the public search results. To collect public prices, ratings and availability across eMAG listings, use this scraper.
Can I build an eMAG price history with this actor?
Yes. Schedule a run on the same search term or category URL, keep the datasets, and join
the rows on product_id or offer_id. Each row has a fetched_at timestamp, so every run
adds one data point per product.
In which formats can I download the data?
Apify stores the rows in a dataset that you can download as JSON, CSV, Excel, XML or HTML, or fetch through the Apify API and integrations.