
TikTok Shop Scraper
scrape.ly/store/shelfbright/tiktok-shop-scraperE-commerceSocial media
1 monthly user

Scrape emag.ro, emag.bg and emag.hu products from category, search and product URLs or keywords: price, old price, discount, rating, reviews, seller, stock, specs, EAN and images.
Scrape products from eMAG, the biggest online store in Romania, Bulgaria and Hungary (emag.ro, emag.bg, emag.hu). Paste category, search or product URLs, or type keywords, and get clean rows with price, old price, discount, rating, review count, seller, stock and images, plus brand, full specifications, description and other marketplace offers when you turn on product details. No login, no browser setup.
/c), search (/search/...), brand and product (/pd/...) pages, with sorting and filters kept and all pages followed.| Field | What it does |
|---|---|
startUrls | eMAG category, search, brand or product URLs (ro, bg, hu). |
searchTerms | Keywords, one per line. |
maxItems | Maximum products saved in the run (default 20). |
includeDetails | Open every product page for brand, specs, images, description and offers (default off). |
country | Site for keywords: ro, bg or hu. |
sortBy | relevance, popular, price-asc, price-desc, reviews, discount. |
{
"startUrls": [
{ "url": "https://www.emag.ro/laptopuri/c" },
{ "url": "https://www.emag.bg/search/telefon" }
],
"searchTerms": ["laptop gaming"],
"country": "ro",
"maxItems": 100,
"includeDetails": true
}
| Field | Description |
|---|---|
productId, title, url | eMAG product code, title and link |
price, originalPrice, discountPercentage, currency | Current price, struck-through price, discount |
rating, reviewCount | Average rating and number of reviews |
category, categoryPath | Category and full category path |
availability, inStock | Stock status |
sellerName, fulfilledByEmag | Seller and whether eMAG sells it |
imageUrl, badges, isGenius | Main image and badges |
brand, images, specifications, description, manufacturerCode | With product details |
offersCount, otherOffers, questionCount | With product details |
Example (from a test run, trimmed):
{
"productId": "D5RJKZMBM",
"title": "Umax VisionBook N14G Plus 14.1\" FHD 4GB 128GB SSD Integrated лаптоп Win 10 Pro сив (UMM230148)",
"url": "https://www.emag.bg/umax-visionbook-n14g-plus-14-1-fhd-4gb-128gb-ssd-integrated-laptop-win-10-pro-siv-umm230148/pd/D5RJKZMBM/",
"price": 203.16,
"originalPrice": 339.9,
"discountPercentage": 40,
"currency": "EUR",
"reviewCount": 0,
"category": "Лаптопи",
"categoryPath": ["Лаптопи"],
"imageUrl": "https://s13emagst.akamaized.net/products/49202/49201118/images/res_6b2ff45eb47db19c83e22ff26dd1b642.png",
"availability": "В наличност",
"inStock": true,
"sellerName": "OVOLT Оволт България",
"fulfilledByEmag": false,
"brand": "Umax",
"specifications": { "Модел процесор": "Intel Celeron", "Капацитет памет": "4 GB" },
"country": "bg",
"detailsFetched": true
}
You pay $1.50 per 1,000 products ($0.0015 per product), with or without product details, plus platform usage (compute and residential proxy traffic). Measured on test runs: 1,000 products from listing pages took 38 seconds and about $0.01 of usage; with product details, usage is about $0.10 per 1,000 products.
Is it legal to scrape eMAG? The actor reads public product pages that anyone can open without an account. You are responsible for how you use the data.
Do I need an eMAG account or my own proxy? No. eMAG blocks datacenter IPs, so the actor uses residential proxies in the site's country by default.
How many products can I get? As many as a category or search lists: the actor follows all pages. Set Max products to cap the run.
Why are some fields empty? Brand, specifications, images, description and offers need Product details. EAN and manufacturer codes only appear when the seller lists them. Rating is empty when a product has no reviews.
Can I schedule it or use the API? Yes. Schedule runs for daily price tracking and read the results through the API or integrations.
Every field below can be set in the run form, passed through the API, or saved as a task. Unset fields fall back to the defaults shown.
startUrlsarrayOptionaleMAG URLs
Category (…/c), search (…/search/…), brand or product (…/pd/…) URLs from emag.ro, emag.bg or emag.hu. Sorting and filters in the URL are kept and all pages are followed.
searchTermsarrayOptionalSearch keywords
One keyword per line, e.g. 'laptop gaming', 'telefon samsung'. Searched on the site chosen under Country.
maxItemsintegerOptionaldefault 20Max products
Maximum number of products saved in this run, across all URLs and keywords.
includeDetailsbooleanOptionaldefault falseProduct details
Also open every product page for brand, all images, full specifications, EAN, description, seller and other marketplace offers, stock code and question count. Slower and uses more proxy traffic (about 400 KB per product).
countryenumOptionaldefault "ro"Country
Which eMAG site the keywords are searched on. URLs always use their own site.
sortByenumOptionaldefault "relevance"Sort by
Order of the keyword search results.
proxyConfigurationobjectOptionaldefault {"useScrapelyProxy":true,"scrapelyProxyGroups":["RESIDENTIA…Proxy configuration
eMAG blocks datacenter IPs, so residential proxies are the default. They are pinned to the site's country (RO, BG or HU) unless you choose one.
Every run writes its results to a dataset. Preview it in the dashboard, then export it or read it through the API.
| Field | Type | Description |
|---|---|---|
| productId | string | null | eMAG product code (part number key) |
| emagProductId | number | null | Internal product ID |
| offerId | number | null | Offer ID |
| title | string | null | Title |
| url | string | null | Product URL |
| price | number | null | Current price |
| originalPrice | number | null | Old (struck-through) price |
| discountPercentage | number | null | Discount % |
| currency | string | null | Currency (RON, EUR, HUF) |
| brand | string | null | Brand (with details) |
| rating | number | null | Average rating (1-5) |
| reviewCount | number | null | Reviews |
| questionCount | number | null | Questions (with details) |
| category | string | null | Category |
| categoryPath | array | null | Category path |
| categoryId | number | null | Category ID |
| imageUrl | string | null | Main image |
| images | array | null | All images (with details) |
| availability | string | null | Stock text as shown |
| availabilityCode | string | null | Stock code (with details) |
| inStock | boolean | null | In stock |
| sellerName | string | null | Seller |
| fulfilledByEmag | boolean | null | Sold by eMAG |
| offersCount | number | null | Number of offers (with details) |
| otherOffers | array | null | Other marketplace offers (with details) |
| ean | string | null | EAN (with details, when listed) |
| description | string | null | Description (with details) |
| specifications | object | null | Specifications by name (with details) |
| hasFreeDelivery | boolean | null | Free delivery (with details) |
| badges | array | null | Badges |
| isGenius | boolean | null | Genius eligible |
| country | string | null | ro, bg or hu |
| site | string | null | Site |
| searchSource | string | null | URL or keyword that found the product |
| detailsFetched | boolean | null | Product page loaded |
| scrapedAt | string | null | Scraped at (UTC) |
| manufacturerCode | string | null | Manufacturer part number (with details) |
You pay for the events the actor reports, such as each result or page it produces. Platform usage is included in the event prices.
| Event | Charged when | Price |
|---|---|---|
| Product | One eMAG product saved to the dataset (with or without product details). | $0.0015 |
Run this actor from your own code. Swap in your API token and the examples work as-is.
import { ScrapelyClient } from 'scrapely-client'
const client = new ScrapelyClient({ token: process.env.SCRAPELY_TOKEN })
// Start the actor and wait for the run to finish.
const run = await client.actor('shelfbright/emag-scraper').call({
"startUrls": [
{
"url": "https://www.emag.ro/laptopuri/c"
}
],
"maxItems": 20,
"proxyConfiguration": {
"useScrapelyProxy": true,
"scrapelyProxyGroups": [
"RESIDENTIAL"
]
}
})
// Read the dataset the run produced.
const { items } = await client.dataset(run.defaultDatasetId).listItems()
console.log(items)Tokens live in your account settings. Keep them server-side: a token carries the full permissions of your account.
Connect the Scrape.ly MCP server once and your agent can run this actor as a tool. Pick your tool:
Fetch scrape.ly/agents.md and run shelfbright/emag-scraperPaste into Claude Code, Codex, Cursor or any AI agent. It signs you in once in the browser.
{
"mcpServers": {
"scrapely": {
"url": "https://api.scrape.ly/mcp?tools=actors,runs,storage,docs&actors=shelfbright/emag-scraper"
}
}
}No key in the file: your client opens the browser to sign you in the first time it connects.
Inputs the developer prepared for common jobs. Open one to see its input, then copy it to your account to run it as-is or adjust it.
Product listings with prices.
Products sorted by popularity.
Products sorted by price, lowest first.
Biggest discounts first, with product details.
Scrape.ly gives you the infrastructure, the tooling, and the team to extract, process, and operationalize web data at any scale. Setup takes minutes. The advantage lasts forever.