# Licitaciones LATAM — Government Tenders Aggregator (`karmic_mastodon/licitaciones-latam`) Actor

Unifies and prioritizes public tenders from 6 LATAM countries (Colombia SECOP, Brazil PNCP, Peru, Chile, Mexico, Argentina) into one OCDS-like schema with an explainable 0–100 opportunity score, monitor mode, awardee analytics and integrity red flags.

- **URL**: https://apify.com/karmic\_mastodon/licitaciones-latam.md
- **Developed by:** [Mixtkrlr](https://apify.com/karmic_mastodon) (community)
- **Categories:** Lead generation, Developer tools, Automation
- **Stats:** 2 total users, 0 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $4.00 / 1,000 tender result (dump)s

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

## Licitaciones LATAM — Tenders priorizados con puntaje de oportunidad (Colombia, Brasil, Perú, Chile, México, Argentina)

> **No te damos 5.000 licitaciones; te decimos cuáles perseguir y por qué.**

Agrega y **unifica las compras públicas de Colombia (SECOP), Brasil (PNCP), Perú (OECE/SEACE), Chile (MercadoPublico), México (OCDS abiertos) y Argentina (Mendoza, OCDS)** en un solo esquema
**OCDS-like**, y le añade a cada licitación un **puntaje de oportunidad 0–100 explicable** para que
veas de un vistazo cuáles vale la pena perseguir. Con **modo monitoreo** para recibir solo lo nuevo
o lo que cambió desde tu última corrida.

`licitaciones LATAM` · `compras públicas` · `SECOP scraper` · `PNCP API` · `SEACE Perú` · `MercadoPublico Chile` · `CompraNet México OCDS` · `Compr.AR Mendoza Argentina` · `Colombia/Brazil/Peru/Chile/Mexico/Argentina government tenders` · `licitaciones priorizadas` · `opportunity score` · `bid intelligence LATAM`

---

### 🌎 Cobertura real (sin letra chica) / Coverage at a glance

**Léelo antes de comprar.** No todos los países tienen la misma cobertura — somos honestos por adelantado:

| País / Country | Estado | Nota honesta / Honest note |
|---|---|---|
| 🇧🇷 Brasil — PNCP | ✅ Vivo / Live | Completo, con fecha de cierre |
| 🇵🇪 Perú — OECE/SEACE | ✅ Vivo / Live | Completo |
| 🇨🇴 Colombia — SECOP | ✅ Vivo / Live | **Sin fecha de cierre** en la fuente → el factor *urgency* = 0 (visible en `reasons`) |
| 🇲🇽 México | 🟡 Parcial / Partial | Solo **Nuevo León** vivo (semanal) + **CompraNet federal congelado en 2022**. No hay federal fresco $0. |
| 🇦🇷 Argentina | 🟡 Parcial / Partial | **Solo provincia de Mendoza** (no es cobertura nacional) |
| 🇨🇱 Chile — MercadoPublico | 🧪 Beta | Requiere `CL_TICKET` (gratis); **mapeo de campos aún sin verificar contra datos en vivo** |

> **Cobertura sólida y viva: Brasil, Perú, Colombia.** México, Argentina y Chile son **parciales/beta** — útiles, pero conoce su alcance antes de pagar.

---

### 🇪🇸 Español

#### ¿Qué hace?
- **Unifica países heterogéneos** en un esquema consistente: COP/BRL/PEN/CLP/MXN/ARS, NIT/CNPJ/RUC/RUT/RFC/CUIT, y estados gubernamentales
  distintos mapeados a un set común (`open`, `awarded`, `closed`, `cancelled`, `unknown`).
- **Puntúa cada licitación 0–100** con un desglose `reasons` auditable (sin IA, sin caja negra): relevancia a
  tus palabras clave, urgencia por días al cierre, tamaño del contrato, si todavía puedes ofertar, y completitud del dato.
- **Modo monitoreo:** entrega **solo lo nuevo/cambiado** desde la última corrida (no un volcado repetido).
- **Filtra y ordena:** `minScore`, `sortByScore`, `priorityKeywords` — ideal también como herramienta para agentes IA.

#### Por qué es distinto
El nicho de contrataciones públicas en Apify está dominado por Europa (TED); **LATAM estaba vacío**. Los
scrapers de TED solo **vuelcan datos**. Aquí entregas **decisiones**: licitaciones unificadas, monitoreadas y
**priorizadas con un puntaje transparente** que el cliente puede auditar. Ventaja idiomática nativa (ES/PT) incluida.

#### Ejemplo de input
```json
{
  "countries": ["BR", "CO"],
  "priorityKeywords": ["software", "vehículos", "obras"],
  "dateFrom": "2026-06-01",
  "dateTo": "2026-06-20",
  "minScore": 60,
  "sortByScore": true,
  "mode": "dump",
  "maxItems": 200
}
````

| Campo | Qué hace |
|---|---|
| `countries` | Países a consultar: `CO`, `BR`, `PE`, `CL` (Chile requiere `CL_TICKET`), `MX`, `AR` |
| `mxSources` | (México) `NL` = Nuevo León (vivo, semanal) · `CN` = CompraNet federal (histórico 2022). Vacío = ambas |
| `keywords` | Filtro de texto del lado de la fuente (opcional) |
| `priorityKeywords` | Temas que te interesan; suben el puntaje de las licitaciones que los mencionan |
| `dateFrom` / `dateTo` | Rango de fechas `YYYY-MM-DD` |
| `modalidades` | (Brasil) códigos PNCP 1–14; vacío = todas |
| `mode` | `dump` (todo lo que matchea) o `monitor` (solo novedades) |
| `minScore` | Emite solo licitaciones con puntaje ≥ este valor (0 = sin filtro) |
| `sortByScore` | Devuelve primero las de mayor puntaje |
| `scoringWeights` | Ajusta los pesos del puntaje (avanzado; ver más abajo) |
| `maxItems` | Tope de resultados para controlar costo/tiempo |
| `webhookUrl` | **Alerta:** URL de Slack o Discord; al terminar envía UN resumen con las mejores |
| `telegramBotToken` / `telegramChatId` | **Alerta:** envía el resumen por Telegram (token del bot + chat) |
| `alertTopN` | Cuántas licitaciones (las de mayor puntaje) incluir en la alerta |
| `includeAwardeeAnalytics` | Agrega análisis de adjudicatarios (`networkSummary`) por registro |
| `includeIntegrityFlags` | Agrega banderas de integridad (`integrityFlags`) por registro |
| `includeSupplierGraph` | Detecta proveedores que ganan en 2+ países (`crossCountrySupplier`) |

#### Ejemplo de output (registro real, con el bloque `score`)

```json
{
  "source": {
    "country": "BR",
    "portal": "PNCP",
    "nativeId": "88201298000149-1-000679/2026",
    "url": "https://pncp.gov.br/app/editais/88201298000149/2026/679"
  },
  "tender": {
    "title": "Sistema de Registro de Preços para possíveis aquisições de 5 veículos ZERO KM",
    "modality": "Pregão - Eletrônico",
    "status": "open",
    "closeDate": "2026-07-06T13:31:00.000Z"
  },
  "buyer": {
    "name": "MUNICIPIO DE LAVRAS DO SUL",
    "id": "88201298000149",
    "idType": "CNPJ",
    "govLevel": "municipal",
    "location": { "region": "RS", "city": "Lavras do Sul", "country": "BR" }
  },
  "value": { "amount": 554771.65, "currency": "BRL", "type": "estimated" },
  "score": {
    "value": 82,
    "label": "high",
    "reasons": [
      { "factor": "keyword",      "points": 18, "of": 35 },
      { "factor": "urgency",      "points": 25, "of": 25 },
      { "factor": "value",        "points": 19, "of": 20 },
      { "factor": "status",       "points": 15, "of": 15 },
      { "factor": "completeness", "points": 5,  "of": 5  }
    ]
  }
}
```

Cada registro incluye además el objeto `raw` original completo, por si necesitas campos extra.

#### Funciones opcionales (opt-in) — más valor por corrida

Actívalas desde el input. Todas son **deterministas, sin IA y de alcance "esta corrida"** (honestas, no histórico):

- **🔔 Alertas (`webhookUrl` / Telegram):** al terminar la corrida envía **UN** resumen con las mejores
  licitaciones por puntaje a **Slack/Discord** (autodetectado por dominio) o **Telegram** (`telegramBotToken`+`telegramChatId`).
  Sin spam, sin tumbar la corrida si el webhook falla.
- **🏷️ Análisis de adjudicatarios (`includeAwardeeAnalytics` → `networkSummary`):** top proveedores por
  comprador, conteo y ratio de concentración (con su `currency`), vistos en esta corrida.
- **🚩 Banderas de integridad (`includeIntegrityFlags` → `integrityFlags`):** señales de riesgo deterministas
  (ventana de ofertas muy corta, método no competitivo, concentración/repetición de adjudicatario). **Heurísticas, NO prueba de irregularidad.**
- **🌎 Grafo de proveedores cross-país (`includeSupplierGraph` → `crossCountrySupplier`):** proveedores adjudicados
  en **2+ países** (cruzados por nombre normalizado; excluye Brasil que no trae adjudicatario). Único en LATAM.

Ejemplo de estos campos en un registro adjudicado:

```json
{
  "networkSummary": {
    "topSuppliers": [{ "name": "ACME S.A.", "id": "900123", "country": "CO", "currency": "COP", "wins": 4, "totalAmount": 1820000 }],
    "totalAwardsSeen": 37, "concentrationRatio": 0.34, "scope": "this-run"
  },
  "integrityFlags": [
    { "flag": "NON_COMPETITIVE_METHOD", "detail": "Contratación directa", "risk": "medium" },
    { "flag": "REPEAT_WINNER_IN_RUN", "detail": "4 wins this-run", "risk": "medium" }
  ],
  "crossCountrySupplier": { "countries": ["CO", "PE"], "totalWins": 5, "scope": "this-run", "match": "normalized-name" }
}
```

#### Cómo funciona el puntaje (transparente y determinístico)

Suma de 5 factores con pesos por defecto (configurables con `scoringWeights`):

| Factor | Peso | Qué mide |
|---|---|---|
| `keyword` | 35 | Cuántas de tus `priorityKeywords` aparecen (satura a 3) |
| `urgency` | 25 | Días al cierre: máximo en la ventana 3–21 días; 0 si ya cerró o no hay fecha |
| `value` | 20 | Tamaño del contrato, log-escalado **dentro de cada moneda** (sin conversión FX) |
| `status` | 15 | Si todavía puedes ofertar (`open`=máximo) |
| `completeness` | 5 | Fracción de {comprador, valor, fecha de cierre} presentes |

`label`: `high` (≥70), `medium` (≥40), `low` (<40). Mismas entradas → mismo puntaje, siempre.

#### Precios (Pay-Per-Event, transparente)

El puntaje **va incluido** en cada resultado, sin cobro aparte.

| Evento | Cuándo se cobra | Precio de lanzamiento |
|---|---|---|
| `tender-result` | Por cada licitación emitida en modo **dump** | **$4 / 1.000** ($0.004 c/u) |
| `monitored-update` | Por cada novedad emitida en modo **monitor** | **$20 / 1.000** ($0.02 c/u) — el "solo lo nuevo" priorizado vale más |

*(El precio real se ve en el Store; estos son los valores de lanzamiento sugeridos.)*

Puedes fijar un tope con `ACTOR_MAX_TOTAL_CHARGE_USD`: el actor **deja de emitir** al alcanzarlo (no consume de más).

#### Limitaciones (honestas)

- **Cobertura actual:** Colombia, Brasil, Perú, Chile, México y Argentina. Chile requiere la variable de entorno `CL_TICKET` (ticket gratuito de MercadoPublico).
- **México — alcance honesto:** hoy no existe una API federal abierta, fresca y gratuita (CompraNet/ComprasMX no la exponen sin barreras anti-bot). Por eso México usa archivos OCDS abiertos: **Nuevo León** (estatal, actualizado **semanalmente**, datos vigentes) + **CompraNet federal** (snapshot **histórico congelado en 2022**, útil para análisis, no para licitaciones vivas). Elige con `mxSources`.
- **Argentina — alcance honesto:** tampoco hay una API federal abierta y fresca (el COMPR.AR nacional en datos.gob.ar es un volcado CSV **congelado en 2020**). Por eso Argentina cubre **solo la provincia de Mendoza** (OCDS abierto, actualizado **mensualmente**, datos vigentes) — no es cobertura nacional.
- **Colombia no publica fecha de cierre** en el dataset abierto: para esas licitaciones el factor `urgency` es 0 y
  `completeness` baja (queda reflejado en `reasons`). Brasil sí trae fecha de cierre.
- Algunas fichas de Colombia enlazan a una página de login del portal (dato inconsistente de la fuente).
- **Sin conversión de divisas** en esta versión: cada valor va en su moneda local (el sub-puntaje de valor se
  calcula dentro de cada moneda, nunca comparando montos entre divisas).

***

### 🇬🇧 English

> **We don't hand you 5,000 tenders — we tell you which ones to chase, and why.**

**Licitaciones LATAM** aggregates **Colombia (SECOP), Brazil (PNCP), Peru (OECE/SEACE), Chile (MercadoPublico), Mexico (open OCDS) and Argentina (Mendoza, OCDS) public procurement** into one
**OCDS-like schema** and attaches an **explainable 0–100 opportunity score** to every tender, so you can
instantly see which bids are worth pursuing. Includes a **monitor mode** that returns only what's new or
changed since your last run.

`LATAM tenders` · `public procurement API` · `SECOP scraper` · `PNCP API` · `SEACE Peru` · `MercadoPublico Chile` · `CompraNet Mexico OCDS` · `Compr.AR Mendoza Argentina` · `ranked government tenders` · `opportunity score` · `bid intelligence LATAM`

#### What it does

- **Unifies very different countries** into one consistent shape: COP/BRL/PEN/CLP/MXN/ARS, NIT/CNPJ/RUC/RUT/RFC/CUIT tax IDs, and disparate
  government statuses mapped to a common set (`open`, `awarded`, `closed`, `cancelled`, `unknown`).
- **Scores every tender 0–100** with an auditable `reasons` breakdown (no AI, no black box): keyword relevance,
  urgency (days to close), contract size, whether you can still bid, and data completeness.
- **Monitor mode** emits **only new/changed** tenders since the last run.
- **Filter & rank:** `minScore`, `sortByScore`, `priorityKeywords` — also a great tool for AI agents.
- **Opt-in extras (deterministic, this-run scope):** webhook/Telegram **alerts**, **awardee analytics** (`networkSummary`),
  **integrity red flags** (`integrityFlags`), and a **cross-country supplier graph** (`crossCountrySupplier`).

#### Why it's different

Apify's procurement niche is dominated by Europe (TED); **LATAM was empty**. TED scrapers just **dump data**.
This delivers **decisions**: unified, monitored, and **transparently prioritized** tenders the buyer can audit.

#### Pricing (Pay-Per-Event)

The opportunity score is **included** in every result — no separate charge.

| Event | Charged when | Launch price |
|---|---|---|
| `tender-result` | Per tender emitted in **dump** mode | **$4 / 1,000** ($0.004 each) |
| `monitored-update` | Per change emitted in **monitor** mode | **$20 / 1,000** ($0.02 each) — prioritized new-only is worth more |

Set a cap with `ACTOR_MAX_TOTAL_CHARGE_USD`; the Actor stops emitting once it's reached.

#### Scoring (transparent & deterministic)

Five weighted factors (default weights, configurable via `scoringWeights`): `keyword` 35, `urgency` 25,
`value` 20, `status` 15, `completeness` 5. `label` is `high` (≥70) / `medium` (≥40) / `low` (<40).
Same inputs always produce the same score.

#### Limitations

- **Current coverage:** Colombia, Brazil, Peru, Chile, Mexico and Argentina. Chile requires the `CL_TICKET` environment variable (free MercadoPublico ticket).
- **Mexico — honest scope:** there is currently no fresh, free, open FEDERAL API (CompraNet/ComprasMX don't expose one without anti-bot barriers). Mexico therefore uses open OCDS files: **Nuevo León** (state-level, refreshed **weekly**, current data) + **CompraNet federal** (a **historical snapshot frozen at 2022**, useful for analysis, not for live tenders). Pick with `mxSources`.
- **Argentina — honest scope:** likewise there is no fresh, open federal API (the national COMPR.AR dump on datos.gob.ar is a CSV **frozen at 2020**). Argentina therefore covers **only Mendoza province** (open OCDS, refreshed **monthly**, current data) — not national coverage.
- **Colombia's open dataset has no proposal close date**, so `urgency` is 0 for those tenders (and `completeness`
  drops) — fully visible in `reasons`. Brazil provides close dates.
- **No FX conversion** in this version: each value stays in its local currency; the value sub-score is computed
  within each currency, never comparing amounts across currencies.

***

### Fuentes / Data sources

- 🇨🇴 **Colombia — SECOP** (datos.gov.co, Socrata/SoQL): open data, no token.
- 🇧🇷 **Brazil — PNCP** (pncp.gov.br consulta REST API): open data, no token.
- 🇵🇪 **Peru — OECE/SEACE** (contratacionesabiertas.oece.gob.pe, OCDS 1.1): open data, no token.
- 🇨🇱 **Chile — MercadoPublico** (api.mercadopublico.cl): open data, requires a free `CL_TICKET`.
- 🇲🇽 **Mexico — OCDS** (OCP Data Registry: Nuevo León live + CompraNet 2022 snapshot): open data, no token.
- 🇦🇷 **Argentina — OCDS** (OCP Data Registry: Mendoza province): open data, no token.

Datos públicos abiertos. Este actor no scrapea con navegador ni usa proxies — solo APIs oficiales JSON.

### Soporte / Support

¿Sugerencias, un país que quieras priorizado, o un campo que necesitas? Abre un issue o escríbenos.
Feature requests (a country to prioritize, an extra field) are welcome — open an issue.

# Actor input Schema

## `countries` (type: `array`):

Países a consultar. Chile (CL) requiere la variable de entorno CL\_TICKET (ticket gratuito de MercadoPublico). Perú (PE) usa la API abierta OECE/OCDS, sin token. México (MX) usa archivos OCDS abiertos: Nuevo León (vivo, semanal) + CompraNet federal (histórico 2022). Argentina (AR) usa OCDS abierto de la provincia de Mendoza (vivo, mensual); no hay agregador federal vivo disponible hoy en MX ni AR.

## `mxSources` (type: `array`):

Qué colecciones OCDS de México incluir. NL = Nuevo León (vivo, semanal). CN = CompraNet federal (histórico, congelado en 2022). Vacío = ambas.

## `keywords` (type: `string`):

Texto libre para filtrar en la fuente (opcional)

## `priorityKeywords` (type: `array`):

Temas que te interesan; suben el puntaje de oportunidad de las licitaciones que los mencionan

## `dateFrom` (type: `string`):

YYYY-MM-DD

## `dateTo` (type: `string`):

YYYY-MM-DD

## `modalidades` (type: `array`):

Códigos de modalidad PNCP (1–14). Vacío = todas. Menos modalidades = corridas más baratas.

## `mode` (type: `string`):

dump = todo lo que matchea; monitor = solo lo nuevo/cambiado desde la última corrida

## `minScore` (type: `integer`):

Emite solo licitaciones con puntaje de oportunidad >= este valor. 0 = sin filtro

## `sortByScore` (type: `boolean`):

Devuelve primero las de mayor puntaje (usa un buffer acotado por el límite)

## `scoringWeights` (type: `object`):

Opcional. Ajusta la importancia de cada factor. Deben sumar 100. Si se omite, usa los pesos por defecto del roadmap

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

Tope de registros para controlar costo/tiempo

## `webhookUrl` (type: `string`):

URL de Slack o Discord. Al terminar la corrida envía UN resumen con las mejores licitaciones. Se autodetecta por el dominio.

## `telegramBotToken` (type: `string`):

Token del bot para enviar el resumen por Telegram. Requiere también el Chat ID.

## `telegramChatId` (type: `string`):

ID numérico o @canal donde enviar el resumen de Telegram.

## `alertTopN` (type: `integer`):

Cuántas licitaciones (las de mayor puntaje) incluir en la alerta de fin de corrida.

## `includeAwardeeAnalytics` (type: `boolean`):

Agrega un resumen por proveedor (adjudicaciones vistas EN ESTA corrida, no histórico). Acumula en memoria acotada por el límite.

## `includeIntegrityFlags` (type: `boolean`):

Agrega banderas de riesgo determinísticas por registro (ventana de ofertas muy corta, método no competitivo, concentración/repetición de adjudicatario EN ESTA corrida). Son heurísticas según los campos disponibles; NO son prueba de irregularidad. Acumula en memoria acotada por el límite.

## `includeSupplierGraph` (type: `boolean`):

Detecta proveedores adjudicados en 2+ países dentro de ESTA corrida, cruzados por NOMBRE normalizado (los IDs fiscales no coinciden entre países). Heurística: puede confundir empresas distintas con el mismo nombre; excluye Brasil (su fuente no trae adjudicatario). Suele estar vacío salvo que consultes varios países con datos solapados.

## Actor input object example

```json
{
  "countries": [
    "CO",
    "BR"
  ],
  "mxSources": [],
  "priorityKeywords": [],
  "modalidades": [],
  "mode": "dump",
  "minScore": 0,
  "sortByScore": false,
  "scoringWeights": {},
  "maxItems": 500,
  "alertTopN": 10,
  "includeAwardeeAnalytics": false,
  "includeIntegrityFlags": false,
  "includeSupplierGraph": false
}
```

# 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 = {};

// Run the Actor and wait for it to finish
const run = await client.actor("karmic_mastodon/licitaciones-latam").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 = {}

# Run the Actor and wait for it to finish
run = client.actor("karmic_mastodon/licitaciones-latam").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 '{}' |
apify call karmic_mastodon/licitaciones-latam --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Licitaciones LATAM — Government Tenders Aggregator",
        "description": "Unifies and prioritizes public tenders from 6 LATAM countries (Colombia SECOP, Brazil PNCP, Peru, Chile, Mexico, Argentina) into one OCDS-like schema with an explainable 0–100 opportunity score, monitor mode, awardee analytics and integrity red flags.",
        "version": "0.1",
        "x-build-id": "5WzHwj4OQXhz5Pjww"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/karmic_mastodon~licitaciones-latam/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-karmic_mastodon-licitaciones-latam",
                "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/karmic_mastodon~licitaciones-latam/runs": {
            "post": {
                "operationId": "runs-sync-karmic_mastodon-licitaciones-latam",
                "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/karmic_mastodon~licitaciones-latam/run-sync": {
            "post": {
                "operationId": "run-sync-karmic_mastodon-licitaciones-latam",
                "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": {
                    "countries": {
                        "title": "Países",
                        "type": "array",
                        "description": "Países a consultar. Chile (CL) requiere la variable de entorno CL_TICKET (ticket gratuito de MercadoPublico). Perú (PE) usa la API abierta OECE/OCDS, sin token. México (MX) usa archivos OCDS abiertos: Nuevo León (vivo, semanal) + CompraNet federal (histórico 2022). Argentina (AR) usa OCDS abierto de la provincia de Mendoza (vivo, mensual); no hay agregador federal vivo disponible hoy en MX ni AR.",
                        "items": {
                            "type": "string",
                            "enum": [
                                "CO",
                                "BR",
                                "CL",
                                "PE",
                                "MX",
                                "AR"
                            ],
                            "enumTitles": [
                                "Colombia",
                                "Brasil",
                                "Chile (beta · requiere CL_TICKET)",
                                "Perú",
                                "México (Nuevo León + CompraNet 2022)",
                                "Argentina (solo Mendoza)"
                            ]
                        },
                        "default": [
                            "CO",
                            "BR"
                        ]
                    },
                    "mxSources": {
                        "title": "Fuentes de México (avanzado)",
                        "type": "array",
                        "description": "Qué colecciones OCDS de México incluir. NL = Nuevo León (vivo, semanal). CN = CompraNet federal (histórico, congelado en 2022). Vacío = ambas.",
                        "items": {
                            "type": "string",
                            "enum": [
                                "NL",
                                "CN"
                            ],
                            "enumTitles": [
                                "Nuevo León (vivo)",
                                "CompraNet federal (histórico 2022)"
                            ]
                        },
                        "default": []
                    },
                    "keywords": {
                        "title": "Palabras clave (filtro)",
                        "type": "string",
                        "description": "Texto libre para filtrar en la fuente (opcional)"
                    },
                    "priorityKeywords": {
                        "title": "Palabras clave prioritarias (scoring)",
                        "type": "array",
                        "description": "Temas que te interesan; suben el puntaje de oportunidad de las licitaciones que los mencionan",
                        "default": [],
                        "items": {
                            "type": "string"
                        }
                    },
                    "dateFrom": {
                        "title": "Fecha desde",
                        "type": "string",
                        "description": "YYYY-MM-DD"
                    },
                    "dateTo": {
                        "title": "Fecha hasta",
                        "type": "string",
                        "description": "YYYY-MM-DD"
                    },
                    "modalidades": {
                        "title": "Modalidades de Brasil (PNCP)",
                        "type": "array",
                        "description": "Códigos de modalidad PNCP (1–14). Vacío = todas. Menos modalidades = corridas más baratas.",
                        "default": []
                    },
                    "mode": {
                        "title": "Modo",
                        "enum": [
                            "dump",
                            "monitor"
                        ],
                        "type": "string",
                        "description": "dump = todo lo que matchea; monitor = solo lo nuevo/cambiado desde la última corrida",
                        "default": "dump"
                    },
                    "minScore": {
                        "title": "Puntaje mínimo (0-100)",
                        "minimum": 0,
                        "maximum": 100,
                        "type": "integer",
                        "description": "Emite solo licitaciones con puntaje de oportunidad >= este valor. 0 = sin filtro",
                        "default": 0
                    },
                    "sortByScore": {
                        "title": "Ordenar por puntaje",
                        "type": "boolean",
                        "description": "Devuelve primero las de mayor puntaje (usa un buffer acotado por el límite)",
                        "default": false
                    },
                    "scoringWeights": {
                        "title": "Pesos del puntaje (avanzado)",
                        "type": "object",
                        "description": "Opcional. Ajusta la importancia de cada factor. Deben sumar 100. Si se omite, usa los pesos por defecto del roadmap",
                        "default": {}
                    },
                    "maxItems": {
                        "title": "Límite de resultados",
                        "minimum": 1,
                        "type": "integer",
                        "description": "Tope de registros para controlar costo/tiempo",
                        "default": 500
                    },
                    "webhookUrl": {
                        "title": "Webhook de alertas (opcional)",
                        "type": "string",
                        "description": "URL de Slack o Discord. Al terminar la corrida envía UN resumen con las mejores licitaciones. Se autodetecta por el dominio."
                    },
                    "telegramBotToken": {
                        "title": "Token del bot de Telegram (opcional)",
                        "type": "string",
                        "description": "Token del bot para enviar el resumen por Telegram. Requiere también el Chat ID."
                    },
                    "telegramChatId": {
                        "title": "Chat ID de Telegram (opcional)",
                        "type": "string",
                        "description": "ID numérico o @canal donde enviar el resumen de Telegram."
                    },
                    "alertTopN": {
                        "title": "Cantidad en el resumen (alertas)",
                        "minimum": 1,
                        "maximum": 50,
                        "type": "integer",
                        "description": "Cuántas licitaciones (las de mayor puntaje) incluir en la alerta de fin de corrida.",
                        "default": 10
                    },
                    "includeAwardeeAnalytics": {
                        "title": "Análisis de adjudicatarios (de esta corrida)",
                        "type": "boolean",
                        "description": "Agrega un resumen por proveedor (adjudicaciones vistas EN ESTA corrida, no histórico). Acumula en memoria acotada por el límite.",
                        "default": false
                    },
                    "includeIntegrityFlags": {
                        "title": "Señales de integridad (banderas rojas, de esta corrida)",
                        "type": "boolean",
                        "description": "Agrega banderas de riesgo determinísticas por registro (ventana de ofertas muy corta, método no competitivo, concentración/repetición de adjudicatario EN ESTA corrida). Son heurísticas según los campos disponibles; NO son prueba de irregularidad. Acumula en memoria acotada por el límite.",
                        "default": false
                    },
                    "includeSupplierGraph": {
                        "title": "Proveedores cross-país (de esta corrida)",
                        "type": "boolean",
                        "description": "Detecta proveedores adjudicados en 2+ países dentro de ESTA corrida, cruzados por NOMBRE normalizado (los IDs fiscales no coinciden entre países). Heurística: puede confundir empresas distintas con el mismo nombre; excluye Brasil (su fuente no trae adjudicatario). Suele estar vacío salvo que consultes varios países con datos solapados.",
                        "default": false
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
