Government Tender & Contract Scraper
Pricing
from $1.20 / 1,000 notice founds
Government Tender & Contract Scraper
Public sector tenders from TED (EU) and both UK procurement portals in one feed. Filter by CPV code, country, value and deadline, separate open opportunities from already-awarded contracts, and get the buying officer's name, email and phone where the portal publishes them.
Pricing
from $1.20 / 1,000 notice founds
Rating
0.0
(0)
Developer
Eimantas V
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
6 days ago
Last modified
Categories
Share
Public sector contracts from TED (EU) and both UK procurement portals in one feed — filtered by CPV code, country, value and deadline, with the buying officer's name, email and phone where the portal publishes them.
UK Find a Tender 40 notices tender:2 contract:38 40 contactsTED (EU) 60 notices tender:36 award:23 667 availableUK Contracts Finder 4 notices award:4 4 contactsd0 £250,000 External Audit Services North London Muslim Housing moosa@nlmha.comd24 £50,000 Queens Park Primary Fascias St Helens Council procurement@star-procurement.gov.ukd31 £750,000 Learner Management System Defence Equipment & Support alexander.tebbitt885@mod.gov.uk
No API key, no registration, no browser. All three are public government APIs.
A named buyer you can actually email
The UK portals publish the officer running each tender — name, email address and direct phone — attached to a live opportunity with a deadline and a budget. 58 of 58 notices in one run carried an email.
That is the difference between a list of contracts and a list of people to call. Tender alert services charge £500–5,000 a year and mostly hand you the notice.
Only about a third of a tender feed is a tender
Every one of these portals mixes four kinds of notice into one stream:
| Type | What it is |
|---|---|
tender | An open opportunity you can bid on |
award | Somebody already won it |
contract | A signed agreement |
planning | An early heads-up, no deadline yet |
A live run returned 104 notices of which 38 were open tenders — the rest were already decided. Set noticeTypes: ["tender"] and the list becomes doors that are still open. Leave it empty and you get the awards too, which is how you see who is winning work in your category.
What you get
Per notice — title, buyerName, contactName / contactEmail / contactPhone, valueAmount + valueCurrency, cpvCodes + cpvDescription, deadline, daysUntilDeadline, procedureId, noticeType, procurementMethod + procurementMethodDetails, status, region, buyerCountry, noticeUrl, noticeId.
Per source — notices returned, totalAvailable, counts by notice type, how many are open, how many close within a week, how many carry a contact, median value, top buyers, top CPV codes.
Rows arrive soonest deadline first within each source, then largest value, with undated notices last — an unknown date is not urgency. Sources are written as they finish, so sort the whole dataset on daysUntilDeadline if you want one list across all three; the dataset view does it in a click.
Who this is for
- Anyone selling to the public sector — construction, IT, consulting, facilities, medical, training.
- Bid teams — a daily run with
noticeTypes: ["tender"]and your CPV codes is your pipeline. - Market intelligence —
noticeTypes: ["award"]shows who is winning what, at what price. - Lead generation — filter on
requireContactDetailsand you have named buyers with live budgets.
Input
{"cpvCodes": ["48", "72"],"noticeTypes": ["tender"],"countries": ["GB", "IE"],"publishedFrom": "2026-08-07","onlyOpen": true,"requireContactDetails": true}
| Option | Default | Notes |
|---|---|---|
sources | all three | ted, uk-contracts-finder, uk-find-a-tender |
cpvCodes | — | A division is enough: 48 software, 45 construction, 72 IT services |
noticeTypes | all | Set to tender for open opportunities only |
countries | all | Mainly narrows TED; the UK portals are UK-only |
onlyOpen | false | Drops passed deadlines, keeps undated notices |
requireContactDetails | false | Effectively narrows to the UK portals |
minValue / maxValue | — | Undisclosed budgets are kept |
publishedFrom | 7 days ago | See below — this is what makes a run recent |
maxPerSource | 250 | TED alone can match hundreds of thousands |
Ten things worth knowing
Each was found by running against live data.
TED cannot be sorted, so the date floor is doing the work. It rejects a sortField outright, and without a date filter the very first result came back from 2016. Every run therefore carries publication-date >=, defaulting to a week ago. Widen the window rather than expecting a "newest first" option that does not exist.
A short CPV code is rejected by TED and required by everyone else. Asking TED for 48 returns "Value '48' is not supported for search field 'classification-cpv'" and nothing else. Codes are padded to eight digits for TED — 48 becomes 48000000, which matches the whole software division — and matched as prefixes when filtering the UK results.
Find a Tender hides its CPV codes. Contracts Finder puts the classification on the tender where you would expect it; Find a Tender buries it in the first item's additionalClassifications, and only some notices carry one at all. Reading a single location left every Find a Tender row unclassified, which meant a CPV-filtered search quietly returned rows nothing had checked.
The contact has to be matched by role. An OCDS release lists suppliers and funders in the same parties array as the buyer. Taking the first party with an email address would hand you a supplier's inbox labelled as the buying officer, so the buyer is matched by id and then by role.
TED's own fields need three separate corrections. Its publication dates arrive as 2026-08-10+02:00 — a date carrying a UTC offset but no time, which Date.parse reads as invalid, so every notice came back undated until the missing midnight was filled in. The amount and its currency live in different fields, so reading total-value alone gave figures with no unit attached and a summary that could not add anything up. And a CPV code is repeated once per lot, so a four-lot notice lists the same two codes four times — left in, the duplicates more than doubled the top-CPV counts on the summary.
Every UK notice link was broken, and nothing could have told you. Both portals were sent to Contracts Finder with the ocid as the path. They use different OCDS prefixes, so a Find a Tender ocid means nothing to Contracts Finder, and neither portal addresses a notice by ocid in the first place. What makes it worth spelling out is the failure mode: both answer a bad notice path with HTTP 200 and a "You have been signed out" or "Page not found" page, so every link looked healthy and went nowhere. Both key on release.id instead — used whole for Find a Tender (077478-2026), with the trailing sequence removed for Contracts Finder (d1d7de05-…-910704). One rule could not serve both, because stripping trailing digits from a Find a Tender id eats the year.
Contracts Finder accepted a page number and ignored it. Pages 1, 2 and 3 of the same search returned byte-identical releases, so asking for 250 notices fetched the first hundred three times, threw two hundred away as duplicates, and then reported truncated: true off a count padded with repeats. The portal looked exhausted at 96 notices. It pages by the links.next cursor instead, which reaches 381 in four pages — the same way Find a Tender already worked.
A corrected notice is a new notice, and only the procedure identifier says so. TED republishes a corrigendum under a fresh publication number; OCDS issues another release against the same ocid. Both carry an identifier for the procedure itself, and across 1,500 live notices that grouped 22 sets of republications where matching on buyer, title, deadline and value found 8. The fourteen it adds are the ones that matter, because a corrigendum exists precisely when something changed: twelve differed on value, three on title, two on the deadline. One moved a closing date from 8 June to 16 June — as two rows, the superseded date reads as a live one. The latest publication wins, and it is chosen before the filters run, so a deadline that moved is judged on the date that applies rather than the one it replaced.
A TED title is not the buyer's title. Every one is assembled as {country} – {CPV description} – {real title}, and TED translates only the first two segments — the buyer's own words are never translated at all. Three consequences, all of which were live in the output. Searching software matched 39 notices where only 15 were about software: the other 24 were cabling, helpdesk and information-security contracts filed under CPV 72, whose generated label reads "IT services: consulting, software development, Internet and support". titleLanguage claimed English on 230 of 250 notices that were actually German, French or Dutch — and reported it as eng where the UK rows said en, so even the answer was in two vocabularies. And cpvDescription was empty on every row while its value sat in the middle of the title. The title now comes from title-proc, which carries the buyer's string alone and the language it is genuinely in; the label it was wrapped in becomes cpvDescription.
Two columns quietly meant three different things depending on the source. procurementMethod carried TED's notice-type — cn-standard on all 104 rows of a run, because that is the form a contract notice is published on, not how it will be awarded. The procedure is a separate TED field, and reading it gives the distribution that was always there: 74 open, 21 negotiated with a call, 5 restricted. The UK side had its own version of the fault, reading OCDS's free-text procurementMethodDetails into the coded column and falling back to mainProcurementCategory — which is goods, services or works, a different question, and one contractNature already answers. Both now carry the four-word OCDS codelist, with each portal's own wording kept beside it in procurementMethodDetails. buyerCountry was the same disease in three spellings: DEU from TED, United Kingdom from OCDS, DE in the summary and in the countries input. Filtering the dataset on the code the documentation asks for returned nothing.
Output
{"recordType": "tender","source": "uk-find-a-tender","title": "Provision of a Learner Management System","buyerName": "Defence Equipment and Support","contactName": "Alexander Tebbitt","contactEmail": "alexander.tebbitt885@mod.gov.uk","valueAmount": 750000, "valueCurrency": "GBP","cpvCodes": ["48000000"],"cpvDescription": "Software package and information systems","noticeType": "tender","procurementMethod": "open","procurementMethodDetails": "Open procedure","buyerCountry": "GB","deadline": "2026-09-14T12:00:00.000Z","daysUntilDeadline": 31}
Three ready-made views: Open opportunities, Buyer contacts and Source summary. Set flattenOutput: true for CSV.
Honest limits
- EU and UK only. TED covers the EU plus Norway, Switzerland and the Western Balkans. There is no US coverage — SAM.gov requires a registered API key.
- Value is often not published. Buyers disclose a budget when they choose to;
valueAmountis null otherwise, and those notices are kept rather than filtered away. - TED publishes no region and no status. Its API exposes a country of performance but no NUTS code, and stuffing a country into a column the UK rows fill with "East Midlands" would repeat exactly the mistake described above. Both stay null on TED rows.
- TED carries no contact email. Only the UK portals name an officer, so
requireContactDetailsnarrows a run to them. - Deadlines are missing on award and contract notices, because the deadline has already passed. That is what
noticeTypeis for. totalValueandmedianValueare only reported when every notice shares one currency. Adding euros to pounds produces a number that means nothing, and so does taking the midpoint of them — one run mixed 2,247,180 RON with 915,200 EUR.valueCurrenciestells you when that is why they are null.- One opportunity is charged once. Every publication of one procurement procedure collapses onto the latest, matched on the identifier the sources themselves use. A UK tender above threshold also reaches both portals under two unrelated ids, and those are matched on buyer, title, deadline and value.
- Failed sources and filtered notices are never charged either.
Pricing
| Event | Price | When |
|---|---|---|
| Actor start | $0.005 | Once per run |
| Source searched | $0.008 | Per portal, including its summary |
| Notice found | $0.0012 | Per notice returned |
| Buyer contact found | $0.004 | Only when an email is present |
$1.20 per 1,000 notices, plus $4 per 1,000 contacts. A daily UK watch on two CPV divisions costs roughly $0.30 a run. Tenders Direct and BiP start in the hundreds of pounds a year; GovWin runs to thousands.
Tips
- Run daily with
publishedFromset to yesterday and diff onprocedureId, notnoticeId. A corrected notice gets a fresh notice number but keeps its procedure id, so diffing on the number reports the same opportunity as new. - Sort by
daysUntilDeadline. Anything under 7 days needs a decision today; the summary counts those asclosingWithin7Days. - Use
noticeTypes: ["award"]on your competitors' CPV codes to see what they are winning and at what value. - Two CPV divisions beat ten keywords. Buyers classify before they write the title, so the code catches tenders whose wording you would never have guessed.
- Feed
contactEmailinto your CRM — a named officer with a live budget and a deadline is a warmer lead than anything a list broker sells.