# Pepper Scraper (`maximedupre/pepper-com-scraper`) Actor

Scrape public Pepper search pages from Poland and the Netherlands. Get structured deals with prices, links, community signals, dates, categories, images, voucher codes, and publisher details when available.

- **URL**: https://apify.com/maximedupre/pepper-com-scraper.md
- **Developed by:** [Maxime Dupré](https://apify.com/maximedupre) (community)
- **Categories:** E-commerce, Business, Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.50 / 1,000 deals

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?

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

### 🛒 Find Pepper deals in Poland and the Netherlands

For ecommerce teams, price researchers, and developers, Pepper Scraper reads public search pages from the Polish and Dutch Pepper sites. It returns structured deal data with prices, links, community signals, dates, and source details, so you can compare deals in one dataset.

- Search public Pepper deals for an **[Air Fryer](https://apify.com/maximedupre/pepper-com-scraper/examples/air-fryer)** and review matching prices and links.
- Find **[Lego](https://apify.com/maximedupre/pepper-com-scraper/examples/lego)** deals in the submitted search scope and save their source details.
- Collect **[Robot Vacuum](https://apify.com/maximedupre/pepper-com-scraper/examples/robot-vacuum)** deals with their visible prices and community signals.
- Track **[Wireless Headphones](https://apify.com/maximedupre/pepper-com-scraper/examples/wireless-headphones)** offers with source links and published dates.
- Review **[Gaming Laptop](https://apify.com/maximedupre/pepper-com-scraper/examples/gaming-laptop)** deals with current and comparison prices.
- Find **[iPhone](https://apify.com/maximedupre/pepper-com-scraper/examples/iphone)** deals and inspect merchant links, categories, and voucher codes when published.
- Search for **[Laptop](https://apify.com/maximedupre/pepper-com-scraper/examples/laptop)** deals across Polish or Dutch Pepper pages and compare community temperature.

#### 📦 Structured Pepper deal data

Each saved row is the first eligible occurrence of a deal found in the submitted search scope. If the same deal appears again through another URL, the later match is ignored and does not change the saved row.

**What each row includes**

Deal ID and title, source and merchant links, current and comparison prices, currency, shipping cost and free-shipping status, community temperature and comment count, publication, update, and expiry times, source status and type, merchant category and group, image links, voucher codes, public publisher details, and post state when Pepper publishes them.

#### 🚀 Run a Pepper search

Use one common run configuration for all submitted search URLs. To shorten a run, set a smaller page limit. No buyer login or authentication is needed for public Pepper pages.

**Run steps**

1. Add one or more public Pepper search-page URLs from the Polish or Dutch sites.
2. Set **Pages to read** for each URL. Leave it empty to return all available results until the source is exhausted.
3. Add an optional minimum community temperature or date filter.
4. Open the `results` link after the run to read the default dataset.

Use separate runs when different search URLs need different filters, because one configuration applies to every URL in a run.

**Access**

The Actor reads public pages and does not post, vote, bookmark, comment, or change Pepper content.

#### ⚙️ Input

**Input fields**

| Field | Type | What it does |
|---|---|---|
| `searchUrls` | array of objects (required) | Adds one or more public Pepper search-page URLs. |
| `searchUrls[].url` | string (required) | Gives the public Pepper search-page URL to read. |
| `maxPages` | integer (optional) | Limits the pages read for each submitted URL. Leave it empty to return all available results until the source is exhausted. |
| `minTemperature` | number (optional) | Keeps deals with a community temperature at or above this value. Leave it empty to include deals at any temperature. |
| `publishedAfter` | string (optional) | Keeps deals published on or after this date. Use `YYYY-MM-DD`. |
| `hotDateFrom` | string (optional) | Keeps deals whose source hot date is on or after this date. Use `YYYY-MM-DD`. |

`searchUrls` is required. The other fields are optional, and the same page limit and filters apply to every URL in the run.

**Example input**

This is the public input from a successful current-beta default-input run:

```json
{
  "searchUrls": [
    {
      "url": "https://www.pepper.pl/search?q=laptop"
    }
  ],
  "maxPages": 3
}
```

#### 🧾 Output

The run output includes a `results` link named **Pepper deal records**. It opens the default dataset. Each row contains the fields below. Optional fields are left out when Pepper does not publish them.

**Run output**

| Field | Type | What it does |
|---|---|---|
| `results` | string | Opens the default dataset of collected Pepper deal rows. |

**Dataset row fields**

| Field | Type | What it does |
|---|---|---|
| `dealId` | string (required) | Identifies the deal with the stable ID assigned by Pepper. |
| `title` | string (required) | Gives the deal title shown by Pepper. |
| `sourceUrl` | string (optional) | Links to the public Pepper deal page or share page. |
| `merchantUrl` | string (optional) | Links to the public merchant destination when Pepper provides one. |
| `pricing` | object (optional) | Groups the prices and shipping details published with the deal. |
| `pricing.currentPrice` | number (optional) | Gives the current deal price. |
| `pricing.comparisonPrice` | number (optional) | Gives the comparison price shown by Pepper. |
| `pricing.currency` | string (optional) | Gives the currency code or label used for the prices. |
| `pricing.shippingCost` | number (optional) | Gives the shipping cost shown by Pepper. |
| `pricing.freeShipping` | boolean (optional) | Says whether Pepper marks shipping as free. |
| `community` | object (optional) | Groups community activity signals published with the deal. |
| `community.temperature` | number (optional) | Gives the community temperature value. |
| `community.temperatureLevel` | string (optional) | Gives the temperature level shown by Pepper. |
| `community.commentCount` | integer (optional) | Gives the number of comments shown by Pepper. |
| `lifecycle` | object (optional) | Groups publication and source state details. |
| `lifecycle.publishedAt` | string (optional) | Gives when Pepper published the deal as a date-time value. |
| `lifecycle.updatedAt` | string (optional) | Gives when Pepper last updated the deal as a date-time value. |
| `lifecycle.expiresAt` | string (optional) | Gives when Pepper says the deal expires as a date-time value. |
| `lifecycle.sourceStatus` | string (optional) | Gives the status reported by Pepper for the deal. |
| `lifecycle.sourceType` | string (optional) | Gives the type reported by Pepper for the deal. |
| `merchantCategory` | string (optional) | Gives the merchant category published with the deal. |
| `merchantGroup` | string (optional) | Gives the merchant group published with the deal. |
| `imageUrls` | array of strings (optional) | Lists public image links published with the deal. |
| `voucherCodes` | array of strings (optional) | Lists voucher codes published with the deal. |
| `publisher` | object (optional) | Groups public publisher details attached to the deal. |
| `publisher.id` | string (optional) | Gives the public publisher ID. |
| `publisher.username` | string (optional) | Gives the public publisher username. |
| `publisher.displayName` | string (optional) | Gives the public publisher display name. |
| `publisher.profileUrl` | string (optional) | Links to the public publisher profile. |
| `postState` | string (optional) | Gives the post state reported by Pepper. |

**Example deal row**

This unshortened row came from a successful current-beta run. It includes prices, shipping, community signals, lifecycle data, links, category data, an image, and public publisher data.

```json
{
  "dealId": "416526",
  "title": "MSI Vector A16 HX RTX5070 Ti gaming laptop",
  "sourceUrl": "https://nl.pepper.com/share-deal/416526",
  "merchantUrl": "https://nl.pepper.com/visit/search/416526",
  "pricing": {
    "currency": "EUR",
    "currentPrice": 1599,
    "comparisonPrice": 1979,
    "shippingCost": 0,
    "freeShipping": true
  },
  "community": {
    "temperature": 281.26,
    "temperatureLevel": "Hot3",
    "commentCount": 14
  },
  "lifecycle": {
    "publishedAt": "2026-08-24T08:39:14.000Z",
    "updatedAt": "2026-08-24T11:36:14.000Z",
    "expiresAt": "2026-08-24T21:59:01.000Z",
    "sourceStatus": "Activated",
    "sourceType": "Deal"
  },
  "merchantCategory": "Elektronica",
  "merchantGroup": "elektronica",
  "imageUrls": [
    "https://static.pepper.com/threads/raw/eDzs2/416526_1/re/202x202/qt/70/416526_1.jpg"
  ],
  "publisher": {
    "id": "104699",
    "username": "DonPedro"
  },
  "postState": "Activated"
}
```

The source did not publish voucher codes or publisher display name and profile link for this row, so those optional fields are absent.

#### 💳 Pricing

This Actor uses pay-per-event pricing. The primary event is charged for each deal saved to the default dataset. A run that saves no deal does not create a charge for that primary event. See the Pricing tab for current rates.

#### 🔌 Integrations

https://www.youtube.com/watch?v=bNACk1\_S\_6w\&list=PLObrtcm1Kw6MUrlLNDbK9QRg8VDJg0gOW\&index=4

Start runs and read the default dataset in the Apify Console or through the standard Apify Actor API. You can export the dataset from Apify for your own workflow.

#### ❓ FAQ

##### What happens if two submitted URLs show the same deal?

The Actor saves the first eligible occurrence and ignores later matches from other submitted URLs. The saved row keeps the first match and is not rewritten.

##### Do the page and filter settings apply to every URL?

Yes. One run uses one page limit and one set of filters for every submitted URL. Use separate runs when those settings need to differ.

##### What does leaving Pages to read empty do?

It returns all available results until the source is exhausted.

##### Which Pepper pages can I submit?

Submit public search-page URLs from the Polish or Dutch Pepper sites. Private, login-gated, non-Pepper, and other page types are outside this Actor's scope.

##### What do the date filters mean?

`publishedAfter` keeps deals whose published date is on or after your date. `hotDateFrom` keeps deals whose source hot date is on or after your date. Use `YYYY-MM-DD` for both.

##### Why is a field missing from a row?

Pepper may not publish every optional value for every deal. The Actor leaves unavailable values out.

##### Does the Actor keep price history?

No. Each run returns data from the public pages at that time. Save repeat run datasets if you want to compare changes later.

### 📝 Changelog

**0.0: Initial release**

### 🆘 Support

For issues, questions, or feature requests, [file a ticket](https://console.apify.com/actors/maximedupre~pepper-com-scraper/issues) and I'll fix or implement it in less than 24h 🫡

### 🔗 Related Actors

- [Amazon Price Tracker](https://apify.com/maximedupre/amazon-price-tracker): Compare Pepper deal prices with current Amazon product snapshots.
- [Allegro Scraper for Prices and Sellers](https://apify.com/maximedupre/allegro-scraper): Compare Polish marketplace listings, prices, sellers, and delivery data with Pepper deals.
- [MercadoLibre Search Scraper](https://apify.com/maximedupre/mercado-libre-search-scraper): Collect marketplace search prices, sellers, shipping, and positions for comparison.
- [OLX Scraper](https://apify.com/maximedupre/olx-scraper): Study second-hand listing prices and seller details beside Pepper deals.
- [Trendyol Scraper](https://apify.com/maximedupre/trendyol-scraper): Collect marketplace products, prices, ratings, sellers, and discounts for broader research.

**Made with ❤️ by Maxime Dupré**

# Actor input Schema

## `searchUrls` (type: `array`):

Enter one or more public Pepper search-page URLs from the Polish or Dutch sites.

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

Set how many pages to read for each submitted search URL. Leave it empty to return all available results until the source is exhausted.

## `minTemperature` (type: `number`):

Only return deals with a community temperature at or above this value. Leave it empty to include deals at any temperature.

## `publishedAfter` (type: `string`):

Only return deals published on or after this date. Use YYYY-MM-DD.

## `hotDateFrom` (type: `string`):

Only return deals whose source hot date is on or after this date. Use YYYY-MM-DD.

## Actor input object example

```json
{
  "searchUrls": [
    {
      "url": "https://www.pepper.pl/search?q=laptop"
    }
  ],
  "maxPages": 3
}
```

# Actor output Schema

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

Open the structured Pepper deal records collected from your submitted search pages.

# 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 = {
    "searchUrls": [
        {
            "url": "https://www.pepper.pl/search?q=laptop"
        }
    ],
    "maxPages": 3
};

// Run the Actor and wait for it to finish
const run = await client.actor("maximedupre/pepper-com-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 = {
    "searchUrls": [{ "url": "https://www.pepper.pl/search?q=laptop" }],
    "maxPages": 3,
}

# Run the Actor and wait for it to finish
run = client.actor("maximedupre/pepper-com-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 '{
  "searchUrls": [
    {
      "url": "https://www.pepper.pl/search?q=laptop"
    }
  ],
  "maxPages": 3
}' |
apify call maximedupre/pepper-com-scraper --silent --output-dataset

```

## MCP server setup

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