# Allegro Scraper - Products, Prices, Sellers & Reviews (`abotapi/allegro-pl-scraper`) Actor

Scrape Allegro marketplace (allegro.pl) by keyword or URL. Extract product offers, prices, delivery options, seller details and customer reviews. Supports incremental change tracking, resume from previous runs and MCP integration for automated workflows.

- **URL**: https://apify.com/abotapi/allegro-pl-scraper.md
- **Developed by:** [Abot API](https://apify.com/abotapi) (community)
- **Features:** Limited permissions
- **Stats:** 11 total users, 4 monthly users, 90.9% runs succeeded, 2 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.70 / 1,000 offer records

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

## Allegro Poland Scraper: Offers, Prices & Seller Data

Allegro Poland Scraper turns Allegro, Poland's largest online marketplace, into a clean Apify dataset. Search by your own phrases or barcodes, or paste Allegro listing, category or seller links, and every matching offer comes back with its price, delivery text, gallery, rating, category, seller signals and the offer's own parameters (colour, memory, size, and so on). Switch on full detail enrichment to add each offer's own description, brand, SKU, GTIN/barcode, return policy, availability and reviews, then export to JSON, CSV or Excel, or pull the results straight into your app through the API.

### Why This Scraper?

- **Three ways in.** Build searches from your own phrases, search by product barcode (EAN/GTIN/UPC), or paste Allegro listing, category (`/kategoria/...`) or seller (`/uzytkownik/...`) links and walk them forward from wherever they start.
- **Full offer rows.** Title, brand, price, currency, delivery terms, offer URL, a full image gallery, rating, category and the offer's own parameters land in every row, no extra toggle needed.
- **Seller signals included.** Seller login, business/private flag, positive-feedback percentage and the Super Seller badge come with every offer.
- **Sponsored, Smart! and price-guarantee flags returned as data.** Keep or drop promoted cards yourself instead of guessing which ones were paid placements.
- **Optional detail enrichment.** Turn on Fetch full offer details to add each offer's own description, brand, SKU, category, availability, GTIN/barcode, return policy and up to Max reviews individual reviews, billed only for the offers actually enriched.
- **Built for schedules.** Incremental mode returns only new and changed offers on recurring runs, and a refused run fails loudly instead of returning an empty dataset.
- **MCP connector export.** Send a concise offer digest into Notion, Linear, Airtable or Apify connectors while the full record stays in the dataset.

### Use Cases

- **Price monitoring and repricing:** track your own or a competitor's listings across scheduled runs and catch price and delivery changes as `changedFields`.
- **Market and category research:** pull hundreds of matching offers for a phrase to compare pricing spread, sellers and parameter mixes in one dataset.
- **Deal and drop alerts:** watch a search with Incremental mode on and feed newly appeared offers into your own alerting tool or spreadsheet.
- **Seller and listing audits:** check seller feedback percentage, business status and Super Seller badges across a category before sourcing decisions.
- **Catalog enrichment:** turn on full offer details to add descriptions, brands and SKUs for offers you already found by search or link.

### Data You Get

> Sample shape: values are illustrative placeholders, not from a live offer.

| Field | Example |
| --- | --- |
| `offerId` | `"20000000001"` |
| `title` | `"Sample Smartphone 8 GB / 128 GB 5G"` |
| `brand` | `"Apple"` (null when the listing card doesn't show one) |
| `url` | `"https://allegro.pl/oferta/20000000001"` |
| `price` / `currency` | `1234.56` / `"PLN"` |
| `originalPrice` | `1499` (null when the offer shows no discount) |
| `deliveryInfo` | `"darmowa dostawa"` |
| `freeDelivery` / `freeReturn` | `false` / `true` |
| `lowestDeliveryPrice` | `9.99` |
| `sponsored` / `bestPriceGuarantee` / `smart` | `false` / `true` / `true` (Smart! is Allegro's free-shipping program) |
| `sellerName` / `sellerBusiness` / `sellerFeedbackPercent` / `superSeller` | `"sample_seller"` / `true` / `98.5` / `false` |
| `category` | `"320000"` |
| `parameters` | `{"Kolor": "czarny", "Wbudowana pamięć": "128 GB"}` |
| `image` / `images` / `thumbnail` | `"https://a.allegroimg.com/s180/sample/sample-thumbnail"` / the full gallery as a list of URLs / listing thumbnail URL |
| `ratingValue` / `ratingCount` | `4.9` / `228` |
| `offerCount` / `hasVariants` | `75` (other sellers offering this same product) / `true` |
| `recentBuyersLabel` / `purchasesCount` | `"381 osób kupiło ostatnio"` / `381` (number parsed from the label) |
| `sellerInfo` | `{"login": "mbrands_pl", "url": "https://allegro.pl/uzytkownik/mbrands_pl", "feedbackPercent": 99.5, "superSeller": true, "business": true}` |
| `deliveryCost` / `shippingInfo` | `7.99` / `"56,99 zł z dostawą"` (lowest delivery price and the delivery text) |
| `isDiscount` / `isInStock` | `true` when the old price is above the price / `true` when the offer can be added to the cart |
| `breadcrumbsList` | `[{"name": "Elektronika", "url": "https://allegro.pl/dzial/elektronika"}]` (with `fetchDetails`) |
| `sourceUrl` / `sourceLabel` | `"https://allegro.pl/listing?string=smartfon"` / `"search-1:smartfon"` (or `"barcode-1:<code>"` for a barcode search) |

When Fetch full offer details is on, an enriched offer also carries `detailDescription`, `detailBrand`, `detailSku`, `detailCategory`, `detailPrice`, `detailPriceCurrency`, `detailAvailability`, `detailCondition`, `gtin`, `detailRatingValue`, `detailRatingCount`, `returnPolicyDays`, `returnPolicyUrl`, `reviews` (up to Max reviews per offer, each with `rating`, `date`, `author`, `text`, `pros`, `cons`) and `reviewsCollected`, parsed from the offer's own page. This is billed one Detail enrichment event per offer actually enriched; the reviews are included in it and carry no separate charge. When Incremental mode is on, every returned offer also carries `changeType` (`NEW`, `UPDATED`, `UNCHANGED`, `REAPPEARED` or `EXPIRED`), `changedFields`, `firstSeenAt` and `lastSeenAt`, rating value/count, the recent-buyers label and count (`purchasesCount`) and review text never trigger `UPDATED` on their own, since that reflects other shoppers buying or rating the product, not a change to the offer itself. Stock status (`isInStock`), discount flag, delivery cost, shipping text, seller details and thumbnail do trigger `UPDATED`.

### How to Use

1. Pick a **mode**: `search` (build from your own phrases and/or barcodes) or `url` (paste Allegro listing, category or seller links).
2. Fill in the phrases, barcodes or links for that mode, and add a keyword filter if you only want titles containing certain terms.
3. Set **Max items** to control run size and cost, and turn on **Fetch full offer details** only if you need description/brand/SKU/GTIN/review fields (set **Max reviews per offer** alongside it).
4. Click **Start**, then download the dataset as JSON, CSV or Excel, or read it through the API.

**Search one phrase:**

```json
{
  "mode": "search",
  "queries": ["iphone"],
  "maxItems": 20
}
```

**Search by barcode (EAN/GTIN/UPC):**

```json
{
  "mode": "search",
  "barcodes": ["0195950627114"],
  "maxItems": 5
}
```

**Paste Allegro listing, category or seller links (a `&p=N` page number in the link is used as the starting page):**

```json
{
  "mode": "url",
  "startUrls": [
    { "url": "https://allegro.pl/listing?string=laptop" },
    { "url": "https://allegro.pl/listing?string=laptop&p=2" },
    { "url": "https://allegro.pl/kategoria/smartfony-i-telefony-komorkowe-165" },
    { "url": "https://allegro.pl/uzytkownik/smartSPOT" }
  ],
  "maxItems": 10
}
```

**Search with full offer details and reviews enriched:**

```json
{
  "mode": "search",
  "queries": ["macbook"],
  "fetchDetails": true,
  "maxReviews": 20,
  "maxItems": 10
}
```

#### Run it from your code

Python:

```python
from apify_client import ApifyClient

client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("abotapi/allegro-pl-scraper").call(run_input={"mode": "search", "queries": ["iphone"]})
for offer in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(offer["title"], offer["price"], offer["currency"])
```

JavaScript:

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

const client = new ApifyClient({ token: '<YOUR_APIFY_TOKEN>' });
const run = await client.actor('abotapi/allegro-pl-scraper').call({ mode: 'search', queries: ['iphone'] });
const { items } = await client.dataset(run.defaultDatasetId).listItems();
```

Or connect it to Make, Zapier, n8n, Google Sheets or webhooks from the **Integrations** tab.

#### Single offer links are not a start source

URL mode reads Allegro listing/search pages (`/listing?...`), category pages (`/kategoria/...`) and seller/store pages (`/uzytkownik/...`), all three carry the same forward-paginated results grid the actor parses. A single offer or product link (`/oferta/...` or `/produkt/...`) does not, and the run will fail if it's the only source, so paste one of the three link types instead, or use Search phrases/Barcodes to find the offer.

If you select URL mode and leave Start URLs untouched (or omit the field in an API call), the run now scrapes one example of each link type: a search listing (`/listing?string=iphone`), a category page (`/kategoria/smartfony-i-telefony-komorkowe-165`) and a seller page (`/uzytkownik/smartSPOT`). Replace the list to scrape your own links.

#### Dataset views

The Output tab offers four views: an overview table of the core offer fields, a detail view for enriched offers (description, GTIN, return policy, detail rating), a reviews view with one row per review, and a changes view for Incremental mode (`changeType`, `changedFields`, `firstSeenAt`, `lastSeenAt`).

#### Resume and recurring updates

- **Resume** (`resumeFromRunId`) continues one interrupted run: paste its run or dataset ID and the actor skips every offer already collected there (matched by `offerId`), so you don't pay twice.
- **Incremental mode** (`incrementalMode`) is for scheduled runs over the same search. Each offer classifies as `NEW` (first time seen), `UPDATED` (with `changedFields` naming what changed) or `UNCHANGED` (suppressed and not billed unless `emitUnchanged` is on). `EXPIRED` and `REAPPEARED` are both narrower: `EXPIRED` rows are only produced when a run reads every source to its natural end (no `maxItems` cap hit, no `resumeFromRunId`) and `emitExpired` is on, and that same run is what marks the missing offer as no longer present. `REAPPEARED` can then only be classified on a later run, for that specific offer, once it has been marked that way and is scraped again; with `emitExpired` left off, no offer is ever marked absent, so `REAPPEARED` cannot occur. `stateKey` names or shares the stored state; leave it empty and the actor derives one from your mode, phrases, links and keywords. Rating value/count, the recent-buyers label and its numeric count (`purchasesCount`), and review fields never trigger `UPDATED` on their own by default; every other field does, including `isInStock`, so an in-stock to out-of-stock flip is reported. Offers saved by an older version of this actor are not flagged `UPDATED` just because the newer fields (`isInStock`, `isDiscount`, `sellerInfo`, `deliveryCost`, `shippingInfo`, `thumbnail`, `purchasesCount`) appeared; those fields are tracked from the following run. add further field names to `ignoreFieldsForChanges` if another field in your setup turns out to be noisy. With Incremental mode off, output is exactly as before.

### Send results into your apps (MCP connectors)

Optionally pipe the scraped offers into the apps you already use, via Model Context Protocol (MCP) connectors. This is an extra delivery step **after** the scrape: the Apify dataset is never changed.

**What gets written to the connector:** a condensed, human-readable **summary** of each offer, not the full JSON. Each item becomes one entry with a **title** and its key fields flattened to plain text. The **complete record always stays in the Apify dataset**.

1. Authorize a connector once under **Apify → Settings → Integrations** (Notion, Linear, Airtable, or Apify).
2. Select it in the **"Pipe results into your apps"** input field. (If the picker is empty, you haven't authorized a connector yet.)
3. For **Notion**, also set `notionParentPageUrl` to the page where offers should be created.

The connection is mediated by Apify's MCP proxy, so this actor never sees your third-party credentials. Connector write errors never fail the run. Leave the field empty to skip.

### Input Parameters

| Parameter | Type | Default | Description |
| --- | --- | --- | --- |
| `mode` | string | `search` | `search` to build searches from your phrases/barcodes, or `url` for pasted Allegro listing/category/seller links. |
| `queries` | array | `["iphone"]` | Search phrases for search mode. Each phrase is one search walk. |
| `barcodes` | array | `[]` | Product barcodes (EAN/GTIN/UPC) for search mode. Allegro's own search resolves a barcode exactly like a phrase; each code is one search walk. May be combined with `queries`. |
| `startUrls` | array | one listing, one category and one seller sample URL | Allegro listing (`/listing?...`), category (`/kategoria/...`) or seller (`/uzytkownik/...`) links for URL mode. A `&p=N` in the link is honoured as the first page read. Single offer/product links (`/oferta/...`, `/produkt/...`) are not a start source. |
| `keywords` | array | `[]` | Keeps only offers whose title contains at least one of these terms (case-insensitive). |
| `fetchDetails` | boolean | `false` | Open each offer's own page to add description, brand, SKU, category, GTIN/barcode, return policy, detail price/currency, availability and reviews (see `maxReviews`). Slower, and billed per offer actually enriched. |
| `maxReviews` | integer | `20` | Only applies with `fetchDetails` on. Cap on individual reviews captured per offer (`0` disables review text; the aggregate rating/count are still attached). Reviews are included in Detail enrichment (no separate charge); the value is capped at 1000. |
| `maxItems` | integer | `20` | Maximum offers to return across the whole run. Minimum 1; the cap is always finite. |
| `maxPages` | integer | `0` | Maximum Allegro result pages to read per search phrase or pasted link. `0` walks every result page; `maxItems` is the primary output cap. |
| `resumeFromRunId` | string | no default (empty) | A previous run ID (or dataset ID) from this actor. Offers already collected there are skipped, so the run returns only new ones. |
| `incrementalMode` | boolean | `false` | Turn on for scheduled runs over the same search: return only new and changed offers. |
| `stateKey` | string | no default (empty) | Name or share a monitoring campaign's stored state. Left empty, a key is derived automatically from mode, phrases, links and keywords. |
| `emitUnchanged` | boolean | `false` | Incremental mode only. Also return (and bill) offers unchanged since the last run. |
| `emitExpired` | boolean | `false` | Incremental mode only. Also return (and bill) offers no longer found, once a run has fully scanned the search. |
| `ignoreFieldsForChanges` | array | `[]` | Incremental mode only. Extra field names to exclude from `UPDATED` detection, on top of the built-in handling (rating value/count, recent-buyers label and count, review fields). Use it for another field in your setup that turns out to be noisy. |
| `proxy` | object | Apify Residential, country PL | Connection settings. Allegro serves pages only to a Polish consumer-class connection, so keep the Residential (Poland) preset. |
| `mcpConnectors` | array | no default (empty) | Optional: send a summary of each offer to apps you authorized under Integrations. |
| `notionParentPageUrl` | string | no default (empty) | Notion connector only: page under which offer pages are created. |
| `maxNotifyListings` | integer | `50` | Cap on how many offers are written to each selected connector per run. Does not affect the dataset. |

### Output Example

> Sample shape: values are illustrative placeholders, not from a live offer.

```json
{
  "offerId": "20000000001",
  "title": "Sample Smartphone 8 GB / 128 GB 5G",
  "brand": "Apple",
  "url": "https://allegro.pl/oferta/20000000001",
  "price": 1234.56,
  "currency": "PLN",
  "originalPrice": 1499,
  "deliveryInfo": "darmowa dostawa",
  "freeDelivery": false,
  "freeReturn": true,
  "lowestDeliveryPrice": 9.99,
  "sponsored": false,
  "bestPriceGuarantee": true,
  "smart": true,
  "sellerName": "sample_seller",
  "sellerBusiness": true,
  "sellerFeedbackPercent": 98.5,
  "superSeller": false,
  "category": "320000",
  "parameters": {
    "Kolor": "czarny",
    "Pamięć RAM": "8 GB",
    "Wbudowana pamięć": "128 GB"
  },
  "image": "https://a.allegroimg.com/s180/sample/sample-thumbnail",
  "images": [
    "https://a.allegroimg.com/s360/sample/sample-1",
    "https://a.allegroimg.com/s360/sample/sample-2"
  ],
  "ratingValue": 4.9,
  "ratingCount": 228,
  "offerCount": 75,
  "hasVariants": true,
  "recentBuyersLabel": "381 osób kupiło ostatnio",
  "sourceUrl": "https://allegro.pl/listing?string=smartfon",
  "sourceLabel": "search-1:smartfon"
}
```

With `fetchDetails` on, an enriched row also carries:

```jsonc
{
  "gtin": "0195950627114",
  "detailRatingValue": 4.9,
  "detailRatingCount": 228,
  "returnPolicyDays": 30,
  "returnPolicyUrl": "https://allegro.pl/regulaminy/polityka-reklamacji-i-zwrotow-na-allegro-sample",
  "reviews": [
    {
      "rating": 5,
      "date": "2026-07-26T14:26:15.391Z",
      "author": "S...1",
      "text": "Sample review text.",
      "pros": ["Fast delivery"],
      "cons": ["None"]
    }
  ],
  "reviewsCollected": 1
}
```

### Plan Requirement

Keep the default Apify Residential proxy with country Poland; Allegro serves pages only to a Polish consumer-class connection, and the actor rotates connections automatically when one is refused. `maxItems` is a maximum cap, not a guaranteed count: a run can save fewer offers when the phrase, link or keyword filter matches fewer active offers.

### FAQ

#### How much does it cost?

You pay per offer returned, plus an optional charge per offer actually enriched when Fetch full offer details is on. Reviews are included in the enrichment charge. The **Pricing** tab shows the current rates. Use **Max items** to cap the cost of any run.

#### Can I search by barcode?

Yes. Put an EAN/GTIN/UPC barcode in the **Barcodes** field (search mode), Allegro's own search resolves it straight to the matching product, the same way a text phrase does.

#### Is it legal to scrape Allegro?

This actor collects only publicly available marketplace data. You are responsible for how you use it: follow Allegro's terms and the laws that apply to you, and get legal advice if you plan commercial redistribution. Prices and offer facts are generally not protected, but seller content, photos and brand names may be subject to third-party rights.

#### Can I get only new or changed offers on a schedule?

Yes. Schedule the actor from the **Schedules** tab and turn on **Incremental mode**. Each run then returns only new and updated offers, and unchanged ones are not billed unless you turn on **Emit unchanged**.

#### Why does a single offer link make my run fail?

URL mode only reads Allegro listing and search pages. An offer page is treated as unreadable, so a run whose only source is an offer link fails with a connection message even though your connection is fine. Paste a `/listing?...` link, or use Search phrases to find the offer by name.

#### Why did my run fail instead of returning an empty dataset?

If the connection cannot reach readable pages, or your account lacks access to the selected proxy group, the run stops with a clear message so "no matching offers" is never confused with "nothing could be read". A genuinely empty search (every page read fine, nothing matched) succeeds quietly and simply saves no rows.

#### Can I use it with AI agents or MCP?

Yes. Call it from any Apify integration or MCP client, and use the connector field to push offers into Notion, Linear or Airtable.

### 🔗 More scrapers you might like

Pair this actor with these related scrapers from the same team:

<table>
<tr><td>🏠 <a href="https://apify.com/abotapi/otodom-pl-scraper"><b>Otodom.pl Scraper</b></a><br>Scrape Otodom.pl properties for sale and rent, including apartments, houses, plots...</td><td>🛒 <a href="https://apify.com/abotapi/mediamarkt-es-scraper"><b>MediaMarkt.es Scraper</b></a><br>Scrape MediaMarkt Spain (mediamarkt.es) products: current price, strike-through original...</td></tr>
<tr><td>🛒 <a href="https://apify.com/abotapi/bigw-marketplace-scraper"><b>BIG W Marketplace Scraper</b></a><br>Scrape BIG W Marketplace seller listings from bigw.com.au: name, brand, price, was-price...</td><td>🧩 <a href="https://apify.com/abotapi/walmart-scraper"><b>Walmart Scraper</b></a><br>Scrape Walmart.com by keyword, URL, or item ID. Extract prices, was-prices, sellers...</td></tr>
<tr><td>🏷️ <a href="https://apify.com/abotapi/bol-com-scraper"><b>bol.com Scraper</b></a><br>Scrape bol.com products: title, price, list price and discount, EAN, brand, images...</td><td>🧩 <a href="https://apify.com/abotapi/emag-com-scraper"><b>eMAG Scraper</b></a><br>Scrape eMAG products across Romania, Hungary, Bulgaria and Poland by keyword or URL...</td></tr>
</table>

👉 [Browse all abotapi scrapers](https://apify.com/abotapi)

### 💬 Support

- 🐞 **Found a bug or a missing field?** Open a ticket on the [Issues tab](https://apify.com/abotapi/allegro-pl-scraper/issues/open). We usually reply within hours.
- 🛠️ **Need another site, extra fields or a private build?** Email <contact@abotapi.com>.
- ⭐ **Enjoying it?** A quick review on the actor page helps other users find it.

# Actor input Schema

## `mode` (type: `string`):

Search mode builds Allegro listing searches from the Search phrases field. URL mode reads the Allegro URLs you paste in Start URLs.

## `queries` (type: `array`):

One or more search phrases. Each phrase is one search walk; every offer found is returned once.

## `barcodes` (type: `array`):

One or more product barcodes. Allegro's own search accepts a barcode exactly like a text phrase and resolves straight to the matching product, so each code becomes its own search walk, same as a phrase. Leave empty to skip. Both Search phrases and Barcodes may be filled together.

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

Allegro links to start from, forward-paged from wherever each one starts (a \&p=N page number in the link is honoured). Three link types work: a listing/search link (https://allegro.pl/listing?string=iphone), a category link (https://allegro.pl/kategoria/smartfony-i-telefony-komorkowe-165), or a seller/store link (https://allegro.pl/uzytkownik/smartSPOT). Single offer or product links (/oferta/... or /produkt/...) are not a start source — use Search phrases, Barcodes, or one of the three link types above instead.

## `keywords` (type: `array`):

Only keep offers where at least one keyword appears in the offer title (case-insensitive). Leave empty to keep every offer the search returns.

## `fetchDetails` (type: `boolean`):

Open each offer's own product page to add full description, brand, SKU, category, detail price/currency, availability, GTIN/barcode, return policy and reviews (see Max reviews per offer below). Slower, and charged per enriched offer on top of the offer record.

## `maxReviews` (type: `integer`):

Only applies with Fetch full offer details on. Cap on individual reviews captured per offer (0 disables review text; the aggregate rating and count are still attached). Reviews are included in Detail enrichment (no separate charge); the maximum is 1000. The true limit is however many reviews Allegro includes on the product page itself.

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

Maximum offers to return across the whole run. 0 is not valid; the cap is always finite.

## `maxPages` (type: `integer`):

Maximum Allegro result pages to read per search phrase or pasted URL. Leave empty to walk every result page; max items is the primary output cap.

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

Allegro serves pages only through a browser session on a Polish consumer-class exit, so the default is the Residential tier with country Poland.

## `resumeFromRunId` (type: `string`):

Paste a previous run ID (or dataset ID) from this actor to continue a large offer pull without returning or charging for offers already collected there (matched by offerId). Use this after an interrupted run. For recurring daily monitoring of the same search, use Incremental mode below instead.

## `incrementalMode` (type: `boolean`):

Turn this on for daily or recurring monitoring. The first run returns all matching offers as NEW. Later runs normally return only NEW, UPDATED, and REAPPEARED offers. Turn on "Emit unchanged" or "Emit expired" only when you also want those offers returned (and billed). State is kept separately for each search/URL and filter setup; use State key when you want to name or deliberately share a monitoring campaign. To continue one specific interrupted run instead, use Resume from a previous run above. Rating value/count, the recent-buyers label and count, and review text do not by themselves count as a change (other shoppers buying, rating or reviewing the product is not something you asked to monitor); price, stock status (isInStock), discount flag, delivery cost, shipping text, seller details, thumbnail and the other offer fields do trigger UPDATED. Offers saved by an older version of this actor are not flagged UPDATED just because these newer fields appeared; the newer fields are tracked from the following run.

## `stateKey` (type: `string`):

Optional. Name this monitoring campaign to keep its state stable, or to deliberately share state across differently-configured runs. Leave empty to let the actor derive a key automatically from the mode/search phrases/URLs/keywords: different searches then never mix state with each other.

## `emitUnchanged` (type: `boolean`):

Off by default. Turn on to also return offers that have not changed since the last run, marked UNCHANGED. This returns (and bills) extra rows you already have, so leave it off unless you specifically want the full snapshot every run.

## `emitExpired` (type: `boolean`):

Off by default. Turn on to also return offers that were present in a previous run but are no longer found, marked EXPIRED. Only produced once a run has fully scanned the tracked search, not when Max items capped it or when Resume was used. This returns (and bills) extra synthetic rows, so leave it off unless you need expiry tracking.

## `ignoreFieldsForChanges` (type: `array`):

Optional. Field names to exclude from UPDATED change detection, in addition to the built-in handling (rating value/count, the recent-buyers label and its numeric count (purchasesCount), and review fields already never trigger a false UPDATED, since they drift on their own as other shoppers buy, rate or review the offer, not because the offer changed; stock status isInStock does trigger UPDATED). Use this if another field in your setup turns out to be noisy.

## `mcpConnectors` (type: `array`):

Optionally send the scraped offers into the apps you already use, via Model Context Protocol (MCP) connectors. Authorize a connector once under Apify > Settings > API & Integrations, then select it here. Notion gets a page-per-offer export; other connectors receive a best-effort write or digest. Leave empty to skip. Supported: Notion (https://mcp.notion.com/mcp), Linear (https://mcp.linear.app/sse), Airtable (https://mcp.airtable.com/mcp), Apify (https://mcp.apify.com).

## `notionParentPageUrl` (type: `string`):

URL or id of the Notion page under which offer pages are created. Required to enable the Notion export; ignored by other connectors.

## `maxNotifyListings` (type: `integer`):

Cap on how many offers are written to each selected connector per run. Does not affect the dataset.

## Actor input object example

```json
{
  "mode": "search",
  "queries": [
    "iphone"
  ],
  "barcodes": [],
  "startUrls": [
    {
      "url": "https://allegro.pl/listing?string=iphone"
    },
    {
      "url": "https://allegro.pl/kategoria/smartfony-i-telefony-komorkowe-165"
    },
    {
      "url": "https://allegro.pl/uzytkownik/smartSPOT"
    }
  ],
  "keywords": [],
  "fetchDetails": false,
  "maxReviews": 20,
  "maxItems": 20,
  "maxPages": 0,
  "proxy": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "PL"
  },
  "incrementalMode": false,
  "emitUnchanged": false,
  "emitExpired": false,
  "ignoreFieldsForChanges": [],
  "maxNotifyListings": 50
}
```

# Actor output Schema

## `overview` (type: `string`):

No description

## `detail` (type: `string`):

No description

## `reviews` (type: `string`):

No description

## `changes` (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 = {
    "mode": "search",
    "queries": [
        "iphone"
    ],
    "barcodes": [],
    "startUrls": [
        {
            "url": "https://allegro.pl/listing?string=iphone"
        },
        {
            "url": "https://allegro.pl/kategoria/smartfony-i-telefony-komorkowe-165"
        },
        {
            "url": "https://allegro.pl/uzytkownik/smartSPOT"
        }
    ],
    "keywords": [],
    "fetchDetails": false,
    "proxy": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ],
        "apifyProxyCountry": "PL"
    },
    "incrementalMode": false,
    "emitUnchanged": false,
    "emitExpired": false,
    "ignoreFieldsForChanges": []
};

// Run the Actor and wait for it to finish
const run = await client.actor("abotapi/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 = {
    "mode": "search",
    "queries": ["iphone"],
    "barcodes": [],
    "startUrls": [
        { "url": "https://allegro.pl/listing?string=iphone" },
        { "url": "https://allegro.pl/kategoria/smartfony-i-telefony-komorkowe-165" },
        { "url": "https://allegro.pl/uzytkownik/smartSPOT" },
    ],
    "keywords": [],
    "fetchDetails": False,
    "proxy": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
        "apifyProxyCountry": "PL",
    },
    "incrementalMode": False,
    "emitUnchanged": False,
    "emitExpired": False,
    "ignoreFieldsForChanges": [],
}

# Run the Actor and wait for it to finish
run = client.actor("abotapi/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 '{
  "mode": "search",
  "queries": [
    "iphone"
  ],
  "barcodes": [],
  "startUrls": [
    {
      "url": "https://allegro.pl/listing?string=iphone"
    },
    {
      "url": "https://allegro.pl/kategoria/smartfony-i-telefony-komorkowe-165"
    },
    {
      "url": "https://allegro.pl/uzytkownik/smartSPOT"
    }
  ],
  "keywords": [],
  "fetchDetails": false,
  "proxy": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "PL"
  },
  "incrementalMode": false,
  "emitUnchanged": false,
  "emitExpired": false,
  "ignoreFieldsForChanges": []
}' |
apify call abotapi/allegro-pl-scraper --silent --output-dataset

```

## MCP server setup

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