# Sodimac Chile Scraper - Ferretería y Precios (`scraperschile/sodimac`) Actor

Scraper de Sodimac Chile para obtener productos de hogar, ferretería y construcción con precios, stock, marcas, vendedores, imágenes y enlaces. Exporta datos a JSON, CSV, Excel o API para comparar catálogos, seguir ofertas y monitorear ecommerce.

- **URL**: https://apify.com/scraperschile/sodimac.md
- **Developed by:** [Scrapers Chile](https://apify.com/scraperschile) (community)
- **Categories:** E-commerce
- **Stats:** 8 total users, 1 monthly users, 90.9% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.00 / 1,000 producto extraidos

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.

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

### Sodimac Chile Scraper for product prices, stock signals, offers, and ecommerce catalog data

Extrae productos publicos desde `sodimac.cl` y los entrega como datos estructurados en Apify. Este scraper de Sodimac Chile esta pensado para monitoreo de precios, retail intelligence, comparacion de productos, analisis ecommerce, catalogos internos y seguimiento del mercado chileno de mejoramiento del hogar, construccion, herramientas, ferreteria, muebles, jardin y decoracion.

El Actor usa contratos JSON publicos del sitio para ser rapido y estable. Primero descubre el flujo real con `https://www.sodimac.cl/sodimac-cl/search?Ntt=...`; si la busqueda cae en resultados generales usa `https://www.sodimac.cl/s/search/v1/socl`, y si Sodimac redirige el termino a una categoria usa `https://www.sodimac.cl/s/browse/v1/listing/cl`. No scrapea visualmente el DOM para extraer productos.

Tambien puede encontrarse como: Sodimac scraper, sodimac.cl scraper, scraper Sodimac Chile, API precios Sodimac, productos Sodimac Chile, monitoreo de precios Sodimac, Homecenter Chile scraper, retail intelligence Chile, ecommerce scraper Chile, herramientas Sodimac, construccion y ferreteria Chile.

### Que hace este Actor

- Busca productos por termino, marca o categoria detectada por Sodimac, por ejemplo `Taladro`, `pintura blanca`, `martillo`, `Bosch` o `ceramica`.
- Recorre la paginacion disponible cuando existen mas resultados.
- Respeta `maxItems`, `maxPages` y `concurrency` para controlar costo, velocidad y alcance.
- Deduplica productos por ID, SKU o URL.
- Guarda filas limpias en el Dataset de Apify y conserva `raw_product` para trazabilidad.
- Genera un `OUTPUT` con estado, termino, total reportado por el sitio, paginas scrapeadas, limites aplicados, warnings y errores.

### Datos que extrae

Cada producto puede incluir:

| Campo | Descripcion |
| --- | --- |
| `search_term` | Termino usado para la corrida. |
| `scraped_at` | Fecha y hora de extraccion. |
| `product_id` | ID original del producto en Sodimac. |
| `sku` | SKU principal o SKU del vendedor. |
| `name` | Nombre publico del producto. |
| `brand` | Marca. |
| `price` | Precio principal normalizado. |
| `normal_price` / `previous_price` | Precio normal, anterior o tachado cuando existe. |
| `card_price` | Precio CMR u otro precio de tarjeta cuando existe. |
| `discount_percentage` | Descuento informado o calculado. |
| `currency` | Moneda, normalmente `CLP`. |
| `is_available` | Disponibilidad normalizada. |
| `availability` | Texto de despacho, retiro, stock o badges asociados. |
| `category` | Categoria principal cuando el flujo la entrega. |
| `category_id` | ID de categoria reportado por Sodimac. |
| `seller_name` | Vendedor principal. |
| `is_marketplace` | Indica si el vendedor parece ser tercero. |
| `url` | URL publica del producto confirmada por la respuesta de Sodimac. Una entrada sin URL se considera incompleta y hace fallar la ejecucion antes de escribir resultados. |
| `image` | Imagen principal. |
| `rating` | Calificacion promedio cuando existe. |
| `reviews_count` | Numero de resenas o calificaciones. |
| `page` | Pagina donde aparecio el resultado. |
| `position` | Posicion global dentro de la extraccion. |
| `merchant_category_id`, `gsc_category_id`, `offering_id`, `seller_id` | Identificadores originales relevantes. |
| `raw_product` | JSON original del producto para auditoria y cambios futuros del contrato. |

### Ejemplo de input

```json
{
  "term": "Taladro",
  "maxItems": 100,
  "maxPages": 3,
  "pageSize": 28,
  "sort": "recommended",
  "concurrency": 4,
  "failOnNoResults": false
}
```

### Ejemplo de output

El Dataset contiene filas como:

```json
{
  "search_term": "Taladro",
  "product_id": "114087187",
  "sku": "114087188",
  "name": "Kit Taladro Perc.+ Atornillador 20v + 2 Bat Dck223d2",
  "brand": "DEWALT",
  "price": 271990,
  "normal_price": 349990,
  "card_price": 254990,
  "discount_percentage": 27,
  "currency": "CLP",
  "seller_name": "TUS HERRAMIENTAS",
  "is_marketplace": true,
  "url": "https://www.sodimac.cl/sodimac-cl/articulo/114087187/Kit-Taladro-Perc.+-Atornillador-20v-+-2-Bat-Dewalt-Dck223d2?exp=so_com",
  "page": 1,
  "position": 1
}
```

El registro `OUTPUT` resume la corrida:

```json
{
  "status": "ok",
  "search_term": "Taladro",
  "source_flow": "listing",
  "total_results_reported": 461,
  "total_products_scraped": 100,
  "pages_scraped": 3,
  "limits": {
    "maxItems": 100,
    "maxPages": 3,
    "pageSize": 28,
    "effectivePageSize": 48
  }
}
```

### Referencia de input

| Campo | Tipo | Requerido | Descripcion |
| --- | --- | --- | --- |
| `term` | string | si | Producto, marca o texto a buscar en Sodimac.cl. |
| `maxItems` | integer | no | Maximo de productos a guardar. Default recomendado: `100`. |
| `maxPages` | integer | no | Maximo de paginas a recorrer. Si se omite, recorre hasta completar la paginacion o `maxItems`. |
| `pageSize` | integer | no | Tamano solicitado. Sodimac actualmente fija el tamano real del backend y el Actor reporta `effective_page_size`. |
| `sort` | string | no | `recommended`, `price_asc`, `price_desc`, `newest`, `rating_desc`, `name_asc` o `brand_asc`. |
| `concurrency` | integer | no | Paginas procesadas en paralelo. Default: `4`. |
| `retries` | integer | no | Reintentos por pagina. Default: `3`. |
| `timeoutSecs` | integer | no | Timeout por solicitud. Default: `30`. |
| `failOnNoResults` | boolean | no | Si es `true`, falla cuando no hay productos. Si es `false`, deja `OUTPUT.status = no_results`. |

### Casos de uso

| Caso de uso | Como ayuda |
| --- | --- |
| Monitoreo de precios Sodimac | Captura precio actual, precio normal, descuento y precio CMR cuando existen. |
| Retail intelligence Chile | Analiza surtido, marcas, categorias, sellers y cambios en resultados de busqueda. |
| Comparacion de productos | Cruza herramientas, materiales, muebles o articulos de construccion con otros retailers. |
| Inteligencia competitiva | Detecta precios de marketplace, productos patrocinados y cambios de posicion. |
| Analisis ecommerce | Crea datasets para dashboards, BI, alertas de precio, catlogos y estudios de mercado. |
| Reportes recurrentes | Programa corridas en Apify y exporta JSON, CSV, Excel, XML o API. |

### Buenas practicas

- Usa `maxItems` para pruebas y monitoreos diarios. Un valor de `100` suele ser suficiente para smoke tests y validaciones.
- Aumenta `maxPages` o elimina el limite solo cuando necesites cobertura completa.
- Baja `concurrency` si el sitio responde lento o ves errores temporales.
- Revisa `OUTPUT.warnings`: Sodimac fija el tamano real de pagina en el backend, aunque el input conserve `pageSize` para compatibilidad.
- Para terminos amplios como `pintura blanca`, define `maxItems` para controlar costo y volumen.

### Limitaciones conocidas

- Sodimac usa dos flujos publicos distintos. El Actor los detecta automaticamente, pero cambios de contrato pueden requerir ajustes.
- El Actor valida identificador, nombre y URL de cada producto antes de normalizarlo. Si Sodimac cambia el contrato y omite alguno de esos campos, la ejecucion falla sin publicar filas incompletas.
- Disponibilidad, despacho, retiro y stock dependen de lo que Sodimac entregue publicamente en el momento de la corrida.
- Los precios y promociones pueden cambiar por ubicacion, sesion, campana o reglas comerciales del sitio.
- Si Sodimac bloquea, limita o cambia la respuesta, el Actor marca `status` como `blocked` o `error` y registra el detalle en `OUTPUT.errors`.

### Uso desde API

#### Python

```python
from apify_client import ApifyClient

client = ApifyClient("<APIFY_API_TOKEN>")
run = client.actor("scraperschile/sodimac").call(
    run_input={"term": "Taladro", "maxItems": 100}
)

for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item["name"], item["price"], item["url"])
```

#### cURL

```bash
curl -X POST \
  -H 'Content-Type: application/json' \
  -H 'Authorization: Bearer <APIFY_API_TOKEN>' \
  -d '{"term":"Taladro","maxItems":100}' \
  'https://api.apify.com/v2/acts/scraperschile~sodimac/runs?waitForFinish=60'
```

### Uso responsable

Este Actor extrae informacion publica de catalogo. No usa cuentas de clientes, no recopila datos privados, no interactua con carritos, pedidos ni credenciales. Usalo de forma responsable y respeta los terminos aplicables de Apify y Sodimac.

# Actor input Schema

## `term` (type: `string`):

Producto, marca o texto a buscar en Sodimac.cl. Ejemplos reales: Taladro, pintura blanca, martillo, Bosch, ceramica.

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

Limite opcional de productos a guardar. Util para pruebas rapidas, presupuestos controlados, smoke tests o monitoreos acotados.

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

Limite opcional de paginas a recorrer. Si se omite, el Actor recorre toda la paginacion disponible o hasta alcanzar maxItems.

## `pageSize` (type: `integer`):

Tamano de pagina solicitado. Sodimac actualmente fija el tamano real por backend, pero el Actor reporta el valor efectivo en OUTPUT.

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

Ordenamiento compatible con los flujos publicos de Sodimac.

## `concurrency` (type: `integer`):

Cantidad de paginas JSON procesadas en paralelo. Baja este valor si Sodimac responde lento o limita solicitudes.

## `retries` (type: `integer`):

Cantidad de reintentos por pagina si Sodimac demora, corta o rechaza una solicitud temporalmente.

## `timeoutSecs` (type: `integer`):

Tiempo maximo en segundos para abrir la pagina de descubrimiento o consultar el endpoint JSON.

## `failOnNoResults` (type: `boolean`):

Si esta activo, la ejecucion falla cuando Sodimac no devuelve productos. Si esta apagado, guarda OUTPUT con estado no\_results y dataset vacio.

## Actor input object example

```json
{
  "term": "Taladro",
  "maxItems": 100,
  "pageSize": 28,
  "sort": "recommended",
  "concurrency": 4,
  "retries": 3,
  "timeoutSecs": 30,
  "failOnNoResults": false
}
```

# Actor output Schema

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

Items del dataset con nombre, marca, precios, descuento, disponibilidad, categoria, vendedor, URL e imagen.

## `summary` (type: `string`):

Registro OUTPUT con estado, paginas recorridas, limites aplicados, warnings, errores y productos crudos agregados.

# 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 = {
    "term": "Taladro",
    "maxItems": 100,
    "pageSize": 28,
    "concurrency": 4
};

// Run the Actor and wait for it to finish
const run = await client.actor("scraperschile/sodimac").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 = {
    "term": "Taladro",
    "maxItems": 100,
    "pageSize": 28,
    "concurrency": 4,
}

# Run the Actor and wait for it to finish
run = client.actor("scraperschile/sodimac").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 '{
  "term": "Taladro",
  "maxItems": 100,
  "pageSize": 28,
  "concurrency": 4
}' |
apify call scraperschile/sodimac --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,scraperschile/sodimac"
        }
    }
}

```

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/RlQHEW1ewVZ0a34e3/builds/EF6WCOkHw0dDxuASy/openapi.json
