SECOP II Colombia Tenders Scraper | Government Bids
Pricing
from $0.90 / 1,000 tenders
SECOP II Colombia Tenders Scraper | Government Bids
Find Colombian government tenders on SECOP II by keyword, buyer, department, city, method or UNSPSC code. One row per open tender with buyer and NIT, estimated value in COP, deadlines, days left, documents and the official notice link. Export JSON, CSV or Excel; build daily tender alerts.
Pricing
from $0.90 / 1,000 tenders
Rating
0.0
(0)
Developer
Philip Kirkbride
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
a day ago
Last modified
Categories
Features
Share
SECOP II Colombia Tenders Scraper
Find Colombian public tenders on SECOP II, the national e-procurement system run by Colombia Compra Eficiente, and get one clean row per tender: title, buying entity and its tax id, department and city, procurement method, contract type, status, UNSPSC category codes, estimated value in pesos, publication date, deadline for offers, days left and the link to the official notice. Turn on details to add the tender documents (specifications, studies, annexes) with download links and a description excerpt.
Price: $0.90 per 1,000 tenders ($0.0009 per tender) plus a $0.005 run start. Twenty open tenders cost about $0.023. Searches that match nothing cost only the start.
By default you get only tenders that are still open: published on SECOP II, with offers accepted until today or later. Drafts that are not public yet are left out. Schedule a daily run with "published or changed since 2 days" and your keywords, buyer or department to get alerts for new tenders in email, Slack or a spreadsheet. Turn on Only new or changed since the last run and the Actor removes the duplicates for you.
For contracts that have already been awarded and the companies that won them, see our Colombia SECOP Contracts + Supplier Company Profiles actor.
Use cases
- Bid teams: one row per open tender with the deadline, days left, estimated value and document links, so you can triage what to bid on today.
- Tender-alert services: a scheduled daily run filtered by keyword, department or buyer, with
onlyNewSinceLastRunso each alert contains only new tenders and changes. - Aggregators and marketplaces: pull every open tender for a department, method or UNSPSC category and republish it with the official link.
- Sales and market research: follow a ministry, city hall or supplier category by NIT and see what it buys and when.
Quick start
- Press Start. The form is already filled with this input, so the first run returns 20 open tenders in a few seconds:
{"maxItems": 20}
- Add your keywords, department, buyer or UNSPSC codes, then run again or save the input as a task.
- Download the rows as JSON, CSV or Excel, or schedule the task for a daily feed.
Open security-services tenders in Antioquia, closing soonest first:
{"keywords": ["vigilancia"], "department": "Antioquia", "sort": "deadlineSoonest"}
New construction tenders above 1,000 million pesos, with documents:
{"categoryCodes": ["72"], "minEstimatedValue": 1000000000, "publishedSince": "2 days", "includeDetails": true}
Input
| Field | Type | Default | What it does |
|---|---|---|---|
keywords | list | [] | Words searched in the tender title, description and buyer, accents optional (energia finds energía). Several keywords return tenders that match any of them. |
status | string | open | open (published, deadline for offers today or later), closed, awarded, cancelled or all. |
publishedSince | date | none | Only tenders published or updated on or after this date, e.g. 2026-11-01, or within a period such as 2 days. |
buyer | string | "" | Buying entity: part of its name, case and accents ignored (policia), or its tax id (NIT, digits only). |
department | string | "" | Department of the buyer, e.g. Antioquia, Valle del Cauca, Bogotá. Accents optional. |
city | string | "" | City of the buyer, the whole name, e.g. Medellín or Pasto. Accents optional. |
procurementMethods | list | all competitive | Public tender, abbreviated selection, reverse auction, merit contest, minimum value, special regime with offers, direct contracting with offers, request for information or sale of state assets. Direct contracting and special-regime awards without competition are only included when you select them. |
categoryCodes | list | [] | UNSPSC code prefixes, 2 to 8 digits, e.g. 72 (building and construction) or 81112000. |
minEstimatedValue | integer | none | Only tenders with a published estimated value of at least this many pesos. |
sort | string | newest | newest or deadlineSoonest. |
maxItems | integer | 50 | Maximum tenders returned, up to 10,000. |
includeDetails | boolean | false | Add the tender documents and a description excerpt. |
Use it as a daily feed
Turn on Only new or changed since the last run (onlyNewSinceLastRun) and run the
Actor on a schedule with the same input. It then returns only tenders this search has not
delivered before, or whose watched fields changed since the last run, so there is nothing
to deduplicate on your side.
- Every returned row carries
changeType(neworchanged) andchangedFields. - The first run has no saved history, so it returns everything and reports
feed.firstRunin the run's OUTPUT. - The history lives in the named key-value store
secop-tenders-scraper-feed-state, one record per search. LeavestateKeyempty to name the record from the input, so different searches keep separate histories; set a name to share one or to start a fresh feed. - An entry leaves the history once its deadline is more than 90 days past and it has not been delivered in the last 90 days, so the history stays bounded.
- The watched fields are the title, the deadline, the status, the estimated value and the documents.
With the flag off (the default) the Actor returns every match, exactly as before.
What it returns
Every row has tenderId, reference, noticeId, portfolioId, title, buyer (name, taxId, entityCode, level, unit), country, region, city, procurementMethod, contractType, status (open, closed, awarded or cancelled), sourceStatus, phase, categoryScheme, categoryCodes, estimatedValue, awardedValue, currency, publishedDate, lastPublishedDate, deadlineDate, daysUntilDeadline, offersOpeningDate, datesTimezone, duration, durationUnit, lots, url, source and scrapedAt.
With includeDetails on, rows also fill descriptionExcerpt (up to 600 characters) and documents (each with documentId, name, fileType, sizeBytes and url). If documents cannot be read for a row, the row is still delivered and detailsError says why.
Dates are calendar dates in Bogotá (YYYY-MM-DD, UTC-5): SECOP II publishes the day of the deadline, not the hour, so check the official notice for the closing time. daysUntilDeadline is 0 when offers close today. Values are numbers in Colombian pesos (COP).
What can be empty, and why
estimatedValueis empty when the buyer did not publish a budget, for example on requests for information.categoryCodesis empty when the buyer did not classify the tender; many open tenders carry no code, so a category filter returns fewer tenders than a keyword search.cityandregionare empty when SECOP II does not say where the buyer is.publishedDateis empty for a small share of tenders that SECOP II lists without one.titleis empty when the source has no title.documentsis empty for tenders whose files SECOP II has not listed yet; newly published tenders can take a day or two.
Limits
- The official open-data copy of SECOP II is updated daily and usually runs one or two days behind the portal. A tender published this morning may appear tomorrow.
- Runs are quick: 500 tenders took about 3 seconds in our tests, and 300 tenders with documents about 15 seconds.
- Up to 10,000 tenders per run. For more, split the search by department, method or date.
Published information
Titles, references, descriptions and document names retain the public text published by the buyer, including contact information where present.
FAQ
How do I get only new tenders each day? Turn on onlyNewSinceLastRun, keep the same input and schedule it. The Actor keeps a history per search and returns only tenders it has not delivered before, or whose deadline, status, value, title or documents changed. The first run returns everything and marks feed.firstRun in the run's OUTPUT.
Can I still use a date window instead? Yes. Schedule a daily run with publishedSince: "2 days" and your filters, and deduplicate on tenderId. Each run is independent, so overlapping windows deliver (and charge for) the same tenders again. onlyNewSinceLastRun is usually cheaper for a daily feed.
What does a daily feed run cost? The start event ($0.005 at 512 MB) plus $0.0009 for each tender it actually delivers. A day with no new tenders costs $0.005. A first run over the 20-tender example costs about $0.023.
How fresh is the data? Every run reads the SECOP II open-data copy live. The official copy is refreshed daily by Colombia Compra Eficiente, so a tender published this morning can appear tomorrow.
Do I need an API key or an account on SECOP? No. The Actor reads the public SECOP II data; there is nothing to sign in to.
What happens when nothing matches? The run succeeds with an empty dataset and a status message saying no tenders matched.
Why is a row missing documents? With includeDetails on, a document list that SECOP II does not publish yet leaves documents empty and puts the reason in detailsError; the tender row is still delivered.
Pricing
You pay per event, and only through Apify's pay-per-event billing:
| Event | Price | When |
|---|---|---|
| Run start | $0.005 per started GB of memory (minimum one event) | Once per run, even when nothing matches |
| Tender | $0.0009 | Once per tender row stored in the dataset |
Worked costs:
- The 20-tender quick-start run: $0.005 start + 20 × $0.0009 = $0.023.
- 1,000 tenders: $0.005 + 1,000 × $0.0009 = $0.905.
- A daily feed run with no new tenders: $0.005.
With includeDetails on, the same per-tender price applies; reading the documents does not add an event. See the Pricing tab for the prices that apply to your plan. The run start is charged per GB of memory, rounded up; the default 512 MB run is one start.
Output example
{"tenderId": "CO1.REQ.11296787", "reference": "MC-RDC-CGA-009-2026", "noticeId": "CO1.NTC.11160203", "portfolioId": "CO1.BDOS.11107663", "title": "Contratar la compra de insumos de tóner originales; necesarios para el adecuado funcionamiento de las dependencias del Centro de Gestión Administrativa.", "buyer": {"name": "SENA-GRUPO DE APOYO ADMINITRATIVO INTERCENTROS CGA Y CFAFC", "taxId": "899999034", "entityCode": "724589023", "level": "Nacional", "unit": "CENTRO DE GESTIÓN ADMINISTRATIVA"}, "country": "CO", "region": "Distrito Capital de Bogotá", "city": "Bogotá", "procurementMethod": "Mínima cuantía", "contractType": "Suministros", "status": "open", "sourceStatus": "Aprobado", "phase": "Presentación de oferta", "categoryScheme": null, "categoryCodes": [], "estimatedValue": 8487000.0, "awardedValue": null, "currency": "COP", "publishedDate": "2026-11-01", "lastPublishedDate": "2026-11-01", "deadlineDate": "2026-11-09", "daysUntilDeadline": 6, "offersOpeningDate": "2026-11-09", "datesTimezone": "America/Bogota", "duration": 30, "durationUnit": "days", "lots": null, "url": "https://community.secop.gov.co/Public/Tendering/OpportunityDetail/Index?noticeUID=CO1.NTC.11160203", "descriptionExcerpt": "Contratar la compra de insumos de tóner originales, necesarios para el adecuado funcionamiento de las dependencias del Centro de Gestión Administrativa.", "documents": [{"documentId": "884186459", "name": "1. DESIGNACION COMUNICACION FUNCIONARIOS Y CONTRATISTAS TONNER (1) (1).pdf", "fileType": "pdf", "sizeBytes": 179651, "url": "https://community.secop.gov.co/Public/Archive/RetrieveFile/Index?DocumentId=884186459&InCommunity=False&InPaymentGateway=False&DocUniqueIdentifier="}, {"documentId": "884186460", "name": "2. SOLCIITUD INICIO PROCESO CONTRATCTUAL.pdf", "fileType": "pdf", "sizeBytes": 190189, "url": "https://community.secop.gov.co/Public/Archive/RetrieveFile/Index?DocumentId=884186460&InCommunity=False&InPaymentGateway=False&DocUniqueIdentifier="}], "detailsError": null, "source": "SECOP II (Colombia Compra Eficiente)", "scrapedAt": "2026-11-03T17:13:59.812155+00:00"}
Support
For questions or issues, contact us from the Actor page.