# Exito Colombia Grocery Price & Stock Scraper (`scrapers_lat/exito-scraper`) Actor

Scrape Exito Colombia grocery and retail products by keyword or category. Extract price, list price, stock, installments, EAN, brand and seller in Colombian pesos. Export to JSON, CSV or Excel.

- **URL**: https://apify.com/scrapers\_lat/exito-scraper.md
- **Developed by:** [Scrapers Lat](https://apify.com/scrapers_lat) (community)
- **Categories:** E-commerce, Automation, Business
- **Stats:** 1 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: 5.00 out of 5 stars

## Pricing

from $6.15 / 1,000 results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
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?

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

[![Exito Colombia Grocery Price & Stock Scraper](https://scrapers.lat/banners/exito-scraper.png)](https://console.apify.com/actors/NSqpT3K3tjdxiyOzP/input)

## Exito Colombia Grocery Price & Stock Scraper

Here is one real result, with every field the actor returns (detail fetch and both AI add-ons enabled):

```json
{
  "name": "Arroz blanco Premium ARROZ SONORA PREMIUM Arroz Blanco (4000  gr)",
  "brand": "ARROZ SONORA PREMIUM",
  "category": "Mercado > Despensa > Granos y arroz",
  "productId": "3250861",
  "sku": "3841129",
  "ean": "7700798000017",
  "productReference": "3250861",
  "price": 22300,
  "listPrice": 22750,
  "sellingPrice": 22300,
  "pricePerUnit": 22300,
  "discountPercentage": 2,
  "currency": "COP",
  "installments": 48,
  "installmentsTable": [
    { "number": 1, "value": 22300, "interestRate": 0, "total": 22300, "paymentName": "American Express à vista" },
    { "number": 12, "value": 1859, "interestRate": 0, "total": 22300, "paymentName": "American Express 12 vezes sem juros" }
  ],
  "priceValidUntil": "2027-08-13T00:00:00Z",
  "promoTeasers": null,
  "measurementUnit": "un",
  "unitMultiplier": 1,
  "available": true,
  "stock": 99999,
  "seller": "exito",
  "isMarketplace": false,
  "categories": ["Mercado > Despensa > Granos y arroz", "Mercado > Despensa", "Mercado"],
  "releaseDate": "2026-06-22T00:00:00Z",
  "imageUrl": "https://exitocol.vteximg.com.br/arquivos/ids/33797019/Arroz-blanco-ARROZ-SONORA-PREMIUM-Arroz-4-gr-3841129_a.jpg?v=639176968367100000",
  "images": ["https://exitocol.vteximg.com.br/arquivos/ids/33797019/Arroz-blanco-ARROZ-SONORA-PREMIUM-Arroz-4-gr-3841129_a.jpg?v=639176968367100000"],
  "url": "https://tienda.exito.com/arroz-blanco-arroz-sonora-premium-arroz-4-gr-3250861/p",
  "description": null,
  "specifications": { "Tipo de Producto": "Arroz", "Tipo de Arroz": "Premium", "IVA": "0", "Vendido por": "Éxito", "Ingredientes": "Arroz Blanco", "Conservacion": "Conservar en lugar seco y fresco", "Factor Neto PUM": "4000" },
  "aiDescription": "Descubre el Arroz Blanco Premium ARROZ SONORA PREMIUM, un producto de alta calidad que garantiza un sabor y textura excepcionales ... (full text, trimmed here)",
  "aiAttributes": { "tipo": "Arroz", "tipo_de_arroz": "Premium", "peso": "4000 gr", "ingredientes": "Arroz Blanco", "conservacion": "Conservar en lugar seco y fresco" },
  "aiTags": ["arroz", "granos", "premium", "blanco", "despensa", "Éxito"],
  "observedAt": "2026-08-14T07:50:40.221Z",
  "error": null
}
```

The most complete Exito Colombia scraper available. It returns every field an Exito (VTEX) product listing exposes, including the full price and installment breakdown, EAN and SKU, live stock, seller and specifications, plus optional AI marketing descriptions and structured attributes, and gives you search, category and sort filters to target exactly the products you need.

**📥 [Input](https://apify.com/scrapers_lat/exito-scraper/input-schema) · 📤 [Output](https://apify.com/scrapers_lat/exito-scraper/output-schema) · 💰 [Pricing](https://apify.com/scrapers_lat/exito-scraper/pricing) · ▶️ [Examples](https://apify.com/scrapers_lat/exito-scraper/examples)**

![Apify](https://img.shields.io/badge/Platform-Apify-1CE1CE?logo=apify\&logoColor=white)
![Coverage](https://img.shields.io/badge/Coverage-Colombia-blue)
![Output](https://img.shields.io/badge/Output-JSON%20%7C%20CSV%20%7C%20Excel-orange)
![Billing](https://img.shields.io/badge/Billing-Pay%20per%20result-brightgreen)

### Table of contents

- [What it does](#what-it-does)
- [Quickstart](#quickstart)
- [Input reference](#input-reference)
- [Output reference](#output-reference)
- [Example output record](#example-output-record)
- [Run via API and CLI](#run-via-api-and-cli)
- [Fetch results](#fetch-results)
- [Billing and limits](#billing-and-limits)
- [FAQ and troubleshooting](#faq-and-troubleshooting)

### What it does

The actor searches the Exito Colombia catalog (VTEX) for the terms and categories you pass, paginates through the matching products, and writes one normalized record per product to the run's dataset. Each record carries the name, brand, category path, EAN, SKU, list and selling price, discount, installment breakdown, live stock, seller and images. With detail fetch on (the default) the product description and technical specifications are added too. Missing source values are returned as `null` and never invented.

Exito is geo-restricted to Colombia, so a Colombian residential proxy is enabled by default and required for stable access. Optional paid AI add-ons write a Spanish marketing description and extract structured attributes and search tags.

### Quickstart

Open the actor, paste this into the input, and press Run. It returns up to 10 rice products from the Exito catalog with full detail.

```json
{
  "searchTerms": ["arroz"],
  "withDetails": true,
  "maxProducts": 10
}
```

Provide `searchTerms`, `categories`, or both. Free plans return up to 10 products per run.

### Input reference

| Field | Type | Required | Default | Description |
|---|---|---|---|---|
| `searchTerms` | string\[] | yes\* | `["arroz"]` | Full-text catalog queries, for example `arroz`, `televisor lg`, `pañales`. Each term is searched separately. \*Provide `searchTerms`, `categories`, or both. |
| `categories` | string\[] | no | `[]` | Restrict to Exito departments by code, for example `34185082` (Mercado/Groceries), `34185084` (Tecnologia). Each is scraped separately. |
| `sortOrder` | enum | no | (relevance) | Catalog order, for example `OrderByPriceASC`, `OrderByTopSaleDESC`, `OrderByBestDiscountDESC`. Empty keeps relevance order. |
| `withDetails` | boolean | no | `true` | Add the product description and technical specifications. Turn off for a faster, lighter run. |
| `maxProducts` | integer | no | `10` | Maximum products to collect. Free Apify plans are capped at 10 per run. |
| `withAiDescription` | boolean | no | `false` | Paid AI add-on. Adds `aiDescription`, a Spanish marketing description. Billed per product. Requires a paid Apify plan. |
| `withAiAttributes` | boolean | no | `false` | Paid AI add-on. Adds `aiAttributes` and `aiTags`. Billed per product. Requires a paid Apify plan. |

### Output reference

One dataset item per product. Types: `string`, `number`, `integer`, `boolean`, `string[]`, `object`, `object[]`, or `null` when the source value is absent.

| Field | Type | Description |
|---|---|---|
| `name` | string | Product name. |
| `brand` | string | Brand name. |
| `category` | string | Primary category path. |
| `productId` | string | Exito product id. |
| `sku` | string | SKU identifier. |
| `ean` | string | EAN barcode. |
| `productReference` | string | Internal product reference. |
| `price` | number | Current price (COP). |
| `listPrice` | number | List (pre-discount) price. |
| `sellingPrice` | number | Selling price. |
| `pricePerUnit` | number | Price per unit of measure. |
| `discountPercentage` | number | Discount percentage vs list price. |
| `currency` | string | Always `COP`. |
| `installments` | integer | Maximum number of installments offered. |
| `installmentsTable` | object\[] | Full installment plans per payment method (`number`, `value`, `interestRate`, `total`, `paymentName`). |
| `priceValidUntil` | string | Date the price is valid until. |
| `promoTeasers` | array | Promotion teasers when present, else `null`. |
| `measurementUnit` | string | Unit of measure, for example `un`. |
| `unitMultiplier` | number | Unit multiplier. |
| `available` | boolean | `true` if in stock. |
| `stock` | integer | Available stock quantity. |
| `seller` | string | Seller name, for example `exito`. |
| `isMarketplace` | boolean | `true` if sold by a marketplace seller. |
| `categories` | string\[] | Full category path hierarchy. |
| `releaseDate` | string | Product release date. |
| `imageUrl` | string | Primary image URL. |
| `images` | string\[] | All image URLs. |
| `url` | string | Product page URL. |
| `description` | string | Product description. Present with `withDetails`, else `null`. |
| `specifications` | object | Technical specifications as key/value pairs. Present with `withDetails`. |
| `aiDescription` | string | Spanish marketing description. Present only with `withAiDescription`. |
| `aiAttributes` | object | Structured product attributes. Present only with `withAiAttributes`. |
| `aiTags` | string\[] | Search tags. Present only with `withAiAttributes`. |
| `observedAt` | string | ISO 8601 timestamp of when the record was collected. |
| `error` | string | `null` on success. On a failed run, a single item with a populated `error` field is written instead. |

### Example output record

Real record from a live run (input `{"searchTerms":["arroz"],"withDetails":true,"withAiDescription":true,"withAiAttributes":true}`). The full record is shown at the top of this page; the large `installmentsTable` (one entry per payment method and term) is trimmed there to two entries and the `aiDescription` text is trimmed, with all shown values unmodified.

### Run via API and CLI

Start a run and wait for it to finish, then read the dataset. Replace `<TOKEN>` with your Apify API token.

Run synchronously and get dataset items in one call:

```bash
curl -X POST "https://api.apify.com/v2/acts/scrapers_lat~exito-scraper/run-sync-get-dataset-items?token=%3CTOKEN%3E" \
  -H "Content-Type: application/json" \
  -d '{"searchTerms":["televisor lg"],"sortOrder":"OrderByPriceASC","maxProducts":25}'
```

Start a run asynchronously:

```bash
curl -X POST "https://api.apify.com/v2/acts/scrapers_lat~exito-scraper/runs?token=%3CTOKEN%3E" \
  -H "Content-Type: application/json" \
  -d '{"categories":["34185082"],"sortOrder":"OrderByBestDiscountDESC","maxProducts":100}'
```

Apify CLI:

```bash
apify call scrapers_lat/exito-scraper \
  --input '{"searchTerms":["pañales"],"withDetails":true}'
```

### Fetch results

Every run writes to a dataset. Fetch items as JSON, CSV, or Excel by changing `format`:

```bash
## JSON
curl "https://api.apify.com/v2/datasets/%3CDATASET_ID%3E/items?token=%3CTOKEN%3E&clean=true&format=json"

## CSV
curl "https://api.apify.com/v2/datasets/%3CDATASET_ID%3E/items?token=%3CTOKEN%3E&clean=true&format=csv"

## Paginate large datasets
curl "https://api.apify.com/v2/datasets/%3CDATASET_ID%3E/items?token=%3CTOKEN%3E&offset=1000&limit=1000"
```

`<DATASET_ID>` is returned as `defaultDatasetId` in the run object. Use `offset` and `limit` to page through large result sets. `clean=true` drops empty and internal fields.

### Billing and limits

- **Pay per result.** You are charged per product returned (`result` event). With `withDetails` on, a `details` event is also charged per product enriched. See the [pricing tab](https://apify.com/scrapers_lat/exito-scraper/pricing) for current prices.
- **AI add-ons billed separately.** `withAiDescription` and `withAiAttributes` each charge their own event and only when the AI output is produced. They require a paid Apify plan and are disabled for free users.
- **No charge on failure.** If a run errors, the actor writes a single item with a populated `error` field and does not charge for it. Empty runs cost nothing.
- **Spend cap respected.** Set `maxTotalChargeUsd` on the run; once reached, the actor stops emitting and charging further billable results.
- **Free Apify plans** are capped at 10 products per run. Upgrade for higher `maxProducts`.

### FAQ and troubleshooting

**A run returned 0 records or timed out. Why?**
Exito is geo-restricted to Colombia. A Colombian residential proxy is enabled by default; keep it on. If a search matched nothing, broaden `searchTerms` or remove a category. Zero-result runs are not charged.

**Why is `description` null even with detail fetch on?**
Some products do not publish a long description on Exito. The specifications are still returned. Missing source values are returned as `null`, never invented.

**How do I scrape a whole department?**
Put the department code in `categories`, for example `34185082` for Mercado (Groceries). Combine with `sortOrder` to page best sellers or biggest discounts first.

**What currency are prices in?**
Colombian pesos (`COP`). The `installmentsTable` breaks down each payment method's plan.

**How do I get the best-priced or most-discounted items first?**
Set `sortOrder` to `OrderByPriceASC` or `OrderByBestDiscountDESC`.

**Is this an official Exito tool?**
No. This actor is independent and has no affiliation with Grupo Exito. It reads only data that is publicly available on the Exito storefront. Use it in accordance with the Exito terms of service.

### Related scrapers

- [Olimpica Scraper](https://apify.com/scrapers_lat/olimpica-scraper): Olimpica Colombia grocery prices and stock.
- [Cruz Verde Scraper](https://apify.com/scrapers_lat/cruz-verde-scraper): Cruz Verde Colombia pharmacy products.
- [Chedraui Scraper](https://apify.com/scrapers_lat/chedraui-scraper): Chedraui Mexico grocery prices.
- [MercadoLibre Scraper](https://apify.com/scrapers_lat/mercadolibre-scraper): MercadoLibre listings across Latin America.
- [Rappi Scraper](https://apify.com/scrapers_lat/rappi-scraper): Rappi store products and prices.

### More scrapers at scrapers.lat

Built and maintained by [scrapers.lat](https://scrapers.lat), where we publish scrapers for US, European and Latin American public platforms: company registries, government data, finance, e-commerce and more. Browse the catalog or request a custom scraper at [scrapers.lat](https://scrapers.lat).

***

> Independent tool, not affiliated with Grupo Exito. Accesses only publicly available storefront data. Use in accordance with the Exito terms of service.

# Actor input Schema

## `maxProducts` (type: `integer`):

Maximum number of products to collect. Optional.

## `withDetails` (type: `boolean`):

When enabled, each record also includes the product description and technical specifications. Disable for a faster, lighter run.

## `withAiDescription` (type: `boolean`):

Opt-in AI add-on (paid plans only). Generate an attractive Spanish marketing description for each product from its name, brand, category and specs. Billed per product.

## `withAiAttributes` (type: `boolean`):

Opt-in AI add-on (paid plans only). Extract structured product attributes (color, size, material, etc.) and search tags for each product. Billed per product.

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

Full-text queries to search the Exito catalog (e.g. "arroz", "televisor lg", "pañales"). Each term is searched separately. Maps to the VTEX ft parameter.

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

Restrict results to one or more Exito departments. Each selected department is scraped separately. Maps to the VTEX fq=C: filter.

## `sortOrder` (type: `string`):

Order in which the catalog returns products. Maps to the VTEX O parameter.

## Actor input object example

```json
{
  "maxProducts": 10,
  "withDetails": true,
  "withAiDescription": false,
  "withAiAttributes": false,
  "searchTerms": [
    "arroz"
  ],
  "categories": [],
  "sortOrder": ""
}
```

# Actor output Schema

## `results` (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 = {
    "maxProducts": 10,
    "searchTerms": [
        "arroz"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("scrapers_lat/exito-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 = {
    "maxProducts": 10,
    "searchTerms": ["arroz"],
}

# Run the Actor and wait for it to finish
run = client.actor("scrapers_lat/exito-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 '{
  "maxProducts": 10,
  "searchTerms": [
    "arroz"
  ]
}' |
apify call scrapers_lat/exito-scraper --silent --output-dataset

```

## MCP server setup

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