# 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, 100.0% 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/platform/actors/running/actors-in-store#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 para ferretería, hogar y precios

El **Sodimac Chile scraper** convierte la búsqueda pública de [Sodimac.cl](https://www.sodimac.cl/) en datos estructurados de herramientas, construcción, ferretería, muebles, jardín y decoración. Extrae productos, precios, descuentos, stock publicado, marcas, vendedores, imágenes y enlaces para evitar la recolección manual.

Úsalo como una **API de precios de Sodimac y Homecenter Chile** para monitoreo competitivo, comparación de catálogos, inteligencia retail y reportes recurrentes. Los resultados quedan disponibles en Dataset, JSON, CSV, Excel, XML o mediante la API de Apify.

### 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 cuando Sodimac la entrega. En algunos resultados generales, Sodimac no entrega URL de PDP y el Actor usa una URL de busqueda por producto como fallback. |
| `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.

### Precio

Este Actor usa pago por evento. Cada producto guardado correctamente cuesta **USD 0.003** mediante el evento `result`, y cada ejecución agrega un evento inicial de **USD 0.00005**. Usa `maxItems` y `maxPages` para controlar el volumen. La pestaña **Pricing** de Apify es la referencia vigente antes de ejecutar.

### Limitaciones conocidas

- Sodimac usa dos flujos publicos distintos. El Actor los detecta automaticamente, pero cambios de contrato pueden requerir ajustes.
- Algunas busquedas generales no entregan URL de producto en el JSON; en esos casos el campo `url` usa una URL de busqueda por producto como fallback y el objeto crudo queda en `raw_product`.
- 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.

### Preguntas frecuentes

#### ¿Puedo monitorear precios y ofertas de Sodimac?

Si. Programa búsquedas recurrentes con el mismo término y compara `price`, `normal_price`, `card_price` y `discount_percentage` cuando esos valores estén publicados.

#### ¿Incluye productos de vendedores marketplace?

Cuando la respuesta pública identifica al vendedor, el Dataset incluye `seller_name` e `is_marketplace`. La cobertura depende del flujo de resultados utilizado por Sodimac para cada búsqueda.

#### ¿Confirma stock de una tienda específica?

No. `is_available` y `availability` son señales públicas observadas durante la corrida. Verifica despacho, retiro y disponibilidad final en la ficha del producto antes de tomar una decisión.

#### ¿Necesita una cuenta de Sodimac?

No. El Actor utiliza resultados públicos y no accede a cuentas, carritos, pedidos ni credenciales.

### Independencia

Este Actor es una herramienta no oficial e independiente. No está afiliado, patrocinado ni respaldado por Sodimac, Homecenter ni Sodimac.cl.

# 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("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).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": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=scraperschile/sodimac",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/RlQHEW1ewVZ0a34e3/builds/UVc5jawgei38b6x8T/openapi.json
