If you sell on Allegro or buy stock for resale in Poland, the question you ask every week is simple: who else sells this exact product, and at what price? Searching by product name gets messy fast. Searching by EAN barcode is cleaner, because one barcode should point to one product card on Allegro, and that card lists every seller.
This tutorial shows how to pull that seller list for a batch of EAN codes with the Allegro EAN Price Tracker on Apify. First without code, then from Python with pandas. Every number below comes from one test run I did on 4 barcodes.
What the test run returned
Input: 4 EAN codes, Allegro.pl, up to 10 offers per product, cheapest first, one row per offer.
The run took 241 seconds and returned 24 rows: 23 seller offers plus 1 row for a barcode Allegro did not know.
| EAN | Product on Allegro | Offers | Lowest | Highest | Average |
|---|---|---|---|---|---|
| 195949036842 | Apple iPhone 15 6 GB / 256 GB 5G, black | 10 | 1,400.00 PLN | 3,173.90 PLN | 2,040.49 PLN |
| 5702017584072 | LEGO Technic 42173 Koenigsegg Jesko Absolut | 3 | 175.67 PLN | 419.90 PLN | 265.19 PLN |
| 5449000000996 | 5 l PET bottle listing | 10 | 4.00 PLN | 4.00 PLN | 4.00 PLN |
| 5900084231472 | not found | 0 |
A few things stood out. The iPhone spread is huge, more than 1,700 PLN between the cheapest and the most expensive offer for the same product card. Of those 10 iPhone offers, 9 had Allegro Smart! delivery, 6 came from Super Sellers and 3 were promoted placements. The most expensive one carried the Lowest Price Guarantee badge and a 12-day delivery time.
The third barcode is a good warning. I used the example code from the actor's input description and it matched a listing for a 5-litre PET bottle. Always read productName before you trust a row.
What data you get
With outputFormat: "offers" you get one flat row per seller offer. These are the fields I found most useful:
| Field | What it holds |
|---|---|
ean |
The barcode you sent |
productName |
Name of the Allegro product card the EAN matched |
title |
The seller's own offer title |
price / priceWithDelivery
|
Item price and price including the cheapest delivery, in PLN |
deliveryTime |
Delivery text as Allegro shows it, e.g. "dostawa jutro" |
smart |
Offer has Allegro Smart! delivery |
superSeller / sellerRating
|
Super Seller badge and positive rating in percent |
sellerIsCompany |
Whether the seller account is a business |
promoted |
Sponsored placement |
lowestPriceGuarantee |
Offer has the "Gwarancja najniższej ceny" badge |
productRating / productReviewsCount
|
Product card rating and review count |
url |
Link to the offer |
Barcodes that match nothing come back as a row with found: false and a note. In my run that note read "No Allegro product with this EAN (Allegro only showed similar products)."
With outputFormat: "products" (the default) you get one record per EAN instead, with lowestPrice, highestPrice, avgPrice, offerCount and the offers nested in an offers[] array. Use that when you only care about the price range per product.
Option 1: no code
- Open the actor page and click Try for free.
- Paste your barcodes into EAN / GTIN codes, one per line.
- Pick the marketplace. Allegro.pl is the default, Allegro.cz and Allegro.sk are also supported.
- Set Top N offers per product. The default is 20, the maximum is 500.
- Choose the output format and click Start.
- When the run finishes, export the dataset as Excel, CSV or JSON.
The main input options:
-
topNOffers: how many seller offers per product. -
sortBy:price-asc,price-descorrating-desc. In my run the dataset rows did not come out in price order, so sort again on your side. -
smartFilter:all,smart-onlyorexclude-smart. -
includePromoted: set tofalseto drop sponsored offers. -
detectHiddenDiscounts: for offers with the Lowest Price Guarantee badge, it adds the price the seller actually set (realSellerPrice) and how much Allegro covers. This one is billed per checked offer, so leave it off unless you need it. -
onlyChangeswithmonitorId: monitoring mode, explained below.
Option 2: Python with apify-client and pandas
Install the two libraries:
pip install apify-client pandas
Then run the actor and load the results into a DataFrame. You need your Apify API token from the Integrations page in the Apify Console. Keep it in an environment variable, not in the script.
import os
import pandas as pd
from apify_client import ApifyClient
client = ApifyClient(os.environ["APIFY_TOKEN"])
run_input = {
"eans": ["195949036842", "5702017584072", "5449000000996", "5900084231472"],
"marketplace": "pl",
"topNOffers": 10,
"sortBy": "price-asc",
"smartFilter": "all",
"includePromoted": True,
"outputFormat": "offers",
}
run = client.actor("liveclaude/allegro-ean-price-tracker").call(run_input=run_input)
items = client.dataset(run["defaultDatasetId"]).list_items(clean=True).items
df = pd.DataFrame(items)
# Barcodes Allegro did not recognise
if "found" in df.columns:
missing = df[df["found"] == False]
print("Not found:", missing["ean"].tolist())
offers = df[df["price"].notna()].copy()
summary = (
offers.groupby(["ean", "productName"])
.agg(
offers=("price", "size"),
lowest=("price", "min"),
highest=("price", "max"),
median=("price", "median"),
smart_share=("smart", "mean"),
)
.round(2)
.sort_values("offers", ascending=False)
)
print(summary)
summary.to_csv("allegro_ean_prices.csv")
One cleanup step is worth adding. On the iPhone card, some offer titles mentioned ex-display units ("Powystawowy"), condition notes ("Stan: bardzo dobry") or even a different variant (one said 15 Plus, another 128GB). Sellers attach offers to product cards loosely, so filter titles before you compare prices:
noise = r"powystaw|stan:|używan|kondycja|plus|128gb"
clean = offers[~offers["title"].str.contains(noise, case=False, na=False)]
cheapest = clean.sort_values("priceWithDelivery").groupby("ean").head(3)
print(cheapest[["ean", "price", "priceWithDelivery", "smart", "superSeller", "url"]])
Adjust the pattern for your product category. For LEGO sets you will want different words than for phones.
Scheduling and price alerts
For ongoing tracking, turn on onlyChanges and give the watch list a monitorId, for example competitors-lego. Then add a schedule in Apify, say every morning at 7:00. Each run returns only new sellers and offers whose price changed since the previous run, with previousPrice, priceChange and priceChangePercent. According to the actor's README, unchanged offers are not charged.
From there you can push results to Google Sheets, Slack, email, Make, Zapier or n8n through Apify integrations, or poll the dataset from your own repricing script. Use a separate monitorId per list so the change history stays clean.
Pricing per 1,000 results
The actor uses pay per event. Current prices on the Free plan, with the Business plan price in brackets:
- Product resolved by EAN: $10 per 1,000 EANs ($7 on Business)
- Seller offer: $2 per 1,000 offers ($1.50 on Business)
- EAN not found: $1 per 1,000
- Hidden discount check: $10 per 1,000 checked offers, only if you enable it
So 1,000 barcodes with 10 offers each would come to roughly $10 for products plus $20 for 10,000 offers on the Free plan, before the small per-run start fee. Matched products are cached for 24 hours, which helps if you rerun the same list the same day.
Responsible use
The actor reads publicly visible offer data. In my run all 23 offers came from business accounts, but Allegro also has private sellers, and a seller login can be a person's nickname. If you store or share results, drop or mask sellerLogin and sellerUrl unless you have a reason and a legal basis to keep them, and handle any personal data under GDPR. Keep run frequency sensible: once or twice a day is plenty for price monitoring.
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)