> ## Documentation Index
> Fetch the complete documentation index at: https://docs.usecroma.com/llms.txt
> Use this file to discover all available pages before exploring further.

# SECOP

> Colombian public procurement across SECOP I and SECOP II: every process, contract, modification, bidder, supplier, sanction and annual purchasing plan, complete and ready to query, plus live drill-down into one process or contract.

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`

| Field        | Type   | Notes                                                  |
| ------------ | ------ | ------------------------------------------------------ |
| `notice_uid` | string | **Required.** SECOP noticeUID, e.g. `CO1.NTC.9458505`. |

```bash theme={"dark"}
curl https://api.croma.run/co/secop/process/v1 \
  -H "Authorization: Bearer $CROMA_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "notice_uid": "CO1.NTC.9458505" }'
```

The `noticeUID` is the process's notice identifier, formatted like
`CO1.NTC.<number>` (e.g. `CO1.NTC.9458505`).

## 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.

| Field         | Type   | Notes                                                       |
| ------------- | ------ | ----------------------------------------------------------- |
| `contract_id` | string | **Required.** SECOP contract id, e.g. `CO1.PCCNTR.6794799`. |

```bash theme={"dark"}
curl https://api.croma.run/co/secop/contract/v1 \
  -H "Authorization: Bearer $CROMA_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "contract_id": "CO1.PCCNTR.6794799" }'
```

Returns `found`, `contract_id`, `contract` (same shape as `contracts[]` below),
and three lists, each capped at 200 with a matching `*_capped` flag:

| List                | Fields                                                                                                                                                                                                                                                                                                |
| ------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `additions[]`       | `addition_id`, `type`, `description`, `registered_date`.                                                                                                                                                                                                                                              |
| `guarantees[]`      | `insurer`, `policy_number`, `insured`, `beneficiary`, `policy_created_date`, `policy_sent_date`, `policy_end_date`, `policy_side`, `status`, `policy_type`, `policy_subtype`, `value`, `created_date`.                                                                                                |
| `execution_items[]` | `execution_type`, `plan_name`, `expected_delivery_date`, `expected_progress_percent`, `actual_delivery_date`, `actual_progress_percent`, `contract_status`, `item_reference`, `description`, `unit`, `awarded_quantity`, `planned_quantity`, `received_quantity`, `pending_quantity`, `created_date`. |

## Search processes

`POST /co/secop/processes-search/v1` <a className="dataset-pill" href="/datasets">Dataset</a>

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.

| Field           | Type    | Notes                                                                                                                                                                                      |
| --------------- | ------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| `query`         | string  | Optional search terms matched against the free text of the record (what is being bought, the entity and the supplier). Leave empty to filter without searching.                            |
| `platform`      | enum    | `secop_ii`, `secop_i`, or `any` for both. Default `any`.                                                                                                                                   |
| `entity_nit`    | string  | Optional document filter: a NIT or a cédula, with or without dots and verification digit (`900195855`, `900.195.855-1` and `900195855-1` all match the same records).                      |
| `department`    | string  | Optional department of the contracting entity, as SECOP writes it (`Antioquia`, `Bogotá D.C.`, ...). Empty for the whole country.                                                          |
| `modality`      | string  | Optional modalidad de contratación, exactly as SECOP writes it (`Contratación directa`, `Licitación pública`, `Mínima cuantía`, ...). Empty for every modality.                            |
| `contract_type` | string  | Optional tipo de contrato, exactly as SECOP writes it (`Prestación de servicios`, `Obra`, `Suministros`, ...). Empty for every type.                                                       |
| `status`        | string  | Optional estado, exactly as SECOP writes it (`Adjudicado`, `Celebrado`, `En ejecución`, `Terminado`, ...). Empty for every status.                                                         |
| `unspsc_code`   | string  | Optional main UNSPSC category code of the purchase (`V1.80101500`). Empty for every category.                                                                                              |
| `year`          | integer | Optional calendar year. 0 searches every year. Default `0`.                                                                                                                                |
| `from_date`     | string  | Optional date filter in yyyy-mm-dd format.                                                                                                                                                 |
| `to_date`       | string  | Optional date filter in yyyy-mm-dd format.                                                                                                                                                 |
| `min_value`     | number  | Bounds apply to `base_price` (the estimated value of the process), in COP. Default `0`.                                                                                                    |
| `max_value`     | number  | Bounds apply to `base_price` (the estimated value of the process), in COP. Default `0`.                                                                                                    |
| `sort`          | enum    | Order of the results: `recent` (newest first, the default), `oldest`, `value_desc` (largest amount first) or `value_asc`. Default `recent`.                                                |
| `page`          | integer | 1-based page number for paginated results. Default `1`.                                                                                                                                    |
| `per_page`      | integer | Results per page (1-100). Default `20`.                                                                                                                                                    |
| `awarded`       | enum    | Restrict to processes that reached an award (`yes`), that did not (`no`), or `any`. Processes whose outcome the source does not state are excluded by `yes` and `no` alike. Default `any`. |

```bash theme={"dark"}
curl https://api.croma.run/co/secop/processes-search/v1 \
  -H "Authorization: Bearer $CROMA_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "query": "recolección de residuos", "year": 2025, "per_page": 20 }'
```

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` <a className="dataset-pill" href="/datasets">Dataset</a>

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.

| Field               | Type    | Notes                                                                                                                                                                 |
| ------------------- | ------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `query`             | string  | Optional search terms matched against the free text of the record (what is being bought, the entity and the supplier). Leave empty to filter without searching.       |
| `platform`          | enum    | Restrict to one system: `secop_ii` (the transactional platform, 2015 onward), `secop_i` (the publication register, 2004 onward), or `any` for both. Default `any`.    |
| `entity_nit`        | string  | Optional document filter: a NIT or a cédula, with or without dots and verification digit (`900195855`, `900.195.855-1` and `900195855-1` all match the same records). |
| `department`        | string  | Optional department of the contracting entity, as SECOP writes it (`Antioquia`, `Bogotá D.C.`, ...). Empty for the whole country.                                     |
| `modality`          | string  | Optional modalidad de contratación, exactly as SECOP writes it (`Contratación directa`, `Licitación pública`, `Mínima cuantía`, ...). Empty for every modality.       |
| `contract_type`     | string  | Optional tipo de contrato, exactly as SECOP writes it (`Prestación de servicios`, `Obra`, `Suministros`, ...). Empty for every type.                                  |
| `status`            | string  | Optional estado, exactly as SECOP writes it (`Adjudicado`, `Celebrado`, `En ejecución`, `Terminado`, ...). Empty for every status.                                    |
| `unspsc_code`       | string  | Optional main UNSPSC category code of the purchase (`V1.80101500`). Empty for every category.                                                                         |
| `year`              | integer | Optional calendar year. 0 searches every year. Default `0`.                                                                                                           |
| `from_date`         | string  | Optional date filter in yyyy-mm-dd format.                                                                                                                            |
| `to_date`           | string  | Optional date filter in yyyy-mm-dd format.                                                                                                                            |
| `min_value`         | number  | Bounds apply to `value_with_additions` (what was actually committed), in COP. Default `0`.                                                                            |
| `max_value`         | number  | Bounds apply to `value_with_additions` (what was actually committed), in COP. Default `0`.                                                                            |
| `sort`              | enum    | Order of the results: `recent` (newest first, the default), `oldest`, `value_desc` (largest amount first) or `value_asc`. Default `recent`.                           |
| `page`              | integer | 1-based page number for paginated results. Default `1`.                                                                                                               |
| `per_page`          | integer | Results per page (1-100). Default `20`.                                                                                                                               |
| `provider_document` | string  | Optional document filter: a NIT or a cédula, with or without dots and verification digit (`900195855`, `900.195.855-1` and `900195855-1` all match the same records). |
| `sector`            | string  | Published on SECOP II contracts only; setting it excludes SECOP I.                                                                                                    |

```bash theme={"dark"}
curl https://api.croma.run/co/secop/contracts-search/v1 \
  -H "Authorization: Bearer $CROMA_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
        "provider_document": "900195855",
        "sort": "value_desc",
        "per_page": 20
      }'
```

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` <a className="dataset-pill" href="/datasets">Dataset</a>

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.

| Field         | Type    | Notes                                                                                                                                                              |
| ------------- | ------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| `query`       | string  | Optional search terms matched against the free text of the record (what is being bought, the entity and the supplier). Leave empty to filter without searching.    |
| `contract_id` | string  | A contract `id` from `secop-contracts-search`, e.g. `secop_ii:CO1.PCCNTR.4168447`.                                                                                 |
| `platform`    | enum    | Restrict to one system: `secop_ii` (the transactional platform, 2015 onward), `secop_i` (the publication register, 2004 onward), or `any` for both. Default `any`. |
| `year`        | integer | Optional calendar year. 0 searches every year. Default `0`.                                                                                                        |
| `from_date`   | string  | Optional date filter in yyyy-mm-dd format.                                                                                                                         |
| `to_date`     | string  | Optional date filter in yyyy-mm-dd format.                                                                                                                         |
| `min_value`   | number  | Optional lower bound on the amount, in COP. 0 means no lower bound. Default `0`.                                                                                   |
| `sort`        | enum    | Order of the results: `recent` (newest first, the default), `oldest`, `value_desc` (largest amount first) or `value_asc`. Default `recent`.                        |
| `page`        | integer | 1-based page number for paginated results. Default `1`.                                                                                                            |
| `per_page`    | integer | Results per page (1-100). Default `20`.                                                                                                                            |

```bash theme={"dark"}
curl https://api.croma.run/co/secop/modifications-search/v1 \
  -H "Authorization: Bearer $CROMA_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "min_value": 1000000000, "sort": "value_desc", "per_page": 20 }'
```

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` <a className="dataset-pill" href="/datasets">Dataset</a>

The SECOP II supplier register. `query` matches the name, the document and the
registered category description.

| Field         | Type    | Notes                                                                                                                                                                 |
| ------------- | ------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `query`       | string  | Optional search terms matched against the free text of the record (what is being bought, the entity and the supplier). Leave empty to filter without searching.       |
| `document`    | string  | Optional document filter: a NIT or a cédula, with or without dots and verification digit (`900195855`, `900.195.855-1` and `900195855-1` all match the same records). |
| `department`  | string  | Optional department of the contracting entity, as SECOP writes it (`Antioquia`, `Bogotá D.C.`, ...). Empty for the whole country.                                     |
| `unspsc_code` | string  | Optional main UNSPSC category code of the purchase (`V1.80101500`). Empty for every category.                                                                         |
| `active`      | enum    | Restrict to active supplier accounts (`yes`), inactive ones (`no`), or `any`. Default `any`.                                                                          |
| `page`        | integer | 1-based page number for paginated results. Default `1`.                                                                                                               |
| `per_page`    | integer | Results per page (1-100). Default `20`.                                                                                                                               |

```bash theme={"dark"}
curl https://api.croma.run/co/secop/suppliers-search/v1 \
  -H "Authorization: Bearer $CROMA_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "query": "constructora", "department": "Antioquia", "per_page": 20 }'
```

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` <a className="dataset-pill" href="/datasets">Dataset</a>

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.

| Field             | Type    | Notes                                                                                                                                                                 |
| ----------------- | ------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `process_id`      | string  | For SECOP II, a process `id` from `secop-processes-search`. SECOP I identifies a process here by its own internal id, which is not that key.                          |
| `bidder_document` | string  | Optional document filter: a NIT or a cédula, with or without dots and verification digit (`900195855`, `900.195.855-1` and `900195855-1` all match the same records). |
| `platform`        | enum    | Restrict to one system: `secop_ii` (the transactional platform, 2015 onward), `secop_i` (the publication register, 2004 onward), or `any` for both. Default `any`.    |
| `year`            | integer | Optional calendar year. 0 searches every year. Default `0`.                                                                                                           |
| `page`            | integer | 1-based page number for paginated results. Default `1`.                                                                                                               |
| `per_page`        | integer | Results per page (1-100). Default `20`.                                                                                                                               |

```bash theme={"dark"}
curl https://api.croma.run/co/secop/bidders-search/v1 \
  -H "Authorization: Bearer $CROMA_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "bidder_document": "900195855", "per_page": 20 }'
```

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` <a className="dataset-pill" href="/datasets">Dataset</a>

The whole register of multas y sanciones, searchable across contractors and
entities rather than one contractor at a time.

| Field               | Type    | Notes                                                                                                                                                                 |
| ------------------- | ------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `query`             | string  | Optional search terms matched against the free text of the record (what is being bought, the entity and the supplier). Leave empty to filter without searching.       |
| `provider_document` | string  | Optional document filter: a NIT or a cédula, with or without dots and verification digit (`900195855`, `900.195.855-1` and `900195855-1` all match the same records). |
| `entity_nit`        | string  | Optional document filter: a NIT or a cédula, with or without dots and verification digit (`900195855`, `900.195.855-1` and `900195855-1` all match the same records). |
| `year`              | integer | Optional calendar year. 0 searches every year. Default `0`.                                                                                                           |
| `from_date`         | string  | Optional date filter in yyyy-mm-dd format.                                                                                                                            |
| `to_date`           | string  | Optional date filter in yyyy-mm-dd format.                                                                                                                            |
| `page`              | integer | 1-based page number for paginated results. Default `1`.                                                                                                               |
| `per_page`          | integer | Results per page (1-100). Default `20`.                                                                                                                               |

```bash theme={"dark"}
curl https://api.croma.run/co/secop/sanctions-search/v1 \
  -H "Authorization: Bearer $CROMA_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "query": "incumplimiento", "per_page": 20 }'
```

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` <a className="dataset-pill" href="/datasets">Dataset</a>

The forward-looking half of Colombian procurement: what entities say they will
buy, before the processes exist.

| Field        | Type    | Notes                                                                                                                                                                                              |
| ------------ | ------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `query`      | string  | Matches the entity name and the mission and strategy it states in the plan. The plan header names its entity by SECOP code rather than NIT, so an entity is reached by name here, not by document. |
| `department` | string  | Optional department of the contracting entity, as SECOP writes it (`Antioquia`, `Bogotá D.C.`, ...). Empty for the whole country.                                                                  |
| `year`       | integer | Optional calendar year. 0 searches every year. Default `0`.                                                                                                                                        |
| `page`       | integer | 1-based page number for paginated results. Default `1`.                                                                                                                                            |
| `per_page`   | integer | Results per page (1-100). Default `20`.                                                                                                                                                            |

```bash theme={"dark"}
curl https://api.croma.run/co/secop/plans-search/v1 \
  -H "Authorization: Bearer $CROMA_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "year": 2026, "per_page": 20 }'
```

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` <a className="dataset-pill" href="/datasets">Dataset</a>

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.

| Field         | Type    | Notes                                                                                                                                                                    |
| ------------- | ------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| `document`    | string  | **Required.** Provider cédula or NIT. Dots and a trailing verification digit are optional: `900195855`, `900195855-1` and `900.195.855-1` all match the same contractor. |
| `per_section` | integer | Only the length of each list. The counts beside them are exact totals either way. Default `5`.                                                                           |

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

**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` <a className="dataset-pill" href="/datasets">Dataset</a>

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`.

| Field               | Type    | Notes                                                                                                                                                                 |
| ------------------- | ------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `query`             | string  | Optional search terms matched against the free text of the record (what is being bought, the entity and the supplier). Leave empty to filter without searching.       |
| `provider_document` | string  | Optional document filter: a NIT or a cédula, with or without dots and verification digit (`900195855`, `900.195.855-1` and `900195855-1` all match the same records). |
| `entity_nit`        | string  | Optional document filter: a NIT or a cédula, with or without dots and verification digit (`900195855`, `900.195.855-1` and `900195855-1` all match the same records). |
| `process_id`        | string  | Optional process id from a search result (`id` on a process, or `process_id` on a bidder). Empty searches every process.                                              |
| `year`              | integer | Optional calendar year. 0 searches every year. Default `0`.                                                                                                           |
| `from_date`         | string  | Optional date filter in yyyy-mm-dd format.                                                                                                                            |
| `to_date`           | string  | Optional date filter in yyyy-mm-dd format.                                                                                                                            |
| `min_value`         | number  | Bounds apply to `value`, this provider's own slice of the award, not the process total. Default `0`.                                                                  |
| `max_value`         | number  | Bounds apply to `value`, this provider's own slice of the award, not the process total. Default `0`.                                                                  |
| `sort`              | enum    | Order of the results: `recent` (newest first, the default), `oldest`, `value_desc` (largest amount first) or `value_asc`. Default `recent`.                           |
| `page`              | integer | 1-based page number for paginated results. Default `1`.                                                                                                               |
| `per_page`          | integer | Results per page (1-100). Default `20`.                                                                                                                               |

```bash theme={"dark"}
curl https://api.croma.run/co/secop/awards-search/v1 \
  -H "Authorization: Bearer $CROMA_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
        "provider_document": "900195855",
        "sort": "value_desc",
        "per_page": 20
      }'
```

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` <a className="dataset-pill" href="/datasets">Dataset</a>

Reads back a single process record by the `id` a search returned.

| Field       | Type   | Notes                                                                                                                                       |
| ----------- | ------ | ------------------------------------------------------------------------------------------------------------------------------------------- |
| `record_id` | string | **Required.** Record id from a SECOP search result (`id`), platform-prefixed: e.g. `secop_ii:CO1.PCCNTR.4168447`, `secop_i:20-11-10442331`. |

```bash theme={"dark"}
curl https://api.croma.run/co/secop/process-record/v1 \
  -H "Authorization: Bearer $CROMA_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "record_id": "secop_ii:CO1.REQ.1234567" }'
```

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` <a className="dataset-pill" href="/datasets">Dataset</a>

Reads back a single contract record by the `id` a search returned.

| Field       | Type   | Notes                                                                                                                                       |
| ----------- | ------ | ------------------------------------------------------------------------------------------------------------------------------------------- |
| `record_id` | string | **Required.** Record id from a SECOP search result (`id`), platform-prefixed: e.g. `secop_ii:CO1.PCCNTR.4168447`, `secop_i:20-11-10442331`. |

```bash theme={"dark"}
curl https://api.croma.run/co/secop/contract-record/v1 \
  -H "Authorization: Bearer $CROMA_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "record_id": "secop_ii:CO1.PCCNTR.4168447" }'
```

Returns `as_of`, `found`, the queried `record_id` and `contract`. A `record_id`
that matches nothing answers `found: false` with `contract` null.

## Contracts by provider

<Warning>
  This endpoint is deprecated since 2026-08-30 and stops answering on 2026-12-01. Use [its successor](/guides/colombia/secop), `POST /co/secop/contracts-search/v1`, instead.
</Warning>

`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.

| Field             | Type    | Notes                                                                                  |
| ----------------- | ------- | -------------------------------------------------------------------------------------- |
| `document_number` | string  | **Required.** Provider cédula or NIT (4-20 alphanumeric).                              |
| `entity_nit`      | string  | Optional. Only contracts with this contracting entity (digits, no verification digit). |
| `from_date`       | string  | Optional. Sign date lower bound (`yyyy-mm-dd`, inclusive).                             |
| `to_date`         | string  | Optional. Sign date upper bound (`yyyy-mm-dd`, inclusive).                             |
| `page`            | integer | Optional. 1-based page of 500. Default `1`.                                            |

```bash theme={"dark"}
curl https://api.croma.run/co/secop/contracts-by-provider/v1 \
  -H "Authorization: Bearer $CROMA_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "document_number": "79372917" }'
```

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

<Warning>
  This endpoint is deprecated since 2026-08-30 and stops answering on 2026-12-01. Use [its successor](/guides/colombia/secop), `POST /co/secop/processes-search/v1`, instead.
</Warning>

`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.

| Field             | Type    | Notes                                                                 |
| ----------------- | ------- | --------------------------------------------------------------------- |
| `document_number` | string  | **Required.** Contracting entity NIT (digits, no verification digit). |
| `from_date`       | string  | Optional. Publication date lower bound (`yyyy-mm-dd`, inclusive).     |
| `to_date`         | string  | Optional. Publication date upper bound (`yyyy-mm-dd`, inclusive).     |
| `page`            | integer | Optional. 1-based page of 500. Default `1`.                           |

```bash theme={"dark"}
curl https://api.croma.run/co/secop/processes-by-entity/v1 \
  -H "Authorization: Bearer $CROMA_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "document_number": "899999061", "from_date": "2026-01-01" }'
```

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`.

## Sanctions by provider

<Warning>
  This endpoint is deprecated since 2026-08-30 and stops answering on 2026-12-01. Use [its successor](/guides/colombia/secop), `POST /co/secop/sanctions-search/v1`, instead.
</Warning>

`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.

| Field             | Type   | Notes                                                       |
| ----------------- | ------ | ----------------------------------------------------------- |
| `document_number` | string | **Required.** Contractor cédula or NIT (4-20 alphanumeric). |

```bash theme={"dark"}
curl https://api.croma.run/co/secop/sanctions-by-provider/v1 \
  -H "Authorization: Bearer $CROMA_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "document_number": "1067811412" }'
```

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`.

## Response

| Field              | Notes                                                                                              |
| ------------------ | -------------------------------------------------------------------------------------------------- |
| `found`            | `true` when a process matches the noticeUID; `false` leaves `process` null and `contracts` empty.  |
| `notice_uid`       | The queried noticeUID.                                                                             |
| `process`          | The process header (see below).                                                                    |
| `awards`           | Per-provider award rows (see below), capped at 500.                                                |
| `awards_capped`    | `true` when the awards list hit its cap; `process.awarded_value`/`award_count` stay authoritative. |
| `contract_count`   | Number of awarded contracts attached.                                                              |
| `contracts_capped` | `true` when the contracts list hit its cap and may be incomplete.                                  |
| `contracts`        | The awarded contracts (see below).                                                                 |

### `process`

| Field                                                                                        | Notes                                                                                                                                   |
| -------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------- |
| `process_id`, `portfolio_id`                                                                 | SECOP ids (`CO1.REQ.*`, `CO1.BDOS.*`).                                                                                                  |
| `reference`                                                                                  | Número del proceso (entity's internal reference).                                                                                       |
| `name`, `description`                                                                        | Nombre y descripción del procedimiento.                                                                                                 |
| `entity`, `entity_nit`, `entity_department`, `entity_city`, `entity_order`                   | Contracting entity.                                                                                                                     |
| `procurement_unit`, `procurement_unit_city`                                                  | Unidad de contratación.                                                                                                                 |
| `modality`, `modality_justification`                                                         | Modalidad de contratación.                                                                                                              |
| `contract_type`, `contract_subtype`                                                          | Tipo / subtipo de contrato.                                                                                                             |
| `unspsc_code`, `additional_categories`                                                       | UNSPSC category codes.                                                                                                                  |
| `duration`, `duration_unit`, `lots`                                                          | Duración y número de lotes.                                                                                                             |
| `base_price`                                                                                 | Precio base estimado (COP).                                                                                                             |
| `phase`, `status_summary`, `procedure_status`, `opening_status`                              | Fase y estados.                                                                                                                         |
| `published_date`, `last_published_date`                                                      | Fechas de publicación (`yyyy-mm-dd`).                                                                                                   |
| `bid_deadline`                                                                               | Deadline for providers to submit offers.                                                                                                |
| `awarded`, `awarded_value`, `award_count`, `award_date`                                      | Award flag, total adjudicated across every award, how many awards it spans, and the award date (can lag; `contracts` is authoritative). |
| `invited_providers`, `directly_invited_providers`, `interested_providers`                    | Provider-funnel metrics.                                                                                                                |
| `responses`, `external_responses`, `offer_responses`, `unique_responding_providers`, `views` | Participation metrics.                                                                                                                  |
| `url`                                                                                        | The OpportunityDetail page.                                                                                                             |

### `awards[]`

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

| Field                                       | Notes                                             |
| ------------------------------------------- | ------------------------------------------------- |
| `provider`, `provider_nit`, `provider_code` | The awarded provider.                             |
| `provider_department`, `provider_city`      | Provider location.                                |
| `awarded_value`                             | This provider's slice of the process award (COP). |
| `award_date`                                | Fecha de adjudicación.                            |

### `contracts[]`

| Field                                                                                               | Notes                                                                                  |
| --------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------- |
| `contract_id`, `reference`                                                                          | SECOP contract id (`CO1.PCCNTR.*`) and reference.                                      |
| `entity`, `entity_nit`, `centralized_entity`                                                        | Contracting entity (`Centralizada`/`Descentralizada`).                                 |
| `provider`, `provider_document`, `provider_document_type`, `provider_code`                          | The awarded provider.                                                                  |
| `is_sme`, `is_group`                                                                                | Es PyME / plural structure (unión temporal, consorcio).                                |
| `legal_rep_name`, `legal_rep_document_type`, `legal_rep_document`                                   | Representante legal and their identity document.                                       |
| `status`, `contract_type`, `object`                                                                 | Estado, tipo y objeto del contrato.                                                    |
| `modality`, `modality_justification`                                                                | How the contract was procured (direct contracting vs tender).                          |
| `unspsc_code`                                                                                       | UNSPSC category code.                                                                  |
| `delivery_conditions`                                                                               | Condiciones de entrega.                                                                |
| `value`                                                                                             | Valor del contrato (COP).                                                              |
| `invoiced_value`, `paid_value`, `pending_execution_value`, `pending_payment_value`                  | Execution amounts.                                                                     |
| `advance_payment_enabled`, `advance_payment_value`, `amortized_value`, `pending_amortization_value` | Advance-payment exposure and amortization.                                             |
| `sign_date`, `start_date`, `end_date`, `added_days`, `duration`                                     | Cronograma del contrato.                                                               |
| `can_be_extended`, `extension_notice_date`                                                          | Prórroga and its notice date.                                                          |
| `requires_liquidation`, `liquidation_start_date`, `liquidation_end_date`                            | Liquidación stage and window.                                                          |
| `has_environmental_obligation`, `has_post_consumption_obligations`, `has_reversion`                 | Contractual obligation flags.                                                          |
| `location`                                                                                          | Localización.                                                                          |
| `supervisor`, `expense_orderer`, `funding_origin`, `expense_destination`                            | Supervisión, origen de los recursos, destino del gasto (`Inversión`/`Funcionamiento`). |
| `sector`, `branch`, `updated_date`                                                                  | Sector, rama, última actualización.                                                    |

Empty and placeholder values are normalized to `null`. Monetary and count
fields are numbers; dates are `yyyy-mm-dd`.

<Note>
  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.
</Note>

<Card title="Full reference" icon="code" href="/api-reference/overview">
  Schemas, all response fields, and an interactive playground.
</Card>
