# Colombia Public Tenders — SECOP II Procurement Opportunities (`boliveira/colombia-secop-tenders`) Actor

Open public tenders in Colombia from the official SECOP II open data: buyer, budget in COP, bid deadline, modality, contract type and link. Filter by keyword, department, value or entity, track new tenders, or pull award history.

- **URL**: https://apify.com/boliveira/colombia-secop-tenders.md
- **Developed by:** [Bruno Scherer Oliveira](https://apify.com/boliveira) (community)
- **Categories:** Business, Lead generation
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$2.00 / 1,000 tender returneds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Colombia Public Tenders — SECOP II Procurement Opportunities

Find **public tenders open for bids in Colombia**, with the buyer, budget in COP, bid deadline, procurement modality, contract type and a link to the official SECOP II page. Data comes from **Colombia Compra Eficiente's official SECOP II open data**, refreshed daily. About **3,000 tenders are open at any time**.

Built for suppliers, bid consultants, market researchers and anyone selling to the Colombian state.

### What you can do

- **Open tenders now:** everything currently accepting bids, sorted by soonest deadline
- **Filter** by keyword, department, buyer, modality, contract type, budget range and publication dates
- **Daily alerts:** turn on *Only new tenders* and schedule the Actor
- **History and awards:** switch to *All* to get closed and awarded processes with award dates and values

### Example

Open tenders in Antioquia mentioning software, above COP 50 million:

```json
{ "mode": "open", "keywords": "software", "departments": ["Antioquia"], "minValueCop": 50000000 }
```

### Output

```json
{
  "processId": "CO1.REQ.11210317",
  "reference": "MC-226-CENACAVIACION-2026",
  "title": "ADQUISICIÓN DE MALLA DE PROTECCIÓN Y POSTES METÁLICOS …",
  "description": "ADQUISICIÓN DE MALLA DE PROTECCIÓN Y POSTES METÁLICOS …",
  "buyer": "CENAC AVIACION",
  "buyerNit": "830039207",
  "buyerDepartment": "Distrito Capital de Bogotá",
  "buyerLevel": "Nacional",
  "modality": "Mínima cuantía",
  "contractType": "Compraventa",
  "status": "Publicado",
  "phase": "Presentación de oferta",
  "baseValueCop": 175000000,
  "duration": 44,
  "durationUnit": "día(s)",
  "bidDeadline": "2026-11-05",
  "bidOpeningDate": "2026-11-05",
  "interestedSuppliers": 0,
  "bidsReceived": 0,
  "awarded": false,
  "url": "https://community.secop.gov.co/Public/Tendering/OpportunityDetail/Index?noticeUID=CO1.NTC.11134663",
  "currency": "COP"
}
```

Each process appears once, even where SECOP has several rows for it. **No personal data:** supplier names, supplier tax IDs and the names of officials are not included. Buyers are public entities.

### Good to know

- *Open* means SECOP status `Publicado` with a bid deadline today or later (Bogotá time). Always confirm details on the official SECOP page before bidding.
- **Direct awards** (*Contratación directa*) are excluded by default. They're not open to bids and are mostly individual service contracts. Turn on *Include direct awards* to add them.
- A few processes have no public link or no publication date in the source; those fields are `null`.
- The source is updated daily, so a tender published today may appear tomorrow.

### Pricing

You pay per tender returned. Tenders skipped by *Only new tenders* are not charged.

### Licence and attribution

Data: **SECOP II — Procesos de Contratación**, Agencia Nacional de Contratación Pública – Colombia Compra Eficiente, published on [datos.gov.co](https://www.datos.gov.co/d/p6dx-8zbt) under [CC BY-SA 4.0](https://creativecommons.org/licenses/by-sa/4.0/). If you republish the data, credit the source and share it under the same licence. Fields are selected and renamed; values are unchanged. This Actor is not affiliated with Colombia Compra Eficiente.

# Actor input Schema

## `mode` (type: `string`):

open = tenders currently accepting bids (bid deadline today or later), soonest deadline first. all = every process including closed and awarded ones, newest first (use dates to narrow).

## `keywords` (type: `string`):

Full-text search in the tender, e.g. software, construcción, vigilancia.

## `departments` (type: `array`):

Buyer's department as written in SECOP, e.g. Antioquia, Distrito Capital de Bogotá, Valle del Cauca.

## `entity` (type: `string`):

Part of the public entity's name, e.g. ALCALDIA DE MEDELLIN or ECOPETROL.

## `modalities` (type: `array`):

Only these modalities. Empty = all competitive modalities.

## `contractTypes` (type: `array`):

As written in SECOP, e.g. Obra, Suministros, Compraventa, Prestación de servicios, Consultoría.

## `minValueCop` (type: `integer`):

Only tenders with a base budget at least this high.

## `maxValueCop` (type: `integer`):

Only tenders with a base budget at most this high.

## `publishedFrom` (type: `string`):

YYYY-MM-DD.

## `publishedTo` (type: `string`):

YYYY-MM-DD.

## `includeDirectContracting` (type: `boolean`):

Add 'Contratación directa' processes. They are not open to bids and are mostly individual service contracts, so they are left out by default.

## `onlyNew` (type: `boolean`):

Skip tenders returned by earlier runs. Schedule the Actor daily for new-tender alerts.

## `maxResults` (type: `integer`):

Maximum number of tenders to return.

## `appToken` (type: `string`):

Your free datos.gov.co app token raises rate limits for very large pulls. Not needed for normal use.

## Actor input object example

```json
{
  "mode": "open",
  "includeDirectContracting": false,
  "onlyNew": false,
  "maxResults": 1000
}
```

# Actor output Schema

## `results` (type: `string`):

One row per procurement process.

## `summary` (type: `string`):

RUN_SUMMARY: counts and the exact query used.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {};

// Run the Actor and wait for it to finish
const run = await client.actor("boliveira/colombia-secop-tenders").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {}

# Run the Actor and wait for it to finish
run = client.actor("boliveira/colombia-secop-tenders").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{}' |
apify call boliveira/colombia-secop-tenders --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,boliveira/colombia-secop-tenders"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/3Egt3IA5xyomEXZe6/builds/UEDvUav0CHJZTt6P5/openapi.json
