Allegro is the biggest marketplace in Poland, and if you sell there (or compete with people who do) you end up checking prices by hand far too often. This guide shows how to pull Allegro search results into a spreadsheet or a pandas DataFrame with the Allegro Product Scraper on Apify. No login, no browser automation on your side.
For this post I ran it on one search phrase, ekspres do kawy (coffee machine), sorted by popularity, new items only, capped at 40 offers. The run finished in about 75 seconds. Every number below comes from that dataset.
What you get per offer
The default mode reads the search listing only, which is fast and cheap. One row per offer:
| Field | What it holds | Example from my run |
|---|---|---|
title |
Offer title | Ekspres ciśnieniowy automatyczny Philips ... |
price / currency
|
Current price | 943.00 PLN |
originalPrice, discountPercent
|
Price before discount (lowest of last 30 days), if shown | 249.00 → 199.00 |
priceWithDelivery, deliveryTime
|
Cheapest price incl. shipping and the delivery promise | 957.99, "dostawa jutro" |
smart |
Allegro Smart! free delivery eligible | true |
lowestPriceGuarantee |
"Gwarancja najniższej ceny" badge | true |
promoted |
Sponsored placement | true |
recentBuyers |
"X people bought recently" counter | 192 |
superSeller, sellerRating, sellerIsCompany
|
Seller badges and rating | true, 99.5, true |
productOffersCount |
How many sellers offer the same catalogue product | 51 |
productRating, productReviewsCount
|
Product reviews | 4.95, 544 |
parameters, mainImage, images
|
Key specs and photos |
Switch on Full offer details (scrapeDetails: true) and the scraper also opens each offer page. Then you get EAN/GTIN, brand, stock, units sold in the last 30 days, the full parameter table, description, warranty, category path and the rating distribution.
What 40 offers told me
A quick look at the raw data before any cleaning:
- Prices ranged from 17.99 PLN to 1,949 PLN, median 232.76 PLN. That median is low because a popularity sort mixes in accessories. 11 of the 40 rows were mats, gaskets, descaler or toy coffee machines for kids. Filtering titles down to real machines left 29 rows with a median of 419 PLN.
- 36 of 40 offers were promoted. On a popularity-sorted first page, sponsored slots are most of what you see. If you want organic results, set
includePromotedto false. - 38 offers were Smart! and only 7 had free delivery for everyone.
priceWithDeliveryis the column to compare if your customers do not have Smart!. - 18 offers carried the Lowest Price Guarantee badge, all of them actual machines.
- The median machine had 22 competing sellers for the same catalogue product (
productOffersCount). One cheap automatic machine had 320. - Seller ratings sat between 94.8% and 100%.
That last point about competing sellers is where the scraper gets useful for pricing work. If a product has 50 sellers, you probably want all 50 prices, which is what the EAN mode below is for.
Option 1: no code
- Open the actor page and click Try for free. A free Apify account works.
- Pick the marketplace: Allegro.pl, .cz or .sk. Currency follows (PLN, CZK, EUR).
- Add one or more Search phrases. You can also paste Allegro URLs: a category, a seller shop (
/uzytkownik/...), single offers or product pages. Or paste EAN codes. - Set Max. offers per input. I used 40.
- Optional filters: min/max price, condition, sort order, Smart! only, hide promoted.
- Click Start, wait, then export from the Storage tab to Excel, CSV or JSON.
Here is the input form so you can see where everything sits:
Option 2: Python with apify-client and pandas
Install the two packages:
pip install apify-client pandas
Then run the actor and load the results. Your API token is under Settings → API & Integrations in the Apify console. Keep it in an environment variable.
import os
import pandas as pd
from apify_client import ApifyClient
client = ApifyClient(os.environ["APIFY_TOKEN"])
run_input = {
"marketplace": "pl",
"searchQueries": ["ekspres do kawy"],
"maxItemsPerInput": 40,
"condition": "new",
"sortOrder": "popularity",
}
run = client.actor("liveclaude/allegro-seller-scraper").call(run_input=run_input)
items = client.dataset(run["defaultDatasetId"]).list_items().items
df = pd.DataFrame(items)
# Drop accessories that a popularity sort pulls in
junk = "mata|uszczel|odkamien|podkładk|dla dzieci|zabawka"
machines = df[~df["title"].str.contains(junk, case=False)]
cols = ["title", "price", "priceWithDelivery", "smart", "promoted",
"recentBuyers", "productOffersCount", "lowestPriceGuarantee", "url"]
print(machines[cols].sort_values("recentBuyers", ascending=False).head(10))
print("median price:", machines["price"].median())
machines[cols].to_csv("allegro_coffee_machines.csv", index=False)
The call() method blocks until the run ends, so for big jobs you may prefer start() and polling.
The input options that matter
Ways in. searchQueries, startUrls and eans can all go into one run. Category URLs are good for whole-segment exports. A seller shop URL gives you a competitor's full catalogue.
EAN mode. Put barcodes in eans and the actor returns every seller of that product, ranked by price, with lowest, highest and average price. maxOffersPerProduct (default 50) caps sellers per product. allSellersForProducts does the same for product URLs.
{ "eans": ["195949036842", "5702017584072"], "maxOffersPerProduct": 50 }
Output shape. outputFormat: "offers" gives one row per offer. "products" groups them.
More than 6,000 results. Allegro stops at 100 pages per search. With deepPagination on (the default), the actor splits large searches into price bands so a full category export still works.
Hidden discounts. detectHiddenDiscounts shows, for Lowest Price Guarantee offers, the price the seller set and how much Allegro covers (realSellerPrice, hiddenDiscount). No extra charge.
Seller company data. sellerCompanyDetails adds company name, NIP, KRS and address from the seller's public business info.
Images. downloadImages with maxImages (default 5) stores the files, handy if you are building a product feed.
Scheduling and integrations
For price monitoring, turn on onlyChanges and give the job a monitorId, for example "coffee-machines". Each scheduled run then returns only new offers and changed prices, with previousPrice and priceChange fields. Unchanged offers are not charged.
{
"startUrls": ["https://allegro.pl/kategoria/smartfony-i-telefony-komorkowe-165"],
"onlyChanges": true,
"monitorId": "smartphones",
"maxItemsPerInput": 5000
}
Add a schedule in the Apify console (daily at 6:00 is a sane start). Results can flow into Google Sheets, Make, Zapier, n8n or Slack, or a webhook can ping your own service when a run finishes. The actor also works from Claude, ChatGPT or Cursor through the Apify MCP server.
Pricing
Pay per event, platform usage included. Per 1,000 offers, at the current price list:
| Event | Free | Starter | Scale | Business |
|---|---|---|---|---|
| Offer from listing | $3.50 | $3.20 | $3.00 | $2.80 |
| Offer with full details | $6.00 | $5.50 | $5.00 | $4.50 |
Monitoring, hidden-discount detection and image download cost nothing extra. At the Free tier rate, my test run (36 charged listing events) works out to about 13 cents.
Responsible use
The actor reads public offer pages only. Business sellers' company data is information they publish on Allegro themselves. Some Allegro sellers are private persons, though, and their logins can be personal data under GDPR. If you store or share the dataset, drop or pseudonymise sellerLogin for non-company sellers (sellerIsCompany tells you which). Keep request volumes reasonable and check Allegro's terms for your use case.
This tutorial was written with AI assistance and checked by the author. All numbers come from a real run of the scraper.


Top comments (0)