# Allegro.pl Scraper - products, prices, sellers (`reventadata/allegro-pl-scraper`) Actor

Search allegro.pl by keyword and get every offer as a row: title, PLN price, price with delivery, seller login and rating, Super Seller, Smart! and lowest-price badges, parameters and offer link. Price, condition, delivery and sort filters run on the site itself and are checked against the page.

- **URL**: https://apify.com/reventadata/allegro-pl-scraper.md
- **Developed by:** [reventadata](https://apify.com/reventadata) (community)
- **Categories:** E-commerce, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.40 / 1,000 products

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

## Allegro.pl Scraper

> **Unofficial.** This Actor is not affiliated with, authorised by, endorsed by, or in any
> way officially connected to Allegro. "Allegro" is a trademark of its respective owner and is
> used here only to describe what this tool reads. It reads the same public search pages a
> browser does.

Allegro.pl Scraper turns an allegro.pl search into a table: product title, price in PLN, price with
delivery, seller, ratings, Smart! and lowest-price badges, product parameters and an offer link, for
every search term you give it.

### What does it do?

For each search term it opens allegro.pl's own search (`/listing?string=...`), walks the result pages
and saves one row per distinct offer. Prices are read from the same data the page renders, so the
number in the row is the number on the card. It works for any category and any search term the site
understands. A run that keeps no rows at all fails on purpose, so an empty result never looks like a
success.

### Why use it?

- **Price and seller on every row:** price as a number with its currency, the price with the cheapest
  delivery, the seller's login, shop page, Super Sprzedawca badge and positive-feedback percentage.
- **The site's own filters:** price range, new or used, free delivery, Allegro Smart!, Super Seller and
  price sort are sent to allegro.pl itself, and the run stops with an error if the site did not apply
  one, instead of handing you unfiltered rows.
- **Fuzzy-search clean-up:** Allegro's search can return products that do not contain your term.
  "Title must contain" and "Title must not contain" are matched against the title and the seller
  login together, ignoring case and accents (`szklo` matches `szkło`).
- **Public data only:** seller logins, shop pages and the ratings the site shows are in the rows;
  nothing from behind a login.

### How to use it

1. Put one or more search terms in `searchQueries`.
2. Set `maxItems` and, if you want, the price, condition, delivery, Smart!, Super Seller and sort options.
3. Run the Actor and download the dataset as JSON, CSV, Excel or NDJSON.

#### Input

| Field | Type | Description |
|---|---|---|
| `searchQueries` | array | Search terms, one search each. Required. |
| `maxItems` | integer | Maximum products saved across all terms (default 100). |
| `minPrice`, `maxPrice` | integer | Price band in PLN, applied by the site and checked again on each row. |
| `condition` | string | `any`, `new` or `used`: the site's own `stan` filter. There is no condition column; the card's condition, when shown, is in `parameters` under `Stan`. |
| `freeDelivery` | boolean | Only offers on the site's free-delivery filter. |
| `smartOnly` | boolean | Only offers on the site's Allegro Smart! filter. |
| `superSellerOnly` | boolean | Only Super Sprzedawca offers. |
| `sortBy` | string | `relevance`, `price-asc` or `price-desc`. |
| `includeKeywords` | array | Title and seller login, taken together, must contain every word. |
| `excludeKeywords` | array | Drop rows whose title or seller login contains any word. |
| `includeSponsored` | boolean | Keep Allegro's paid "Sponsorowane" placements (default on). |

#### Sample input

```json
{
    "searchQueries": ["iphone"],
    "maxItems": 20,
    "condition": "used",
    "excludeKeywords": ["etui", "szkło", "case"]
}
```

#### Output

| Field | Type | Description |
|---|---|---|
| `id` | string | Allegro offer id. |
| `title` | string | Product title. |
| `url` | string | Offer page, `https://allegro.pl/oferta/<id>`. |
| `productUrl` | string / null | The product page the card links to, when it is not a sponsored click link. |
| `price` | number | Price as a number. |
| `currency` | string | `PLN`. |
| `priceWithDelivery` | number / null | Price including the cheapest delivery ("z dostawą"). |
| `deliveryLowestPrice` | number / null | Cheapest delivery price; 0 when delivery is free. |
| `freeDelivery` | boolean | The site's free-delivery flag. |
| `pricePerUnit` | string / null | Unit price text, when the card shows one. |
| `imageUrl` | string / null | Main thumbnail. |
| `sellerLogin`, `sellerId`, `sellerUrl` | string / null | The seller's public login, id and shop page. |
| `sellerSuperSeller` | boolean | Super Sprzedawca badge. |
| `sellerIsCompany` | boolean | The site marks the seller as a business ("Firma"). |
| `sellerPositiveFeedbackPercent` | number / null | Positive feedback, percent. |
| `ratingAverage`, `ratingCount` | number / integer / null | Product rating, when it has reviews. |
| `popularityLabel` | string / null | Allegro's own "kupiło ostatnio" text. |
| `deliveryLabel` | string / null | Delivery badge on the card, usually `Smart!`. |
| `bestPriceGuarantee` | boolean | Allegro's lowest-price guarantee badge. |
| `parameters` | object | Product parameters on the card (colour, storage, condition ...). |
| `productId`, `productOffersCount` | string / null, integer / null | The product the offer belongs to and how many offers it has. |
| `listingType` | string / null | `regular`, `promoted` or `sponsored`. |
| `matchedKeyword` | string | The search term that returned it. |
| `page` | integer | Result page it was read from. |
| `scrapedAt` | string | ISO 8601 timestamp. |

#### Sample output

One real row from a run on 2026-10-22 (run `0VTZBXeWdpbzukAmd`, search "iphone"):

```json
{
    "id": "18896733090",
    "title": "Smartfon Apple iPhone SE szary 64 GB 4G (LTE)",
    "url": "https://allegro.pl/oferta/18896733090",
    "productUrl": "https://allegro.pl/produkt/smartfon-apple-iphone-se-szary-64-gb-4g-lte-14f376a6-b08b-4da7-b352-bcbc799625cb?offerId=18896733090",
    "price": 1099,
    "currency": "PLN",
    "priceWithDelivery": 1099,
    "deliveryLowestPrice": 0,
    "freeDelivery": true,
    "pricePerUnit": null,
    "imageUrl": "https://a.allegroimg.com/s180/113397/04638b424107972373f186caf9c3/Kolekcjonerski-Apple-iPhone-SE-szary-64GB-LTE-ofoliowany-nie-aktywowany",
    "sellerLogin": "Ck_Gsm_World",
    "sellerId": "49095642",
    "sellerUrl": "https://allegro.pl/uzytkownik/Ck_Gsm_World",
    "sellerSuperSeller": true,
    "sellerIsCompany": true,
    "sellerPositiveFeedbackPercent": 99.7,
    "ratingAverage": 4.77,
    "ratingCount": 308,
    "popularityLabel": "7 osób kupiło ostatnio",
    "deliveryLabel": null,
    "bestPriceGuarantee": false,
    "parameters": {
        "Stan": [
            "Powystawowy"
        ],
        "Kolor": [
            "szary"
        ],
        "Przekątna ekranu": [
            "4\""
        ],
        "Wbudowana pamięć": [
            "64 GB"
        ],
        "Pamięć RAM": [
            "2 GB"
        ]
    },
    "productId": "14f376a6-b08b-4da7-b352-bcbc799625cb",
    "productOffersCount": 3,
    "listingType": "regular",
    "matchedKeyword": "iphone",
    "page": 3,
    "scrapedAt": "2026-10-22T17:04:30.672572+00:00"
}
```

### How much does it cost to scrape allegro.pl?

Pay-per-event: **$0.0024 per result** saved to the dataset (**$2.40 per 1,000 results**), plus
**$0.00005** charged once when the run starts. No subscription. Duplicate offers, offers outside the
price band, titles that fail "Title must contain" / "Title must not contain" and (when turned off)
sponsored placements are dropped before the row is saved, so they are not charged.

### Good to know

- **Search ceiling:** allegro.pl serves at most 100 result pages per search (about 6,000 products for a
  broad term). A search with fewer results has fewer pages. For more than that, split the search with
  price bands.
- **Speed:** allegro.pl sits behind a bot-protection service, so every page is fetched through a
  commercial unblocking service. Pages are fetched three at a time. In a 20-page test run on 2026-10-22
  (run `0VTZBXeWdpbzukAmd`) each page took 20 to 76 seconds, one page needed a second attempt (195 s),
  and the run took 8 minutes 47 seconds. Give big runs a timeout of at least 15 minutes.
- **Fuzzy search:** a search term that matches nothing can still return unrelated products; use
  "Title must contain" when you need strict matches (it looks at the title and the seller login).
- **Sorting:** only relevance and price (both directions) are offered, the sorts whose direction was
  checked against the returned prices. Sponsored rows ignore the sort.
- **Sponsored rows:** these are paid placements; an offer found both sponsored and organic is saved once.
- **Polish marketplace only:** allegro.cz, allegro.sk and allegro.hu are not covered.

### Privacy & Compliance

This Actor reads only publicly accessible pages and returns the public data they show. It sends no login.

# Actor input Schema

## `searchQueries` (type: `array`):

Search terms to look up on allegro.pl, one search per term. Any category, any language the site understands (Polish or English product names work).

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

Maximum number of products to save across all search terms. A page holds about 60-70 distinct products and the site serves at most 100 pages per search.

## `minPrice` (type: `integer`):

Only products priced at or above this amount in Polish zloty. Leave empty for no lower limit. 0 is a real value.

## `maxPrice` (type: `integer`):

Only products priced at or below this amount in Polish zloty. Leave empty for no upper limit.

## `condition` (type: `string`):

Filter by the condition the site records for the offer: new (nowe) or used (używane). 'any' sends no condition filter.

## `freeDelivery` (type: `boolean`):

Only offers on the site's own 'darmowa dostawa' (free delivery) filter.

## `smartOnly` (type: `boolean`):

Only offers on the site's own 'Allegro Smart!' delivery-programme filter.

## `superSellerOnly` (type: `boolean`):

Only offers from sellers carrying Allegro's Super Sprzedawca badge (its own filter).

## `sortBy` (type: `string`):

Order of the results: the site's relevance order, price from low to high, or price from high to low.

## `includeKeywords` (type: `array`):

Keep only products whose title (or seller name) contains every one of these words, ignoring case and accents. Allegro's search is fuzzy and can return products that do not contain your term; this removes them.

## `excludeKeywords` (type: `array`):

Drop products whose title (or seller name) contains any of these words, ignoring case and accents. Useful to remove cases, glass and accessories from a phone search.

## `includeSponsored` (type: `boolean`):

Allegro mixes paid 'Sponsorowane' placements into the results. Turn off to drop them; an offer that appears both sponsored and organic is saved once either way.

## Actor input object example

```json
{
  "searchQueries": [
    "iphone"
  ],
  "maxItems": 20,
  "condition": "any",
  "freeDelivery": false,
  "smartOnly": false,
  "superSellerOnly": false,
  "sortBy": "relevance",
  "includeSponsored": true
}
```

# Actor output Schema

## `dataset` (type: `string`):

One row per allegro.pl offer that matched the search and cleared the filters: price in PLN, price with delivery, seller, rating, delivery badge, parameters, offer link.

# 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 = {
    "searchQueries": [
        "iphone"
    ],
    "maxItems": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("reventadata/allegro-pl-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 = {
    "searchQueries": ["iphone"],
    "maxItems": 20,
}

# Run the Actor and wait for it to finish
run = client.actor("reventadata/allegro-pl-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 '{
  "searchQueries": [
    "iphone"
  ],
  "maxItems": 20
}' |
apify call reventadata/allegro-pl-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,reventadata/allegro-pl-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/b6LPpUUS6zy7MQl58/builds/uZzITFPTLsVgUw8xA/openapi.json
