# Ceneo Scraper \[Only $0.4💰] | Prices | Offers | Reviews (`ahmed_jasarevic/ceneo-scraper`) Actor

Scrape Ceneo.pl products, shop offers and reviews for price monitoring and e-commerce research in Poland: prices, price ranges, ratings, specs, images and full offer lists.

- **URL**: https://apify.com/ahmed_jasarevic/ceneo-scraper.md
- **Developed by:** [Ahmed Jasarevic](https://apify.com/ahmed_jasarevic) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.38 / 1,000 listings

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Ceneo Scraper

Scrape Ceneo.pl products, shop offers and reviews for price monitoring and e-commerce research in Poland: product name, brand, lowest price and price range, rating and review count, offers count, specifications, images and the full list of shop offers, from any search, category or product URL.

The actor uses a plain HTTP crawler (no browser) and reads Ceneo's server-rendered pages plus their embedded schema.org Product data, so search and category pages return product rows cheaply and product pages enrich them in place.

### Main Use Cases

- Price monitoring and price-history tracking on Ceneo.pl
- E-commerce market research across Polish shops and categories
- Building a structured product and price database for Poland
- Competitor price comparison and offer analysis (who sells cheapest)
- Review and rating aggregation for product sentiment
- Feed enrichment and catalog matching for affiliate and retail projects

### How It Works

Ceneo pages carry both visible markup and an embedded schema.org Product block (name, brand, description, images, offers, aggregate rating). The actor reads both:

| URL type | What it returns |
| --- | --- |
| Search URL (`https://www.ceneo.pl/;szukaj-laptop`) | Product listing rows, with prices and ratings. |
| Category URL (`https://www.ceneo.pl/Laptopy`) | Product listing rows for the category. |
| Product URL (`https://www.ceneo.pl/186696977`) | Full product details, specifications, images and the complete shop offer list. |

When scraping a search or category listing, the actor opens each product page and enriches the same row in place (no duplicate rows) when `scrapeProductDetails` is on. Prices and the offer list come from the product page's offers and JSON-LD, and reviews come from the product's `/opinie-N` pages when `scrapeReviews` is on.

### Scrape Ceneo Prices And Offers Without An Official API

Ceneo offers an official API, but it is part of the Ceneo Affiliate Program (partnerzyapi.ceneo.pl) and is scoped to affiliates and sellers for their own products and categories, with tiers (PartnerService, PartnerServiceBasic, PartnerServicePremium) and field limits. It is not a general way to read the comparison grid, price ranges or competitor offers. This actor reads the same public pages a browser sees:

- Listing rows for search and category pages, with rating, review count, offers count and price range.
- Full product details with specifications, images and the complete offer list per product (`scrapeProductDetails`).
- Review pages with author, rating, recommendation, verified purchase, vote counts and content (`scrapeReviews`).
- Bounds on every dimension (`maxPagesPerListing`, `maxProductsPerListing`, `maxOffersPerProduct`, `maxReviewsPerProduct`, `maxRequestsPerCrawl`) so runs stay predictable.

### Input Parameters

| Field | Type | Required | Default | Notes |
| --- | --- | --- | --- | --- |
| `startUrls` | array | Yes | Battlefield 6 search and a product | Ceneo.pl URLs. Accepts search URLs (`https://www.ceneo.pl/;szukaj-laptop`), category URLs (`https://www.ceneo.pl/Laptopy`) and product URLs (`https://www.ceneo.pl/186696977`). |
| `scrapeProductDetails` | boolean | No | `true` | When scraping search/category pages, also open each product page and enrich the same row with full specifications, images and the complete shop offer list. Disable for a fast listing-only extraction. |
| `scrapeReviews` | boolean | No | `false` | For each product page, also follow its `/opinie-N` pages and collect reviews into the `reviews` dataset. Adds extra requests per product. |
| `maxReviewsPerProduct` | integer | No | `10` | Maximum reviews collected per product. Reviews are paginated about 10 per page. |
| `maxPagesPerListing` | integer | No | `2` | How many pagination pages of each search/category listing to follow. |
| `maxProductsPerListing` | integer | No | `50` | Maximum products collected from each search/category listing page. |
| `maxOffersPerProduct` | integer | No | `50` | Maximum shop offers kept for each product. |
| `maxRequestsPerCrawl` | integer | No | `60` | Hard cap on the total number of pages fetched in a run (listings plus product pages). |
| `maxConcurrency` | integer | No | `25` | Maximum parallel requests. Ceneo pages are plain HTTP, so higher values are cheap. |
| `proxy` | object | No | Apify residential (PL) | Ceneo serves a bot check to datacenter IPs, so a Polish residential proxy is required. Defaults to Apify Proxy residential PL. |

### Output Fields

#### Products dataset (main output)

One item per product. Listing fields are always present; the enriched fields are added when `scrapeProductDetails` is on.

- `type`, `productId`, `name`, `brand`, `url`: row type, Ceneo product ID, name, brand and product URL.
- `price`, `priceDisplay`, `priceRange`: lowest price as a number, formatted price text and the price range object (`min`, `max`, `currency`, `offerCount`, `availability`).
- `rating`, `reviewCount`, `offersCount`: rating, review count and number of shop offers.
- Enriched: `description`, `specs` (specification key to value map), `images` (image URLs), `categories`, `offers` (array of shop offers).
- Each offer includes `position`, `offerId`, `shopId`, `shop`, `shopUrl`, `price`, `priceDisplay`, `currency`, `delivery`, `freeDelivery` and `stock`.
- `scrapedAt`: ISO 8601 scrape timestamp.

Dataset view: `overview` (Products).

#### Reviews dataset (only when `scrapeReviews` is enabled)

One item per review, joined to the products dataset on `productId`.

- `productId`: the reviewed product.
- `author`, `rating`, `recommendation`, `isRecommended`, `isVerifiedPurchase`: reviewer and rating attributes.
- `publishedAt`: review date.
- `votesUp`, `votesDown`, `content`: helpful votes and review text.

Dataset view: `overview` (Reviews).

### Example Input And Output

Example input:

```json
{
  "startUrls": [
    { "url": "https://www.ceneo.pl/;szukaj-battlefield+6" },
    { "url": "https://www.ceneo.pl/Laptopy" }
  ],
  "scrapeProductDetails": true,
  "scrapeReviews": true,
  "maxReviewsPerProduct": 10,
  "maxPagesPerListing": 2,
  "maxProductsPerListing": 50
}
```

Example Products row (enriched):

```json
{
  "type": "product",
  "productId": "186696977",
  "name": "Example Wireless Headphones",
  "brand": "ExampleBrand",
  "url": "https://www.ceneo.pl/186696977",
  "price": 349.0,
  "priceDisplay": "349,00 zl",
  "priceRange": { "min": 349.0, "max": 429.0, "currency": "PLN", "offerCount": 12, "availability": "InStock" },
  "rating": 4.6,
  "reviewCount": 812,
  "offersCount": 12,
  "description": "Wireless over-ear headphones with active noise cancelling.",
  "specs": { "Typ": "Nauszne", "Lacznosc": "Bluetooth 5.3" },
  "images": ["https://image.ceneostatic.pl/data/products/186696977/ex1.jpg"],
  "offers": [
    { "position": 1, "offerId": "5551111", "shop": "Example Shop", "shopUrl": "https://www.ceneo.pl/5551111", "price": 349.0, "priceDisplay": "349,00 zl", "currency": "PLN", "delivery": "0 zl", "freeDelivery": true, "stock": "InStock" }
  ],
  "scrapedAt": "2026-10-13T09:00:00.000Z"
}
```

Example Reviews row:

```json
{
  "productId": "186696977",
  "author": "Marek",
  "rating": 5,
  "recommendation": "Polecam",
  "isRecommended": true,
  "isVerifiedPurchase": true,
  "publishedAt": "2026-08-14",
  "votesUp": 12,
  "votesDown": 1,
  "content": "Great sound and battery life for the price."
}
```

### Integrations & Automation

Export results as JSON, CSV or Excel, read them through the Apify API, or push rows to a database, spreadsheet or BI tool with webhooks, Zapier or Make. For price monitoring, schedule the actor daily with the same `startUrls` so each run records the same products over time; weekly is usually enough for catalog research. Recurring runs also help the actor surface better in the Apify Store.

### Related Actors

- [studio-amba/ceneo-scraper](https://apify.com/studio-amba/ceneo-scraper)
- [bovi/ceneo-price-scraper](https://apify.com/bovi/ceneo-price-scraper)
- [trev0n/ceneo-scraper](https://apify.com/trev0n/ceneo-scraper)
- [trev0n/ceneo-product-review-scraper](https://apify.com/trev0n/ceneo-product-review-scraper)
- [ahmed_jasarevic/allegro-scraper](https://apify.com/ahmed_jasarevic/allegro-scraper)

### FAQ

#### Is there an official Ceneo API?

There is one, but it belongs to the Ceneo Affiliate Program (partnerzyapi.ceneo.pl). It is designed for affiliates and sellers to read their own products and categories, comes in field-limited tiers (PartnerService, PartnerServiceBasic, PartnerServicePremium) and requires a partnership. It is not a general endpoint for the comparison grid, price ranges or competitor offers, which is what this actor returns from the public pages.

#### What are the alternatives to this actor for Ceneo data?

Alternatives include the Ceneo Affiliate API (when you qualify), other Apify Store actors focused on Ceneo products or Ceneo reviews, and Allegro actors if your catalog also spans Allegro. This actor returns listing rows and enriched product details with the full offer list in one run.

#### Do I need a Polish residential proxy?

Yes, in practice. Ceneo serves a bot check to datacenter IPs, so the default is the Apify residential proxy with a Poland exit. Change `proxy` only if you have your own working proxy.

#### Can I monitor a product's price over time?

Yes. Keep the same `startUrls` (product or search URLs) and schedule the actor daily. Each run writes the current `price`, `priceDisplay` and `priceRange`, so comparing runs gives you a price history. Set `scrapeProductDetails` on for price ranges and the full offer list.

#### How do listing rows and product rows relate?

They are the same rows. When you scrape a search or category page with `scrapeProductDetails` on, the actor opens each product page and enriches the existing listing row in place, so you do not get duplicates.

#### How many reviews can I get per product?

Up to `maxReviewsPerProduct` (default 10). Reviews are paginated about 10 per page, so the actor follows as many `/opinie-N` pages as needed, up to that limit.

### SEO Keywords

ceneo scraper, ceneo.pl scraper, scrape ceneo, ceneo api, ceneo prices, ceneo product scraper, ceneo reviews scraper, price monitoring poland, price comparison scraper, e-commerce data poland, product prices poland, shop offers scraper, ceneo price range, ceneo product database, allegro ceneo data, polish ecommerce data, product rating scraper, ceneo offers data, competitor price analysis, price history scraping, ceneo without api, product catalog scraper, ceneo laptop prices, ceneo csv export, price intelligence poland

### For AI Agents & LLM Apps

Purpose: return Ceneo.pl product rows (prices, price range, rating, offers count) and, optionally, enriched product details and reviews, for a set of search, category or product URLs.

Minimal working input:

```json
{ "startUrls": [{ "url": "https://www.ceneo.pl/;szukaj-battlefield+6" }] }
```

Variant for one product with reviews:

```json
{ "startUrls": [{ "url": "https://www.ceneo.pl/186696977" }], "scrapeReviews": true, "maxReviewsPerProduct": 20 }
```

Output fields: Products dataset: `type`, `productId`, `name`, `brand`, `url`, `price`, `priceDisplay`, `priceRange`, `rating`, `reviewCount`, `offersCount`, `description`, `specs`, `images`, `categories`, `offers`, `scrapedAt`. Reviews dataset: `productId`, `author`, `rating`, `recommendation`, `isRecommended`, `isVerifiedPurchase`, `publishedAt`, `votesUp`, `votesDown`, `content`.

Behaviors an agent should know:

- `startUrls` is the only required field. Search and category URLs produce multiple product rows; product URLs produce one.
- `scrapeProductDetails` defaults to true and enriches each listing row in place with specifications, images and the offer list; it adds one billed `product-detail` event per enriched product. Set it false for a cheap listing-only run.
- `scrapeReviews` defaults to false; turning it on adds `review` billed events and writes to the `reviews` dataset.
- `maxOffersPerProduct`, `maxProductsPerListing` and `maxPagesPerListing` control row size and crawl breadth; `maxRequestsPerCrawl` is the global page ceiling.
- Non-paying users are capped at 10 products per run.
- A Polish residential proxy is required; Ceneo blocks datacenter IPs.

Billing: pay-per-event. `apify-actor-start` (about $0.00005), one `listing-result` per listing row (about $0.0004), one `product-detail` per enriched product (about $0.0016) and one `review` per review (about $0.0012), lower at higher loyalty tiers.

### Legal & Compliance Disclaimer

This actor is independent and is not affiliated with, endorsed by or sponsored by Ceneo.pl or Ceneo sp. z o.o. It reads only publicly available pages and their embedded schema.org data: it does not log in, does not bypass authentication and does not solve CAPTCHAs.

Users are responsible for complying with Ceneo's Terms of Service and with applicable data-protection law (for example GDPR) in their own jurisdiction. Where the output contains reviewer names or other personal data, that data must not be used for unsolicited commercial outreach in violation of applicable law.

# Actor input Schema

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

Ceneo.pl URLs to scrape. Accepts search URLs (https://www.ceneo.pl/;szukaj-laptop), category URLs (https://www.ceneo.pl/Laptopy) and product URLs (https://www.ceneo.pl/186696977). Search/category pages return product listings; product pages return full details with shop offers.

## `scrapeProductDetails` (type: `boolean`):

When scraping search/category pages, also open each product page and ENRICH the same row with full specifications, images and the complete shop offer list (no separate row / dataset). Disable for a fast listing-only extraction, in which case each row only has the listing fields.

## `scrapeReviews` (type: `boolean`):

For each product page, also follow its /opinie-N review pages and collect author, rating, content, pros/cons, vote counts and purchase verification into the 'reviews' dataset. Adds extra requests per product.

## `maxReviewsPerProduct` (type: `integer`):

Maximum number of reviews to collect per product. Reviews are paginated ~10 per page.

## `maxPagesPerListing` (type: `integer`):

How many pagination pages of each search/category listing to follow.

## `maxProductsPerListing` (type: `integer`):

Maximum number of products to collect from each search/category listing page.

## `maxOffersPerProduct` (type: `integer`):

Maximum number of shop offers kept for each product.

## `maxRequestsPerCrawl` (type: `integer`):

Hard cap on the total number of pages fetched in a run (listings + product pages).

## `maxConcurrency` (type: `integer`):

Maximum number of parallel requests. Higher values finish runs faster; Ceneo pages are plain HTTP so a high value is cheap.

## `proxy` (type: `object`):

Ceneo serves a bot-check/captcha to datacenter IPs, so a Polish residential proxy is required to get data. Defaults to Apify Proxy with residential PL; only change it if you have your own working proxy.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://www.ceneo.pl/186696977"
    },
    {
      "url": "https://www.ceneo.pl/;szukaj-battlefield+6"
    }
  ],
  "scrapeProductDetails": true,
  "scrapeReviews": false,
  "maxReviewsPerProduct": 10,
  "maxPagesPerListing": 2,
  "maxProductsPerListing": 50,
  "maxOffersPerProduct": 50,
  "maxRequestsPerCrawl": 60,
  "maxConcurrency": 25,
  "proxy": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "PL"
  }
}
```

# Actor output Schema

## `products` (type: `string`):

No description

## `reviews` (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 = {
    "startUrls": [
        {
            "url": "https://www.ceneo.pl/186696977"
        },
        {
            "url": "https://www.ceneo.pl/;szukaj-battlefield+6"
        }
    ],
    "proxy": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ],
        "apifyProxyCountry": "PL"
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("ahmed_jasarevic/ceneo-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 = {
    "startUrls": [
        { "url": "https://www.ceneo.pl/186696977" },
        { "url": "https://www.ceneo.pl/;szukaj-battlefield+6" },
    ],
    "proxy": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
        "apifyProxyCountry": "PL",
    },
}

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

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

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

```

## CLI example

```bash
echo '{
  "startUrls": [
    {
      "url": "https://www.ceneo.pl/186696977"
    },
    {
      "url": "https://www.ceneo.pl/;szukaj-battlefield+6"
    }
  ],
  "proxy": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "PL"
  }
}' |
apify call ahmed_jasarevic/ceneo-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,ahmed_jasarevic/ceneo-scraper"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/7ZMoScLdEsbTleATo/builds/OOxbTC8nZ0oT96F5b/openapi.json
