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
noticeUID is the process’s notice identifier, formatted like
CO1.NTC.<number> (e.g. CO1.NTC.9458505).
Contracts by provider
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.
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
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.
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.
found, contract_id, contract (same shape as contracts[] below),
and three lists, each capped at 200 with a matching *_capped flag:
Sanctions by provider
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.
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.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.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.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.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.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.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.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.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.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.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.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.