# eMAG Product Scraper (`extractify-labs/emag-scraper`) Actor

Extract product listings from eMAG - Romania, Bulgaria & Hungary. Scrape prices, stock status, ratings, seller info, and category paths from emag.ro, emag.bg, and emag.hu. No proxy required.

- **URL**: https://apify.com/extractify-labs/emag-scraper.md
- **Developed by:** [Extractify Labs](https://apify.com/extractify-labs) (community)
- **Categories:** E-commerce
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, NaN bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.50 / 1,000 results

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/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use 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

## eMAG Product Scraper

Last updated: 2026-05-05 | Version: 1.0 | Status: Active

Extract product listings and individual product details from eMAG — the leading e-commerce marketplace in Romania, Bulgaria, and Hungary. Scrape prices, stock status, ratings, seller information, category paths, images, and optional customer review texts across emag.ro, emag.bg, and emag.hu in a single actor run. No proxy subscription required.

### Overview

The eMAG Product Scraper accepts category URLs, search page URLs, individual product page URLs, or plain search terms, and returns structured product data for every matching item. It uses the official eMAG search API for category and search inputs — which is fast and reliable with no rate-limiting issues — and falls back to HTML JSON-LD parsing for direct product page URLs. All three eMAG country domains (Romania, Bulgaria, Hungary) are supported automatically: the country is detected from the URL hostname, so a single run can collect products across all three markets simultaneously.

**Who is this for?** E-commerce analysts and competitive intelligence teams that need current pricing, availability, and seller data from Eastern European markets. Dropshipping researchers who source products from eMAG for resale. Price monitoring pipelines that need to track promotional discounts across multiple country domains. Developers integrating eMAG product data into inventory systems, comparison engines, or dashboards.

**What makes it different?** A single actor handles all three eMAG country sites without needing separate configurations per domain. The actor also combines two scraping strategies in one: fast API-based extraction for search and category pages (720×720 images, full pricing metadata), and HTML JSON-LD parsing for direct product page URLs. No proxy subscription is required — eMAG does not block direct API requests.

### Key Features

- **Category and search page scraping** — Pass eMAG category URLs (`/c` suffix), subcategory URLs (`/sd` suffix), or search result URLs to extract all listed products with automatic pagination.
- **Direct product page support** — Pass individual eMAG product page URLs (`/pd/CODE/`) to extract a specific product by its detail page.
- **Keyword search** — Supply one or more search terms via `searchTerms`; each term runs as a separate search and results are combined into a single dataset.
- **Multi-domain in one run** — Mix emag.ro, emag.bg, and emag.hu URLs in a single `startUrls` array. Country is auto-detected per URL; the `country` input parameter sets the default for keyword searches.
- **23 output fields per product** — Includes price, original price, discount percentage, brand, category path (department → sub-department → category), stock status, rating, review count, seller name, offer ID, recommendation rate, fulfilled-by-eMAG flag, badges, images, and scrape timestamp.
- **Optional customer review texts** — Set `includeReviewTexts: true` to fetch the full text of each product's customer reviews (one extra API request per product). Star rating and review count are always included regardless of this setting.
- **Global item cap** — Set `maxItems` to limit the total number of products collected across all URLs and search terms combined.
- **No proxy required** — The sapi.emag.ro API accepts direct requests. You pay only for Apify compute — no residential or datacenter proxy subscription needed.

### Supported Sites

| Domain | Country | Currency |
|--------|---------|----------|
| emag.ro | Romania | RON |
| emag.bg | Bulgaria | BGN |
| emag.hu | Hungary | HUF |

The actor detects the country from each URL's hostname and returns the corresponding `currency` code in every output item. When using `searchTerms` without `startUrls`, the `country` parameter controls which domain is searched (default: `"ro"`).

### Quick Start

#### Scrape the top laptops from emag.ro (category page)

Input:
```json
{
  "startUrls": [
    { "url": "https://www.emag.ro/laptopuri/c" }
  ],
  "maxItems": 10
}
````

#### Search for a product by keyword

Input:

```json
{
  "searchTerms": ["laptop lenovo"],
  "country": "ro",
  "maxItems": 5
}
```

#### Extract a specific product by its page URL

Input:

```json
{
  "startUrls": [
    { "url": "https://www.emag.ro/laptop-lenovo/pd/DBLL5H3BM/" }
  ]
}
```

#### Multi-domain run: compare prices across Romania and Bulgaria

Input:

```json
{
  "startUrls": [
    { "url": "https://www.emag.ro/laptopuri/c" },
    { "url": "https://www.emag.bg/laptopi/c" }
  ],
  "maxItems": 20
}
```

### Input Parameters

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `startUrls` | array | **required**\* | List of eMAG URLs to scrape, each as a `{ "url": "…" }` object. Accepts category pages (`/c`, `/sd`), search result pages (`/search/…`), or individual product pages (`/pd/CODE/`). The URL's hostname auto-detects the country (`emag.ro`, `emag.bg`, `emag.hu`) and overrides the `country` parameter for that request. At least one of `startUrls` or `searchTerms` must be provided. |
| `searchTerms` | array of strings | **required**\* | Keywords to search on eMAG. Each term runs as a separate search. Results from all terms are combined in the output. The `country` parameter controls which domain is searched. At least one of `startUrls` or `searchTerms` must be provided. |
| `country` | string (`"ro"`, `"bg"`, `"hu"`) | `"ro"` | Default country site used for `searchTerms` runs. Overridden per-URL by the URL's hostname when `startUrls` are provided. |
| `maxItems` | integer | unlimited | Total products to collect across all URLs and search terms combined. Leave unset to collect all available products. |
| `includeReviewTexts` | boolean | `false` | Fetch the full text of customer reviews for each product. When `true`, one extra API request is made per product. Star ratings and review counts are always included regardless of this setting. |

**\* Required:** At least one of `startUrls` or `searchTerms` must be provided. If neither is given, the actor stops immediately with an error message.

#### How to find an eMAG category URL

1. Go to [emag.ro](https://www.emag.ro), [emag.bg](https://www.emag.bg), or [emag.hu](https://www.emag.hu).
2. Browse to the category you want to scrape.
3. The URL will end in `/c` (top-level category) or `/sd` (subcategory). Copy this URL directly into `startUrls`.

**Examples:**

- Laptops Romania: `https://www.emag.ro/laptopuri/c`
- Laptops Bulgaria: `https://www.emag.bg/laptopi/c`
- Phones Romania: `https://www.emag.ro/telefoane-mobile/c`

#### How to find a product page URL

Navigate to any product on eMAG. The URL contains `/pd/` followed by the product code (e.g. `https://www.emag.ro/…/pd/DBLL5H3BM/`). Copy this URL directly into `startUrls`.

### Output Data Schema

Every output item is a JSON object with the following fields. All fields are always present in the output — fields with no value are `null` (or `[]` for array fields) rather than absent.

| 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/"` | eMAG product page URL. Note: the eMAG API always returns emag.ro canonical URLs even for products scraped from emag.bg or emag.hu — see the `country` field and Limitations for details. |
| `price` | float | `4815.92` | Current selling price |
| `originalPrice` | float or null | `2549.99` | Pre-discount price. `null` when there is no active discount, and always `null` for product page URLs (HTML path). |
| `currency` | string | `"RON"` | Currency code: `RON`, `BGN`, or `HUF` |
| `discountPercentage` | integer or null | `14` | Discount as a percentage. `null` when no discount is active, and always `null` for product page URLs (HTML path). |
| `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://s13emagst.akamaized.net/…?width=720&height=720&…"` | Primary product image URL. 720×720 for category/search results; 80×80 for product page URLs (JSON-LD limit). |
| `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). Returns `0.0` for products with no ratings yet (not `null`). |
| `reviewCount` | integer or null | `103` | Total number of customer ratings |
| `inStock` | boolean | `true` | Whether the product is currently available to order |
| `fulfilledByEmag` | boolean or null | `true` | Whether the product is sold and shipped by eMAG directly. Always `null` for product page URLs (HTML path). |
| `sellerName` | string or null | `"INFLOO"` | Third-party seller name, or `null` when sold directly by eMAG |
| `badges` | array of strings | `["has_image", "has_offer"]` | Internal API flags returned by the eMAG search API. These are system-level tags, not commercial badges such as "Genius eligible". Always `[]` for product page URLs (HTML path). |
| `recommendationRate` | integer or null | `88` | Percentage of buyers who recommend this product. Always `null` for product page URLs (HTML path). |
| `offerId` | integer or null | `304315905` | eMAG internal offer ID. Always `null` for product page URLs (HTML path). |
| `country` | string | `"ro"` | Country domain used for this product (`"ro"`, `"bg"`, or `"hu"`) |
| `scrapedAt` | string (ISO 8601) | `"2026-05-05T20: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-20", "hasImages": false}]` | Customer review texts. `null` when `includeReviewTexts` is `false`. Each review has `author`, `rating` (1–5), `title` (headline, or `null` if not provided), `text`, `date`, and `hasImages` (whether the reviewer attached photos) fields. |

#### Sample output item (from category/search path)

```json
{
  "productId": "DBLL5H3BM",
  "title": "Laptop Lenovo Thinkbook 16 G7, Procesor Amd Ryzen 5 7533Hs, 16Gb Ddr5, 1Tb Ssd M.2, 16\" 1920x1200, Arctic Grey",
  "url": "https://www.emag.ro/laptop-lenovo-thinkbook-16-g7/pd/DBLL5H3BM/",
  "price": 4815.92,
  "originalPrice": null,
  "currency": "RON",
  "discountPercentage": null,
  "brand": "Lenovo",
  "category": "Laptop / Notebook",
  "categoryPath": ["Laptop, Tablete & Telefoane", "Laptopuri si accesorii", "Laptop / Notebook"],
  "imageUrl": "https://s13emagst.akamaized.net/products/112493/112492367/images/res_acfa2d.jpg?width=720&height=720",
  "images": [
    "https://s13emagst.akamaized.net/products/112493/112492367/images/res_acfa2d.jpg?width=200&height=200",
    "https://s13emagst.akamaized.net/products/112493/112492367/images/res_acfa2d.jpg?width=720&height=720"
  ],
  "rating": 0.0,
  "reviewCount": null,
  "inStock": true,
  "fulfilledByEmag": false,
  "sellerName": "INFLOO",
  "badges": ["has_image", "has_offer", "has_profiling_widgets", "may_be_compared", "allow_favorites", "allow_feedback"],
  "recommendationRate": null,
  "offerId": 304315905,
  "country": "ro",
  "scrapedAt": "2026-05-05T20:26:04.877422+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 [Apify Scheduler](https://docs.apify.com/platform/schedules), passing the category URLs for the product segments you monitor. Compare each run's `price` and `originalPrice` 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 pricing or competitor prices on other platforms. Combine the actor with a search or category URL covering your product segment, then use the `sellerName` field to filter for specific merchants or for eMAG's own listings (`fulfilledByEmag: true`). Export results as CSV from the Apify console and load directly into a spreadsheet or BI tool.

#### Multi-Market Product Sourcing

Source products from eMAG's three country domains to identify cross-border arbitrage opportunities. Run a single actor job with category URLs from emag.ro, emag.bg, and emag.hu simultaneously. Use the `country` and `currency` fields to group and compare prices across markets — products priced lower in BGN (Bulgaria) or HUF (Hungary) after currency conversion can represent resale opportunities in other markets.

#### 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](https://docs.apify.com/platform/integrations/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 specific category by running the actor on all relevant category URLs. The structured `categoryPath`, `brand`, `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.

#### Customer Sentiment Analysis

When building a review analysis pipeline, set `includeReviewTexts: true` to retrieve the full text of each product's customer reviews alongside the product metadata. The `reviews` field on each item contains the author name, star rating (1–5), review text, and date — ready for sentiment classification, keyword extraction, or summarisation.

### Limitations and Known Issues

**Fields not available for product page URLs (`/pd/CODE/`).** When a product is scraped via its direct product page URL (HTML JSON-LD path), the following fields are always `null` or `[]`: `originalPrice`, `discountPercentage`, `recommendationRate`, `offerId`, `fulfilledByEmag`, and `badges`. These fields are only populated when products are scraped via category or search pages (API path). If these fields are important to your use case, use category or search URLs rather than direct product URLs.

**Lower-resolution `imageUrl` for product page URLs.** When scraped via a product page URL, the `imageUrl` field contains an 80×80 thumbnail (JSON-LD limit). Category and search page scraping returns 720×720 images. The `images` array is also limited to a single 80×80 thumbnail on the HTML path. If full-resolution images are required, use a category or search URL to reach the product instead.

**`reviews` field requires `includeReviewTexts: true`.** Customer review texts are not fetched by default. With the default `includeReviewTexts: false`, the `reviews` field is `null` on every item. Enable `includeReviewTexts: true` to fetch full review texts — note that this makes one extra API request per product.

**`rating` is `0.0` for unrated products.** Products with no customer ratings return `rating: 0.0` rather than `null`. This is the value returned by the eMAG API for products with no ratings. Check `reviewCount: null` or `reviewCount: 0` to distinguish unrated products from products with an actual zero-star average.

**`badges` field contains internal API flags.** The `badges` array contains internal system tags returned by the eMAG API (e.g. `"has_image"`, `"has_offer"`, `"allow_favorites"`). These are not commercial marketing badges (e.g. "Genius eligible", "Free delivery"). Commercial badge data is tracked separately in [GitHub issue #7](https://github.com/web-crawling/apify-emag/issues/7) for a future release.

**`url` field uses emag.ro canonical URLs for all domains.** The eMAG search API returns canonical product URLs on the emag.ro domain regardless of which country domain was queried. Products scraped from emag.bg or emag.hu may have `url` values pointing to emag.ro. The `country` field correctly reflects which domain was scraped. This is tracked in [GitHub issue #9](https://github.com/web-crawling/apify-emag/issues/9).

**No proxy required.** The actor uses the sapi.emag.ro REST API for category and search inputs, which accepts direct requests reliably. No proxy subscription is needed. If you encounter connectivity issues from a specific region, contact support.

**`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.

**No product specifications or description.** The actor does not extract long-form product descriptions, specification tables, or attribute lists. It returns the 23 structured fields listed in the output schema above.

### FAQ

#### Does this actor work with all three eMAG domains?

Yes. The actor supports emag.ro (Romania), emag.bg (Bulgaria), and emag.hu (Hungary). Pass URLs from any domain in `startUrls`, and the country is detected automatically from the hostname. You can mix URLs from all three domains in a single run — each output item includes a `country` field indicating which domain it came from.

#### What is the difference between `startUrls` and `searchTerms`?

`startUrls` accepts direct eMAG URLs — category pages, search pages, or individual product pages. `searchTerms` accepts plain text keywords; each keyword is run as a search on the eMAG domain specified by `country`. Both inputs can be used together in a single run. At least one must be provided.

#### Can I scrape a specific product by its product code?

Yes. Find the product on eMAG and copy its URL (it will contain `/pd/` followed by the product code, e.g. `https://www.emag.ro/…/pd/DBLL5H3BM/`). Paste this URL into `startUrls`. Note that several fields (`originalPrice`, `discountPercentage`, `recommendationRate`, `offerId`, `fulfilledByEmag`, `badges`) are not available on the HTML path used for product pages — see the Limitations section above.

#### How do I get customer review texts?

Set `includeReviewTexts: true` in the input. The actor will make one additional API request per product to fetch the review texts. Each item's `reviews` field will contain an array of objects with `author`, `rating` (1–5), `title` (review headline, or `null`), `text`, `date`, and `hasImages` (whether the reviewer attached photos). With the default `includeReviewTexts: false`, the `reviews` field is `null`.

#### Does this actor require a proxy?

No. The eMAG search API (sapi.emag.ro) accepts direct requests. No residential or datacenter proxy subscription is needed.

#### What export formats are supported?

The actor outputs structured JSON to Apify's dataset. From the Apify console or via the API, you can export the dataset as JSON, CSV, Excel (XLSX), or XML. The dataset also integrates directly with Google Sheets via the Apify Google Sheets integration, and can be connected to Zapier, Make, or any HTTP-based integration via the Apify API.

#### How fast is the scraper?

The actor uses the eMAG REST API for category and search inputs, which returns 48 products per page. Pagination is fully automatic. Speed depends on the Apify compute tier selected and the number of URLs in the run. Enabling `includeReviewTexts: true` adds one extra API request per product and will reduce overall throughput proportionally.

#### Is scraping eMAG legal?

The actor scrapes only publicly accessible product data — the same data visible to any browser visitor. Scraping publicly available web data has legal precedent (see *hiQ Labs v. LinkedIn*). Review eMAG's current Terms of Service and ensure your use case complies with applicable data protection laws, including GDPR for EU domains (Romania, Bulgaria, Hungary).

### Related Actors

- [Apify E-commerce Scraping Tool](https://apify.com/apify/e-commerce-scraping-tool) — Scrapes product data across 40+ e-commerce platforms including Amazon, Walmart, eBay, and others
- [Google Shopping Scraper](https://apify.com/apify/google-shopping-scraper) — Extracts product listings from Google Shopping results, useful for cross-platform price comparison

# Actor input Schema

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

eMAG URLs to scrape — category pages (/c, /sd), search pages (/search/...), or individual product pages (/pd/CODE/). URL hostname auto-detects country and overrides the country parameter for that request.

## `searchTerms` (type: `array`):

Keywords to search on eMAG. Each search runs as a separate request. The maxItems limit is a combined total across all searches, not per-search.

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

Default eMAG country site for searchTerms-only runs. Overridden per-URL by the URL's hostname when startUrls are provided.

## `maxItems` (type: `integer`):

Total products to collect across all URLs and search terms combined. Leave empty for no limit.

## `includeReviewTexts` (type: `boolean`):

Fetch full customer review texts per product (makes an extra request per product). Star rating and review count are always included regardless.

## Actor input object example

```json
{
  "country": "ro",
  "includeReviewTexts": false
}
```

# Actor output Schema

## `results` (type: `string`):

No description

# 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 = {};

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

# Run the Actor and wait for it to finish
run = client.actor("extractify-labs/emag-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{}' |
apify call extractify-labs/emag-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=extractify-labs/emag-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "eMAG Product Scraper",
        "description": "Extract product listings from eMAG - Romania, Bulgaria & Hungary. Scrape prices, stock status, ratings, seller info, and category paths from emag.ro, emag.bg, and emag.hu. No proxy required.",
        "version": "1.0",
        "x-build-id": "bdtRCi7dnq4pbAY98"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/extractify-labs~emag-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-extractify-labs-emag-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/extractify-labs~emag-scraper/runs": {
            "post": {
                "operationId": "runs-sync-extractify-labs-emag-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/extractify-labs~emag-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-extractify-labs-emag-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "properties": {
                    "startUrls": {
                        "title": "eMAG URLs to Scrape",
                        "type": "array",
                        "description": "eMAG URLs to scrape — category pages (/c, /sd), search pages (/search/...), or individual product pages (/pd/CODE/). URL hostname auto-detects country and overrides the country parameter for that request.",
                        "items": {
                            "type": "object",
                            "required": [
                                "url"
                            ],
                            "properties": {
                                "url": {
                                    "type": "string",
                                    "title": "URL of a web page",
                                    "format": "uri"
                                }
                            }
                        }
                    },
                    "searchTerms": {
                        "title": "Search Terms",
                        "type": "array",
                        "description": "Keywords to search on eMAG. Each search runs as a separate request. The maxItems limit is a combined total across all searches, not per-search.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "country": {
                        "title": "Default Country",
                        "enum": [
                            "ro",
                            "bg",
                            "hu"
                        ],
                        "type": "string",
                        "description": "Default eMAG country site for searchTerms-only runs. Overridden per-URL by the URL's hostname when startUrls are provided.",
                        "default": "ro"
                    },
                    "maxItems": {
                        "title": "Max Items to Collect",
                        "minimum": 1,
                        "type": "integer",
                        "description": "Total products to collect across all URLs and search terms combined. Leave empty for no limit."
                    },
                    "includeReviewTexts": {
                        "title": "Include Full Review Texts",
                        "type": "boolean",
                        "description": "Fetch full customer review texts per product (makes an extra request per product). Star rating and review count are always included regardless.",
                        "default": false
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
