# Compra Ágil Monitor Chile | Mercado Público & ChileCompra (`foremost_sideboard/compra-agil-monitor`) Actor

Alerts for new open Compra Ágil purchases on Mercado Público (ChileCompra), filtered by region and keyword, verified and deduplicated. Official API.

- **URL**: https://apify.com/foremost\_sideboard/compra-agil-monitor.md
- **Developed by:** [Juan Requena](https://apify.com/foremost_sideboard) (community)
- **Categories:** Lead generation, Business, Automation
- **Stats:** 1 total users, 0 monthly users, 0.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $10.00 / 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.

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

**ES** · [English below](#english) 🇨🇱

Encuentra **Compras Ágiles abiertas** de Mercado Público (ChileCompra) que coincidan con tus
palabras clave, en las regiones que elijas, usando la **API oficial Compra Ágil v2** con **tu propio
ticket**. Prográmalo cada 1-2 horas y recibe solo las oportunidades **nuevas**.

A diferencia de los scrapers de licitaciones Chile genéricos, este Actor se enfoca solo en
**Compra Ágil** (compras de hasta 100 UTM, con plazos de cotización muy cortos), donde llegar primero
es lo que importa: filtra por **región** y **palabras clave**, **verifica** la coincidencia en la
descripción y los productos, y **no repite** lo ya entregado.

### ¿Qué hace?

1. Recorre el listado de Compras Ágiles **publicadas** (abiertas) de las regiones elegidas, de la más
   nueva a la más antigua, hasta la ventana de días que indiques.
2. Busca tus palabras clave en el **nombre** (sin distinguir mayúsculas ni tildes, acepta plural y
   masculino/femenino; una sigla en MAYÚSCULAS como `PIE` se busca exacta y no confunde "PIE DE METRO").
3. Opcionalmente usa el buscador `q` de la API (con variantes con/sin tilde y singular/plural, porque
   la API exige la palabra exacta) para encontrar la palabra en la **descripción**, y **verifica** cada
   hallazgo consultando el detalle (descripción + productos solicitados).
4. Entrega cada coincidencia en el dataset con código, nombre, organismo, monto, fecha de cierre,
   región, palabras clave encontradas, enlace a la ficha y un indicador `verified`.
5. Con **Solo nuevos** recuerda lo ya visto (key-value store con nombre) y no repite resultados entre
   corridas programadas (y no te cobra dos veces lo mismo).

Respeta las particularidades reales de la API (medidas en sep-2026): páginas de máximo 10 ítems
(más da 504), sin filtros de fecha (dan 504; el corte por fecha se hace localmente), consultas en
paralelo, detalles lentos (8-25 s) con tope configurable y un **presupuesto de tiempo** (default 270 s):
si se agota entrega lo obtenido y lo marca como parcial en `OUTPUT`.

### Cómo obtener tu ticket (gratis)

1. Entra a <https://www.chilecompra.cl/api/> (sección API Mercado Público).
2. Inicia sesión con tu **ClaveÚnica** (persona) y acepta las condiciones de uso.
3. Copia el **ticket** que se muestra (un código tipo UUID) y pégalo en el campo **ticket** del Actor.
   Se guarda cifrado (campo secreto) y nunca aparece en los registros.

> Cada ticket tiene una cuota diaria. Si recibes "ERROR 429", espera al cambio de día o desactiva
> la búsqueda q para consumir menos.

### Entrada (ejemplo)

```json
{
  "ticket": "<TU-TICKET-CHILECOMPRA>",
  "regions": ["14"],
  "keywords": ["material didáctico", "señalética", "placa", "trofeo", "medalla", "grabado", "corte láser", "PIE"],
  "dias": 2,
  "maxDetalles": 25,
  "incluirBusquedaQ": true,
  "soloNuevos": true
}
```

| Campo | Descripción | Default |
|---|---|---|
| `ticket` | Ticket personal de la API (secreto, obligatorio) | — |
| `regions` | Códigos de región del organismo comprador (1-16). Ej.: `14` = Los Ríos, `13` = Metropolitana. Vacío = todas | todas |
| `keywords` | Palabras clave. Vacío `[]` = todas las compras de la ventana | lista de rubro didáctico/señalética (ver abajo) |
| `dias` | Días hacia atrás según fecha de publicación | 2 |
| `maxDetalles` | Máximo de consultas de detalle por corrida | 25 |
| `incluirBusquedaQ` | Buscar también en la descripción vía `q` | true |
| `soloNuevos` | Solo compras no vistas en corridas anteriores | true |
| `incluirSinVerificar` | Incluir hits de `q` sin detalle (`verified: false`) | true |
| `presupuestoSegundos`, `maxPaginas`, `concurrencia`, `stateStoreName` | Avanzado | 270, 60, 6, `compra-agil-seen` |

Consejos: con **todas las regiones** hay miles de compras abiertas y el listado completo no cabe en
270 s; deja activa la búsqueda `q` (rápida) o sube `presupuestoSegundos`. Las frases de varias
palabras se buscan en nombre/detalle, pero no con `q` (la API las trata como palabras sueltas);
agrega también la palabra principal sola (p.ej. `didáctico`).

Palabras clave por defecto (si no envías `keywords`): material didáctico, didáctico, sensorial,
señalética, letrero, mdf, corte láser, láser, placa, galvano, trofeo, medalla, grabado, madera,
pendón, credencial, PIE, programa de integración escolar. Evita nombres de materiales muy genéricos
(p.ej. "acrílico" también aparece en compras de prótesis dentales o insumos médicos): generan falsos
positivos. Mejor usa el producto que vendes (`letrero`, `trofeo`, `placa`).

### Salida (ejemplo real, Los Ríos, 28-09-2026)

```json
{
  "codigo": "3335-1224-COT26",
  "nombre": "ADQUISICIÓN DE MATERIAL DE OFICINA Y DIDACTICO PARA ESCUELA RURAL F.M.L.M. ORD. 49 LEY SEP",
  "organismo": "I MUNICIPALIDAD DE LA UNION",
  "unidadCompra": "Departamento de Educación",
  "rutOrganismo": "69.200.800-6",
  "monto": 1000000,
  "montoEstimado": null,
  "montoDisponibleClp": 1000000,
  "moneda": "CLP",
  "fechaPublicacion": "2026-09-28 13:04",
  "fechaCierre": "2026-09-29 15:00",
  "zonaHoraria": "America/Santiago",
  "region": 14,
  "regionNombre": "Región de Los Ríos",
  "llamado": "Primer llamado",
  "direccionEntrega": null,
  "matchedKeywords": ["didáctico"],
  "matchSource": "nombre",
  "qTerms": ["didactico"],
  "verified": true,
  "fichaUrl": "https://buscador.mercadopublico.cl/ficha?code=3335-1224-COT26",
  "detalleConsultado": false,
  "scrapedAt": "2026-09-28T21:01:35Z"
}
```

- `monto`: presupuesto estimado (si se consultó el detalle) o monto disponible en CLP.
- Fechas en **hora de Chile** tal como las entrega la API.
- `verified: true` = la palabra clave se confirmó en nombre, descripción o productos.
  `verified: false` = la API la encontró con `q` pero no se pudo leer el detalle (revísala tú).
- Resumen de cada corrida (tiempos, avisos, si fue parcial) en el key-value store por defecto, clave `OUTPUT`.
- El enlace `fichaUrl` usa el patrón del buscador público de Mercado Público (no documentado en la guía de la API).

### Casos de uso

- **Proveedores y pymes**: imprentas, talleres de grabado/corte láser, señalética, librerías, ferreterías,
  aseo, computación… reciben las Compras Ágiles de su rubro y región apenas se publican.
- **Colegios y DAEM / SLEP**: ver qué compran otros establecimientos (material didáctico, PIE) y a qué montos.
- **Consultores y asesores de compras públicas**: alertas para varios clientes, una tarea programada por cliente.
- **Integraciones**: conecta el dataset a Google Sheets, Slack, email, Make o Zapier vía integraciones de Apify.

### Programar y alertas

Crea una **Task** con tu entrada, prográmala (p.ej. cada 2 horas de 8 a 20 h, hora Chile) y activa
una integración (email/Slack/Sheets) "on run succeeded". Con `soloNuevos` solo llegan novedades.

### ¿Cuánto cuesta?

**US$0.01 por resultado / per result** (US$10 por 1.000 resultados), más un cargo mínimo por inicio de corrida.

Pagas **por resultado**: cada Compra Ágil entregada al dataset tiene un precio fijo (ver la pestaña
*Pricing*), más un cargo mínimo por inicio de corrida. No pagas cómputo aparte. Con **Solo nuevos**
activado, una corrida programada sin novedades no entrega (ni cobra) resultados. El ticket de
ChileCompra es gratis.

### Preguntas frecuentes

#### ¿Qué es la Compra Ágil?

Una modalidad de Mercado Público para compras de hasta 100 UTM: el organismo publica un
requerimiento y los proveedores cotizan en pocos días. Por eso conviene revisar varias veces al día.

#### ¿En qué se diferencia de un scraper de licitaciones?

Las licitaciones (LP, LE, L1…) y las Compras Ágiles (COT) son procesos distintos. Este Actor usa
solo la API de **Compra Ágil** y está pensado para alertas: filtro por región y palabras clave,
verificación en el detalle y deduplicación entre corridas.

#### ¿Es legal?

Sí: usa la API pública oficial de ChileCompra con tu propio ticket y respeta sus límites de uso.

### Limitaciones

- Solo compras en estado **publicada** (abiertas).
- Detalles lentos; algunos códigos devuelven 504 persistente: se entregan con los datos del listado.
- Cuota diaria por ticket (la define ChileCompra).
- Este Actor no está afiliado a ChileCompra; usa la API pública oficial bajo los términos de tu ticket.

***

<a id="english"></a>

### English: Chile Compra Ágil Monitor (Mercado Público)

Finds **open Compra Ágil purchases** (Chile's small, fast public procurement, up to 100 UTM) on
Mercado Público that match your **keywords** in the **regions** you choose, using the **official
Compra Ágil v2 API** with **your own ChileCompra ticket**. Schedule it every 1–2 hours and get only
**new** opportunities.

#### What it does

1. Walks the list of **published** (open) Compra Ágil items for the selected regions, newest first,
   until the `dias` (days) window.
2. Matches your keywords in the **title** (case- and accent-insensitive, plural and gender tolerant;
   an ALL-CAPS acronym like `PIE` is matched exactly).
3. Optionally uses the API's `q` search (accent/plural variants, since `q` needs the exact word) to
   find keywords that appear only in the **description**, then **verifies** them via the detail endpoint.
4. Pushes each match to the dataset: code, title, buyer, amount, closing date, region, matched
   keywords, link to the public listing, and a `verified` flag.
5. **Solo nuevos** ("only new") keeps seen codes in a named key-value store so scheduled runs never
   repeat (or re-charge) the same item.

It respects the real API quirks: page size ≤ 10 (larger → 504), no date filters (→ 504; filtering is
done locally), parallel requests, slow detail calls (8–25 s) with a cap, and a total **time budget**
(default 270 s); partial runs are flagged in the `OUTPUT` record.

#### Getting a ticket (free)

1. Go to <https://www.chilecompra.cl/api/>.
2. Sign in with **ClaveÚnica** and accept the terms.
3. Copy your **ticket** and paste it in the Actor's **ticket** field (stored encrypted, never logged).

#### Example input / output

See the JSON examples above. Region codes: 1 Tarapacá, 2 Antofagasta, 3 Atacama, 4 Coquimbo,
5 Valparaíso, 6 O'Higgins, 7 Maule, 8 Biobío, 9 Araucanía, 10 Los Lagos, 11 Aysén,
12 Magallanes, 13 Metropolitana (Santiago), 14 Los Ríos, 15 Arica y Parinacota, 16 Ñuble.

#### Use cases

- **Suppliers / SMEs** (printing, engraving, laser cutting, signage, school supplies, IT, cleaning…):
  get relevant Compras Ágiles in your region as soon as they are published.
- **Schools, municipal education departments (DAEM/SLEP)**: benchmark what other schools buy and at what budget.
- **Public procurement consultants**: one scheduled task per client.
- **Integrations**: push results to Google Sheets, Slack, email, Make or Zapier.

#### Pricing

**US$0.01 por resultado / per result** (US$10 per 1,000 results), plus a tiny per-run start fee.

Pay per result: you pay only for each Compra Ágil delivered to the dataset (see the Pricing tab),
plus a tiny per-run start fee; no separate compute charges. The ChileCompra ticket is free.
With **Solo nuevos** on, scheduled runs with no news deliver (and charge) nothing.

# Actor input Schema

## `ticket` (type: `string`):

Tu ticket personal de la API de Mercado Público. Solicítalo gratis con tu ClaveÚnica en https://www.chilecompra.cl/api/ . Se guarda cifrado y nunca se muestra en los registros. / Your personal ChileCompra API ticket (encrypted, never logged).

## `regions` (type: `array`):

Regiones del organismo comprador. Vacío = todas las regiones (más lento: se recomienda dejar activa la búsqueda q). Ejemplo: 14 = Los Ríos.

## `keywords` (type: `array`):

Se buscan en el nombre (y en descripción/productos vía búsqueda q + detalle). Sin distinguir mayúsculas ni tildes; acepta plural y masculino/femenino. Una palabra en MAYÚSCULAS (p.ej. PIE) se busca como sigla exacta. Lista vacía = todas las compras de la ventana.

## `dias` (type: `integer`):

Ventana de fecha de publicación. Solo se consideran compras aún abiertas (estado publicada).

## `maxDetalles` (type: `integer`):

Tope de consultas de detalle por corrida (cada una tarda 8-25 s). Sirven para verificar coincidencias en la descripción y obtener monto estimado y dirección de entrega. 0 = sin detalles.

## `incluirBusquedaQ` (type: `boolean`):

Usa el buscador q de la API con variantes con/sin tilde y singular/plural para encontrar la palabra clave en la descripción. Más completo, pero consume más cuota del ticket.

## `soloNuevos` (type: `boolean`):

Recuerda lo ya visto en un key-value store con nombre y entrega solo compras nuevas desde la corrida anterior (ideal para corridas programadas).

## `incluirSinVerificar` (type: `boolean`):

Incluye hits de la búsqueda q cuyo detalle no se pudo obtener (verified = false).

## `presupuestoSegundos` (type: `integer`):

Tiempo máximo total de consultas. Al agotarse se entrega lo obtenido y el resumen OUTPUT marca parcial = true.

## `maxPaginas` (type: `integer`):

Páginas de 10 ítems (la API da 504 con páginas mayores).

## `concurrencia` (type: `integer`):

La API tolera ~6-11 requests concurrentes.

## `stateStoreName` (type: `string`):

Store con nombre (persistente) donde se guardan los códigos ya vistos. La clave depende de regiones + palabras clave.

## Actor input object example

```json
{
  "regions": [
    "14"
  ],
  "keywords": [
    "material didáctico",
    "señalética",
    "letrero",
    "placa",
    "trofeo",
    "medalla",
    "grabado",
    "corte láser",
    "PIE"
  ],
  "dias": 2,
  "maxDetalles": 25,
  "incluirBusquedaQ": true,
  "soloNuevos": true,
  "incluirSinVerificar": true,
  "presupuestoSegundos": 270,
  "maxPaginas": 60,
  "concurrencia": 6,
  "stateStoreName": "compra-agil-seen"
}
```

# Actor output Schema

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

Open Compra Ágil purchases matching the filters, one item per purchase (default dataset, overview table view).

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

Run summary JSON (counts, parameters, warnings) stored under the OUTPUT key of the default key-value store.

# 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 = {
    "regions": [
        "14"
    ],
    "keywords": [
        "material didáctico",
        "señalética",
        "letrero",
        "placa",
        "trofeo",
        "medalla",
        "grabado",
        "corte láser",
        "PIE"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("foremost_sideboard/compra-agil-monitor").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 = {
    "regions": ["14"],
    "keywords": [
        "material didáctico",
        "señalética",
        "letrero",
        "placa",
        "trofeo",
        "medalla",
        "grabado",
        "corte láser",
        "PIE",
    ],
}

# Run the Actor and wait for it to finish
run = client.actor("foremost_sideboard/compra-agil-monitor").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 '{
  "regions": [
    "14"
  ],
  "keywords": [
    "material didáctico",
    "señalética",
    "letrero",
    "placa",
    "trofeo",
    "medalla",
    "grabado",
    "corte láser",
    "PIE"
  ]
}' |
apify call foremost_sideboard/compra-agil-monitor --silent --output-dataset

```

## MCP server setup

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

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/WhXQaGcZdnrCtfwor/builds/vokDYSYI1KOr3Xnle/openapi.json
