# Yapo.cl Scraper: Chile Classified Ads (`reventadata/yapo-scraper`) Actor

Scrape Yapo.cl classified ads by category, keyword, price range and sort order. Rows have title, description, price in CLP, region and commune, dates, availability, seller name and photos. Filter by words and place. Unofficial.

- **URL**: https://apify.com/reventadata/yapo-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?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
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.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## 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.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Yapo.cl Scraper

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

Collects classified ads from Yapo.cl, Chile's classifieds site, as one row per ad: title,
description, price, location, category, dates, availability, seller name and photos, ready
for a spreadsheet or a price tracker.

### What does it do?

Opens the Yapo.cl category pages you name, such as `https://www.yapo.cl/electronica-telefono-movil`
(mobile phones), optionally searched by keyword, price range and sort order, walks the result
pages and returns one row per ad. An ad found under several keywords or categories is
returned once.

### Why use it?

- **The whole listing, not the first page.** Each result page holds 20 ads and the Actor
  follows the site's own pagination to its last page. A 1,000-ad run took about 12 minutes
  on Apify (50 pages of one phone category).
- **Price, sort and keyword applied by the site.** Minimum and maximum price (either end can
  be left empty), newest-first, oldest-first and price order, and the keyword search all
  run on yapo.cl, so the Actor only reads the pages you asked for.
- **Filters the site does not offer.** Words an ad must or must not contain, and a place
  (region or commune), are applied after the fetch, ignoring case and accents.
- **Clean text and numbers.** Prices are numbers, dates are ISO 8601, and ad text comes with
  the page's line-break tags and character codes already turned into normal text.

### How to use it

1. Put one or more categories in `categories`. Open a category on yapo.cl and copy it from
   the address bar: either the last part (`electronica-telefono-movil`) or the whole address.
2. Optionally add `searchQueries` (one search per keyword), `minPrice` and `maxPrice` in
   Chilean pesos, `sort`, and the keyword and place filters.
3. Set `maxItems` and run. Download JSON, CSV or Excel from the dataset.

#### Input

| Field | Type | Description |
|---|---|---|
| `categories` | array | Category pages to read: a slug such as `electronica-telefono-movil`, `electronica`, `autos-usados`, or a full yapo.cl address. Required: the site has no all-categories listing, and its home, `marketplace`, `autos`, `bienes-raices` and `empleos` pages are not listings. |
| `searchQueries` | array | Keywords searched inside each category. Leave empty to read the category as it is. The site's search is broad, so combine it with `includeKeywords` for exact words. |
| `maxItems` | integer | Most ads to return across all categories and keywords. |
| `maxPages` | integer | Most result pages per category and keyword (20 ads each). |
| `sort` | string | `RELEVANCE` (the site's popularity order), `NEWEST`, `OLDEST`, `PRICE_ASC`, `PRICE_DESC`. |
| `minPrice`, `maxPrice` | number | Price range in CLP, applied by the site. |
| `includeKeywords` | array | Keep ads whose title or description contains every one of these words. |
| `excludeKeywords` | array | Drop ads whose title or description contains any of these words. |
| `locationContains` | string | Keep ads whose location text (region and commune) contains this, for example `Santiago` or `Viña del Mar`. |
| `onlyAvailable` | boolean | On by default: drops ads the site itself marks "Anuncio no disponible". |
| `proxyConfiguration` | object | Apify Unblocker by default. |

#### Sample input

```json
{
    "categories": ["electronica-telefono-movil"],
    "searchQueries": ["iphone"],
    "sort": "NEWEST",
    "minPrice": 100000,
    "maxPrice": 300000,
    "maxItems": 20
}
```

#### Output

Each row holds `id`, `url`, `title`, `description`, `price`, `currency`, `location`,
`region`, `commune`, `category`, `categorySlug`, `vertical`, `postedAt`, `updatedAt`,
`available`, `featured`, `sellerId`, `sellerName`, `sellerVerified`, `imageUrl`,
`imageUrls`, `searchCategory`, `matchedKeyword`, `page` and `scrapedAt`.

- `price` is the asking price in pesos. `price` and `currency` are empty when the ad states
  no price (28 of 1,000 ads in one phone run).
- `location` is the site's text, region then commune. `region` and `commune` are its two
  parts; both are empty when the site gives only "Chile".
- `postedAt` is the creation date; `NEWEST` and `OLDEST` order by it. `updatedAt` is the
  last edit.
- `featured` is the paid highlight tier (`silver`, `gold` or `platinum`), empty for a
  regular ad.
- `sellerId` and `sellerName` are the account id and name shown on the ad. Phone and
  WhatsApp numbers are not in the rows: the listing page scrambles them and the Actor does
  not decode them.
- `PRICE_ASC` and `PRICE_DESC` follow the site's own order, which is not strictly by price,
  and a price range can let through ads priced a little under the minimum. Check the
  `price` column yourself when that matters.

#### Sample output

One real row from run `YGjrbNmUufPRhfbvh` (2026-10-21, `iphone` in phones, relevance order):

```json
{
    "id": "27323403",
    "url": "https://www.yapo.cl/electronica-telefono-movil/iphone-7/27323403",
    "title": "Iphone 7",
    "description": "VENDO!\nIphone 7 32gb liberado, en excelente estado, sin desgastes de bolsillo, solo un detalle estético en la esquina inferior izquierda, pantalla en perfecto estado (rayones/piquetes son de la mica que ya posee), entrada lightning en perfecto estado, botones de volumen, bloqueo y silencio sin problemas, cámara frontal y trasera sin rayones. \nParlantes en perfecto estado, batería al 75% funcionando al máximo rendimiento (ver últimas fotos) \nPRECIO CONVERSABLE. \nSe entrega con su caja, sin audífonos, con cargador alternativo y 3 carcasas de regalo. \nEntrego en Metro de Santiago en L1, L2, o L3.",
    "price": 100000,
    "currency": "CLP",
    "location": "Región Metropolitana, Santiago",
    "region": "Región Metropolitana",
    "commune": "Santiago",
    "category": "Marketplace / Tecnología / Teléfonos Celulares",
    "categorySlug": "electronica-telefono-movil",
    "vertical": "marketplace",
    "postedAt": "2022-08-05T08:47:46.000Z",
    "updatedAt": "2025-09-25T16:12:30.000Z",
    "available": true,
    "featured": null,
    "sellerId": "14275316",
    "sellerName": "Santiago Zuñiga",
    "sellerVerified": true,
    "imageUrl": "https://photos.encuentra24.com/t_or_fh_m/f_auto/v1/cl/27/32/34/03/27323403_3cf161",
    "imageUrls": [
        "https://photos.encuentra24.com/t_or_fh_m/f_auto/v1/cl/27/32/34/03/27323403_3cf161",
        "https://photos.encuentra24.com/t_or_fh_m/f_auto/v1/cl/27/32/34/03/27323403_71ef84",
        "https://photos.encuentra24.com/t_or_fh_m/f_auto/v1/cl/27/32/34/03/27323403_db1ab8",
        "https://photos.encuentra24.com/t_or_fh_m/f_auto/v1/cl/27/32/34/03/27323403_7dce94",
        "https://photos.encuentra24.com/t_or_fh_m/f_auto/v1/cl/27/32/34/03/27323403_bf4f31",
        "https://photos.encuentra24.com/t_or_fh_m/f_auto/v1/cl/27/32/34/03/27323403_7c719f"
    ],
    "searchCategory": "electronica-telefono-movil",
    "matchedKeyword": "iphone",
    "page": 1,
    "scrapedAt": "2026-10-21T21:42:40.203306+00:00"
}
```

### How much does it cost to scrape Yapo.cl?

Pay-per-event: **$0.001 per result** saved to the dataset (**$1.00 per 1,000 results**), plus
**$0.00005** charged once when the run starts. No subscription. The "must contain" / "must not
contain" words, the location filter, the "only available" switch and duplicate removal run before a
row is saved, so ads they drop are not charged.

### Limits

- A category is required; there is no single search across all of Yapo.
- The Actor was run end to end on marketplace categories (technology and phones). Used-car
  listings (`autos-usados`) load with the same page layout; real-estate and job listings
  were not tested.
- Reading goes through Apify Unblocker, because yapo.cl answers a plain request or a
  datacenter proxy with a Cloudflare challenge page.
- It reads listing pages only, never an individual ad page, and never the site's `/ajax`
  endpoints that its robots.txt disallows.
- This Actor reads only publicly accessible pages and returns the public data they show. It sends no login.

# Actor input Schema

## `categories` (type: `array`):

yapo.cl category pages to read, as the last part of the address or the whole address: for example electronica-telefono-movil (mobile phones), electronica (all technology), autos-usados (used cars) or https://www.yapo.cl/anuncios-clasificados-deportes-y-ocio. Open a category on yapo.cl and copy it from the address bar. The marketplace, autos, bienes-raices and empleos home pages are not listings.

## `searchQueries` (type: `array`):

Keywords searched inside each category, one search per keyword (for example iphone 13, bicicleta). Leave empty to read the category's own listing. Yapo's search is broad: it also returns ads from the same subcategory that do not contain the word, so use the keyword filters below for exact matching.

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

Total number of ads to save across all categories and keywords. Each page holds 20 ads.

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

Result pages to walk per category and keyword (20 ads each). The Actor also stops at the site's last page.

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

Order of the results on the site.

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

Only ads priced at or above this amount in Chilean pesos, applied by the site. Leave empty for no minimum.

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

Only ads priced at or below this amount in Chilean pesos, applied by the site. Leave empty for no maximum.

## `includeKeywords` (type: `array`):

Keep only ads whose title or description contains every one of these words, ignoring case and accents.

## `excludeKeywords` (type: `array`):

Drop ads whose title or description contains any of these words, ignoring case and accents.

## `locationContains` (type: `string`):

Keep only ads whose location (region and commune, as the site writes it) contains this text, ignoring case and accents. For example Santiago, Biobío or Viña del Mar.

## `onlyAvailable` (type: `boolean`):

Drop ads that the site itself marks "Anuncio no disponible" (no longer available). Turn off to keep them.

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

Apify Unblocker is what reached yapo.cl in testing: with no proxy and a datacenter proxy the site answers with a Cloudflare challenge page.

## Actor input object example

```json
{
  "categories": [
    "electronica-telefono-movil"
  ],
  "searchQueries": [
    "iphone"
  ],
  "maxItems": 20,
  "maxPages": 1,
  "sort": "RELEVANCE",
  "onlyAvailable": true,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "UNBLOCKER"
    ]
  }
}
```

# Actor output Schema

## `dataset` (type: `string`):

One row per Yapo.cl ad that cleared the filters: title, description, CLP price, location, category, dates, availability, seller name, photos, ad 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 = {
    "categories": [
        "electronica-telefono-movil"
    ],
    "searchQueries": [
        "iphone"
    ],
    "maxItems": 20,
    "maxPages": 1,
    "sort": "RELEVANCE",
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "UNBLOCKER"
        ]
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("reventadata/yapo-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 = {
    "categories": ["electronica-telefono-movil"],
    "searchQueries": ["iphone"],
    "maxItems": 20,
    "maxPages": 1,
    "sort": "RELEVANCE",
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["UNBLOCKER"],
    },
}

# Run the Actor and wait for it to finish
run = client.actor("reventadata/yapo-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 '{
  "categories": [
    "electronica-telefono-movil"
  ],
  "searchQueries": [
    "iphone"
  ],
  "maxItems": 20,
  "maxPages": 1,
  "sort": "RELEVANCE",
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "UNBLOCKER"
    ]
  }
}' |
apify call reventadata/yapo-scraper --silent --output-dataset

```

## MCP server setup

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