Skip to main content
Latin American governments publish thousands of tenders every month through official procurement portals. This data is valuable for:
  • Sales intelligence: identify which companies are winning government contracts
  • Prospecting: find new sales opportunities in the public sector
  • Due diligence: verify a supplier’s contracting history
  • Market research: analyze public spending by sector or region
This guide shows how to access this data programmatically for Chile, Brazil, and Mexico.

Official sources by country

CountrySystemAPICoverage
Chile 🇨🇱Mercado PúblicoREST (requires a free ticket)Tenders + awarded contracts
Brazil 🇧🇷PNCPPublic REST, no authFederal contracts since 2017
Mexico 🇲🇽ComprasMX (OCDS)Public REST, no authFederal APF since 2017
All three systems are publicly accessible. EnrichLATAM unifies them into a single API with a consistent format.

Use case: contracts where a company is the supplier

Given a company’s RUT, CNPJ, or RFC, retrieve all its government contracts:
import requests

API_KEY = "your_api_key"
BASE_URL = "https://api.enrichlatam.com"

def company_contracts(tax_id: str, country: str) -> dict:
    """
    Returns government contracts where the company is the supplier.

    Args:
        tax_id: RUT (CL), CNPJ (BR), or RFC (MX)
        country: "CL", "BR", or "MX"
    """
    response = requests.post(
        f"{BASE_URL}/v1/tenders",
        headers={"X-API-Key": API_KEY},
        json={"rut": tax_id, "country": country},
    )
    response.raise_for_status()
    return response.json()


# Chile — by RUT
cl = company_contracts("77.261.280-K", "CL")
print(f"Chile: {cl['total_orders']} contracts — source: {cl['source']}")

# Brazil — by CNPJ
br = company_contracts("28.591.276/0001-00", "BR")
print(f"Brazil: {br['total_orders']} contracts — source: {br['source']}")

# Mexico — by RFC
mx = company_contracts("EMP123456ABC", "MX")
print(f"Mexico: {mx['total_orders']} contracts — source: {mx['source']}")
Example response (Chile — Mercado Público):
{
  "rut": "77.261.280-K",
  "total_orders": 12,
  "orders": [
    {
      "code": "1003473-1501-SE26",
      "name": "IT infrastructure maintenance service",
      "status": "active"
    },
    {
      "code": "2755-2-LP26",
      "name": "Computer equipment acquisition",
      "status": "awarded"
    }
  ],
  "source": "mercadopublico"
}

Use case: awarded contracts (Chile)

For Chile, the /tenders/awarded endpoint returns won contracts including amounts and the buying entity:
def awarded_contracts_cl(rut: str) -> dict:
    response = requests.post(
        f"{BASE_URL}/v1/tenders/awarded",
        headers={"X-API-Key": API_KEY},
        json={"rut": rut},
    )
    response.raise_for_status()
    return response.json()


awarded = awarded_contracts_cl("77.261.280-K")
for c in awarded["contracts"]:
    print(f"{c['name']}: ${c['amount']:,.0f} {c['currency']}{c['buyer']}")
{
  "rut": "77.261.280-K",
  "total": 3,
  "contracts": [
    {
      "code": "2755-2-LP26",
      "name": "IT systems maintenance",
      "amount": 15000000.0,
      "currency": "CLP",
      "awarded_at": "2026-03-15T00:00:00",
      "buyer": "Ministerio de Salud",
      "buyer_rut": "61.002.001-3"
    }
  ],
  "source": "mercadopublico"
}

Use case: search active tenders by keyword

Find open tenders across any of the three countries:
def search_tenders(keyword: str, country: str) -> dict:
    response = requests.post(
        f"{BASE_URL}/v1/tenders/search",
        headers={"X-API-Key": API_KEY},
        json={"keyword": keyword, "country": country},
    )
    response.raise_for_status()
    return response.json()


# Search for software tenders in Chile
results = search_tenders("software development", "CL")
for t in results["results"]:
    print(f"[{t['code']}] {t['name']} — closes: {t['closes_at']}")

# Search in Mexico
mx = search_tenders("technology consulting", "MX")
print(f"Mexico: {mx['total']} results")

Use case: sales intelligence pipeline

Combine government contracts with company data to enrich a CRM:
def enrich_supplier(rut: str) -> dict:
    """Returns a full company profile + contracting history."""

    # Company data
    company = requests.post(
        f"{BASE_URL}/v1/enrich",
        headers={"X-API-Key": API_KEY},
        json={"identifier": rut, "country": "CL"},
    ).json()

    # Government contracts
    contracts = requests.post(
        f"{BASE_URL}/v1/tenders",
        headers={"X-API-Key": API_KEY},
        json={"rut": rut, "country": "CL"},
    ).json()

    return {
        "company_name": company.get("company_name"),
        "status": company.get("status"),
        "activity": company.get("activity"),
        "total_government_contracts": contracts.get("total_orders", 0),
        "recent_contracts": contracts.get("orders", [])[:3],
    }


profile = enrich_supplier("77.261.280-K")
print(profile)

Technical notes

Mercado Público (Chile)

  • Requires MERCADOPUBLICO_TICKET — a free integration ticket, request it at mercadopublico.cl
  • Data updated in real time
  • Covers tenders, purchase orders, and framework agreements

PNCP (Brazil)

  • No authentication required — public REST API at pncp.gov.br
  • Covers Federal Public Administration contracts
  • Includes active contracts and historical records

ComprasMX (Mexico)

  • No authentication required — standard OCDS format
  • API at api.datos.gob.mx/v2/contratacionesabiertas
  • Covers federal APF since 2017
  • License: Decreto de Datos Abiertos 2015 (commercial use permitted with attribution)

Data attribution

SourceCountryLicense
Mercado Público (mercadopublico.cl)Chile 🇨🇱Public data — Ley 20.285
PNCP (pncp.gov.br)Brazil 🇧🇷CC BY-ND 3.0
ComprasMX OCDS (api.datos.gob.mx)Mexico 🇲🇽Decreto Datos Abiertos 2015

Resources