# Allegro Category Listing Scraper (`apt_marble/allegro-category-listing-scraper`) Actor

Extract every product in any Allegro category with prices, sellers, ratings and sales data. Paste a category link or ID and get clean structured results — no login needed.

- **URL**: https://apify.com/apt\_marble/allegro-category-listing-scraper.md
- **Developed by:** [Hamza](https://apify.com/apt_marble) (community)
- **Categories:**
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$1.50 / 1,000 offer 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?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## Allegro Category Scraper

Browse any Allegro category the way a shopper would, and get every offer back as clean, structured data. Paste a category link — or just its numeric ID — and receive a row for each offer with its title, price, discount, seller, sales numbers, rating, product specs, delivery lines, image and a clean link. Narrow the category with keywords, a price range and sort order, and collect anywhere from a handful of offers to a full 5,000-row category export. Built for anyone who needs Allegro's catalog as data: sellers tracking competitors and price bands, analysts sizing a category, sourcing teams building product lists, and brands watching where their offers land.

### What you can do with it

- **Turn a category into a dataset** — point at a phone or sneaker category and get back thousands of live offers with price, seller, sales and specs, ready to filter and pivot.
- **Track price bands** — set a minimum and maximum price and sort cheapest-first to map what a product actually sells for right now.
- **Narrow with keywords** — add a search term inside the category to pull just the slice you care about, e.g. only "128GB" phones.
- **Reuse a category link you already built on Allegro** — paste the address with all its filters and the actor reads it back; anything you set in the run overrides the link.
- **Watch a category on a schedule** — re-run hourly or daily and compare each fresh dataset against the last to spot new offers, price moves and sold-count growth.
- **Go deeper on any offer** — every row carries a clean offer link, ready to feed into a product-details scraper for full descriptions and all photos.

### What you get

One row per offer. Abridged sample of a single result:

```json
{
  "offerId": "17456011011",
  "title": "Smartfon XYZ 128GB 5G czarny",
  "url": "https://allegro.pl/d/oferta/17456011011",
  "thumbnail": "https://a.allegroimg.com/s512/11a22b-aaa1-4bbb-8ccc-d1234567890a",
  "price": 1299.0,
  "currency": "PLN",
  "originalPrice": 1499.0,
  "sellerLogin": "example-seller",
  "soldCount": 214,
  "rating": 4.9,
  "reviewCount": 57,
  "condition": "new",
  "shippingInfo": "Free delivery",
  "categoryPath": "Electronics > Phones",
  "attributes": {
    "Kolor": "czarny",
    "Pamięć wbudowana": "128 GB"
  },
  "shippingOptions": ["Free delivery"]
}
```

Each row keeps the offer's main photo (high resolution), the tile's spec table as `attributes` (color, memory and similar), and the tile's delivery lines as `shippingOptions`. Listing tiles carry one photo and no description by design — for full descriptions, multi-photo galleries and true seller identities, feed the offer links into a product-details scraper.

### Input reference

| Setting | Type | Default | What it does |
| --- | --- | --- | --- |
| Category URLs | list of text | — | One or more Allegro category page addresses (`allegro.pl/kategoria/...`), or listing addresses with filters already applied — the actor mirrors the link's own filters, and anything you set below overrides them. **Required, unless you give a category ID or search term instead.** |
| Category IDs | list of text | — | Numeric Allegro category IDs (e.g. `165`) as an alternative to pasting links. |
| Search terms | list of text | — | Optional keywords applied inside the category to narrow it down. |
| Max items | whole number | `200` | How many offers to collect. The actor works through the category pages automatically until this number is reached or the offers run out. Maximum 5,000. |
| Sort | choice | `popularity` | `popularity`, `price_asc` (cheapest first), `price_desc` (priciest first), or `newest`. |
| Minimum price | number | — | Only return offers priced at or above this amount, in PLN. |
| Maximum price | number | — | Only return offers priced at or below this amount, in PLN. |
| Country | fixed | `Poland` | The actor reads Allegro Poland (`allegro.pl`); prices come back in PLN. |

### Output fields

| Field | Type | Description |
| --- | --- | --- |
| `offerId` | text | Allegro's numeric offer ID. |
| `title` | text | Offer title as shown to shoppers. |
| `url` | text | Clean link to the offer. |
| `thumbnail` | text | The offer's main image, high resolution. |
| `price` | number | Current price, in the stated currency. |
| `currency` | text | Currency code, normally `PLN`. |
| `originalPrice` | number | The struck-through was-price, when a discount is shown. |
| `sellerLogin` | text | Seller login name, when the tile lists one. |
| `sellerId` | text | Seller ID, when exposed — listing tiles usually do not carry it. |
| `soldCount` | number | Units sold, when shown. |
| `rating` | number | Offer or seller rating, when shown. |
| `reviewCount` | number | Number of opinions, when shown. |
| `condition` | text | Item condition, when the tile states it. |
| `shippingInfo` | text | Delivery summary, when the tile shows one. |
| `categoryPath` | text | Category breadcrumb for the scraped category. |
| `attributes` | object | The tile's spec table (e.g. color, memory), when the tile shows one. |
| `shippingOptions` | list of text | Delivery lines shown on the tile, when listed. |

### Pricing

You pay per result, with no monthly minimum.

| What you are charged for | Price |
| --- | --- |
| Category offer — one offer added to your dataset | **$1.50 per 1,000** |

**Worked example.** A category export collecting 1,000 offers costs 1,000 × $0.0015 = **$1.50**. A full 4,000-offer export is about **$6.00**. A daily watch collecting 500 offers is about $0.75 per run.

### Limits & what this actor cannot do

- Prices, stock, sales numbers and ranking are a snapshot at the moment of collection and keep changing afterwards.
- The actor returns what Allegro actually serves and reports distinct offers only — the same offer repeated across nearby pages is returned once.
- Each row carries the listing tile's single main photo, not the full gallery, and no description text; both live on the offer page, which listing tiles do not include.
- Where a tile omits a field — seller on some layouts, ratings or sold counts on others, delivery lines on some page layouts — the actor leaves it empty rather than guessing.
- Prices come back in each listing's own currency, normally PLN; a figure is never re-labelled into a different currency.
- The actor reads Allegro Poland only.
- Speed depends on the size of the job and on Allegro's own response times; no fixed throughput is promised.
- Allegro's terms govern automated access. You are responsible for using the data lawfully and in line with the source site's terms, and for handling any personal data in line with applicable privacy law.

### FAQ

**Do I need an Allegro account?**
No. The actor reads only what Allegro shows the public in its category listings.

**Does it need my login or password?**
No. There is nothing to connect and nothing to configure — paste a category link and press start.

**Can I paste a category link I already filtered on Allegro?**
Yes. Paste the full address and the actor mirrors its filters. Anything you set in the run overrides the link, and a link left to its own settings is followed as-is.

**How many offers can I get in one run?**
Up to 5,000 per run. If a category holds more than that, split it with keywords or price bands and run each slice.

**Why are some fields empty?**
Because the tile did not show them. The actor reports exactly what the listing carries — an empty field means "not shown", never a failed guess.

**Can I get full descriptions and all photos?**
Not from listing tiles — they only carry one photo and no description. Feed the offer links from any run into a product-details scraper for the complete record.

**Can I schedule it?**
Yes. Schedule it hourly, daily or weekly from the Apify console, and each run writes a fresh dataset you can compare against the last — ideal for tracking prices, new offers and sales over time.

**Is the data complete?**
It is complete for everything Allegro shows openly in its listings. The actor reports distinct offers rather than Allegro's shifting estimate of the total, and leaves unshown fields empty instead of inventing them.

# Actor input Schema

## `urls` (type: `array`):

Allegro category page URLs (allegro.pl/kategoria/... or listing URLs with filters to mirror).

## `categoryUrls` (type: `array`):

Alias of urls — Allegro category page URLs to scrape.

## `categoryIds` (type: `array`):

Numeric Allegro category IDs (appended to the category base URL).

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

Optional keywords applied inside the category (mapped to the string param).

## `searchTerms` (type: `array`):

Alias of queries.

## `country` (type: `string`):

Marketplace country code.

## `siteId` (type: `string`):

Alias of country.

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

Maximum number of offers to return per run.

## `sort` (type: `string`):

Listing sort order.

## `priceFrom` (type: `number`):

Optional minimum price filter.

## `priceTo` (type: `number`):

Optional maximum price filter.

## Actor input object example

```json
{
  "urls": [
    "https://allegro.pl/magazyn-allegro/rtv-i-agd"
  ],
  "categoryUrls": [],
  "categoryIds": [],
  "queries": [],
  "searchTerms": [],
  "country": "PL",
  "siteId": "PL",
  "maxItems": 50,
  "sort": "popularity"
}
```

# Actor output Schema

## `results` (type: `string`):

Every row this run produced.

## `runSummary` (type: `string`):

What this run collected, and anything it could not read.

# 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 = {
    "urls": [
        "https://allegro.pl/magazyn-allegro/rtv-i-agd"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("apt_marble/allegro-category-listing-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 = { "urls": ["https://allegro.pl/magazyn-allegro/rtv-i-agd"] }

# Run the Actor and wait for it to finish
run = client.actor("apt_marble/allegro-category-listing-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 '{
  "urls": [
    "https://allegro.pl/magazyn-allegro/rtv-i-agd"
  ]
}' |
apify call apt_marble/allegro-category-listing-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,apt_marble/allegro-category-listing-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/jz7pygjNVAEEpJtOz/builds/mH5boY9lfKjkzzm3b/openapi.json
