Latinfo

atinfo

Business registry API for Latin America. Embed 27M+ company records from Peru and Colombia into your app. Lookup by tax ID, search by name, check sanctions and debtors — via API, CLI, or SDK. Free, open source.

npm install -g latinfo
latinfo pe sunat padron --search "banco de credito"
latinfo co rues registry --search "ecopetrol"
latinfo pe oece tenders "construccion hospital" --category works

What is Latinfo?

Latinfo gives you instant access to public business registries across Latin America. Instead of scraping government websites, parsing messy CSVs, or running your own database, you query a single API that returns structured data in milliseconds.

Use cases: KYB/KYC verification, invoice validation, supplier due diligence, compliance screening (sanctions, fines, debtors), procurement monitoring, and any app that needs to look up a company by tax ID or name.

How to integrate: Use the API directly (curl), the CLI (latinfo), or the SDK (npm install latinfo). For mobile/embedded apps, the SDK ships a small index file that lets your app fetch only the exact bytes it needs from the CDN — no backend required, works on 3G.

What you get

Start in 30 seconds

# Install + login
npm install -g latinfo
latinfo login

# Peru
latinfo pe sunat padron 20100047218
latinfo pe sunat padron --search "banco de credito"
latinfo pe sunat padron --dni 09346247
latinfo pe oece tenders "servicio alimentacion" --category works

# Colombia
latinfo co rues registry 0860002964
latinfo co rues registry --search "ecopetrol"

# Or use the API directly
curl -H "Authorization: Bearer YOUR_API_KEY" \
  https://api.latinfo.dev/pe/sunat/padron/ruc/20100047218

API endpoints

Base URL: https://api.latinfo.dev

EndpointDescription
Peru — SUNAT
GET /pe/sunat/padron/ruc/:rucLookup by RUC (11 digits)
GET /pe/sunat/padron/dni/:dniLookup by DNI (8 digits)
GET /pe/sunat/padron/search?q=...Search by company name
GET /pe/sunat/coactiva/ruc/:rucTax enforcement debtors
Peru — OSCE
GET /pe/osce/sanctioned/ruc/:rucSanctioned suppliers
GET /pe/osce/fines/ruc/:rucProvider fines
Peru — Other
GET /pe/servir/sanctions/dni/:dniPublic sector sanctions
GET /pe/redam/registry/dni/:dniFood debt debtors
GET /pe/oece/tenders?q=...Government procurement (890K+ tenders)
Colombia — RUES
GET /co/rues/registry/nit/:nitBusiness registry lookup
GET /co/rues/registry/search?q=...Search by company name

All endpoints support search?q=... for name search. Lookup endpoints return 404 if not found, 400 for invalid format.

Licitaciones response (OCDS 1.1)

Returns full OCDS 1.1 compiledRelease records. Key fields:

FieldDescriptionExample
ocidOpen Contracting IDocds-dgv273-seacev3-2026-273-3
urlLink to official OECE portalcontratacionesabiertas.oece.gob.pe/proceso/...
buyer.nameBuyer organizationMUNICIPALIDAD DISTRITAL DE MORO
tender.titleShort titleCP-ABR-1-2026-MDM/CS-1
tender.descriptionFull descriptionSUPERVISION DE OBRA: CONSTRUCCION DE...
tender.value.amountAmount in PEN64815.55
tender.mainProcurementCategorygoods, services, worksservices
tender.procurementMethodDetailsProcurement methodConcurso Público Abreviado
tender.datePublishedPublication date2026-03-10T23:26:00-05:00
tender.items[].statusDetailsStatusCONVOCADO
tender.documents[]Attached files (bases, etc.)
awards[]Award decisions, suppliers
contracts[]Contract details

Response fields

FieldDescriptionExample
rucRUC number (11 digits)20100047218
razon_socialBusiness nameBANCO DE CREDITO DEL PERU
estadoTax statusACTIVO
condicionConditionHABIDO
ubigeoLocation code150114
tipo_viaStreet typeJR.
nombre_viaStreet nameCENTENARIO
numeroStreet number156

SDK

// npm install latinfo
import { Latinfo } from 'latinfo';
const client = new Latinfo('YOUR_API_KEY');

// Peru
const bcp = await client.pe.ruc('20100047218');
const results = await client.pe.search('banco de credito');

// Colombia
const banco = await client.co.nit('0860002964');
const empresas = await client.co.search('ecopetrol');

// Licitaciones
const obras = await client.pe.licitaciones({
  q: 'construccion', category: 'works', limit: 10
});

What you don't have to do

You don't download 364MB from SUNAT. You don't parse Latin1 with escaped pipe delimiters. You don't write a check digit algorithm (mod 11, weights [5,4,3,2,7,6,5,4,3,2], special cases for remainders 10 and 11). You don't build a search index that handles S.A.C. and E.I.R.L. — SQLite FTS5 splits E.I.R.L. into four single-letter tokens and discards them. You don't set up a daily import pipeline with change detection and atomic replacement. You don't manage servers.

We do all of that. Daily. For free.

How it works

There is no database. Records are compiled into binary files stored in Cloudflare R2 and served via Workers at 300+ edge locations worldwide.

Lookup (RUC/NIT/DNI): A prefix index maps every ID to an exact byte range in a binary shard. One R2 range request returns the record. O(log n) binary search on a 300 KB index — the rest of the data (1 GB+) is never loaded. Sub-100ms from anywhere.

Search: An inverted index maps every term to a posting list with inline fields (name + status per entry, 110 bytes each). Multi-token queries intersect posting lists, scored by TF-IDF with phrase proximity bonus. The index header (~20 MB) is cached in Worker memory; posting data is fetched via range requests on demand.

MPHF (client-side processing): A Minimal Perfect Hash Function file ships with the SDK (72 KB to 19 MB depending on the source). It maps every search term to its exact byte offset in the binary index — O(1), no scanning. The client knows exactly which bytes to request, fetches only those bytes from the CDN via a range request (kilobytes, not megabytes), and processes the result locally. No API server involved, no heavy response payloads. Works on 3G. Designed for mobile clients in LATAM where bandwidth is expensive and connectivity is unreliable.

Binary format: Each data source produces two files: a .bin (sorted records, variable-length fields) and an .idx (prefix index, fixed-size entries). SUNAT padron: 18M records across 28 shards, ~7 GB total. Index: 300 KB. The format is designed for R2 range requests — no full download needed.

Import pipeline: Government data is downloaded, parsed, deduplicated, sorted, encoded into binary format, and uploaded to R2. Automated daily via GitHub Actions on a self-hosted runner. Each import builds the binary files, search index, and MPHF in one pass.

Infrastructure cost: Cloudflare Workers free tier handles 3M requests/month. R2 storage: ~$0.015/GB/month. Total: under $1/month for the entire platform. No servers, no database, no ops.

Pricing

Currently free for everyone. No limits, no credit card.

Countries & Sources

LIVE Peru (SUNAT) — RUC, DNI, company search. 18M+ records, updated daily.

LIVE Peru (OECE/SEACE) — Government procurement search. 890K+ tenders.

LIVE Peru (OSCE) — Sanctioned suppliers + fines.

LIVE Peru (SERVIR) — Public sector sanctions. 10K+ records.

LIVE Peru (REDAM) — Food debt debtors registry. 24K+ records.

LIVE Peru (SUNAT Coactiva) — Tax enforcement debtors.

LIVE Colombia (RUES) — NIT lookup, company search. 9M+ records.

Brazil, Mexico, Argentina, and Chile in development.

Start with the API. Own it later if you need to.

Use Latinfo to ship today. If you outgrow it or need full control, the data is public — you can always build your own solution. We're not locking you in. We're saving you time.