TendersOnTime Scraper
Pricing
from $0.90 / 1,000 results
TendersOnTime Scraper
[💰 $0.9 / 1K] Extract government tenders, RFPs and bids from TendersOnTime — title, TOT reference, country, posting date, deadline, days left, contract value and currency. Filter by keyword, 248 countries, 16 trade blocs, dates and value. Active tenders plus archives back to 2017.
Pricing
from $0.90 / 1,000 results
Rating
0.0
(0)
Developer
SolidCode
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
3 days ago
Last modified
Categories
Share
Pull government tender, RFP, and bid notices from TendersOnTime at scale — titles, TOT reference numbers, countries, posting dates, closing deadlines, days remaining, and published contract values, across 248 countries and 16 trade blocs. Search 1.27 million open tenders or dig into 33+ million archived notices going back to 2017. Built for bid managers, proposal teams, government-contract consultants, and B2G market analysts who need to spot the right public tender while there is still time to respond — without checking dozens of national portals one by one.
Why This Scraper?
- 1.27 million live tenders plus 33+ million archived notices — search everything currently open, or switch to one of three archive windows (2025–2026, 2021–2024, 2020 and earlier) for market history and win/loss research going back to 2017.
- 291 place selections: 248 countries, 27 regions, 16 trade blocs — target a single country, a sub-region like Western Africa or South-Eastern Asia, or an economic group such as the European Union, GCC, ASEAN, BRICS, MENA, ECOWAS, COMESA, SAARC, CIS, or G20. No hand-built search links.
- NCB vs ICB competition filter — isolate the 731,789 International Competitive Bidding notices that accept foreign suppliers, or restrict to National Competitive Bidding when you only want domestic opportunities.
- Exact-phrase matching that measurably cuts noise — searching "water treatment" as a loose keyword returns 1,735 tenders; flip exact matching on and you get the 1,318 that actually contain the phrase.
daysToDeadlinecomputed on every row — bid urgency arrives as a plain integer, so you can sort or filter a spreadsheet straight down to what closes this week. No date math required.- Deadline window and posting window filter independently — pull "closes between 1 and 5 September" for pipeline planning, or "posted in the last 24 hours" for a clean daily lead delta, or both at once.
- Contract-value threshold with three comparisons — more than, less than, or equal to any figure, so a team that only bids above $1M never pays for rows below it.
- Exact lookup by TOT reference number or pasted tender link — refresh the tenders you already track without re-running a search, and paste links in either the
/tenders-details/…or country-path format. - Four sort orders and an exact result cap — "Deadline soonest" for triage, "Newest first" for daily monitoring, and a
maxResultscap honoured to the row: ask for 7 and you get exactly 7. 300 notices land in about four seconds, 1,700+ in around thirty. - Multiple keywords in one run, deduplicated — search "solar", "photovoltaic" and "battery storage" together and every keyword contributes its share of your result cap, with a
searchKeywordcolumn on each row telling you which one matched. A tender that answers two keywords is billed and delivered once.
Use Cases
Bid Discovery & Pipeline Building
- Surface every open tender matching your keywords across all 248 covered countries in one run
- Triage by days remaining and work only the notices you can still realistically win
- Screen by contract value before assigning a proposal writer to a bid
- Keep a watchlist of specific tenders by reference number and refresh their deadlines daily
Market Intelligence & Sizing
- Measure how many tenders a country or bloc floats per month using the posting-date window
- Compare public procurement volume across the EU, GCC, ASEAN, and BRICS from a single dataset
- Chart demand for a category — "solar", "water treatment", "road construction" — from 2017 to today
- Size a new geography before committing sales or delivery resources to it
Competitive & Win/Loss Analysis
- Reconstruct what was tendered and when using the 2021–2024 archive window
- Benchmark your pricing against historic published contract values in the same country
- Identify which markets publish International Competitive Bidding notices you are eligible for
- Spot recurring buyers by filtering on purchaser names such as "ministry", "railway", or "municipal"
Lead Generation & B2G Sales
- Build a weekly lead list from newest-first tenders posted in the last seven days
- Route notices to regional sales teams automatically using the country and country-code fields
- Focus reps on tenders above a minimum value so no time is spent on sub-scale opportunities
- Feed qualified tender leads straight into a CRM with reference number and source link attached
Monitoring & Alerting
- Run a daily posting-window pull so every row is genuinely new since your last run
- Alert your team when a tracked tender drops below a set number of days remaining
- Watch a named buyer's activity over time and react the day a new notice appears
- Push matching tenders into Slack, email, or a spreadsheet the moment a run finishes
Getting Started
Newest Tenders Worldwide
The simplest run — the 50 most recently posted open tenders anywhere:
{"maxResults": 50}
Keyword Search Across a Trade Bloc
Countries and blocs are picked by name from a dropdown in the Apify interface. In JSON they appear as their matching selection codes — pol_2009 is the European Union. The two keywords share the 200-row cap, so each one contributes about 100 rows, and anything one keyword cannot fill is handed to the other:
{"keywords": ["solar", "photovoltaic"],"countries": ["pol_2009"],"exactKeywords": true,"maxResults": 200}
Deadline Triage for Bids You Can Still Win
Tenders closing in a specific window, worth over 1,000,000, soonest deadline first:
{"keywords": ["water treatment"],"deadlineFrom": "2026-09-01","deadlineTo": "2026-09-30","tenderValue": 1000000,"tenderValueCondition": "more_than","sortBy": "Bid_Deadline_1 ASC","maxResults": 100}
Refresh Tenders You Already Track
Paste tender links, reference numbers, or both — one row comes back per tender, with daysToDeadline recalculated. A link and its reference number point to the same tender, so you are only ever charged for it once:
{"tenderUrls": ["https://www.tendersontime.com/tenders-details/supply-and-delivery-various-agricultural-items-8b90e8f/","https://www.tendersontime.com/india/details/repair-maintenance-and-installation-8b8c713/"],"totRefNumbers": ["146327315", "146345615"]}
Full-Featured Example
International bidding opportunities from ministries in the Gulf, posted this month, sorted by deadline:
{"keywords": ["road construction", "highway"],"countries": ["pol_2010", "103514"],"exactKeywords": false,"status": "1","competition": "ICB","purchaserName": "ministry","postedFrom": "2026-07-01","postedTo": "2026-07-31","sortBy": "Bid_Deadline_1 ASC","maxResults": 500}
Input Reference
What to Scrape
| Parameter | Type | Default | Description |
|---|---|---|---|
keywords | string[] | [] | Words or phrases to search for, e.g. "solar", "water treatment", "road construction". Each keyword runs as its own search and the results are combined into one list with duplicates removed, sharing your "Max Results" allowance between them. Leave empty to browse the newest tenders across every country. |
tenderUrls | string[] | [] | Paste TendersOnTime tender page links to pull those exact tenders. Useful for refreshing tenders you are already tracking. Copy the link straight from the tender page so it keeps its ending reference code. These are looked up before any keyword search, and your "Max Results" setting also limits how many of them are collected. |
totRefNumbers | string[] | [] | Look up tenders by their TendersOnTime reference number (the "TOT Ref. No." shown on every tender, e.g. 146327315). One tender is returned per number. These are looked up before any keyword search, and your "Max Results" setting also limits how many of them are collected. |
Where & What Kind
| Parameter | Type | Default | Description |
|---|---|---|---|
countries | select (multi) | [] | Limit results to these places. Pick individual countries, a whole continent or sub-region, or an economic group such as the European Union, GCC or BRICS. 291 options in total. Leave empty to search worldwide. |
exactKeywords | boolean | false | Only return tenders containing your keyword as an exact phrase. Off by default, which finds more results by matching the individual words too. |
status | select | Active tenders (open now) | Which set of tenders to search. "Active" covers open tenders that have not closed yet. The three archive options — 2025–2026, 2021–2024, and 2020 and earlier — search historical tenders, which is useful for market research and win/loss analysis. |
competition | select | Any competition type | Restrict to National Competitive Bidding (open to domestic suppliers) or International Competitive Bidding (open to foreign suppliers). This narrows which tenders are returned; the bidding type itself is not published in the results, so there is no matching output column. |
purchaserName | string | (empty) | Only return tenders floated by buyers whose name contains this text, e.g. "ministry", "railway", "municipal". This narrows which tenders are returned; the buyer's name itself is not published in the results, so there is no matching output column. |
Dates & Value
| Parameter | Type | Default | Description |
|---|---|---|---|
deadlineFrom | date | (empty) | Only include tenders closing on or after this date (YYYY-MM-DD). Use with "Deadline To" to find tenders you still have time to bid on. |
deadlineTo | date | (empty) | Only include tenders closing on or before this date (YYYY-MM-DD). |
postedFrom | date | (empty) | Only include tenders published on or after this date (YYYY-MM-DD). Handy for daily or weekly lead pulls. |
postedTo | date | (empty) | Only include tenders published on or before this date (YYYY-MM-DD). |
tenderValue | integer | (unset) | Filter by the estimated contract value, compared using the condition below. Leave empty for no value filter. Note that many tenders publish no value at all ("Refer Document") and are excluded once you set this. |
tenderValueCondition | select | More than | How to compare the tender value above: More than, Equal to, or Less than. Ignored when no tender value is set. |
Sorting & Limits
| Parameter | Type | Default | Description |
|---|---|---|---|
sortBy | select | Newest first (most recently posted) | Order results are collected in. Four options: Newest first, Oldest first, Deadline soonest, Deadline latest. "Deadline soonest" is the most useful for finding tenders you can still bid on; "Newest first" is best for daily lead monitoring. |
maxResults | integer | 50 | Maximum number of tenders to return in total, across every keyword, reference number and pasted link. This is an exact cap — you never receive or pay for more than this. The highest value accepted is 50,000 tenders per run; 0 means "no cap" and also collects up to that same 50,000. |
Output
One flat row per tender notice — 14 fields, every one verified against live data.
{"totRefNumber": "146345615","title": "Supply, installation and commissioning of a 5 MW solar photovoltaic power plant including 33 kV evacuation works","url": "https://www.tendersontime.com/tenders-details/supply-installation-and-commissioning-5-mw-solar-photovoltaic-power-plant-8b90e8f/","country": "India","countryCode": "IN","postingDate": "2026-07-31T20:45:52Z","deadline": "2026-08-25T00:00:00Z","daysToDeadline": 24,"tenderValue": 1168000.0,"tenderValueText": "INR 1168000","currency": "INR","status": "active","searchKeyword": "solar","scrapedAt": "2026-08-01T09:12:04Z"}
| Field | Type | Description |
|---|---|---|
totRefNumber | string | TendersOnTime reference number — the tender's unique identifier, and the key to look it up again later |
title | string | The tender's published summary line, describing what is being procured |
url | string | Direct link to the tender page on TendersOnTime |
country | string | Country of the purchasing authority, e.g. "India", "United Kingdom" |
countryCode | string | Two-letter ISO country code, e.g. "IN", "GB" |
postingDate | string | When the tender was published, ISO 8601 with a Z suffix |
deadline | string | Bid submission deadline, ISO 8601 with a Z suffix |
daysToDeadline | number | Whole days between now and the deadline, counted in UTC. Negative once the deadline has passed. null for the small number of tenders published without a real closing date |
tenderValue | number | Estimated contract value as a number, on the notices that publish a figure |
tenderValueText | string | The value exactly as published, e.g. "INR 1168000" or "Refer Document". Present on every notice that publishes a value line |
currency | string | Currency code matching tenderValue, e.g. "INR", "USD", "EUR". Set on the same rows as tenderValue, and null on the same rows too |
status | string | Which set the tender came from: active, archive-2025-2026, archive-2021-2024, or archive-2020-and-earlier. A tender fetched directly by reference number or link belongs to no chosen set, so it reads active while it is still open and null once it has closed — use daysToDeadline to tell the two apart |
searchKeyword | string | The keyword that matched this tender, so you can tell which search produced it. null for browse runs and direct lookups |
scrapedAt | string | ISO 8601 timestamp of when the row was collected |
Tips for Best Results
- Pair International Competitive Bidding with a trade bloc. Setting
competitionto ICB andcountriesto the EU, GCC, or ASEAN gives you exactly the cross-border opportunities a foreign supplier is eligible to bid on — the highest-signal filter combination in this actor. - Use the posting-date window for a daily delta. Set
postedFromto yesterday and schedule the run each morning. Every row that comes back is new since your last pull, so there is nothing to de-duplicate on your side. - Sort by "Deadline soonest" when you are triaging. Combine it with a
deadlineFrom/deadlineTowindow to get a clean worklist of everything closing in the next two weeks, ordered by urgency. - Turn on exact matching for two-word keywords. Common word pairs like "water treatment" pull in a lot of loose matches; exact-phrase mode trimmed that search from 1,735 tenders to 1,318 — roughly a quarter less noise.
- Know when a value figure exists. About 37% of notices publish a parseable amount, which lands in
tenderValueandcurrency. The rest publish text such as "Refer Document", which always ships intenderValueText, so nothing is lost. Setting atenderValuefilter excludes the text-only notices — leave it empty when you want maximum coverage. - "Active" is not a recency filter. It means "not yet closed", and includes notices posted as far back as 2017. If you only want recent postings, add a
postedFromdate rather than relying on status alone. - Start small, then scale. Run with
maxResultsat 20–50 to confirm the filter combination returns what you expect, then raise it. The cap is exact, so a test run never costs more than the number you asked for.
Pricing
From $0.90 per 1,000 results — pay only for the tender rows you actually receive, with the exact maxResults cap guaranteeing you are never billed for a rounded-up page. Bronze, Silver, and Gold subscribers pay progressively less; the table below shows the total cost at each discount tier.
| Results | No discount | Bronze | Silver | Gold |
|---|---|---|---|---|
| 100 | $0.105 | $0.100 | $0.095 | $0.090 |
| 1,000 | $1.05 | $1.00 | $0.95 | $0.90 |
| 10,000 | $10.50 | $10.00 | $9.50 | $9.00 |
| 100,000 | $105.00 | $100.00 | $95.00 | $90.00 |
A "result" is one tender row in the output dataset. No compute or time-based charges — you pay per result, plus a small fixed per-run start fee.
Integrations
Export data in JSON, CSV, Excel, XML, or RSS. Connect to 1,500+ apps via:
- Zapier / Make / n8n — Workflow automation
- Google Sheets — Direct spreadsheet export
- Slack / Email — Notifications when new tenders appear
- Webhooks — Trigger custom APIs on run completion
- Apify API — Full programmatic access
Legal & Ethical Use
This actor is designed for legitimate public-procurement research, bid discovery, market intelligence, and B2G sales work. Tender notices are published by government and public-sector bodies for the express purpose of attracting bidders. Users are responsible for complying with applicable laws and TendersOnTime's terms of service, and for verifying tender details and deadlines against the official issuing authority before submitting any bid. Do not use extracted data for spam, harassment, or any illegal purpose.