# Ceneo Scraper — Polish Price Comparison & Product Reviews (`studio-amba/ceneo-scraper`) Actor

Scrape product listings, price comparisons in PLN, ratings, and store offers from Ceneo.pl — Poland's largest price comparison platform.

- **URL**: https://apify.com/studio-amba/ceneo-scraper.md
- **Developed by:** [Studio Amba](https://apify.com/studio-amba) (community)
- **Categories:** E-commerce
- **Features:** Limited permissions
- **Stats:** 23 total users, 0 monthly users, 98.3% runs succeeded, 1 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.00 / 1,000 result scrapeds

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/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 -- Polish Price Comparison, Product Data & Store Offers

Extract product listings, price comparisons in PLN, ratings, reviews, and multi-retailer offer data from [Ceneo.pl](https://www.ceneo.pl) -- Poland's largest and most trusted price comparison platform, aggregating prices from thousands of online shops for millions of products.

### What is Ceneo Scraper?

Ceneo is to Poland what Google Shopping is to the rest of Europe -- except bigger and more deeply integrated into Polish online shopping culture. With over 30 million monthly visitors, Ceneo is the default starting point for Polish consumers comparing prices before any online purchase. It covers every product category imaginable: electronics, home appliances, fashion, beauty, automotive parts, toys, garden equipment, and much more.

What makes Ceneo uniquely valuable is its depth: for any single product, Ceneo shows offers from dozens of competing retailers with individual prices, shipping costs, and seller ratings. This actor extracts that aggregated intelligence at scale.

Here is what people build with it:

- **Polish e-commerce pricing** -- online retailers operating in Poland monitor Ceneo prices daily to maintain competitive positioning against hundreds of rival shops.
- **Brand distribution analysis** -- consumer brands track which Polish retailers list their products, at what price points, and with how many total offers.
- **Market entry intelligence** -- companies planning to sell in Poland use Ceneo data to understand price expectations, popular categories, and competitive dynamics.
- **Consumer sentiment analysis** -- Ceneo's rating and review data provides a massive source of Polish consumer product opinions for market researchers and product teams.
- **Deal detection** -- deal aggregation services and browser extensions use Ceneo pricing data to surface the best offers for Polish shoppers.
- **Dropshipping research** -- e-commerce entrepreneurs use Ceneo's multi-retailer pricing to identify products with healthy margins and reliable supply across Polish suppliers.

### What data does Ceneo Scraper extract?

Each product record includes:

- :package: **Product name** -- full product title in Polish
- :label: **Brand** -- manufacturer brand
- :zloty: **Price** -- lowest available price in PLN (Polish zloty)
- :white_check_mark: **Stock status** -- whether the product is listed as available
- :star: **Rating** -- aggregate user rating (0-5)
- :speech_balloon: **Review count** -- number of consumer reviews
- :camera: **Image** -- product image URL
- :file_folder: **Category** -- the category the product was scraped from
- :link: **URL** -- direct link to the Ceneo product page

### How to scrape Ceneo.pl

| Field | Type | Required | Description |
|-------|------|----------|-------------|
| `categoryUrl` | String | No | A Ceneo.pl category page URL to scrape, e.g. `https://www.ceneo.pl/Sluchawki`. Use this to target one specific category. |
| `searchQuery` | String | No | Used only if no `categoryUrl` is given. A general keyword search across all of Ceneo.pl, e.g. `"laptop"`, `"buty sportowe"`, `"słuchawki"` -- not limited to exact category names. |
| `maxResults` | Integer | No | Maximum products to return (default: 100, max: 50,000) |
| `proxyConfiguration` | Object | No | Accepted for compatibility; fetching goes through Bright Data, not Apify Proxy |

**Tips:**

- Browse ceneo.pl to find a category page URL (e.g. `https://www.ceneo.pl/Buty_sportowe_meskie`) and paste it into `categoryUrl` when you want one specific category.
- `searchQuery` works as a general keyword search (Polish, with or without diacritics, single or multi-word) -- it does not need to match an exact Ceneo category name.
- The actor handles pagination automatically via Ceneo's `rel="next"` page links.

### Output

```json
{
    "name": "Shokz OpenFit Pro, Black",
    "brand": "Shokz",
    "price": 1049,
    "currency": "PLN",
    "url": "https://www.ceneo.pl/197078408",
    "scrapedAt": "2026-07-17T13:51:27.657Z",
    "inStock": true,
    "rating": 5,
    "reviewCount": 1,
    "imageUrl": "https://image.ceneostatic.pl/data/products/197078408/f-shokz-openfit-pro-black.jpg",
    "category": "sluchawki"
}
```

### How much does it cost?

Ceneo Scraper fetches category listing pages through Bright Data Web Unlocker -- each request returns a full page of ~30 products, so the cost per result is low:

| Volume | Approx. Bright Data requests | Approx. Bright Data cost |
|--------|------------------------------|---------------------------|
| 100 products | ~4 | ~$0.006 |
| 500 products | ~17 | ~$0.026 |
| 1,000 products | ~34 | ~$0.05 |
| 5,000 products | ~167 | ~$0.25 |

Product fields (name, brand, price, rating, image) are read directly off the listing page's own product cards -- no per-product detail-page fetch is needed.

### Can I integrate?

Connect Polish pricing data to your business tools:

- **Google Sheets** -- build a live Polish market price tracker for your product portfolio
- **Slack** -- get alerts when competitor prices change on Ceneo
- **Zapier / Make** -- automate competitive pricing updates for your Polish e-shop
- **Webhooks** -- feed real-time price data to your dynamic pricing engine
- **BigQuery / PostgreSQL** -- build a historical Polish market price database
- **Power BI / Tableau** -- visualise price distributions and competitive dynamics

### Can I use it as an API?

Yes. Integrate Polish price comparison data into your pipeline:

**Python:**

```python
from apify_client import ApifyClient

client = ApifyClient("YOUR_API_TOKEN")

run = client.actor("studio-amba/ceneo-scraper").call(run_input={
    "categoryUrl": "https://www.ceneo.pl/Smartfony",
    "maxResults": 200,
})

for product in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(f"{product['name']} | {product.get('price')} PLN | {product.get('brand', '?')}")
```

**JavaScript:**

```javascript
import { ApifyClient } from "apify-client";

const client = new ApifyClient({ token: "YOUR_API_TOKEN" });

const run = await client.actor("studio-amba/ceneo-scraper").call({
    categoryUrl: "https://www.ceneo.pl/Smartfony",
    maxResults: 200,
});

const { items } = await client.dataset(run.defaultDatasetId).listItems();
const withRatings = items.filter((p) => p.rating >= 4.5 && p.reviewCount > 100);
console.log(`${withRatings.length} highly-rated smartphones on Ceneo:`);
withRatings.forEach((p) => {
    console.log(`  ${p.name} | ${p.price} PLN | ${p.rating}/5 (${p.reviewCount} reviews)`);
});
```

### FAQ

**Is Ceneo only for electronics?**
No. Ceneo covers virtually every product category: electronics, home appliances, fashion, beauty, sports, automotive, garden, children's products, pet supplies, and more. It is a universal price comparison platform.

**Are prices in PLN or EUR?**
All prices are in Polish zloty (PLN). Ceneo is a Polish platform for the Polish market.

**Can I see individual store prices?**
No. The actor extracts the lowest listed price per product from the category listing page. Individual per-retailer prices would require scraping the offers tab on each product page, which this actor does not currently do.

**How reliable are the ratings?**
Ceneo's review system is one of the most trusted in Poland. The rating and review count come straight from each product card on the category listing page.

**Does it handle Polish characters in search?**
Yes. `searchQuery` accepts Polish text with diacritics directly, e.g. `"słuchawki"`, and works as a general keyword search, not just exact category names.

**Can I scrape specific product pages by ID?**
Not currently. This actor is category-listing based; it does not fetch individual product detail pages.

**How large is Ceneo's product database?**
Ceneo tracks millions of products across thousands of categories. The platform aggregates offers from over 30,000 online shops in Poland, making it by far the most comprehensive pricing source for the Polish e-commerce market.

**What happens if a category has no products?**
The actor logs a warning and fails the run with a clear message if the resolved category URL returns zero products -- check that `categoryUrl` points to a real Ceneo category page.

### Limitations

- Targets ceneo.pl (Poland) only. Ceneo does not operate in other countries.
- **No per-product detail pages.** All fields (name, brand, price, rating, image) are read from the category/search listing page's product cards, not from an individual product URL. EAN, SKU, description, per-store offer counts, and price range are not currently extracted.
- Individual retailer offer details (per-shop prices, shipping costs, seller ratings) require deeper page scraping beyond the current implementation.
- Product names and categories are in Polish. No translation is performed.

### Related price comparison and European scrapers

- [Prisjakt Scraper](https://apify.com/studio-amba/prisjakt-scraper) -- Sweden's largest price comparison platform
- [Apotea Scraper](https://apify.com/studio-amba/apotea-scraper) -- Swedish online pharmacy products and prices
- [Norauto Scraper](https://apify.com/studio-amba/norauto-scraper) -- French automotive retail prices
- [AutoVlan Scraper](https://apify.com/studio-amba/autovlan-scraper) -- Belgian used car market data

### Your feedback

Want individual retailer prices, review text extraction, or support for specific product categories? Open an issue on GitHub or contact us through the Apify platform. We improve based on what users actually need.

# Actor input Schema

## `categoryUrl` (type: `string`):

A Ceneo.pl category page URL to scrape (e.g. https://www.ceneo.pl/Sluchawki). Use this when you want one specific category; otherwise use searchQuery for a general keyword search.

## `searchQuery` (type: `string`):

Used only if no categoryUrl is given. A general keyword search across all of Ceneo.pl (e.g. "laptop", "buty sportowe", "słuchawki") — not limited to exact category names.

## `maxResults` (type: `integer`):

Maximum number of products to return.

## `brightDataApiKey` (type: `string`):

Optional: your own Bright Data Web Unlocker API key. Leave empty to use the built-in key.

## `proxyConfiguration` (type: `object`):

Proxy settings for better reliability on large runs.

## Actor input object example

```json
{
  "categoryUrl": "https://www.ceneo.pl/Sluchawki",
  "searchQuery": "słuchawki",
  "maxResults": 100,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "PL"
  }
}
```

# 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 = {
    "categoryUrl": "https://www.ceneo.pl/Sluchawki",
    "searchQuery": "słuchawki",
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ],
        "apifyProxyCountry": "PL"
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("studio-amba/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 = {
    "categoryUrl": "https://www.ceneo.pl/Sluchawki",
    "searchQuery": "słuchawki",
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
        "apifyProxyCountry": "PL",
    },
}

# Run the Actor and wait for it to finish
run = client.actor("studio-amba/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 '{
  "categoryUrl": "https://www.ceneo.pl/Sluchawki",
  "searchQuery": "słuchawki",
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "PL"
  }
}' |
apify call studio-amba/ceneo-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,studio-amba/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/wojZxPbRYwhsDcmHr/builds/hvgBCw2CtDDP1uuJF/openapi.json
