# Easy Chile Scraper - Hardware, Home & Construction Prices (`recordsdata/easy-chile-hardware-scraper`) Actor

Scrape Easy.cl, Chile's hardware, home and construction retailer: product name, brand, category, EAN, list and offer price in CLP, live stock, seller and image for every SKU found by search term. Export CSV, Excel, JSON. No login or API key. 50 products per request.

- **URL**: https://apify.com/recordsdata/easy-chile-hardware-scraper.md
- **Developed by:** [RecordsData](https://apify.com/recordsdata) (community)
- **Categories:** E-commerce, Business
- **Features:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $15.71 / 1,000 product records

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?

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

<p align="center">
  <img src="https://api.apify.com/v2/key-value-stores/AAm3a1h3Z9nYfrvh9/records/banner?v=3" alt="RecordsData" width="100%" />
</p>

## Easy Chile Scraper - Hardware, Home & Construction Prices

> **Easy Chile Scraper** extracts product data from Easy.cl, Chile's hardware, home and construction retailer: name, brand, category path, EAN, list price, offer price in CLP, discount percent, card promotions with their conditions, final Cencosud and CencoPay card prices when a promotion exists, installments, live stock and specifications. Search by Spanish term, category, brand or product link, sort by price or biggest discount, and export to CSV, Excel or JSON. Monitor mode returns only new or changed products. No login needed. Cost: $0.02 per product on the free tier.

### 🔧 What does Easy Chile Scraper do?

**Easy Chile Scraper** reads [Easy.cl](https://www.easy.cl) through the VTEX catalog API that powers the store, so prices and stock are the ones the retailer serves, not parsed from HTML. Each search returns one row per SKU, 50 per request, up to your per-search limit. A search can be a term, category, brand or any mix, or you can paste product links or ids. On Apify you also get scheduling, API access, webhooks and export to CSV, Excel, JSON, XML or HTML.

### ✨ What can Easy Chile Scraper do?

- **Sort at the source:** relevance, price, name, newest, best sellers or biggest discount, applied before your limit.
- **Discounts:** `onSale`, `discountPercent` and `discountAmount` on every row; `onlyDiscounts` or `minDiscountPercent` keep only deals.
- **Card prices and promotions:** `cencosudCardPrice`, `cencopayPrice` and `cardDiscountPercent` give the final price with that card when a promotion exists, matching the easy.cl page to the peso on the SKUs we compared. `promotions` lists each offer with name, payment method ids, percent and minimum quantity. Installment fields show the longest interest-free plan.
- **Product links and ids:** `productUrls` returns every variant (SKU) of a product.
- **Monitor mode:** with `onlyChanged`, a run delivers a SKU only when it is new or its price, list price or availability changed, and unchanged SKUs are free.

### 📦 What data can you extract from Easy.cl?

Each row has up to 52 keys. Keys the source does not provide are left out of the row, not filled with null.

| Group | Fields |
| --- | --- |
| Identity | `recordType`, `searchTerm`, `changeType`, `position`, `productId`, `skuId`, `ean`, `referenceId`, `productReference` |
| Product | `productName`, `brand`, `brandId`, `color`, `variations`, `description`, `specifications`, `warranty`, `releaseDate`, `collections` |
| Category | `category`, `categoryPath`, `categories`, `categoryId`, `categoryIds` |
| Price in CLP | `currency`, `listPrice`, `price`, `onSale`, `discountPercent`, `discountAmount`, `measurementUnit`, `unitMultiplier` |
| Promotions | `promotions`, `hasCardPromotion`, `cencosudCardPrice`, `cencopayPrice`, `cardDiscountPercent`, `appliedPromotions`, `maxInstallments`, `installmentValue`, `installmentMethod` |
| Stock and seller | `availableQuantity`, `isAvailable`, `sellerName`, `isMarketplace` |
| Links | `productUrl` (public easy.cl link), `imageUrl`, `images` (up to 10) |
| Run | `scrapedAt`, `error`, `errorType`, `hint` |

`position` is Easy.cl's own rank for that search. `changeType` (`new` or `changed`) appears only in monitor mode. `description`, `specifications` and extra `images` are skipped when `includeDetails` is off.

**Card prices:** the percent applies to the list price (the struck-through Normal price), not the offer price. A card price shows only when it is below the offer price: in a deal-biased scan of 10,329 SKUs about 1.5 percent had one (Cencosud 147, CencoPay 7), and 7 of 45 rows in a small random cloud batch. Price-table promotions (`PPCAT`) give no card price, because easy.cl shows none.

**Not available:** ratings and review counts (not in the Easy.cl catalog data).

### 🧾 What does the output look like?

Illustrative row for `taladro`: identity, price and stock from a real run, discount values are examples.

```json
{
    "recordType": "product-record",
    "searchTerm": "taladro",
    "position": 3,
    "productId": "1417303",
    "skuId": "1522815",
    "productName": "Prensa De Taladro Doble Soporte Pedestal Porta Taladro Banco",
    "brand": "EshopAngie",
    "category": "Fijaciones y Adhesivos",
    "productUrl": "https://www.easy.cl/prensa-de-taladro-doble-soporte-pedestal-porta-taladro-banco-mk5n2jvjsp/p",
    "currency": "CLP",
    "listPrice": 18990,
    "price": 12990,
    "onSale": true,
    "discountPercent": 31.6,
    "availableQuantity": 100,
    "scrapedAt": "2026-10-09T12:00:00.000Z"
}
```

### 💰 How much does it cost to scrape Easy.cl?

Pay per event: you pay only for products delivered. Prices per product, by Apify plan:

| Event | FREE | BRONZE | SILVER | GOLD and above |
| --- | --- | --- | --- | --- |
| Product record (one SKU) | $0.02 | $0.01857 | $0.01714 | $0.01571 |

Worked examples (free tier, then Gold):

- 10 best deals in a category (`sortBy: biggestDiscount`, limit 10): 10 x $0.02 = $0.20, or $0.16 on Gold.
- 1,000 tool products: 1,000 x $0.02 = $20.00, or $15.71 on Gold.
- A scheduled monitor run where nothing changed: 0 products, nothing charged.

There are no extra events. Rows without an id or name, duplicate SKUs, empty searches, unchanged SKUs in monitor mode and failed runs are not charged. A maximum cost per run stops the actor cleanly. Free plan accounts get 10 results per search.

### 🚀 How to scrape Easy.cl in 3 steps

1. In the **Input** tab, add Spanish terms, categories, brands or product links.
2. Pick **Sort by**, filters and the limit.
3. Click **Run**, then download JSON, CSV or Excel.

### ⚙️ Input

| Field | Type | Default | Description |
| --- | --- | --- | --- |
| `searchTerms` | array | `[]` | Spanish keywords (prefill `martillo`) |
| `categories` | array | `[]` | Category name, path, id or easy.cl URL |
| `brands` | array | `[]` | Brand names such as Bosch or Makita |
| `productUrls` | array | `[]` | easy.cl product links (end in `/p`) or numeric product ids |
| `maxItemsPerSearch` | integer | `50` | SKUs per search, 1 to 2,500 (10 on free) |
| `sortBy` | select | `relevance` | `relevance`, `priceAsc`, `priceDesc`, `nameAsc`, `nameDesc`, `newest`, `bestSellers`, `biggestDiscount` |
| `minPrice` / `maxPrice` | integer | none | Price range in CLP, applied before the limit |
| `onlyDiscounts` | boolean | `false` | Only products priced below list price |
| `minDiscountPercent` | number | none | Minimum discount off list price, 0 to 100 |
| `onlyInStock` | boolean | `false` | Skip products with no units available |
| `includeDetails` | boolean | `true` | Description, specifications and up to 10 images |
| `onlyChanged` | boolean | `false` | Monitor mode: only new or changed SKUs |
| `stateKey` | string | derived | Name of the monitor memory |
| `resetSeen` | boolean | `false` | Forget previous results |

Limits: 100 terms, 50 categories, 50 brands, 500 product links, 1,000 searches per run.

```json
{
    "searchTerms": ["taladro"],
    "sortBy": "biggestDiscount",
    "minDiscountPercent": 20,
    "onlyInStock": true,
    "maxItemsPerSearch": 10
}
```

### 📊 How does it compare to other Easy.cl scrapers?

Rival pages read on 2026-10-10. "Not stated" means the rival page does not say.

| | This actor | scraperschile/easy | sheshinmcfly/sodimac-easy-price-scraper |
| --- | --- | --- | --- |
| Price per 1,000 | $15.71 to $20 | from $3.00 | from $2.00 |
| Sort options | 8, including biggest discount | 6 | Not stated |
| Filters | Category, brand, price, discount, stock | None listed | Discounts only, store choice |
| Card prices | Cencosud and CencoPay, when a promotion exists | Cencosud and CencoPay, null if none | CMR price, null for Easy |
| Monitor mode (changes only) | Yes, unchanged not charged | Not listed | Not stated |
| Ratings and reviews | No | When Easy sends them | Not stated |
| Stores covered | Easy.cl | Easy.cl | Easy.cl and Sodimac |

Both rivals are 5 to 10 times cheaper per product. scraperschile also returns raw backend blobs and ratings when present, and sheshinmcfly covers Sodimac in the same run. This actor adds filters, specifications, variants, structured promotions and change monitoring. If you only need cheap bulk rows or Sodimac, pick a rival. We have not tested their output.

### 🎯 What can you use Easy.cl data for?

- **Price and stock monitoring:** schedule `onlyChanged` runs on a category; keep `skuId` as the stable key.
- **Deal finding:** sort by biggest discount.
- **Benchmarking:** match Easy.cl to other Chilean retailers by EAN or name.

### 🔌 How do you use Easy Chile Scraper via API?

```bash
curl -X POST "https://api.apify.com/v2/acts/RecordsData~easy-chile-hardware-scraper/run-sync-get-dataset-items?token=YOUR_APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"searchTerms":["martillo"],"sortBy":"priceAsc","maxItemsPerSearch":10}'
```

It also works with the Apify client, Zapier, Make, n8n and Google Sheets.

### 🤖 Easy Chile Scraper MCP server for AI agents

AI agents can call this Actor through the Apify MCP server at `https://mcp.apify.com?tools=RecordsData/easy-chile-hardware-scraper`, which loads only this Actor. Add it to your MCP client (Claude Desktop, Cursor, VS Code):

```json
{
  "mcpServers": {
    "apify": {
      "url": "https://mcp.apify.com?tools=RecordsData/easy-chile-hardware-scraper"
    }
  }
}
```

Example agent prompt:

> Use the Easy Chile Scraper to find the 10 biggest discounts on "taladro" at Easy.cl, in stock only, and list name, list price, offer price and discount percent in CLP.

Tool description: Search Easy.cl, Chile's hardware and construction retailer, by term, category, brand or product link. Returns one row per SKU with CLP prices, discount percent, card promotions, stock, specifications and an optional new-or-changed filter. Free plan accounts are capped at 10 results per search.

### ⚖️ Is it legal to scrape Easy.cl?

The actor reads public catalog data (prices, stock, descriptions) that any visitor can see and collects no personal data. You are responsible for using it in line with Easy.cl's terms and applicable law.

### ❓ FAQ

#### Why did I get 0 results?

The search matched no products on Easy.cl, or your filters (category, brand, discount, price range) left none. The run still succeeds with a "No products found" message and nothing is charged. Try a broader Spanish term, such as "martillo" instead of "martillo carpintero 16 oz", or remove a filter.

#### Why did the run fail?

A run fails only when the Easy.cl catalog API errors or returns an unexpected response and no products were delivered. Nothing is charged. It retries a failed page up to five times, and three failed searches in a row end the run with a clear message. Run it again later.

#### Which language should search terms be in?

Spanish. Easy.cl is a Chilean hardware and home store, so terms such as "taladro", "tornillo" or "pintura" return relevant products, while an English word such as "drill" returns unrelated results. Short nouns work best, and keeping maxItemsPerSearch low while testing saves money.

#### Are prices in Chilean pesos?

Yes. The price and listPrice fields are in Chilean pesos (CLP), as served by Easy.cl. The price field is the current offer price and listPrice the original price. When both are equal, the product has no markdown and onSale is false.

#### How many products can I get per search?

Up to your maxItemsPerSearch value for each search, collected in pages of 50 products. The default is 50. Easy.cl serves at most the first 2,500 results of one search, and free plan accounts are capped at 10. To reach more, split a broad topic by category, brand or price range.

#### Does it need a proxy?

No. The actor reads the Easy.cl VTEX catalog API directly, so you do not need to configure a proxy. It adds a short delay between pages of 50 products to stay polite to the store. You only pay the per-product price.

#### How do I limit what I spend?

Lower maxItemsPerSearch or set a maximum cost per run in the run options. The Actor stops cleanly once the limit is reached. On the free tier each product costs $0.02, and duplicate SKUs, empty searches, unchanged SKUs in monitor mode and failed runs are not charged.

#### What happens if I send an empty or invalid input?

The actor needs at least one search term, category, brand or product link. With none, the run ends as succeeded with a single free error row (errorType: invalid-input) that explains the problem, and nothing is charged. Blank strings count as empty.

#### Can I schedule it?

Yes. Use Apify schedules to run it daily or weekly and send results to a webhook or spreadsheet. For price monitoring, turn on onlyChanged so each run delivers only SKUs whose price, list price or availability changed, and keep skuId as the stable key between runs.

#### How do I get the biggest discounts or sort by price?

Set sortBy to biggestDiscount, priceAsc or any other option. Easy.cl sorts before your limit, so a limit of 10 with biggestDiscount returns the 10 best deals. To keep only discounted items, add onlyDiscounts or minDiscountPercent, for example 30. Both filters run in the actor, which keeps paging until it has enough matches.

#### How does monitor mode work?

With onlyChanged on, the actor remembers every SKU it delivered in a named store in your account (stateKey names it). A later run returns a SKU only when it is new or its price, list price or availability changed, with changeType new or changed. Unchanged SKUs are skipped and not charged. Use resetSeen to start over.

#### Does it return card prices or only card promotions?

Both. When a product has a card promotion, you get cencosudCardPrice and cencopayPrice, the final price with that card, plus cardDiscountPercent. A card price appears only if it is below the offer price, and in a deal-biased scan about 1.5 percent of SKUs had one, so most rows have none. The promotions field lists each offer with conditions.

#### Does it return ratings or reviews?

No. The Easy.cl catalog data used by this actor carries no rating or review count, so those fields do not exist in the output. Everything else, including specifications, warranty, variants, seller and card prices, is included. A rival listing says it fills ratings only when Easy sends them.

#### Why is the product link different from before?

The productUrl field now holds the public easy.cl product link, ending in /p, which opens the product page. Earlier versions returned a VTEX backend link that redirects to a login page, so replace links saved from old runs. It is still one link per SKU.

#### Why did a run stop early with a status message?

A run stops when 150 pages or 300 seconds pass without a delivered row, which happens with very restrictive filters on a huge catalog. Rows already delivered stay in the dataset and are charged; the idle part is free. Loosen the filters or split the search by category.

#### What is the 2,500 result limit?

Easy.cl serves at most the first 2,500 results of any single search, so the actor stops there and says so in the log. To collect a larger catalog, run several narrower searches, for example one per category, brand or price range with minPrice and maxPrice.

### 🧰 Want more e-commerce data?

- [PriceCharting Scraper](https://apify.com/RecordsData/pricecharting-scraper): collectibles and game prices.
- [Epic Games Store Scraper](https://apify.com/RecordsData/epic-games-store-scraper): free games and product data.

### 💬 Support

Bug or custom field? Use the Issues tab or write to contact.punkrecordsdata@gmail.com.

Last updated: 2026-10-11

# Actor input Schema

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

Product keywords to search on Easy.cl (Chile hardware, home and construction retailer), in Spanish, e.g. "martillo", "taladro", "tornillo". Each term returns its matching products with price, discount, stock and brand. Leave empty to browse only by category, brand or product URL.

## `maxItemsPerSearch` (type: `integer`):

Maximum number of products (SKUs) to collect for each search (each term, category, brand or product URL). Free plan accounts are limited to 10 per search. You are charged per product delivered, so lower this number to cap cost. Easy.cl serves at most the first 2,500 results of one search.

## `sortBy` (type: `string`):

Order of the results. Applied by Easy.cl before the result limit, so "Biggest discount" with a limit of 10 gives the 10 best deals.

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

Limit the search to Easy.cl categories. Accepts a category name ("Herramientas"), a path ("Ferretería y Gasfitería/Fijaciones y Adhesivos"), a category id or an easy.cl category URL. With no search term, the whole category is listed. Each term and category pair is one search.

## `brands` (type: `array`):

Limit the search to brands, spelled as on the product (for example "Bosch", "Makita", "Stanley"). With no search term, every product of the brand is listed.

## `productUrls` (type: `array`):

Fetch specific products: easy.cl product links (they end in /p) or numeric product ids. Every size and color variant (SKU) of the product is returned.

## `minPrice` (type: `integer`):

Only products priced at or above this amount, in Chilean pesos. Applied by Easy.cl before the result limit.

## `maxPrice` (type: `integer`):

Only products priced at or below this amount, in Chilean pesos. Applied by Easy.cl before the result limit.

## `onlyDiscounts` (type: `boolean`):

Return only products whose price is below the list price. The discount percent and amount are in the output.

## `minDiscountPercent` (type: `number`):

Only products with at least this discount off the list price, for example 30.

## `onlyInStock` (type: `boolean`):

Skip products that are out of stock or have no units available.

## `includeDetails` (type: `boolean`):

Adds the product description, the specification table (material, power, warranty and more), and up to 10 image links. Turn off for smaller, faster rows when you only need prices.

## `onlyChanged` (type: `boolean`):

Return a product only when it is new or its price, list price or availability changed since the last run. Unchanged products are skipped and not charged. Each row carries changeType new or changed. A product found by two searches in the same monitor is delivered once.

## `stateKey` (type: `string`):

Name for the memory of previous results. Leave empty to derive it from your filters. Use the same name to share memory between runs, or a different name to keep separate monitors.

## `resetSeen` (type: `boolean`):

Clear the memory for this monitor before the run, so every product counts as new again.

## Actor input object example

```json
{
  "searchTerms": [
    "martillo"
  ],
  "maxItemsPerSearch": 10,
  "sortBy": "relevance",
  "categories": [],
  "brands": [],
  "productUrls": [],
  "onlyDiscounts": false,
  "onlyInStock": false,
  "includeDetails": true,
  "onlyChanged": false,
  "stateKey": "",
  "resetSeen": false
}
```

# Actor output Schema

## `dataset` (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 = {
    "searchTerms": [
        "martillo"
    ],
    "maxItemsPerSearch": 10,
    "categories": [],
    "brands": [],
    "productUrls": [],
    "stateKey": ""
};

// Run the Actor and wait for it to finish
const run = await client.actor("recordsdata/easy-chile-hardware-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 = {
    "searchTerms": ["martillo"],
    "maxItemsPerSearch": 10,
    "categories": [],
    "brands": [],
    "productUrls": [],
    "stateKey": "",
}

# Run the Actor and wait for it to finish
run = client.actor("recordsdata/easy-chile-hardware-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 '{
  "searchTerms": [
    "martillo"
  ],
  "maxItemsPerSearch": 10,
  "categories": [],
  "brands": [],
  "productUrls": [],
  "stateKey": ""
}' |
apify call recordsdata/easy-chile-hardware-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,recordsdata/easy-chile-hardware-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/fthMagprSyWQaqN7L/builds/VfXXwsQVNVbSXl36f/openapi.json
