UK & EU Public Tenders & Contracts Finder · SiteVerdict
Pricing
$5.00 / 1,000 tender notices
UK & EU Public Tenders & Contracts Finder · SiteVerdict
Search UK and EU public tenders and contract awards in one feed: Find a Tender, Contracts Finder, Public Contracts Scotland, Sell2Wales and TED. Filter by keyword, CPV, buyer, region, value and deadline; schedule daily alerts. $5 per 1,000 notices; in monitor mode, already-seen notices are free.
Pricing
$5.00 / 1,000 tender notices
Rating
0.0
(0)
Developer
Aman Thakran
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
2
Monthly active users
3 days ago
Last modified
Categories
Security
Limited permissionsShare
SiteVerdict — Public Tenders & Contracts Finder (UK, EU)
Quick start: keep the prefilled input and press Start. It searches Find a Tender, Contracts Finder and Public Contracts Scotland for tender notices matching "website" or "digital" from the last 7 days, and saves up to 10.
In our two test runs on 24 Oct 2026 this took about 3 minutes (2 min 53 s each). Most of that time was a 2-minute pause that Find a Tender asks clients to take after a burst of requests; the run keeps working during the pause and the run status says so.
What it costs: $0.005 per notice saved ($5 per 1,000). The prefilled run saves at most 10 notices, so it costs at most $0.05. In monitor mode, already-seen notices, digests and errors are free.
Works well with: UK Companies House Data (profile buyers and winners) · VAT & Company Number Validator.
Every UK and EU public-sector opportunity in one clean feed — with daily "new tender" alerts and a closing-soon digest.
One search covers Find a Tender (all UK notices under the Procurement Act 2023), Contracts Finder (England, below-threshold and legacy procurements), Public Contracts Scotland, Sell2Wales and the EU's TED (Tenders Electronic Daily). Results come back in one normalised, OCDS-based format: title, buyer, value, CPV codes with labels, location, procedure, deadline, documents, notice link, lots and award winners. Cross-posted duplicates are merged.
Uses only the official, open government APIs. No logins, no scraping of web pages, no proxies.
Who it is for
- SMEs and bid teams who want every relevant tender without checking five portals.
- Bid writers and consultancies monitoring several sectors or clients.
- Sales and market-intelligence teams tracking who wins what (awards, incumbents, contract values).
- Developers and AI agents who need a clean procurement feed (also available as an MCP tool).
What you can do
| Need | How |
|---|---|
| Find open tenders for your services | keywords, cpvCodes or cpvKeywords + openOnly |
| Don't know CPV codes? | cpvKeywords: ["cleaning", "website"] looks them up in the official CPV 2008 vocabulary (9,454 codes) |
| Only your area | regions ("London", "Scotland", "UKI3", "TLM", "DE1") or postcodes ("M", "LS1") |
| Right-sized contracts | minValue / maxValue |
| Specific buyers | buyers: ["NHS", "Ministry of Defence"] |
| Daily alerts | mode: "monitor" on a daily schedule — only notices you have not seen before |
| Weekly "closing soon" email | mode: "closingSoon" + closingWithinDays: 7 → markdown digest in the DIGEST.md record |
| Rank by fit | profileKeywords + profileExcludeKeywords → 0–100 relevance score, sortBy: "relevance" |
| Who won what | noticeTypes: ["award"] → supplier organisations and awarded values |
Sources and coverage
| Source | What it adds | Notes |
|---|---|---|
| Find a Tender (Cabinet Office, Central Digital Platform) | All UK notices under the Procurement Act 2023 (UK1–UK17 notices, from 24 Feb 2025), plus above-threshold notices under the old regulations and Scottish above-threshold notices | Queried by update date; we deliberately do not use its stages filter (see FAQ) |
| Contracts Finder | England: below-threshold opportunities and awards, and procurements started under the old regulations (before 24 Feb 2025) | Strict rate limit — the Actor paces itself |
| Public Contracts Scotland | Scottish below-threshold "website" notices and Scottish-regime notices | Month-level API; above-threshold Scottish notices are also on Find a Tender and are merged |
| Sell2Wales | Welsh below-threshold notices | Same platform as PCS. On 11 Oct 2026 its list API returned HTTP 500 for every query; the Actor detects this, skips it and reports it in the run summary |
| TED (Publications Office of the EU) | EU/EEA above-threshold notices in eForms: contract notices, awards, prior information, modifications | Keyword search uses TED's own full-text search across all languages |
UK notices stopped going to TED after Brexit (2021), so UK and EU results do not overlap.
Input examples
Open digital/IT tenders in London and the South East, £25k–£500k
{"sources": ["fts", "contractsFinder"],"keywords": ["website", "software", "digital"],"regions": ["London", "South East"],"minValue": 25000,"maxValue": 500000,"openOnly": true,"lookbackDays": 14}
Daily alert (schedule it every morning)
{"mode": "monitor","monitorKey": "cleaning-scotland","sources": ["fts", "scotland"],"cpvKeywords": ["cleaning"],"regions": ["Scotland"],"noticeTypes": ["tender", "planning"]}
Closing-soon digest across the UK and Ireland
{"mode": "closingSoon","closingWithinDays": 7,"sources": ["fts", "contractsFinder", "scotland", "ted"],"cpvCodes": ["72000000"],"tedCountries": ["IE"]}
Who won NHS cleaning contracts this quarter
{"noticeTypes": ["award"],"buyers": ["NHS"],"cpvKeywords": ["cleaning"],"publishedFrom": "2026-07-01","sources": ["fts", "contractsFinder", "scotland"]}
Try it offline first with "useSampleData": true (bundled recorded responses, no network, no charges).
Output
One dataset item per notice (trimmed example from a live run on 11 Oct 2026):
{"uid": "fts:095671-2026","source": "fts","sourceName": "Find a Tender (UK)","id": "095671-2026","ocid": "ocds-h6vhtk-077751","noticeType": "tender","noticeTypeCode": "UK4","noticeTypeLabel": "Tender notice","status": "active","title": "Chelmsford College Website tender","description": "The College is looking for a company to build a new website in ASP.net …","buyer": { "name": "Chelmsford College", "id": "GB-PPON-PPHT-3744-XBMQ", "identifiers": [{ "scheme": "GB-PPON", "id": "PPHT-3744-XBMQ" }], "address": { "locality": "Chelmsford", "region": "UKH36", "postcode": "CM2 0JQ", "country": "United Kingdom" }, "type": "Public authority - sub-central government" },"value": { "amount": null, "amountMin": null, "currency": null },"cpv": [{ "code": "72413000", "label": "World wide web (www) site design services" }],"location": { "countries": ["United Kingdom"], "nutsCodes": ["UKH3", "UKH36"], "postcodes": ["CM2 0JQ"] },"procedure": { "method": "open", "details": "Below threshold - open competition", "legalBasis": "2023/54", "regime": "Procurement Act 2023", "aboveThreshold": false, "smeSuitable": true },"publishedDate": "2026-10-09T12:16:49.000Z","deadline": "2026-11-06T23:59:59.000Z","deadlineType": "tender","daysUntilDeadline": 26.7,"isOpen": true,"documents": [{ "type": "biddingDocuments", "url": "https://www.find-tender.service.gov.uk/Notice/Attachment/A-23859" }],"noticeUrl": "https://www.find-tender.service.gov.uk/Notice/095671-2026","awards": [],"lots": [],"relevance": { "score": 41, "matchedKeywords": ["website"], "matchedCpv": [], "excludedBy": [] },"alsoPublishedOn": [],"licence": "Open Government Licence v3.0 — https://www.nationalarchives.gov.uk/doc/open-government-licence/version/3/","attribution": "Contains public sector information from Find a Tender, licensed under the Open Government Licence v3.0."}
Also written to the run's key-value store:
OUTPUT— run summary: per-source status, records fetched, why notices were filtered out, CPV codes used, duplicates merged, warnings, attribution.DIGEST.md— a ready-to-send markdown digest (paste into email, Slack or Teams, or send it with an Apify integration/webhook).DIGEST— the same digest as JSON, including a closing-soon list.
Dataset views: Overview, Closing soon, Awards, Relevance.
Monitoring (daily alerts)
- Set
mode: "monitor"and give the alert amonitorKey(e.g."it-london"). - Schedule the Actor daily (Apify Console → Schedules).
- Each run continues from the previous run (with one day of overlap) and outputs only notices it has not sent before, so you are charged only for new ones. State is kept in the named key-value store
siteverdict-public-tenders-state; eachmonitorKeyis independent. - By default you get one alert per procurement and stage (tender, then award). Set
alertOnUpdates: trueto be alerted on every change notice too.
How long a run takes
Run time depends on how much each portal returns, whether each portal is available, and the portals' own rate limits. The Actor waits when a portal asks it to pause, so run times are not fixed.
- First and historical searches can take several minutes. In our tests on 24 Oct 2026, a 7-day search needed 25 requests to Find a Tender and took about 3 minutes. In each test run, Find a Tender asked for a 2-minute pause after about 20 requests; the run status shows when this pause is happening.
- Daily monitoring usually needs fewer requests. In monitor mode, after the first run, each run starts one day before your previous run (the overlap described above, never more than 30 days back), so a daily schedule covers about two days. In our tests a 2-day weekday window needed 10 requests to Find a Tender. The first monitor run uses Look back (days) (default 7).
- Closing-soon digests need a longer scan. They look back at least 45 days unless you set Published from, so they can take longer than a 7-day search.
- A short look-back is not a substitute for a full first search. A 1–2 day look-back in search mode can leave out older notices. For a first search, set a look-back that covers the whole period you need; for ongoing alerts, use monitor mode on a schedule.
Calling from code or an AI agent
A search reads every selected portal, merges duplicates, and saves the notices at the end of the run. A run usually takes a few minutes, sometimes longer when a portal asks the Actor to pause (see "How long a run takes"). Design your client for that:
- Start the run asynchronously — don't hold a request open waiting for the results.
- API:
POST https://api.apify.com/v2/acts/siteverdict~siteverdict-public-tenders/runs?token=…with your input as the JSON body. The response has the runidanddefaultDatasetId. - JavaScript:
const run = await client.actor('siteverdict/siteverdict-public-tenders').start(input); - Python:
run = client.actor('siteverdict/siteverdict-public-tenders').start(run_input=input)
- API:
- Wait for it to finish by polling or with a webhook.
- Polling:
GET /v2/actor-runs/{runId}?waitForFinish=60waits up to 60 s per call and returns when the run ends. Repeat untilstatusisSUCCEEDED,FAILED,TIMED-OUTorABORTED. In the clients:client.run(id).waitForFinish({ waitSecs })/client.run(id).wait_for_finish(wait_secs=…). - Webhook: add an
ACTOR.RUN.SUCCEEDEDwebhook (Console → Integrations, or thewebhooksparameter when starting the run) and fetch the results when it fires. - Allow at least 15 minutes for a normal search and 45 minutes for a closing-soon scan before you treat a run as stuck.
- Per-portal time limit (new in 1.1.0): each portal may take at most
sourceTimeBudgetSecsseconds (default 900, i.e. 15 minutes). A slower portal is cut off, keeps what it already read, and is listed inOUTPUT.incompleteSourcesandOUTPUT.sourceStates; the other portals carry on. For long closing-soon scans or long look-backs, raise it (up to 3600) or set0to turn it off. - A Proactis portal (Scotland, Wales) that times out or returns server errors twice in a row is skipped for that run, with a note in
OUTPUT.sources. A run that is waiting on a portal's rate limit says so in its status message — that is normal, not a hang.
- Polling:
- Don't abort a run because it is slow. An aborted run keeps nothing in standard delivery. Two options help if your client cannot wait:
- Finish within (seconds) (
timeBudgetSecs): the Actor stops reading portals in time to save what it found and finish within that many seconds — for example240for a 5-minute synchronous call. - Save found notices before the run times out (
saveBeforeTimeout, on by default): close to the run's timeout, the Actor saves what it found instead of losing it. Either way the run ends as Succeeded withOUTPUT.complete: falseand the affected portals inOUTPUT.stoppedEarlySources. Those notices are saved and charged as usual. - Progressive delivery (
deliveryMode: "progressive"): each portal's notices are saved as soon as that portal finishes. If the run is then aborted or times out (even withsaveBeforeTimeoutoff), the notices already saved stay in the dataset and are charged;OUTPUTshowsrunState: "RUNNING"andcomplete: false. A notice cross-posted on several portals is kept from the portal that finished first; in rare cases where two copies are linked only through a third notice, both copies can be saved. Not available in monitor mode. - In standard delivery, a run aborted or timed out before the end-of-run save keeps nothing and is not charged. A run stopped while it is already saving keeps, and is charged for, the notices saved so far.
- Run status change: a run that would previously end Timed out with nothing saved now ends Succeeded with partial results. If you alert on timed-out runs, also check
OUTPUT.complete. The status message ends with "PARTIAL (time limit), stopped early: …" in that case.
- Finish within (seconds) (
- Fetch the results from the run's default dataset:
GET /v2/datasets/{defaultDatasetId}/items?format=json&offset=0&limit=1000, paging withoffsetuntil fewer thanlimititems come back. The run summary is theOUTPUTrecord in the run's key-value store (GET /v2/key-value-stores/{defaultKeyValueStoreId}/records/OUTPUT). - Check what you got.
OUTPUT.completeistrueonly when every selected portal was read to the end and your maximum charge did not cut the output.OUTPUT.runStateis"RUNNING"if the run was stopped before it finished.OUTPUT.incompleteSourceslists portals that failed, were cut bymaxPagesPerSource, or were stopped early.- If your maximum charge is used up exactly by Max notices (for example 10 notices with a $0.05 maximum), the run is complete:
chargeLimitReachedisfalse. It istrueonly when a notice you asked for could not be saved because of the maximum charge. OUTPUT.sourceStatesshows each portal's state, and theRUN-STATUSrecord in the run's key-value store is updated while the run is in progress.- By default each portal is read up to 40 pages per run (
maxPagesPerSource, about 4,000 records for Find a Tender and TED). Over a long look-back, busy portals can reach that limit and are then listed inincompleteSources. Use a shorter look-back, add filters or raisemaxPagesPerSource.
- If your maximum charge is used up exactly by Max notices (for example 10 notices with a $0.05 maximum), the run is complete:
- Retry carefully. A retry is a new run and is charged again for every notice it saves.
- If a run finished but your client lost the result, read the same run's dataset again instead of starting a new run.
- Retry only runs that ended
FAILED,TIMED-OUTorABORTED. These usually saved nothing, but check the run's dataset before you retry. - For repeated searches over the same period, use monitor mode with a
monitorKey: notices it has already sent are skipped and not charged again. - De-duplicate on your side by
uid(unique per notice and source).
- Be explicit about the input. If you omit
sources, an API call searches four portals including EU TED, andmaxResultsdefaults to 100. Pass the portals you need (for example["fts", "contractsFinder"]) and amaxResultsthat fits your use. Fewer portals and a shorter look-back mean shorter runs. - Cap spend with
maxTotalChargeUsdwhen you start the run. The Actor stops adding notices when the cap is reached. Set it to at least the price of one notice ($0.005).
Cost example: 200 notices at $5.00 per 1,000 = $1.00.
Relevance ranking
Score 0–100 per notice, fully transparent: keyword in title +30, in description/lots +12, in CPV labels +6 (per keyword); a CPV code match +25; still open +5. Any profileExcludeKeywords hit sets the score to 0. Use minRelevance to drop weak matches.
FAQ
Why not use Find a Tender's own stages filter? We tested it on 11 Oct 2026: with stages=tender it returned only notices under the old regulations and silently dropped every Procurement Act 2023 notice (15 results vs 198 tender-stage notices actually published that week). So we fetch by date and filter stages ourselves. It is slower but complete.
Do values get converted between currencies? No. Value filters compare in each notice's own currency (GBP for UK sources, mostly EUR for TED, sometimes SEK, PLN etc.).
Are TED titles in English? title is the buyer's original title. headline is TED's translated headline ("Country – CPV – title") in your tedLanguage. Descriptions are in the original language.
How far back can I search? Any date range. UK APIs only filter by date, so long windows mean more pages: about 300–450 Find a Tender records per weekday (100 per page). Raise maxPagesPerSource for long ranges; the summary tells you if a source was truncated.
What counts as a duplicate? The same procurement on two platforms (e.g. a Scottish tender on both PCS and Find a Tender, linked by its PCS reference), or the same title + buyer + stage. The best source is kept and the others are listed in alsoPublishedOn.
Is a notice "open" if it has no deadline? isOpen is null when no deadline is published; openOnly and closingWithinDays exclude those.
Limits
- Speed is set by the sources' rate limits. Contracts Finder locks clients out for 2 minutes after about 12 rapid requests, and Find a Tender asks clients to back off (HTTP 429, Retry-After 120 s) after bursts. The Actor waits as asked, so a 45-day closing-soon scan can take several minutes. While the Actor is waiting, the run status says which portal asked it to pause.
- If a portal does not respond during a run, the Actor skips it and names it in the run summary. Portal availability is outside our control.
- Public Contracts Scotland and Sell2Wales only filter by month and notice type, so the Actor trims to your dates.
- TED keyword matching happens on TED's side (all languages, full text), so it can be broader than the UK keyword matching (title, description, lots, CPV labels).
- Keyword → CPV lookup matches words in official CPV labels, plus a small curated synonym list (e.g. website, cyber security, cloud, AI). Check
OUTPUT.cpvLookupto see which codes were used. - Documents are links only. Many buyers host tender packs on their own e-tendering portals, which may need a free supplier registration.
Compliance, sources and licences
- Find a Tender, Contracts Finder, Public Contracts Scotland, Sell2Wales: Open Government Licence v3.0. Contains public sector information licensed under the Open Government Licence v3.0. Each item carries its own
licenceandattribution. - TED: © European Union, reused under Commission Decision 2011/833/EU (reuse of Commission documents). CPV 2008 labels come from the EU eForms SDK code list (OP-TED), under the same reuse policy.
- Only official open APIs are used, with an honest User-Agent and polite pacing. No logins, CAPTCHAs, paywalls or proxy rotation.
- Personal data is off by default. Buyer contact names, emails and phone numbers are excluded unless you set
includeContactDetails: true. If you do, they are output exactly as the buyer published them, and you are responsible under UK GDPR and PECR: assess legitimate interest, and do not use them for unsolicited marketing to individuals. Award winners are organisations as published by the buyer (a sole trader's trading name can be a person's name, so treat it with care). - Not legal, financial or procurement advice. Always read the official notice and documents before bidding. Data is as published by the sources, with dates shown on each notice.
Pricing
Pay per event: you pay for each notice saved to the dataset (event notice). Nothing is charged for errors, empty runs, sample-data runs or notices skipped as already seen in monitor mode. The run stops cleanly when your maximum charge per run is reached. See PRICING.md.