SECOP II Colombia Procurement Scraper - 9M+ Public Contracts avatar

SECOP II Colombia Procurement Scraper - 9M+ Public Contracts

Pricing

from $15.62 / 1,000 procurement records

Go to Apify Store
SECOP II Colombia Procurement Scraper - 9M+ Public Contracts

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

RecordsData

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

14 days ago

Last modified

Share

RecordsData

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 SoQL whereClause.
  • 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.

FieldDescription
processId, portfolioIdIdentifiers. portfolioId links a contract to its process
entityName, entityNit, entityCodeContracting entity, tax ID and code
department, cityLocation of the entity
processName, description, contractObjectWhat is procured
phase, processStatus, statusSummaryWhere the process stands
publicationDate, responseOpeningDate, awardDateProcess dates (processes only)
basePrice, awardedValue, contractValueBase price, awarded value and contract value in COP
contractingModality, contractType, categoryCodeMechanism, contract type, UNSPSC main category
invitedSuppliers, interestedSuppliers, bidsReceived, uniqueBidders, lotCountBidder and lot counts (processes only)
supplierName, supplierNit, supplierDocumentWinning supplier and its tax ID or document
signedDate, startDate, endDateContract dates (contracts only)
paidValue, pendingPaymentValue, invoicedValuePayments (contracts only)
fundingNationalBudget, fundingRoyalties, fundingLocalResources, fundingCredit, supervisorNameFunding sources and supervisor (contracts only)
processUrlLink 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.

EventPrice (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)

  1. Pick the dataset (processes or contracts) and set at least one filter: keywords, entity, department, status, supplier, value or date range.
  2. Set Max results (free plan: up to 10).
  3. Click Run, then download the dataset.

⚙️ SECOP II scraper input

FieldTypeDescription
datasetstringprocesses (default) or contracts
keywordsstringFull-text search, all words must appear
entityNameContains, entityNitstringEntity name substring, or NIT (dots and check digit accepted)
departmentstringDepartment name, accents ignored
processStatus, phasestringProcess status and phase (processes only)
contractStatusstringContract status (contracts only)
contractingModality, contractTypestringChoose from the published values, or ANY
supplierName, supplierNitstringAwarded supplier name substring or NIT/document
dateFrom, dateTostringPublication (processes) or signature (contracts) date, YYYY-MM-DD
minBasePrice, maxBasePriceintegerBase price range in COP (processes only)
minContractValue, maxContractValueintegerContract value range in COP (contracts only)
awardedOnlybooleanOnly processes that already have a supplier (processes only)
sortBystringSource order, newest, oldest, value
maxItemsintegerMaximum records to return, default 10
whereClause, appTokenstringAdvanced 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 actorscrapers_latteslagpknowten
Price per 1,000$20 processes, $12 contractsfrom $9.23from $10from $0.50
DataProcesses and contractsContractsProcesses, listing unclearProcesses
FieldsUp to 58 or 77 per row85+25 or 2660
Keyword and NIT filtersKeywords, entity and supplier NITFree text, entity and supplier NITKeywords, entity or NITKeywords, no NIT input
Value rangeYes, per datasetYesYesNot stated
Raw SoQL clauseYesNot statedNot statedYes

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.

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

💬 Support

Open a ticket in the Issues tab or write to contact.punkrecordsdata@gmail.com.

Last updated: 2026-10-11