Skip to main content
Colombia has run public procurement on two systems. SECOP I (2004 onward) is a publication register: an entity uploads what it did. SECOP II (2015 onward) is a transactional platform: the process happens inside it. Both are run by Colombia Compra Eficiente, both are still being written to, and they publish different columns in different words at different grains. Croma serves both as one corpus. Seven datasets (processes, contracts, contract modifications, bidders, suppliers, sanctions and annual purchasing plans) are complete, kept up to date and answered in a single vocabulary, so a question like “everything this company has contracted with the state” is one call rather than two searches in two shapes. Every dataset-served response carries as_of: how current the data is. Two endpoints still read the source live, because they answer about one record rather than about the corpus: secop-process returns a SECOP II process with its per-provider awards and awarded contracts attached, and secop-contract returns one contract with its additions, guarantees and delivery plan.

Process by notice

POST /co/secop/process/v1
The noticeUID is the process’s notice identifier, formatted like CO1.NTC.<number> (e.g. CO1.NTC.9458505).

Contracts by provider

This endpoint is deprecated since 2026-08-30 and stops answering on 2026-12-01. Use its successor, POST /co/secop/contracts-search/v1, instead.
POST /co/secop/contracts-by-provider/v1 Lists the contracts awarded to one provider (cédula or NIT) across every contracting entity: the contractor profile.
Returns document_number, the echoed filters (entity_nit, from_date, to_date), count, capped, contracts[] (same contract shape as below), and a pagination object (total, page_size, total_pages, page). Pages of 500, newest first; when capped is true the page is full, so request the next page or narrow the search.

Processes by entity

This endpoint is deprecated since 2026-08-30 and stops answering on 2026-12-01. Use its successor, POST /co/secop/processes-search/v1, instead.
POST /co/secop/processes-by-entity/v1 Lists the procurement processes published by one contracting entity (by NIT), optionally within a publication-date window: the audit population for an entity. Returns lean summaries; drill into one with the by-notice lookup above.
Returns document_number, from_date, to_date, count, capped, processes[] (each with notice_uid, process_id, name, entity, entity_nit, modality, contract_type, base_price, phase, procedure_status, published_date, and url), and a pagination object (total, page_size, total_pages, page). Pages of 500, newest first; when capped is true the page is full, so request the next page.

Contract by id

POST /co/secop/contract/v1 Resolves one electronic contract by its id and attaches its satellite history: registered additions/modifications, insurance policies (garantías), and the delivery plan with planned vs actual progress.
Returns found, contract_id, contract (same shape as contracts[] below), and three lists, each capped at 200 with a matching *_capped flag:

Sanctions by provider

This endpoint is deprecated since 2026-08-30 and stops answering on 2026-12-01. Use its successor, POST /co/secop/sanctions-search/v1, instead.
POST /co/secop/sanctions-by-provider/v1 Lists the fines and sanctions (multas y sanciones) recorded against one state contractor. Records span 2010 to the present.
Returns document_number, count, capped, and sanctions[], each with entity, entity_nit, entity_level, entity_order, municipality, resolution_number, provider, contract_number, sanction_value, published_date, final_date (fecha de firmeza), and url.

Search processes

POST /co/secop/processes-search/v1 Searches every procurement process published on SECOP II and SECOP I as one corpus. Filters combine freely; query matches the name, the description, the entity and the process reference.
The whole source, organized and ready to query: this endpoint answers in milliseconds, at any hour, the same way every time. Every response carries as_of: how current the data is.
Returns as_of (how current the data is), total, page, per_page, total_pages, count, the filters as they were applied, and results[]. Each result is a process record: its platform-prefixed id, the buying entity, what is being bought, the modality and contract type, the estimated and awarded amounts, the dates, the competition counts SECOP II publishes (invited_providers, unique_responding_providers, …) and the process URL. Pass a result’s id to secop-process-record to read it back on its own, or its notice_uid to secop-process for the live view with awards and contracts attached.

Search contracts

POST /co/secop/contracts-search/v1 Searches every contract signed through SECOP II and SECOP I as one corpus. provider_document accepts a NIT or cédula with or without dots and verification digit: 900195855, 900.195.855-1 and 900195855-1 all match the same contractor.
The whole source, organized and ready to query: this endpoint answers in milliseconds, at any hour, the same way every time. Every response carries as_of: how current the data is.
Returns as_of, the page metadata, the filters as applied, and results[]. Each result is a contract record with the entity, the contractor and its legal representative, the object, the amounts (signed, with additions, invoiced, paid, pending), the funding breakdown by source, the dates, the peace-agreement and post-conflict markers, and who supervises it. value is the amount at signature; value_with_additions is the amount to rank spending by. Pass a result’s id to secop-contract-record, or its contract_id to secop-contract for the live view with additions, guarantees and the delivery plan.

Search contract modifications

POST /co/secop/modifications-search/v1 Lists what happened to contracts after they were signed. Sorting by value_desc with a min_value floor is the plainest way to find the contracts that grew most after award.
The whole source, organized and ready to query: this endpoint answers in milliseconds, at any hour, the same way every time. Every response carries as_of: how current the data is.
Returns as_of, the page metadata, the filters as applied, and results[] with contract_id, kind, description, added_value, added_days and registered_date. SECOP I records its additions against the adjudication rather than the contract row, so those carry contract_reference (the adjudication id, which a contract reports as award_id) instead of contract_id.

Search suppliers

POST /co/secop/suppliers-search/v1 The SECOP II supplier register. query matches the name, the document and the registered category description.
The whole source, organized and ready to query: this endpoint answers in milliseconds, at any hour, the same way every time. Every response carries as_of: how current the data is.
Returns as_of, the page metadata, the filters as applied, and results[] with the supplier’s document, name, category, location, contact details, legal representative and is_active. SECOP I has no supplier register of its own; a SECOP I contractor appears in secop-contracts-search but not here.

Search bidders

POST /co/secop/bidders-search/v1 Who presented an offer on which process. SECOP I also publishes the score and whether the bidder won; SECOP II publishes only the participation, so score and awarded are null there rather than guessed.
The whole source, organized and ready to query: this endpoint answers in milliseconds, at any hour, the same way every time. Every response carries as_of: how current the data is.
Returns as_of, the page metadata, the filters as applied, and results[] with process_id, bidder, bidder_document, score, awarded and published_date.

Search sanctions

POST /co/secop/sanctions-search/v1 The whole register of multas y sanciones, searchable across contractors and entities rather than one contractor at a time.
The whole source, organized and ready to query: this endpoint answers in milliseconds, at any hour, the same way every time. Every response carries as_of: how current the data is.
Returns as_of, the page metadata, the filters as applied, and results[] with the sanctioning entity, the contractor, the resolution number, the contract, the amount in COP, the publication date and the date the sanction became final.

Search annual procurement plans

POST /co/secop/plans-search/v1 The forward-looking half of Colombian procurement: what entities say they will buy, before the processes exist.
The whole source, organized and ready to query: this endpoint answers in milliseconds, at any hour, the same way every time. Every response carries as_of: how current the data is.
Returns as_of, the page metadata, the filters as applied, and results[] with the entity, the year, the announced total budget, the menor and mínima cuantía thresholds, the entity’s stated mission and strategy, and the contact it named.

Profile by document

POST /co/secop/profile/v1 One document, both sides of the market. A NIT can be a contractor, a buying entity, or both, and this answers for all of it at once.
The whole source, organized and ready to query: this endpoint answers in milliseconds, at any hour, the same way every time. Every response carries as_of: how current the data is.
The counts are exact; the lists are the largest few. as_contractor.contracts is the real number of contracts even when largest_contracts holds five of them. To page the rest, take the document and call secop-contracts-search with it. contracts_value is the sum of the contracts actually returned and nothing more. It is not a lifetime total: a total across every contract is not something this endpoint can compute, and a number inferred from one page would be wrong in the direction nobody would think to check. found: false means the corpus holds nothing at all for the document. That is an answer, not an error: most cédulas have never contracted with the state.

Search awards

POST /co/secop/awards-search/v1 Every awarded provider on every SECOP II process, at the grain the source publishes them. A SECOP I row is itself an adjudication, contractor and amount included, so SECOP I awards live in secop-contracts-search.
The whole source, organized and ready to query: this endpoint answers in milliseconds, at any hour, the same way every time. Every response carries as_of: how current the data is.
Returns as_of, the page metadata, the filters as applied, and results[] with process_id, notice_uid, the entity, the provider and its document, value and awarded_at. Pass a result’s process_id to secop-process-record, or its notice_uid to secop-process for the process with every award and contract attached.

Read one process

POST /co/secop/process-record/v1 Reads back a single process record by the id a search returned.
The whole source, organized and ready to query: this endpoint answers in milliseconds, at any hour, the same way every time. Every response carries as_of: how current the data is.
Returns as_of, found, the queried record_id and process. A record_id that matches nothing answers found: false with process null; that is an answer, not an error.

Read one contract

POST /co/secop/contract-record/v1 Reads back a single contract record by the id a search returned.
The whole source, organized and ready to query: this endpoint answers in milliseconds, at any hour, the same way every time. Every response carries as_of: how current the data is.
Returns as_of, found, the queried record_id and contract. A record_id that matches nothing answers found: false with contract null.

Response

process

awards[]

One row per awarded provider (framework agreements award many):

contracts[]

Empty and placeholder values are normalized to null. Monetary and count fields are numbers; dates are yyyy-mm-dd.
A process also has sections available only on SECOP’s own site (Documentos Tipo, Cuestionario, Observaciones, document downloads) or in other SECOP records (plan anual de adquisiciones, presupuesto detail). Those are not part of these responses.

Full reference

Schemas, all response fields, and an interactive playground.