SECOP II Colombia Procurement Scraper - 9M+ Public Contracts
Pricing
from $15.62 / 1,000 procurement records
SECOP II Colombia Procurement Scraper - 9M+ Public Contracts
Scrape Colombia's SECOP II public procurement data from datos.gov.co: entity, NIT, process, base price, modality, status and awarded supplier with value. Filter by entity, department, status or date. Export CSV, Excel, JSON. No login or API key. 9.2M+ records.
Pricing
from $15.62 / 1,000 procurement records
Rating
0.0
(0)
Developer
RecordsData
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
14 days ago
Last modified
Categories
Share
SECOP II Colombia Procurement Scraper - 9M+ Public Contracts
SECOP II Colombia Procurement Scraper extracts Colombian public procurement processes and signed contracts from the official open data on datos.gov.co. Search by keywords, entity, NIT, department, modality, status, supplier, value and dates. Process rows carry up to 58 fields and contract rows up to 77. Export CSV, Excel, JSON or API. No login, no API key. Billed per record delivered, never for empty results.
This actor searches 9,274,086 Colombian public procurement processes (count checked on 2026-10-03, newest publication date 2026-10-02) and, in contracts mode, the SECOP II signed contracts dataset (5,625,151 contracts). Colombia Compra Eficiente publishes the data through SECOP II. It queries the government's own open-data API, so there is no scraping of protected pages and no proxy cost.
🔎 What does SECOP II Colombia Procurement Scraper do?
- Choose the dataset: procurement processes (tenders and direct awards) or signed contracts.
- Search by keywords (all words must appear), for example "hospital ambulancia".
- Filter by entity name, entity NIT, department, modality, contract type, phase, status, supplier name or NIT, value range and dates.
- Use
awardedOnly, sort by date or value, or add a raw SoQLwhereClause. - Get dates, bidder counts, UNSPSC category and supplier details on processes, and payments, funding and supervisor on contracts, with a link to the official SECOP II page on every row.
📋 What data can you extract from SECOP II?
Process rows carry up to 58 keys, contract rows (recordType: "contract-record") up to 77. The schema lists 118 keys in total.
| Field | Description |
|---|---|
processId, portfolioId | Identifiers. portfolioId links a contract to its process |
entityName, entityNit, entityCode | Contracting entity, tax ID and code |
department, city | Location of the entity |
processName, description, contractObject | What is procured |
phase, processStatus, statusSummary | Where the process stands |
publicationDate, responseOpeningDate, awardDate | Process dates (processes only) |
basePrice, awardedValue, contractValue | Base price, awarded value and contract value in COP |
contractingModality, contractType, categoryCode | Mechanism, contract type, UNSPSC main category |
invitedSuppliers, interestedSuppliers, bidsReceived, uniqueBidders, lotCount | Bidder and lot counts (processes only) |
supplierName, supplierNit, supplierDocument | Winning supplier and its tax ID or document |
signedDate, startDate, endDate | Contract dates (contracts only) |
paidValue, pendingPaymentValue, invoicedValue | Payments (contracts only) |
fundingNationalBudget, fundingRoyalties, fundingLocalResources, fundingCredit, supervisorName | Funding sources and supervisor (contracts only) |
processUrl | Link to the official SECOP II page |
Fields the source leaves blank or marks "No Definido", "N/A", "No aplica", "Sin descripción" or "No Adjudicado" are omitted, and no value is written as null. In a 1,200-row sample of processes, responseOpeningDate was filled on 7.2 percent of rows and awardDate on 3.9 percent, and supplier and award fields exist only for awarded processes (893,205 of 9,305,342, 9.6 percent).
Personal data: 84 percent of signed contracts (4,749,538 of 5,625,151) are with natural persons. The dataset publishes their name and document number, delivered in supplierName and supplierDocument. Bank details, legal representative data, official names, supervisor document numbers and the execution address are not mapped on purpose.
🧾 SECOP II sample output
Real record from a run with entityNameContains: "universidad" and processStatus: "Seleccionado":
{"recordType": "procurement-record","processId": "CO1.REQ.5984810","entityName": "UNIVERSIDAD PEDAGÓGICA NACIONAL","processName": "ADECUACION DE LA INSTALACIONES DEL EDIFICO LOCALIZADO EN LA CALLE 72 No. 12 - 77 DE LA UPN","publicationDate": "2024-03-20T00:00:00.000","basePrice": 2045929218,"contractingModality": "Contratación régimen especial (con ofertas)","processStatus": "Seleccionado","awarded": "Si","supplierName": "SAFRID INGENIERIA SAS","awardedValue": 1992947881,"processUrl": "https://community.secop.gov.co/Public/Tendering/OpportunityDetail/Index?noticeUID=CO1.NTC.5874350"}
The sample is trimmed: newer columns and contract rows are not shown.
💰 How much does it cost to scrape SECOP II?
Pay per event, only for each process or signed contract record saved to your dataset.
| Event | Price (Free plan) | Price (Gold plan) |
|---|---|---|
| Procurement record (processes) | $0.02 | $0.01562 |
| Signed contract (contracts mode) | $0.012 | $0.012 |
That is $20 per 1,000 process records on the Free tier, less on higher plans (Bronze $18.10, Silver $16.76, Gold $15.62 per 1,000). Worked example: 1,000 records cost 1,000 x $0.02 = $20.00 on Free and 1,000 x $0.01562 = $15.62 on Gold. A 10-record test costs $0.20. A contracts run costs $12 per 1,000 signed contracts on every plan, so a 1,000-contract run costs 1,000 x $0.012 = $12.00. Rows are not charged for empty searches, records without a process ID, duplicates or failed runs. The run stops cleanly at your maximum charge limit, in contracts mode too. A 600-row run used about $0.003 of platform usage.
🚀 How to scrape SECOP II (3 steps)
- Pick the dataset (processes or contracts) and set at least one filter: keywords, entity, department, status, supplier, value or date range.
- Set Max results (free plan: up to 10).
- Click Run, then download the dataset.
⚙️ SECOP II scraper input
| Field | Type | Description |
|---|---|---|
dataset | string | processes (default) or contracts |
keywords | string | Full-text search, all words must appear |
entityNameContains, entityNit | string | Entity name substring, or NIT (dots and check digit accepted) |
department | string | Department name, accents ignored |
processStatus, phase | string | Process status and phase (processes only) |
contractStatus | string | Contract status (contracts only) |
contractingModality, contractType | string | Choose from the published values, or ANY |
supplierName, supplierNit | string | Awarded supplier name substring or NIT/document |
dateFrom, dateTo | string | Publication (processes) or signature (contracts) date, YYYY-MM-DD |
minBasePrice, maxBasePrice | integer | Base price range in COP (processes only) |
minContractValue, maxContractValue | integer | Contract value range in COP (contracts only) |
awardedOnly | boolean | Only processes that already have a supplier (processes only) |
sortBy | string | Source order, newest, oldest, value |
maxItems | integer | Maximum records to return, default 10 |
whereClause, appToken | string | Advanced SoQL condition ANDed with the filters; optional datos.gov.co app token for a higher rate limit |
{"keywords": "hospital","minBasePrice": 1000000000,"maxItems": 5}
Filters are combined with AND. With an empty input the actor returns 10 records. Invalid input, or a filter that belongs to the other dataset (for example awardedOnly with dataset: "contracts"), ends the run as succeeded with one free error row. Sorting leaves out rows without that date or value and can return source junk first (some base prices reach hundreds of billions of COP).
📦 SECOP II scraper output
Each row is one procurement process or, in contracts mode, one signed contract. Three views (overview, processes, contracts). A process with several awardees is one row, and duplicate rows per process id are dropped before charging. If nothing matches the run finishes as succeeded with zero charge. If the government API is unreachable the run fails with a clear message.
⚖️ SECOP II scraper vs alternatives
Store listings read on 2026-10-10.
| This actor | scrapers_lat | teslagp | knowten | |
|---|---|---|---|---|
| Price per 1,000 | $20 processes, $12 contracts | from $9.23 | from $10 | from $0.50 |
| Data | Processes and contracts | Contracts | Processes, listing unclear | Processes |
| Fields | Up to 58 or 77 per row | 85+ | 25 or 26 | 60 |
| Keyword and NIT filters | Keywords, entity and supplier NIT | Free text, entity and supplier NIT | Keywords, entity or NIT | Keywords, no NIT input |
| Value range | Yes, per dataset | Yes | Yes | Not stated |
| Raw SoQL clause | Yes | Not stated | Not stated | Yes |
fortuitous_pirate/colombia-secop-scraper lists 14 fields and six inputs, with prices that disagree on its own page ($2, $2.50, $1). Several alternatives cost less per row, and we say so. scrapers_lat shows more fields on contracts, and its listing states no only-new mode, as ours has none. Choose this actor for processes with bidder counts and award data plus contracts with payments and funding in one place, and no charge for empty or failed runs.
🎯 SECOP II use cases
Government sales teams, competitor trackers, compliance and due diligence analysts (payments and funding in contracts mode) and journalists following public spending use this data.
🔌 Run SECOP II scraper via API and integrations
curl -X POST "https://api.apify.com/v2/acts/RecordsData~secop-colombia-procurement-scraper/run-sync-get-dataset-items?token=YOUR_TOKEN" \-H "Content-Type: application/json" \-d '{"entityNameContains":"alcaldia","processStatus":"Publicado","sortBy":"DATE_DESC","maxItems":50}'
Schedule runs with a recent dateFrom (no built-in only-new mode) to catch new tenders, and send results to Google Sheets, Zapier, Make or n8n.
🤖 SECOP II Colombia Procurement Scraper MCP server for AI agents
AI agents can call the SECOP II Colombia Procurement Scraper through the Apify MCP server at https://mcp.apify.com?tools=RecordsData/secop-colombia-procurement-scraper. The URL loads only this Actor as a tool.
MCP client configuration (Claude Desktop, Cursor, VS Code):
{"mcpServers": {"apify": {"url": "https://mcp.apify.com?tools=RecordsData/secop-colombia-procurement-scraper"}}}
Example agent prompt:
Use the SECOP II Colombia Procurement Scraper to find the 5 processes with keyword "hospital" and a base price of at least 1,000,000,000 COP, newest first, then list the entity, base price and publication date of each.
Choose this tool when an agent needs official Colombian public procurement data from SECOP II: who is buying, the base price and which supplier won. It takes the same fields as the Input table above and returns one row per process or, with dataset: "contracts", per signed contract.
❓ Is it legal to scrape SECOP II?
SECOP II records are public information that the Colombian government publishes as open data on datos.gov.co for reuse. This actor reads that official API and bypasses no protection. Most signed contracts are with natural persons whose name and document number the dataset publishes (see the personal data note above). You remain responsible for using them in line with local data-protection rules.
🙋 Frequently asked questions
How many records does SECOP II have? According to the count checked on 2026-10-03, the SECOP II Colombia Procurement Scraper can search 9,274,086 public procurement processes on the official datos.gov.co open data, with publications up to 2026-10-02, published by Colombia Compra Eficiente through the SECOP II platform. Narrow them with keyword, entity, department, status, value and date filters. The signed contracts dataset holds 5,625,151 contracts.
Why did I get 0 results from the SECOP II Colombia Procurement Scraper?
The filters matched nothing in SECOP II. Department and status ignore case and accents, but an unknown department is rejected, and "Adjudicado" is not a status value, so use "Seleccionado" or awardedOnly. Several filters together can also match nothing. The run finishes successfully and is free in that case.
Why are some SECOP II rows missing supplierName? Only processes with a selected supplier carry a supplierName, supplierNit and awardedValue, and the SECOP II Colombia Procurement Scraper omits blank source fields. Across the processes dataset only 9.6 percent of rows (893,205 of 9,305,342) are awarded. In contracts mode every contract has a supplier.
Which SECOP II status means a contract was awarded?
In the SECOP II Colombia Procurement Scraper, use processStatus "Seleccionado" or the awardedOnly option and then check the awarded field on each row, which reads "Si" or "No". Awarded rows also include the supplier name, supplier NIT and awarded value when the source publishes them, and "Adjudicado" is not a status value in this dataset.
Can I get all 9 million SECOP II records with the scraper? Technically yes, with a high maxItems. At the Free tier price of $0.02 per process record that would cost about $20 per 1,000 records, so use keywords, entity, department, status, value or a date window and download only what you need. Contract rows cost $0.012 each, about $12 per 1,000.
Do I need an API key to scrape SECOP II? No. The SECOP II Colombia Procurement Scraper reads the Colombian government open data API on datos.gov.co, which needs no key, login or proxy. You only need an Apify account. An optional datos.gov.co app token raises the rate limit on large runs.
Is the SECOP II data live? The source dataset is updated by the Colombian government, and the SECOP II Colombia Procurement Scraper reads it at run time, so you get what datos.gov.co holds at that moment. There is no built-in only-new mode, so to catch new tenders schedule the actor with a recent dateFrom value.
Does the SECOP II Colombia Procurement Scraper cover SECOP I? No. The SECOP II Colombia Procurement Scraper covers only SECOP II, the current Colombian public procurement platform, using its official open data on datos.gov.co. Older SECOP I processes are not included, so a search for them returns no rows. The actor reads only SECOP II datasets.
What happens if I send an empty or invalid input to the SECOP II Colombia Procurement Scraper? An empty input {} is valid and returns 10 records. If a value is wrong, such as a date not in YYYY-MM-DD, or a processes-only filter is combined with the contracts dataset, the run ends as succeeded, writes a single free row with errorType "invalid-input", an error message and a hint, and charges nothing.
Am I charged for failed SECOP II Colombia Procurement Scraper runs? No. The SECOP II Colombia Procurement Scraper charges only when a record is saved, at $0.02 per process record on the Free tier (signed contract rows cost $0.012 each). Empty searches, records without a process ID, duplicates, error rows and failed runs are not billed, and the run stops cleanly at your maximum charge limit.
Can the SECOP II Colombia Procurement Scraper return signed contracts?
Yes. Set dataset to contracts in the SECOP II Colombia Procurement Scraper and each row is one signed SECOP II contract with the supplier, value, payments, funding and supervisor name, linked to its process by portfolioId. Contract rows cost $0.012 each.
Which SECOP II fields or features are not available?
The source has no searchKeywords column, so keywords searches every column instead. A run with a valid appToken is not proven, because no valid token was available for testing. Bank details, legal representative data and official names are left out on purpose, and there is no only-new mode.
🧰 Want more public procurement data? Other RecordsData scrapers
- Federal Contracts Spending Scraper for US federal awards
- Grants.gov Opportunities Scraper for US grant listings
- Contractor License Aggregator for contractor license checks
💬 Support
Open a ticket in the Issues tab or write to contact.punkrecordsdata@gmail.com.
Last updated: 2026-10-11