# Pepper Scraper (`trev0n/pepper-scraper`) Actor

Extract deal data from Pepper.pl, most popular deal-sharing platform. Get comprehensive information including prices, discounts, deal temperatures (vote scores), merchant details, user comments, and timestamps.

- **URL**: https://apify.com/trev0n/pepper-scraper.md
- **Developed by:** [Paweł](https://apify.com/trev0n) (community)
- **Categories:** E-commerce, Automation, Lead generation
- **Stats:** 3 total users, 0 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.00 / 1,000 results

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

## Pepper.pl Deals Scraper

An Apify Actor for scraping deal data from [Pepper.pl](https://www.pepper.pl) - Poland's largest deal-sharing community. Extract deal information including prices, discounts, temperatures, merchants, categories and posters.

### Features

- **Rich deal data** - prices, discounts, temperature, merchant, category, poster, timestamps
- **No duplicates** - every listing page returns a distinct set of deals, and repeated (pinned) deals are filtered out within a run
- **Fast and cheap** - reads the server-rendered listing data over plain HTTP, no browser needed (~1 second per page)
- **Category support** - all deals, hot deals or newest deals
- **Search support** - scrape search results for any phrase
- **Temperature filter** - keep only deals hot enough for you
- **Proxy configurable** - Apify Proxy datacenter servers by default, your own selection if you prefer

### Input Configuration

| Parameter            | Type    | Description                                                 | Required | Default                     |
| -------------------- | ------- | ----------------------------------------------------------- | -------- | --------------------------- |
| `maxPages`           | Integer | How many listing pages to scrape (~30 deals per page)       | No       | 2                           |
| `category`           | String  | Listing to scrape: `all`, `hot` or `new`                    | No       | `all`                       |
| `minTemperature`     | Integer | Only return deals with temperature >= this value            | No       | 0                           |
| `searchQuery`        | String  | Scrape search results for this phrase instead of a category | No       | `""`                        |
| `proxyConfiguration` | Object  | Proxy used for requests                                     | No       | `{ "useApifyProxy": true }` |

#### Example Input - Basic Scraping

```json
{
    "maxPages": 5,
    "category": "hot",
    "minTemperature": 100
}
```

#### Example Input - Search for Specific Deals

```json
{
    "searchQuery": "PlayStation",
    "maxPages": 3,
    "minTemperature": 50
}
```

#### Example Input - New Deals Only

```json
{
    "category": "new",
    "maxPages": 10,
    "minTemperature": 0
}
```

### Output Format

```json
{
    "dealId": "1348213",
    "dealType": "Deal",
    "dealTitle": "Hantel żeliwny regulowany 40kg Rebel",
    "slug": "hantel-zeliwny-regulowany-40kg-rebel",
    "dealDescription": "Dobra cena, wyglada podobnie do 4fizjo, ktory juz mam i byl o wiele drozszy.",
    "url": "https://www.pepper.pl/promocje/hantel-zeliwny-regulowany-40kg-rebel-1348213",

    "price": 369.99,
    "displayPrice": "369,99zł",
    "originalPrice": 529,
    "displayOriginalPrice": "529,00zł",
    "discount": 159.01,
    "discountPercent": 30,

    "temperature": 268.11,
    "temperatureLevel": "Hot2",
    "commentCount": 9,
    "shareCount": null,

    "publishedAt": "2026-09-09T09:24:51.000Z",
    "createdAt": "2026-09-09T09:24:51.000Z",
    "updatedAt": "2026-09-09T09:46:09.000Z",
    "startsAt": "2026-09-08T16:41:00.000Z",
    "endsAt": "2026-09-15T16:39:00.000Z",

    "isExpired": false,
    "isLocal": false,
    "isHot": true,
    "isNew": false,
    "isPinned": false,
    "expirable": true,
    "nsfw": false,

    "merchant": {
        "id": "21",
        "name": "Decathlon",
        "urlName": "decathlon.pl"
    },
    "merchantHost": "www.decathlon.pl",

    "postedBy": "bartimeole",
    "groupIds": ["103"],
    "groupName": "Sport i turystyka",

    "imageUrl": "https://static.pepper.pl/threads/raw/fcWqW/re/730x575/qt/60/1348213_1.jpg",

    "shipping": {
        "isFree": true,
        "price": 0
    },

    "scrapedAt": "2026-09-09T17:47:11.000Z"
}
```

### Output Fields Reference

#### Basic Deal Information

- `dealId` - unique deal ID (threadId)
- `dealType` - deal type, usually `Deal`
- `dealTitle` - deal title
- `slug` - URL-friendly title slug
- `dealDescription` - deal description as shown in the listing (Pepper truncates long descriptions there, so expect roughly the first 180 characters)
- `url` - direct link to the deal page

#### Pricing

- `price` - current/deal price
- `displayPrice` - formatted price with currency
- `originalPrice` - price before the discount, when the deal states one
- `displayOriginalPrice` - formatted original price
- `discount` - discount amount in PLN
- `discountPercent` - discount percentage

#### Popularity & Engagement

- `temperature` - deal temperature (vote score)
- `temperatureLevel` - temperature tier (`Hot1`, `Hot2`, `Hot3`, ...)
- `commentCount` - number of comments
- `shareCount` - always `null`; Pepper no longer exposes share counts in the listing data

#### Timestamps

All timestamps are ISO 8601.

- `publishedAt` - when the deal was published
- `createdAt` - when the deal was created (equals `publishedAt` for listing data)
- `updatedAt` - when the deal was last updated
- `startsAt` - deal start date, when the poster set one
- `endsAt` - deal expiry date, when the poster set one

#### Status Flags

- `isExpired`, `isLocal`, `isHot`, `isNew`, `isPinned`, `nsfw`
- `expirable` - whether the deal has an expiry date

#### Merchant Information

- `merchant.id`, `merchant.name`, `merchant.urlName`
- `merchantHost` - host of the outgoing deal link

#### User & Categories

- `postedBy` - username of the deal poster
- `groupIds` - category/group IDs of the deal (main category)
- `groupName` - main category name

#### Media & Shipping

- `imageUrl` - deal image URL
- `shipping.isFree`, `shipping.price`

### Use Cases

- **Deal monitoring** - track the hottest deals in real time
- **Price intelligence** - monitor prices across merchants
- **Market research** - analyse deal trends and popular products
- **Deal aggregation** - build deal aggregator services
- **Notifications** - power deal alert systems

### Categories

| Category | URL                              | Description          |
| -------- | -------------------------------- | -------------------- |
| `all`    | `https://www.pepper.pl`          | All deals (homepage) |
| `hot`    | `https://www.pepper.pl/promocje` | Hot/trending deals   |
| `new`    | `https://www.pepper.pl/nowe`     | Newest deals         |

### Temperature Guide

| Temperature | Meaning                    |
| ----------- | -------------------------- |
| < 0°        | Cold deal (negative votes) |
| 0° - 100°   | Lukewarm deal              |
| 100° - 200° | Warm deal                  |
| 200° - 500° | Hot deal                   |
| 500°+       | Very hot deal              |

### Best Practices

- **Set `minTemperature`** to filter out low-quality deals
- **Use `category: "hot"`** to get only trending deals
- **Limit `maxPages`** to control run time and cost - one page is ~30 deals
- **Use `searchQuery`** when looking for specific products or brands

### Technical Details

The Actor reads the deal objects that Pepper server-renders into every listing page, so a single
HTTP request per page returns the complete data for ~30 deals. No browser and no GraphQL calls are
involved, which keeps runs fast (about a second per page) and avoids the duplicate results that
page-agnostic API calls produce.

If a search phrase or filter matches nothing, Pepper responds with a page of recommended deals
instead of results. The Actor detects those pages and pushes nothing, so an empty search never
produces (or charges for) irrelevant items - the reason is stored in the `NO_RESULTS` record of the
run's key-value store.

***

### Related Actors

Check out other scrapers from the same developer:

- **[Mohito Scraper](https://apify.com/trev0n/mohito-scraper)** - Scrape product data from Mohito.com fashion store
- **[Sinsay Scraper](https://apify.com/trev0n/sinsay-scraper)** - Fast scraper for Sinsay.com product data
- **[Ceneo Product Scraper](https://apify.com/trev0n/ceneo-scraper)** - Extract product data from Poland's largest price comparison website

***

### Your Feedback

We are always working to improve our scrapers. If you have any technical feedback or found a bug, please create an issue in the repository or contact us through Apify Console.

# Actor input Schema

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

How many listing pages to scrape (each page holds ~30 deals).

## `category` (type: `string`):

Which listing to scrape: all deals (homepage), hot deals or newest deals.

## `minTemperature` (type: `integer`):

Only return deals with a temperature greater than or equal to this value (0 = all deals).

## `searchQuery` (type: `string`):

Optional - scrape search results for this phrase instead of a category listing.

## `proxyConfiguration` (type: `object`):

Proxy used for the requests. Apify Proxy datacenter servers are enough for Pepper.pl and are used by default.

## Actor input object example

```json
{
  "maxPages": 2,
  "category": "all",
  "minTemperature": 0,
  "searchQuery": "",
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `overview` (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 = {
    "maxPages": 2,
    "category": "all",
    "minTemperature": 0,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("trev0n/pepper-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 = {
    "maxPages": 2,
    "category": "all",
    "minTemperature": 0,
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("trev0n/pepper-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 '{
  "maxPages": 2,
  "category": "all",
  "minTemperature": 0,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call trev0n/pepper-scraper --silent --output-dataset

```

## MCP server setup

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