SECOP I and SECOP II, finally in one place

All of Colombia's public procurement since 2004 in one vocabulary: ten datasets, full-text search with filters, and a profile that answers for a NIT in a single call.

Colombia runs public procurement on two systems and both are still live. SECOP I, from 2004, is a publication register: an entity uploads what it did. SECOP II, from 2015, is a transactional platform: the process happens inside it. They publish different columns, in different words, at different grains.

That turned every serious question into two questions. "Everything this company has contracted with the state" meant searching twice and then reconciling two shapes that do not agree on a single field name.

As of today they are one corpus, in one vocabulary.

Ten datasets#

DatasetWhat it holds
processesEvery procurement process, from both systems
contractsEvery signed contract, from both systems
awardsEvery awarded provider, not just the first one
modificationsAdditions and extensions made after signature
guaranteesThe insurance policies backing the contracts
deliveriesThe delivery plan: what was promised and what arrived
biddersWho bid on each process, losers included
suppliersThe SECOP II supplier register
sanctionsFines and sanctions against contractors
plansEach entity's annual purchasing plan

A SECOP I contract and a SECOP II contract come back with the same field names. A contractor's document is stored in one canonical form, so it makes no difference whether you write 1234567890, 1234567890-1 or 1.234.567.890-1: all three find the same records. Every response carries as_of, which says how current the data is.

One NIT, one call#

The most common question about public procurement is also the most awkward to assemble: what has this company done with the state. It used to be four searches and a manual reconciliation. Now it is one:

curl https://api.croma.run/co/secop/profile/v1 \
  -H "Authorization: Bearer $CROMA_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "document": "1234567890" }'

It returns the supplier account if there is one, how many contracts have been signed and the largest of them, how many awards were won, how many processes were bid on, and every sanction on record. If the document turns out to belong to a public entity, it answers for the other side of the market too: what it has bought and how many processes it has published.

The counts are exact. The lists are the largest few, and the field names say so: contracts can be 412 while largest_contracts holds five. To page through the rest, take the same document to the contracts search.

What you can ask now#

Full-text search over what is being bought, combined with the entity, the department, the modality, the contract type, the category, the year, a date range and a value range. Sortable by amount:

curl https://api.croma.run/co/secop/contracts-search/v1 \
  -H "Authorization: Bearer $CROMA_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "query": "waste collection",
    "department": "Antioquia",
    "year": 2025,
    "sort": "value_desc"
  }'

Two questions that had no answer before:

Who else showed up. bidders is the only published view of the losing bidders, so how contested a tender actually was can be measured rather than assumed.

Which contracts grew after they were awarded. modifications-search sorted by amount, with a floor, is the most direct way to find them.

All of it is on MCP as well, with the same names and the same filters.

Endpoints being retired#

Three endpoints each answered one question about SECOP II alone. The search that replaces each one answers the same question across both systems, with filters, paging and ordering. They keep working until 1 December 2026:

RetiringUse instead
secop-contracts-by-providersecop-contracts-search
secop-processes-by-entitysecop-processes-search
secop-sanctions-by-providersecop-sanctions-search

The documentation has the detail of every field, and the source page summarizes what SECOP publishes and since when.

Start querying official records