# Chollometro Scraper — Spain Deals & Coupons (`reventadata/chollometro-scraper`) Actor

Extracts deals, vouchers, and discounts from chollometro.com categories and feeds with live prices, temperature votes, merchant details, and voucher codes. Applies client-side price and expiration filters without robots-disallowed query strings.

- **URL**: https://apify.com/reventadata/chollometro-scraper.md
- **Developed by:** [reventadata](https://apify.com/reventadata) (community)
- **Categories:** E-commerce, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.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

> **Unofficial.** This Actor is not affiliated with, authorised by, endorsed by, or in any
> way officially connected to Chollometro, Pepper.com, or Digital Link Marketing S.L.
> "Chollometro" is a trademark of its respective owner and is used here only to describe
> what this tool reads. It reads the same public pages a browser does.

Chollometro Scraper monitors and extracts deals, vouchers, and discounts from
[chollometro.com](https://www.chollometro.com) — Spain's largest social shopping and deals
community — and returns every deal with its price, **community temperature, voucher code,
merchant information, and expiration status as separate columns**.

### What data can you extract from Chollometro?

Every deal card published on Chollometro carries rich structured data. This Actor extracts:

- **Deal essentials:** Title, canonical deal URL, deal type (`Deal`, `Voucher`, or `Discussion`), category group, and main image.
- **Pricing & discounts:** Current deal price in EUR, reference/next-best price, and free shipping status.
- **Community feedback:** Temperature rating (votes in degrees, e.g. `200°`) and total comment count.
- **Coupons & vouchers:** Coupon codes (`voucherCode`) for online store checkout discounts.
- **Merchant attribution:** Merchant name (e.g. Amazon, AliExpress, MediaMarkt) and merchant slug.
- **Timestamps & status:** Publication timestamp, `isNew` flag, and `isExpired` flag.
- **Public attribution:** Public community username of the deal submitter (`posterUsername`). Private personal identities, emails, or phone numbers are never extracted.

### Why scrape Chollometro?

- **Real-time deal and price monitoring:** Track trending deals across Spain before stock runs out.
- **Voucher and coupon code discovery:** Filter specifically for active voucher codes across major Spanish online retailers.
- **Robots.txt compliant category and feed browsing:** Chollometro's `robots.txt` reserves its `/search` endpoint and query filters, but allows feed (`/ofertas`) and category (`/categorias/<slug>`) browsing. This Actor operates strictly on allowed paths, applying price and expiration filters client-side after fetch.
- **Fast, lightweight direct scraping:** Fully server-rendered HTML parsing without heavy headless browsers, delivering results in seconds with minimal compute overhead.

### How to scrape Chollometro

1. Choose your sources: use `"ofertas"` to monitor the main hot deals feed, or specify category slugs (e.g. `electronica`, `videojuegos`, `alimentacion`).
2. Set optional filters: `hideExpired` to discard expired bargains, or `minPrice` / `maxPrice` to narrow your price window.
3. Configure your pagination depth with `maxPages` and row cap with `maxItems`.
4. Run the Actor. Results stream directly into the Apify dataset.

#### Input

| Field | Type | Description |
|---|---|---|
| `sources` | array | One or more sources: `"ofertas"` for the main deal feed, or a category slug like `"electronica"`. Default `["ofertas"]`. |
| `maxItems` | integer | Maximum number of deals to extract. Default `1000`, prefill `10`. |
| `maxPages` | integer | Maximum pagination depth per source (30 deals/page). Default `50`, prefill `1`. |
| `hideExpired` | boolean | When `true`, discards expired deals client-side. Default `false`. |
| `minPrice` | number | Optional minimum price in EUR, applied client-side. |
| `maxPrice` | number | Optional maximum price in EUR, applied client-side. |

```json
{
    "sources": ["ofertas", "electronica"],
    "maxItems": 100,
    "maxPages": 5,
    "hideExpired": true,
    "minPrice": 10.0,
    "maxPrice": 150.0
}
```

#### Output

```json
{
    "threadId": "1996262",
    "title": "OSRAM ORBIS Quickfix Luz de techo LED 245mm 20W Plata",
    "url": "https://www.chollometro.com/ofertas/osram-orbis-quickfix-luz-de-techo-led-245mm-20w-plata-1996262",
    "type": "Deal",
    "source": "ofertas",
    "price": 13.42,
    "nextBestPrice": 24.99,
    "temperature": 200.4,
    "isExpired": false,
    "isNew": false,
    "voucherCode": null,
    "merchantName": "Amazon",
    "merchantUrlName": "amazon",
    "mainGroup": "Hogar",
    "mainImage": "threads/raw/2026/09/04/1996262_1.jpg",
    "publishedAt": 1757012000,
    "commentCount": 18,
    "shippingPrice": 0.0,
    "isFreeShipping": true,
    "posterUsername": "Sildavia"
}
```

### Notes and limits

- **Category & feed monitoring only:** Because `chollometro.com/robots.txt` disallows `/search` and all filter query parameters (`sortBy`, `priceFrom`, `hide_expired`), this Actor navigates `/ofertas` and `/categorias/<slug>` and executes filtering in memory.
- **Pagination limits:** Each page serves up to 30 deals. Chollometro hard-errors (HTTP 410) past the end of available listings (`lastPage`, maximum 334 pages / ~10,000 items on the main feed). The Actor safely clamps requests to `min(maxPages, lastPage)` and halts immediately if HTTP 410 is encountered.
- **Empty results trap:** When zero items match, Chollometro renders 4 fallback recommendation cards while reporting `pagination.items == 0`. This Actor checks `pagination.items` and discards fallback recommendation cards completely.
- **Redirect responses:** The scraper uses `follow_redirects=False`. If Chollometro responds with an HTTP 3xx redirect (e.g. for expired feeds or merged categories), the source halts safely to preserve boundary integrity.

### Pricing

Pay-per-result: **$1.00 per 1,000 items** ($0.001 per deal row pushed). Platform usage and proxy costs are absorbed.

| Volume | Cost |
|---|---|
| 100 deals | $0.10 |
| 1,000 deals | $1.00 |
| 10,000 deals | $10.00 |

### More Spanish marketplace & deal scrapers

| Target | Platform | Actor |
|---|---|---|
| Wallapop | Classifieds & Second-hand | [reventadata/wallapop-scraper](https://apify.com/reventadata/wallapop-scraper) |
| Milanuncios | Classifieds & Motor | [reventadata/milanuncios-scraper](https://apify.com/reventadata/milanuncios-scraper) |
| Todocoleccion | Antiques & Auctions | [reventadata/todocoleccion-scraper](https://apify.com/reventadata/todocoleccion-scraper) |
| Cash Converters | Second-hand & Graded Electronics | [reventadata/cashconverters-scraper](https://apify.com/reventadata/cashconverters-scraper) |
| eBay Spain | Active Auctions & Fixed Price | [reventadata/ebay-scraper](https://apify.com/reventadata/ebay-scraper) |
| Spain Multi-Marketplace | 5-in-1 Aggregator | [reventadata/wallapop-vinted-milanuncios-scraper](https://apify.com/reventadata/wallapop-vinted-milanuncios-scraper) |

# Actor input Schema

## `sources` (type: `array`):

One or more Chollometro sources to browse. Use 'ofertas' for the main deal feed (/ofertas) or a category slug (e.g. 'electronica', 'videojuegos', 'alimentacion') for /categorias/<slug>. Free-text search is omitted because /search is disallowed by robots.txt.

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

Maximum number of deals to extract across all sources. Low prefill ensures quick daily test verification.

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

Maximum pagination depth per source (30 deals per page). Clamped to the lastPage reported by the site.

## `hideExpired` (type: `boolean`):

When true, excludes expired deals. Applied client-side after fetch because the hide\_expired query param is disallowed by robots.txt.

## `minPrice` (type: `number`):

Optional minimum price in EUR. Applied client-side after fetch because the priceFrom query param is disallowed by robots.txt.

## `maxPrice` (type: `number`):

Optional maximum price in EUR. Applied client-side after fetch because the priceTo query param is disallowed by robots.txt.

## Actor input object example

```json
{
  "sources": [
    "ofertas"
  ],
  "maxItems": 10,
  "maxPages": 1,
  "hideExpired": false
}
```

# Actor output Schema

## `deals` (type: `string`):

Matching deals: price, temperature, merchant, voucher code, and link.

# 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 = {
    "sources": [
        "ofertas"
    ],
    "maxItems": 10,
    "maxPages": 1
};

// Run the Actor and wait for it to finish
const run = await client.actor("reventadata/chollometro-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 = {
    "sources": ["ofertas"],
    "maxItems": 10,
    "maxPages": 1,
}

# Run the Actor and wait for it to finish
run = client.actor("reventadata/chollometro-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 '{
  "sources": [
    "ofertas"
  ],
  "maxItems": 10,
  "maxPages": 1
}' |
apify call reventadata/chollometro-scraper --silent --output-dataset

```

## MCP server setup

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