# Colombia SECOP II Contracts Scraper (`talcoe/secop-colombia`) Actor

Search Colombia's official SECOP II government contract records by department, status, signed date and keyword, and pay only per contract returned.

- **URL**: https://apify.com/talcoe/secop-colombia.md
- **Developed by:** [M Usama](https://apify.com/talcoe) (community)
- **Categories:** Business
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $5.00 / 1,000 results

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

### What does Colombia SECOP II Contracts Scraper do?

This Actor returns contract records from SECOP II, Colombia's official electronic public procurement system, straight from the government's open data API. Each result includes the contracting entity, department and city, contract value in Colombian pesos, supplier, contract type, status, key dates and a link back to the original SECOP record. Use the keyword, department, status and date filters to keep runs small and focused, since pricing is per result returned.

### Data source

Data comes from the "SECOP II - Contratos Electrónicos" dataset published by Colombia Compra Eficiente on datos.gov.co (Socrata Open Data API), which is updated by the government daily.

### Why use it?

- Lead generation: find recently signed government contracts by sector, department or keyword to identify agencies and suppliers active in your market.
- Competitor and market research: see who is winning contracts with which entities, at what values, and under which contracting method.
- Compliance and spend monitoring: track contract status changes and values for entities or suppliers you already work with.
- Replaces manually searching the SECOP II web portal one province or entity at a time.

### How to use it

1. Open the Actor and set keywords, department, status and a signed-after date to match what you are looking for.
2. Click Start. Download results as JSON, CSV or Excel, or read them through the API.
3. Add a Schedule and an Integration (Slack, Google Sheets, webhook) to get new contracts automatically.

### Input

| Field | Description |
|---|---|
| `keywords` | Free text search across the contract object and description, for example hospital, vias, alimentacion escolar. Leave blank to skip text search. |
| `department` | Limit results to one Colombian department. Leave as All departments to skip this filter. |
| `status` | Limit results to one contract status (in execution, closed, approved, and so on). Leave as All statuses to skip this filter. |
| `dateFrom` | Only return contracts signed on or after this date, format YYYY-MM-DD. Leave blank for no lower bound. |
| `maxResults` | Hard stop for the run. You are billed per result, so this caps the cost. |
| `proxyConfiguration` | Apify proxy is recommended for larger runs. |

Example input:

```json
{
    "keywords": "salud",
    "department": "",
    "status": "",
    "dateFrom": "2026-01-01",
    "maxResults": 60
}
```

### Output

Every record has the same shape:

```json
{
    "id": "CO1.PCCNTR.9960208",
    "entity": "SUBRED INTEGRADA DE SERVICIOS DE SALUD SUR OCCIDENTE ESE.",
    "entityNit": "900959048",
    "department": "Distrito Capital de Bogotá",
    "city": null,
    "description": "Prestar servicios Profesionales a la gestion administrativa y/o asistencial en el area de Farmacia.",
    "contractType": "Prestación de servicios",
    "status": "Aprobado",
    "value": 7919086,
    "currency": "COP",
    "supplier": "Jhon Jairo Hernandez Clavijo",
    "supplierId": "1000133932",
    "contractingMethod": "Contratación régimen especial",
    "sector": "Salud y Protección Social",
    "category": null,
    "reference": "5617-2026",
    "processId": "CO1.BDOS.10874417",
    "signedDate": "2026-09-19",
    "startDate": null,
    "endDate": "2026-10-31",
    "sourceUrl": "https://community.secop.gov.co/Public/Tendering/OpportunityDetail/Index?noticeUID=CO1.NTC.10915514&isFromPublicArea=True&isModal=true&asPopupView=true",
    "scrapedAt": "2026-09-21T08:27:18.680Z"
}
```

| Field | Meaning |
|---|---|
| `id` | Stable contract id (`id_contrato`), safe for deduplication between runs |
| `entity` | Name of the contracting government entity |
| `entityNit` | Tax id (NIT) of the contracting entity |
| `department` | Colombian department where the entity operates |
| `city` | City where the entity operates, when published |
| `description` | Description of the contracted process |
| `contractType` | Contract type, for example Prestación de servicios or Compraventa |
| `status` | Current contract status |
| `value` | Contract value |
| `currency` | Always COP (Colombian pesos) |
| `supplier` | Awarded supplier name |
| `supplierId` | Supplier tax or national id |
| `contractingMethod` | Contracting modality, for example Contratación directa |
| `sector` | Government sector, for example Salud y Protección Social |
| `category` | UNSPSC category code, when classified |
| `reference` | Entity's internal contract reference number |
| `processId` | Related procurement process id |
| `signedDate` | Date the contract was signed, ISO format |
| `startDate` | Contract start date, when published |
| `endDate` | Contract end date |
| `sourceUrl` | Link to the process on the SECOP II public portal |

### Pricing

Pay per event: a small fee when a run starts, then a fixed price per result returned. You only pay for records that pass your filters. Set `maxResults` to cap any run.

### Limitations

- Only covers SECOP II, the platform used since 2019. Older SECOP I contracts are not in this dataset.
- `startDate` and `city` are only as complete as the entity's own filing. Many contracts do not have these fields populated at the source.
- Data reflects the government's daily publication cycle, not real time.

### FAQ

**Is this legal?** The Actor reads the open data API that Colombia Compra Eficiente publishes for public use on datos.gov.co, and stores only the procurement information published for that purpose. You are responsible for how you use the data.

**Something is missing or broken?** Open an issue in the Issues tab; response time is usually under a day.

# Actor input Schema

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

Free text search across the contract object and description, for example hospital, vias, alimentacion escolar. Leave blank to skip text search.

## `department` (type: `string`):

Limit results to one Colombian department. Leave as All departments to skip this filter.

## `status` (type: `string`):

Limit results to one contract status. Leave as All statuses to skip this filter.

## `dateFrom` (type: `string`):

Only return contracts signed on or after this date, format YYYY-MM-DD. Leave blank for no lower bound.

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

Hard stop for the run. You are billed per result, so this caps the cost.

## `proxyConfiguration` (type: `object`):

Apify proxy is recommended for larger runs.

## Actor input object example

```json
{
  "keywords": "salud",
  "department": "",
  "status": "",
  "dateFrom": "2026-01-01",
  "maxResults": 60,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

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

No description

# 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 = {
    "keywords": "salud",
    "dateFrom": "2026-01-01",
    "proxyConfiguration": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("talcoe/secop-colombia").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 = {
    "keywords": "salud",
    "dateFrom": "2026-01-01",
    "proxyConfiguration": { "useApifyProxy": False },
}

# Run the Actor and wait for it to finish
run = client.actor("talcoe/secop-colombia").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 '{
  "keywords": "salud",
  "dateFrom": "2026-01-01",
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}' |
apify call talcoe/secop-colombia --silent --output-dataset

```

## MCP server setup

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

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/zdH2CZrNxgBM3abQM/builds/oLbJ5K9GejhxI1Pe3/openapi.json
