# MercadoLibre Chile Scraper | Prices, Listings & Historical Data (`jchame/mercadolibre-chile-scraper`) Actor

Scrape MercadoLibre Chile (mercadolibre.cl / MLC) listings. Extract CLP prices, discounts, search rank, sponsored ads, item IDs, URLs, thumbnails, shipping/Full signals, and AI-ready JSON/CSV for price monitoring, historical datasets, and ecommerce research.

- **URL**: https://apify.com/jchame/mercadolibre-chile-scraper.md
- **Developed by:** [Javier Chame](https://apify.com/jchame) (community)
- **Categories:** E-commerce, Developer tools
- **Stats:** 2 total users, 0 monthly users, 100.0% runs succeeded, 1 bookmarks
- **User rating**: No ratings yet

## Pricing

$1.50 / 1,000 mlc listings

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/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use 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

## MercadoLibre Chile Scraper | Prices, Listings & Historical Data

![MercadoLibre Chile Scraper demo](assets/demo.svg)

Chile-first Apify Actor for scraping public MercadoLibre Chile (`MLC`) search results and product listings as clean JSON, CSV, Excel, or API output.

Use it for MercadoLibre Chile product research, competitor snapshots, CLP price monitoring, sponsored-placement checks, catalog discovery, ecommerce datasets, and AI-agent workflows that need fresh `mercadolibre.cl` listing data.

### Resumen en espanol

Actor de Apify especializado en MercadoLibre Chile (`mercadolibre.cl`, sitio `MLC`). Extrae resultados publicos de busqueda y fichas de productos con precios en CLP, descuentos, posicion en busqueda, senales de aviso patrocinado, miniaturas, URLs, envio gratis, senales de Full/fulfillment y diagnosticos de calidad.

Sirve para monitoreo de precios, investigacion de productos, snapshots de competidores, datasets historicos y flujos con agentes de IA que necesitan datos estructurados de MercadoLibre Chile.

### Why this Actor

Most MercadoLibre scrapers are generic LATAM tools. This Actor is tuned for Chile, MLC, and `mercadolibre.cl` first:

- Searches `listado.mercadolibre.cl` from product keywords or MercadoLibre Chile URLs.
- Uses public page extraction for normal no-token runs.
- Reads MercadoLibre's embedded Nordic page state before falling back to visible HTML selectors, so standard runs capture more structured listing evidence without extra page requests.
- Reads listing IDs from MercadoLibre Chile URL fragments such as `wid=MLC...`.
- Extracts title, price, original price, discount, thumbnail, listing URL, sponsored signal, ranking position, category/domain IDs, seller display names, rating signals, and shipping/Full signals.
- Supports optional enrichment through public product pages, plus MercadoLibre OAuth API enrichment when a token is provided.
- Outputs stable, agent-friendly JSON with extraction metadata and field-fill diagnostics.
- Uses Apify residential proxy with country `CL` as the recommended production default.
- Can be scheduled daily on Apify to build your own historical MercadoLibre Chile price and search-position dataset.

### Quick Start

```json
{
  "searchQueries": ["audifonos bluetooth", "impresora termica"],
  "maxItems": 100,
  "maxItemsPerQuery": 25,
  "maxPagesPerQuery": 2,
  "htmlRetryCount": 2,
  "searchMode": "api_first",
  "outputMode": "standard",
  "includeDetails": false,
  "includeSeller": false,
  "includeReviews": false,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": ["RESIDENTIAL"],
    "apifyProxyCountry": "CL"
  }
}
````

You can also provide MercadoLibre Chile search URLs or direct product URLs:

```json
{
  "startUrls": [
    { "url": "https://listado.mercadolibre.cl/masajeador-cervical" }
  ],
  "maxItems": 50,
  "outputMode": "standard"
}
```

### Recommended Presets

Cheap trial, about 25 listings:

```json
{
  "searchQueries": ["audifonos bluetooth"],
  "maxItems": 25,
  "maxItemsPerQuery": 25,
  "maxPagesPerQuery": 1,
  "outputMode": "standard"
}
```

Daily price monitoring:

```json
{
  "searchQueries": ["audifonos bluetooth", "impresora termica"],
  "maxItems": 100,
  "maxItemsPerQuery": 50,
  "maxPagesPerQuery": 2,
  "outputMode": "standard"
}
```

High-evidence product research, about 25 product pages:

```json
{
  "searchQueries": ["audifonos bluetooth"],
  "maxItems": 25,
  "maxItemsPerQuery": 25,
  "maxPagesPerQuery": 1,
  "outputMode": "enriched",
  "includeDetails": true,
  "maxPublicDetailPages": 25
}
```

Canary quality check:

```json
{
  "searchQueries": ["audifonos bluetooth", "impresora termica", "freidora de aire"],
  "maxItems": 15,
  "maxItemsPerQuery": 5,
  "failOnQualityDrop": true,
  "minCoreFieldFillScore": 0.95,
  "minFieldFillScore": 0.9,
  "maxWarningCount": 0
}
```

MercadoLibre trends, requires OAuth:

```json
{
  "includeTrendingSearches": true,
  "maxTrendingSearches": 10,
  "mercadoLibreAccessToken": "PASTE_OAUTH_TOKEN_HERE",
  "maxItemsPerQuery": 25,
  "outputMode": "standard"
}
```

### Output Fields

Common fields include:

- `item_id`
- `title`
- `permalink`
- `price_clp`
- `original_price_clp`
- `discount_percent`
- `thumbnail`
- `condition`
- `category_id`
- `catalog_product_id`
- `catalog_listing`
- `shipping_logistic_type`
- `shipping_free_shipping`
- `shipping_is_fulfillment`
- `seller_id`
- `seller_nickname`
- `seller_reputation_level_id`
- `review_rating_average`
- `review_total`
- `available_quantity`
- `sold_quantity`
- `is_sponsored`
- `ad_type`
- `position`
- `extraction_meta`

`extraction_meta` reports the extraction method, output mode, build number, field-fill scores, missing fields, and null reasons. This makes downstream checks easier for dashboards and AI agents.

Important: MercadoLibre public quantity and sales fields can be bucketed or hidden. This Actor does not scrape private seller metrics, login-only pages, or non-public data.

### Output Modes

- `lean`: smallest output for broad, low-cost search exports.
- `standard`: default. Best balance of reliability, speed, and useful listing data. Uses search-result state and card parsing only.
- `enriched`: fetches public product pages for richer evidence such as sold-count buckets, available-quantity buckets, seller IDs, seller reputation, item-level review totals, condition, category, and fulfillment details. If you provide an OAuth token, API enrichment is used where available.

For broad low-cost exports, use `standard`. For inventory decisions or product research, use `enriched` with `maxPublicDetailPages` set to the number of listings you truly need enriched.

### Reliability

MercadoLibre frequently challenges datacenter traffic. In Apify cloud testing, datacenter/no-proxy runs were bot-checked, while Chile residential proxy runs succeeded.

Recommended production settings:

- `proxyConfiguration.useApifyProxy`: `true`
- `proxyConfiguration.apifyProxyGroups`: `["RESIDENTIAL"]`
- `proxyConfiguration.apifyProxyCountry`: `"CL"`
- `htmlRetryCount`: `2`
- `requestDelayMs`: `700` or higher for large runs

The scraper uses a fallback ladder:

1. MercadoLibre API when an OAuth token is provided.
2. Embedded MercadoLibre Nordic page state for standard no-token search runs.
3. Public product-page enrichment when `includeDetails` is enabled.
4. JSON-LD, listing-card, link, and URL-fragment parsing.
5. Graceful nulls with field diagnostics instead of silent failures.

### Benchmark

Latest Apify cloud benchmark, May 13, 2026:

- 20 Chile search queries.
- 500 saved listings.
- 500 unique listing IDs.
- 20/20 queries represented.
- 0 warning logs.
- 100% `item_id`, `title`, `permalink`, `thumbnail`, and `price_clp` fill.
- 55.6% original-price/discount fill, because only discounted items expose those fields.
- Version `0.1.19` adds embedded-state parsing that materially improves category, seller, rating, shipping, Full/fulfillment, and sponsored-ad fill rates in standard mode. Enriched mode can now use public product pages without OAuth for sold-count and seller/reputation evidence.
- Runtime: 290 seconds.
- Default memory: 2048 MB.
- Apify usage cost: about `$0.052`, or about `$0.10 / 1,000 saved listings`.
- Proxy traffic: about 0.003115 GB using residential Chile proxy.

This benchmark is included so users and agents can reason about reliability and cost before running the Actor. It is not a guarantee for every query, because MercadoLibre pages, retry rates, proxy traffic, and enrichment settings can change real usage.

### Pricing

The Actor charges per saved listing:

- `$0.0015` per listing.
- `$1.50` per 1,000 saved listings.
- A small 25-listing test costs about `$0.04`.

You only pay for listings saved to the output dataset.

### Use Cases

- Scrape MercadoLibre Chile listings for a product keyword.
- Export `MLC` prices, discounts, thumbnails, URLs, and search positions.
- Monitor competitor price changes by scheduling repeat runs.
- Build a historical MercadoLibre Chile dataset from daily snapshots.
- Collect sponsored/ad placement signals from public search results.
- Feed structured MercadoLibre Chile data into AI agents, MCP tools, notebooks, dashboards, or ecommerce research workflows.

### Dataset Views

The default dataset includes multiple Apify views:

- `overview`: general listing table.
- `pricing`: price, original price, discount, rank, and scrape time.
- `ads`: sponsored/ad signals and search position.
- `shipping`: free shipping, logistics type, and fulfillment/Full signals.
- `agent_view`: compact fields for AI agents and data pipelines.

### AI Agent Use

This Actor is designed for LLM and agent workflows. Search keywords and README terms intentionally include:

`MercadoLibre Chile`, `mercadolibre.cl`, `MLC scraper`, `MercadoLibre scraper`, `MercadoLibre product listings`, `MercadoLibre prices`, `Chile ecommerce`, `product research Chile`, `price monitoring`, `historical data`, `AI agent JSON`, `Apify MCP`, `MercadoLibre listing scraper`.

Example agent prompt:

```text
Use the MercadoLibre Chile Scraper actor to collect 100 standard listings for "impresora termica" on MercadoLibre Chile. Return item_id, title, price_clp, permalink, thumbnail, discount_percent, is_sponsored, and position.
```

Example historical-data prompt:

```text
Schedule the MercadoLibre Chile Scraper actor daily for "audifonos bluetooth" and "impresora termica" to build a historical dataset of prices, ranking positions, discounts, sponsored ads, and shipping signals on MercadoLibre Chile.
```

### Local Development

```bash
npm install
npm test
npm run benchmark
npm run apify:validate
npm run apify:trial
npm run apify:cloud-trial
npm run apify:cloud-benchmark
npm run apify:push
npm start
```

For local `npm start`, create Apify local storage input at:

```text
storage/key_value_stores/default/INPUT.json
```

### Notes

This Actor extracts public marketplace listing data. It does not log into MercadoLibre accounts, bypass private pages, or access private seller analytics. Users are responsible for using the data in accordance with applicable laws and marketplace terms.

# Actor input Schema

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

Product names or keywords to search on MercadoLibre Chile.

## `startUrls` (type: `array`):

MercadoLibre Chile search/listing URLs or direct product URLs.

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

Maximum unique listings to save across all inputs.

## `maxItemsPerQuery` (type: `integer`):

Optional per-query cap. Use 0 for no per-query cap.

## `maxPagesPerQuery` (type: `integer`):

Each API search page returns up to 50 listings. Keep this low for cheaper, steadier runs.

## `htmlRetryCount` (type: `integer`):

How many extra attempts to make for each public page using fresh proxy sessions.

## `searchMode` (type: `string`):

API first uses API when an OAuth token is provided, otherwise it uses public HTML extraction. HTML mode is best for no-token runs.

## `outputMode` (type: `string`):

Lean is smallest. Standard returns search-result intelligence from embedded page state. Enriched adds product-page or API detail evidence such as sold-count buckets, seller IDs, reputation, review totals, category, condition, and shipping details.

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

Sorting applied to keyword searches when supported by MercadoLibre.

## `categoryId` (type: `string`):

Optional MercadoLibre Chile category ID, for example MLC1051.

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

Fetch richer item details. With OAuth, the Actor uses MercadoLibre API. Without OAuth, it visits public product pages for sold-count buckets, seller signals, category, reviews, and shipping details.

## `maxPublicDetailPages` (type: `integer`):

Safety cap for product-page enrichment when Enrich item details is enabled without an OAuth token. Product pages improve evidence but cost more than search-result parsing.

## `includeSeller` (type: `boolean`):

Fetch public seller profile and reputation signals when available.

## `includeReviews` (type: `boolean`):

Fetch public item review summaries where the endpoint allows it. Some review data may require a token.

## `mercadoLibreAccessToken` (type: `string`):

Optional OAuth token for MercadoLibre API endpoints that require authentication. Without it, the Actor still uses public page extraction.

## `includeRaw` (type: `boolean`):

Include compact raw API snippets for debugging. Leave off for clean production datasets.

## `includeTrendingSearches` (type: `boolean`):

Use MercadoLibre Chile trending search terms as additional queries before the manually provided searches. Requires a MercadoLibre OAuth token.

## `maxTrendingSearches` (type: `integer`):

Maximum number of MercadoLibre Chile trending search terms to add when trends are enabled.

## `trendCategoryIds` (type: `array`):

Optional MercadoLibre Chile category IDs for trend collection, for example MLC1051. Leave empty for site-wide trends.

## `maxConcurrency` (type: `integer`):

How many enrichment requests can run at the same time.

## `requestDelayMs` (type: `integer`):

Delay between requests in milliseconds. Higher values are slower but gentler.

## `failOnQualityDrop` (type: `boolean`):

Fail the run when quality thresholds are not met. Useful for scheduled canary checks and monitoring.

## `minCoreFieldFillScore` (type: `number`):

Minimum allowed average fill score for core fields when fail-on-quality-drop is enabled.

## `minFieldFillScore` (type: `number`):

Minimum allowed average fill score for expected fields when fail-on-quality-drop is enabled.

## `maxWarningCount` (type: `integer`):

Maximum allowed warning count when fail-on-quality-drop is enabled.

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

Apify proxy settings. Residential Chile proxy is the recommended production default for MercadoLibre Chile page extraction.

## Actor input object example

```json
{
  "searchQueries": [
    "audifonos bluetooth",
    "impresora termica"
  ],
  "startUrls": [
    {
      "url": "https://listado.mercadolibre.cl/audifonos-bluetooth"
    }
  ],
  "maxItems": 100,
  "maxItemsPerQuery": 0,
  "maxPagesPerQuery": 2,
  "htmlRetryCount": 2,
  "searchMode": "api_first",
  "outputMode": "standard",
  "sort": "relevance",
  "categoryId": "",
  "includeDetails": false,
  "maxPublicDetailPages": 50,
  "includeSeller": false,
  "includeReviews": false,
  "includeRaw": false,
  "includeTrendingSearches": false,
  "maxTrendingSearches": 20,
  "trendCategoryIds": [],
  "maxConcurrency": 3,
  "requestDelayMs": 700,
  "failOnQualityDrop": false,
  "minCoreFieldFillScore": 0,
  "minFieldFillScore": 0,
  "maxWarningCount": 100,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "CL"
  }
}
```

# Actor output Schema

## `runSummary` (type: `string`):

Machine-readable run health summary with listing counts, field-fill scores, warnings, pricing estimate, represented queries, and quality status.

## `listings` (type: `string`):

JSON dataset items containing listing IDs, titles, CLP prices, discounts, URLs, thumbnails, search positions, sponsored/ad signals, category/domain IDs, seller signals, review signals, shipping/Full signals, and extraction diagnostics.

## `overview` (type: `string`):

A table-oriented view of the same default dataset, optimized for quickly checking prices, discounts, rankings, ads, shipping signals, and product URLs.

## `pricing` (type: `string`):

Dataset view focused on CLP prices, original prices, discounts, search positions, URLs, and scrape time.

## `ads` (type: `string`):

Dataset view focused on search rank, sponsored/ad signals, ad type, listing IDs, prices, and URLs.

## `shipping` (type: `string`):

Dataset view focused on free shipping, fulfillment/Full signals, logistics type, shipping tags, and URLs.

## `agentView` (type: `string`):

Compact high-signal dataset view for AI agents and data pipelines, including price, rank, category, seller, review, shipping, and sold-count evidence when available.

# 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 = {
    "searchQueries": [
        "audifonos bluetooth",
        "impresora termica"
    ],
    "startUrls": [
        {
            "url": "https://listado.mercadolibre.cl/audifonos-bluetooth"
        }
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("jchame/mercadolibre-chile-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 = {
    "searchQueries": [
        "audifonos bluetooth",
        "impresora termica",
    ],
    "startUrls": [{ "url": "https://listado.mercadolibre.cl/audifonos-bluetooth" }],
}

# Run the Actor and wait for it to finish
run = client.actor("jchame/mercadolibre-chile-scraper").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 '{
  "searchQueries": [
    "audifonos bluetooth",
    "impresora termica"
  ],
  "startUrls": [
    {
      "url": "https://listado.mercadolibre.cl/audifonos-bluetooth"
    }
  ]
}' |
apify call jchame/mercadolibre-chile-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=jchame/mercadolibre-chile-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "MercadoLibre Chile Scraper | Prices, Listings & Historical Data",
        "description": "Scrape MercadoLibre Chile (mercadolibre.cl / MLC) listings. Extract CLP prices, discounts, search rank, sponsored ads, item IDs, URLs, thumbnails, shipping/Full signals, and AI-ready JSON/CSV for price monitoring, historical datasets, and ecommerce research.",
        "version": "0.1",
        "x-build-id": "wU8d6Mi6iagRkIMan"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/jchame~mercadolibre-chile-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-jchame-mercadolibre-chile-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/jchame~mercadolibre-chile-scraper/runs": {
            "post": {
                "operationId": "runs-sync-jchame-mercadolibre-chile-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/jchame~mercadolibre-chile-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-jchame-mercadolibre-chile-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "properties": {
                    "searchQueries": {
                        "title": "Search queries",
                        "type": "array",
                        "description": "Product names or keywords to search on MercadoLibre Chile.",
                        "default": [],
                        "items": {
                            "type": "string"
                        }
                    },
                    "startUrls": {
                        "title": "MercadoLibre URLs",
                        "type": "array",
                        "description": "MercadoLibre Chile search/listing URLs or direct product URLs.",
                        "default": [],
                        "items": {
                            "type": "object",
                            "required": [
                                "url"
                            ],
                            "properties": {
                                "url": {
                                    "type": "string",
                                    "title": "URL of a web page",
                                    "format": "uri"
                                }
                            }
                        }
                    },
                    "maxItems": {
                        "title": "Maximum items",
                        "minimum": 1,
                        "maximum": 5000,
                        "type": "integer",
                        "description": "Maximum unique listings to save across all inputs.",
                        "default": 100
                    },
                    "maxItemsPerQuery": {
                        "title": "Maximum items per query",
                        "minimum": 0,
                        "maximum": 5000,
                        "type": "integer",
                        "description": "Optional per-query cap. Use 0 for no per-query cap.",
                        "default": 0
                    },
                    "maxPagesPerQuery": {
                        "title": "Maximum pages per query",
                        "minimum": 1,
                        "maximum": 50,
                        "type": "integer",
                        "description": "Each API search page returns up to 50 listings. Keep this low for cheaper, steadier runs.",
                        "default": 2
                    },
                    "htmlRetryCount": {
                        "title": "HTML retry count",
                        "minimum": 0,
                        "maximum": 5,
                        "type": "integer",
                        "description": "How many extra attempts to make for each public page using fresh proxy sessions.",
                        "default": 2
                    },
                    "searchMode": {
                        "title": "Search mode",
                        "enum": [
                            "api_first",
                            "api_only",
                            "html_only"
                        ],
                        "type": "string",
                        "description": "API first uses API when an OAuth token is provided, otherwise it uses public HTML extraction. HTML mode is best for no-token runs.",
                        "default": "api_first"
                    },
                    "outputMode": {
                        "title": "Output mode",
                        "enum": [
                            "lean",
                            "standard",
                            "enriched"
                        ],
                        "type": "string",
                        "description": "Lean is smallest. Standard returns search-result intelligence from embedded page state. Enriched adds product-page or API detail evidence such as sold-count buckets, seller IDs, reputation, review totals, category, condition, and shipping details.",
                        "default": "standard"
                    },
                    "sort": {
                        "title": "Sort",
                        "enum": [
                            "relevance",
                            "price_asc",
                            "price_desc"
                        ],
                        "type": "string",
                        "description": "Sorting applied to keyword searches when supported by MercadoLibre.",
                        "default": "relevance"
                    },
                    "categoryId": {
                        "title": "Category ID",
                        "type": "string",
                        "description": "Optional MercadoLibre Chile category ID, for example MLC1051.",
                        "default": ""
                    },
                    "includeDetails": {
                        "title": "Enrich item details",
                        "type": "boolean",
                        "description": "Fetch richer item details. With OAuth, the Actor uses MercadoLibre API. Without OAuth, it visits public product pages for sold-count buckets, seller signals, category, reviews, and shipping details.",
                        "default": false
                    },
                    "maxPublicDetailPages": {
                        "title": "Maximum public detail pages",
                        "minimum": 0,
                        "maximum": 500,
                        "type": "integer",
                        "description": "Safety cap for product-page enrichment when Enrich item details is enabled without an OAuth token. Product pages improve evidence but cost more than search-result parsing.",
                        "default": 50
                    },
                    "includeSeller": {
                        "title": "Enrich sellers",
                        "type": "boolean",
                        "description": "Fetch public seller profile and reputation signals when available.",
                        "default": false
                    },
                    "includeReviews": {
                        "title": "Fetch reviews",
                        "type": "boolean",
                        "description": "Fetch public item review summaries where the endpoint allows it. Some review data may require a token.",
                        "default": false
                    },
                    "mercadoLibreAccessToken": {
                        "title": "MercadoLibre access token",
                        "type": "string",
                        "description": "Optional OAuth token for MercadoLibre API endpoints that require authentication. Without it, the Actor still uses public page extraction."
                    },
                    "includeRaw": {
                        "title": "Include raw snippets",
                        "type": "boolean",
                        "description": "Include compact raw API snippets for debugging. Leave off for clean production datasets.",
                        "default": false
                    },
                    "includeTrendingSearches": {
                        "title": "Include MercadoLibre trends",
                        "type": "boolean",
                        "description": "Use MercadoLibre Chile trending search terms as additional queries before the manually provided searches. Requires a MercadoLibre OAuth token.",
                        "default": false
                    },
                    "maxTrendingSearches": {
                        "title": "Maximum trending searches",
                        "minimum": 1,
                        "maximum": 50,
                        "type": "integer",
                        "description": "Maximum number of MercadoLibre Chile trending search terms to add when trends are enabled.",
                        "default": 20
                    },
                    "trendCategoryIds": {
                        "title": "Trend category IDs",
                        "type": "array",
                        "description": "Optional MercadoLibre Chile category IDs for trend collection, for example MLC1051. Leave empty for site-wide trends.",
                        "default": [],
                        "items": {
                            "type": "string"
                        }
                    },
                    "maxConcurrency": {
                        "title": "Maximum concurrency",
                        "minimum": 1,
                        "maximum": 20,
                        "type": "integer",
                        "description": "How many enrichment requests can run at the same time.",
                        "default": 3
                    },
                    "requestDelayMs": {
                        "title": "Request delay",
                        "minimum": 0,
                        "maximum": 10000,
                        "type": "integer",
                        "description": "Delay between requests in milliseconds. Higher values are slower but gentler.",
                        "default": 700
                    },
                    "failOnQualityDrop": {
                        "title": "Fail on quality drop",
                        "type": "boolean",
                        "description": "Fail the run when quality thresholds are not met. Useful for scheduled canary checks and monitoring.",
                        "default": false
                    },
                    "minCoreFieldFillScore": {
                        "title": "Minimum core field score",
                        "minimum": 0,
                        "maximum": 1,
                        "type": "number",
                        "description": "Minimum allowed average fill score for core fields when fail-on-quality-drop is enabled.",
                        "default": 0
                    },
                    "minFieldFillScore": {
                        "title": "Minimum expected field score",
                        "minimum": 0,
                        "maximum": 1,
                        "type": "number",
                        "description": "Minimum allowed average fill score for expected fields when fail-on-quality-drop is enabled.",
                        "default": 0
                    },
                    "maxWarningCount": {
                        "title": "Maximum warnings",
                        "minimum": 0,
                        "maximum": 100,
                        "type": "integer",
                        "description": "Maximum allowed warning count when fail-on-quality-drop is enabled.",
                        "default": 100
                    },
                    "proxyConfiguration": {
                        "title": "Proxy configuration",
                        "type": "object",
                        "description": "Apify proxy settings. Residential Chile proxy is the recommended production default for MercadoLibre Chile page extraction.",
                        "default": {
                            "useApifyProxy": true,
                            "apifyProxyGroups": [
                                "RESIDENTIAL"
                            ],
                            "apifyProxyCountry": "CL"
                        }
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
