# Mexico Supermarket Prices - PROFECO (Walmart, Soriana, HEB) (`timekast/mexico-retail-prices-profeco`) Actor

Official store-level prices for groceries, medicines and appliances in 37 Mexican cities from PROFECO: Walmart, Soriana, Chedraui, HEB, La Comer. No login.

- **URL**: https://apify.com/timekast/mexico-retail-prices-profeco.md
- **Developed by:** [TimeKast](https://apify.com/timekast) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.00 / 1,000 price records

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

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Mexico Supermarket Prices API - PROFECO Quién es Quién (Walmart, Soriana, Chedraui, HEB)

**Official, store-level prices for groceries, medicines and home appliances in 37 Mexican cities**, from PROFECO's *Quién es Quién en los Precios* program (Mexico's federal consumer agency). Covers Walmart, Bodega Aurrera, Soriana, Chedraui, HEB, La Comer, SuperISSSTE, pharmacies and public markets. No login, no browser, no blocking: **US$2.00 per 1,000 price rows**, and you pay only for rows delivered.

[🇲🇽 Versión en español abajo](#-español)

### What data do you get?

One row per **product × store × observation date**, cleaned and ready for analysis:

- **Product**: full name, PROFECO product type, parsed **brand**, presentation and **size** (e.g. `1 LT`, `1.4 KG`)
- **Price** in MXN and the exact **observation date**
- **Store**: normalized **chain** (Walmart, Soriana, Chedraui, HEB, La Comer…), branch name, street address, colonia, postal code, municipality, state
- **City** (37 PROFECO-covered cities) and the search term that produced the row
- Source attribution and extraction timestamp

### Use cases

- **CPG brands & distributors** - shelf-price monitoring of your SKUs and competitors, by chain and city.
- **Retail & pricing analysts** - compare Walmart vs Soriana vs Chedraui vs HEB price levels; track promotions over time.
- **Economists, journalists, fintechs** - local inflation panels (tortilla, leche, huevo, the *canasta básica*).
- **Apps & AI agents** - "where is milk cheapest in Monterrey?" via the Apify API or MCP server.
- **Scheduled datasets** - run daily or weekly with Apify Schedules and send results to Google Sheets, a webhook, S3 or your database.

### How to use it

1. Type one or more products in Spanish (as PROFECO names them): `leche`, `huevo`, `tortilla`, `aceite`, `paracetamol`, `refrigerador`… Brand names work too (`Alpura`, `Bimbo`). Or pick a preset basket.
2. Choose cities (`Ciudad de México`, `Monterrey`, `Guadalajara`… or `ALL`).
3. Optionally filter by chain or PROFECO product type, and set **Max results**.
4. Run, then download as JSON, CSV, Excel or HTML, or read it via the API.

#### Input example

```json
{
  "searchTerms": ["leche", "huevo"],
  "cities": ["Ciudad de México", "Monterrey"],
  "chains": ["Soriana", "Walmart"],
  "latestOnly": true,
  "maxItems": 1000
}
```

| Field | Description |
|---|---|
| `searchTerms` | Products in Spanish as PROFECO names them. Brands work too. |
| `preset` | `canasta_basica` (28 staples), `medicamentos` (8), `electrodomesticos` (8) - added to your terms. |
| `cities` | City names or codes, or `ALL` for all 37 cities. Default: Ciudad de México. |
| `chains` | Optional, e.g. `["Soriana","Walmart","HEB"]`. |
| `productTypes` | Optional PROFECO product type, e.g. `LECHE ULTRAPASTEURIZADA`. |
| `latestOnly` | Keep only the newest price per store and product (default `true`). |
| `maxItems` | Stop after N rows (0 = no limit). Default 1,000. |

#### Output sample

```json
{
  "product": "LECHE EN POLVO, NIDO. KINDER, LATA 1.4 KG. (ALIMENTO PARA NIÑOS...)",
  "productType": "LECHE EN POLVO",
  "brand": "NIDO",
  "presentation": "KINDER, LATA 1.4 KG. (ALIMENTO PARA NIÑOS...)",
  "size": "1.4 KG",
  "priceMxn": 269,
  "observedDate": "2026-10-14",
  "chain": "SuperISSSTE",
  "chainRaw": "SUPERISSSTE",
  "store": "I.S.S.S.T.E. SUCURSAL 110",
  "address": "ESCUELA NAVAL MILITAR S/N, ESQ. TEPETLAPA",
  "neighborhood": "ALIANZA POPULAR REVOLUCIONARIA U.H.",
  "postalCode": "04800",
  "municipality": "Coyoacán",
  "state": "Ciudad de México",
  "cityCode": "0901",
  "city": "Ciudad de México",
  "searchTerm": "leche",
  "source": "PROFECO - Quién es Quién en los Precios",
  "sourceUrl": "https://qqp.profeco.gob.mx/",
  "scrapedAt": "2026-10-19T12:37:59.188Z"
}
```

### How much does it cost?

Pay per event - you pay only for price rows delivered to your dataset (plus Apify's tiny standard start fee of US$0.00005 per run).

| Event | Price |
|---|---|
| Price record (one row) | US$0.002 → **US$2.00 per 1,000 rows** |

Real runs (Oct 2026): `leche` + `huevo` in Mexico City = 714 rows ≈ **US$1.43** in 9 s. The full *canasta básica* preset in CDMX + Monterrey + Guadalajara, Soriana only = 2,946 rows ≈ **US$5.89** in 2.5 min.
Use **Max results** or the run's **Max cost per run** to cap spending: the Actor stops cleanly at your budget and never charges for rows you did not receive.

### Covered cities (37)

Acapulco, Aguascalientes, Apizaco, Campeche, Cancún, Chihuahua, Ciudad Juárez, Ciudad de México, Cuernavaca, Culiacán, Durango, Estado de México, Guadalajara, Hermosillo, La Paz, La Piedad, León, Monterrey, Morelia, Mérida, Oaxaca, Orizaba, Pachuca, Playa del Carmen, Puebla, Querétaro, Saltillo, San Luis Potosí, Tampico, Tijuana, Tlaxcala, Toluca, Torreón, Tuxtla Gutiérrez, Veracruz, Villahermosa, Zacatecas.

### Data quality

- If PROFECO is down or changes its format, the run **fails with a clear message** instead of "succeeding" with an empty dataset.
- If your terms simply match nothing, the Actor checks the source with a canary query and tells you so.
- `RUN_STATS` and `QUALITY_REPORT` are saved in the run's key-value store.
- Gentle on the source: about 1 request per second, retries with exponential backoff.

### FAQ

**How fresh are the prices?** PROFECO observations are usually 1-7 days old; `observedDate` tells you exactly when each price was seen.

**Why are some products or stores missing?** PROFECO surveys a basket of products in selected stores; it is not a full online catalog of each chain.

**Can I get every city at once?** Yes, set `cities` to `["ALL"]`. Combine with `maxItems` or Max cost per run to control spend.

**Is this legal?** The Actor reads only **public information PROFECO publishes for consumers**, without login, and collects **no personal data** (stores are businesses). Source: *PROFECO - Programa Quién es Quién en los Precios*. Not affiliated with PROFECO or any retailer.

**Can I use it from code or an AI agent?** Yes - via the Apify API, the JavaScript/Python clients, integrations (Make, Zapier, n8n) or the Apify MCP server.

**Found a problem?** Open an issue in the Issues tab; we usually reply within 2 business days.

***

### 🇲🇽 Español

## API de precios de supermercados en México - PROFECO Quién es Quién (Walmart, Soriana, Chedraui, HEB)

**Precios oficiales por tienda de abarrotes, medicinas y electrodomésticos en 37 ciudades de México**, del programa *Quién es Quién en los Precios* de PROFECO. Incluye Walmart, Bodega Aurrera, Soriana, Chedraui, HEB, La Comer, SuperISSSTE, farmacias y mercados. Sin login ni navegador: **US$2.00 por cada 1,000 precios**, y solo pagas lo que recibes.

#### ¿Qué datos obtienes?

Una fila por **producto × tienda × fecha de observación**: nombre del producto, tipo, **marca**, presentación y **tamaño**; **precio en MXN** y fecha; **cadena normalizada**, sucursal, dirección, colonia, código postal, municipio y estado; ciudad y término buscado.

#### Casos de uso

- Monitoreo de precios en anaquel para marcas y distribuidores.
- Comparar niveles de precio entre cadenas y ciudades; seguimiento de promociones.
- Índices locales de inflación (tortilla, leche, huevo, canasta básica).
- Apps y agentes de IA ("¿dónde está más barato el huevo en Monterrey?").
- Datasets programados (diario/semanal) hacia Google Sheets, webhooks o tu base de datos.

#### Cómo usarlo

Escribe productos en español (`leche`, `huevo`, `tortilla`…) o elige un preset (`canasta_basica`, `medicamentos`, `electrodomesticos`), elige ciudades (o `ALL`), filtra por cadena si quieres y define **Max results**.

```json
{ "searchTerms": ["leche", "huevo"], "cities": ["Ciudad de México", "Monterrey"], "chains": ["Soriana", "Walmart"], "maxItems": 1000 }
```

#### Campos de salida

`product`, `productType`, `brand`, `presentation`, `size`, `priceMxn`, `observedDate`, `chain`, `chainRaw`, `store`, `address`, `neighborhood`, `postalCode`, `municipality`, `state`, `cityCode`, `city`, `searchTerm`, `source`, `sourceUrl`, `scrapedAt`.

#### Precio

Pago por evento: **US$0.002 por precio (US$2.00 por 1,000)** más la tarifa estándar de inicio de Apify (US$0.00005 por ejecución). Ejemplo real: leche + huevo en CDMX = 714 filas ≈ US$1.43. Usa "Max results" o "Max cost per run": el Actor se detiene limpio en tu presupuesto.

#### Preguntas frecuentes

**¿Qué tan recientes son los precios?** Normalmente de 1 a 7 días; `observedDate` indica la fecha exacta.
**¿Por qué faltan productos?** PROFECO levanta una canasta de productos en tiendas seleccionadas; no es el catálogo completo de cada cadena.
**¿Calidad?** Si PROFECO no responde o cambia su formato, la ejecución **falla con mensaje claro**; nunca entrega un "éxito" vacío.
**¿Es legal?** Solo lee información **pública** que PROFECO publica para consumidores, sin iniciar sesión y **sin datos personales**. Fuente: PROFECO, Programa Quién es Quién en los Precios. Sin afiliación con PROFECO ni con las cadenas.

# Changelog

This Actor's version history is a separate document: https://apify.com/timekast/mexico-retail-prices-profeco/changelog.md

# Actor input Schema

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

Product keywords in Spanish, as PROFECO names them: e.g. leche, huevo, tortilla, aceite, paracetamol, refrigerador. Brand names work too (e.g. Alpura, Bimbo).

## `preset` (type: `string`):

Adds a ready-made list of search terms (combined with the ones above).

## `cities` (type: `array`):

PROFECO-covered cities by name or code (e.g. "Ciudad de México", "Monterrey", "Guadalajara", "1901"). Use "ALL" for all 37 cities. Default: Ciudad de México.

## `chains` (type: `array`):

Keep only stores whose chain contains any of these words, e.g. Soriana, Walmart, Chedraui, HEB, La Comer, Bodega Aurrera, Superissste.

## `productTypes` (type: `array`):

Filter on PROFECO's product type, e.g. "LECHE ULTRAPASTEURIZADA", "HUEVO".

## `latestOnly` (type: `boolean`):

Keep only the most recent price per store and product.

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

Stop after this many price rows (0 = no limit). You pay only for rows delivered; you can also set a max cost per run.

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

Not needed normally (the source is public and reachable from Apify). Only if the source blocks the run region, enable Apify Proxy (RESIDENTIAL, country MX).

## Actor input object example

```json
{
  "searchTerms": [
    "leche",
    "huevo",
    "tortilla"
  ],
  "preset": "none",
  "cities": [
    "Ciudad de México"
  ],
  "chains": [
    "Soriana",
    "Walmart"
  ],
  "productTypes": [
    "LECHE ULTRAPASTEURIZADA"
  ],
  "latestOnly": true,
  "maxItems": 100,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

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

All result rows in the default dataset (overview view).

## `runStats` (type: `string`):

Requests, errors and charged events for this run.

## `qualityReport` (type: `string`):

Schema validation and data-quality summary of this run.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "searchTerms": [
        "leche",
        "huevo"
    ],
    "cities": [
        "Ciudad de México"
    ],
    "maxItems": 100
};

// Run the Actor and wait for it to finish
const run = await client.actor("timekast/mexico-retail-prices-profeco").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "searchTerms": [
        "leche",
        "huevo",
    ],
    "cities": ["Ciudad de México"],
    "maxItems": 100,
}

# Run the Actor and wait for it to finish
run = client.actor("timekast/mexico-retail-prices-profeco").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "searchTerms": [
    "leche",
    "huevo"
  ],
  "cities": [
    "Ciudad de México"
  ],
  "maxItems": 100
}' |
apify call timekast/mexico-retail-prices-profeco --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,timekast/mexico-retail-prices-profeco"
        }
    }
}
```

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/ElncbnYqJ3J7hoR27/builds/SLmM6hf8aLAETMhdb/openapi.json
