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#
| Dataset | What it holds |
|---|---|
processes | Every procurement process, from both systems |
contracts | Every signed contract, from both systems |
awards | Every awarded provider, not just the first one |
modifications | Additions and extensions made after signature |
guarantees | The insurance policies backing the contracts |
deliveries | The delivery plan: what was promised and what arrived |
bidders | Who bid on each process, losers included |
suppliers | The SECOP II supplier register |
sanctions | Fines and sanctions against contractors |
plans | Each 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:
| Retiring | Use instead |
|---|---|
secop-contracts-by-provider | secop-contracts-search |
secop-processes-by-entity | secop-processes-search |
secop-sanctions-by-provider | secop-sanctions-search |
The documentation has the detail of every field, and the source page summarizes what SECOP publishes and since when.