UK & EU Public Tenders & Contracts Finder · SiteVerdict avatar

UK & EU Public Tenders & Contracts Finder · SiteVerdict

Pricing

$5.00 / 1,000 tender notices

Go to Apify Store
UK & EU Public Tenders & Contracts Finder · SiteVerdict

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

Aman Thakran

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

2

Monthly active users

3 days ago

Last modified

Categories

Security

Limited permissions

Share

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

NeedHow
Find open tenders for your serviceskeywords, 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 arearegions ("London", "Scotland", "UKI3", "TLM", "DE1") or postcodes ("M", "LS1")
Right-sized contractsminValue / maxValue
Specific buyersbuyers: ["NHS", "Ministry of Defence"]
Daily alertsmode: "monitor" on a daily schedule — only notices you have not seen before
Weekly "closing soon" emailmode: "closingSoon" + closingWithinDays: 7 → markdown digest in the DIGEST.md record
Rank by fitprofileKeywords + profileExcludeKeywords → 0–100 relevance score, sortBy: "relevance"
Who won whatnoticeTypes: ["award"] → supplier organisations and awarded values

Sources and coverage

SourceWhat it addsNotes
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 noticesQueried by update date; we deliberately do not use its stages filter (see FAQ)
Contracts FinderEngland: 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 ScotlandScottish below-threshold "website" notices and Scottish-regime noticesMonth-level API; above-threshold Scottish notices are also on Find a Tender and are merged
Sell2WalesWelsh below-threshold noticesSame 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, modificationsKeyword 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)

  1. Set mode: "monitor" and give the alert a monitorKey (e.g. "it-london").
  2. Schedule the Actor daily (Apify Console → Schedules).
  3. 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; each monitorKey is independent.
  4. By default you get one alert per procurement and stage (tender, then award). Set alertOnUpdates: true to 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:

  1. 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 run id and defaultDatasetId.
    • JavaScript: const run = await client.actor('siteverdict/siteverdict-public-tenders').start(input);
    • Python: run = client.actor('siteverdict/siteverdict-public-tenders').start(run_input=input)
  2. Wait for it to finish by polling or with a webhook.
    • Polling: GET /v2/actor-runs/{runId}?waitForFinish=60 waits up to 60 s per call and returns when the run ends. Repeat until status is SUCCEEDED, FAILED, TIMED-OUT or ABORTED. In the clients: client.run(id).waitForFinish({ waitSecs }) / client.run(id).wait_for_finish(wait_secs=…).
    • Webhook: add an ACTOR.RUN.SUCCEEDED webhook (Console → Integrations, or the webhooks parameter 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 sourceTimeBudgetSecs seconds (default 900, i.e. 15 minutes). A slower portal is cut off, keeps what it already read, and is listed in OUTPUT.incompleteSources and OUTPUT.sourceStates; the other portals carry on. For long closing-soon scans or long look-backs, raise it (up to 3600) or set 0 to 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.
  3. 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 example 240 for 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 with OUTPUT.complete: false and the affected portals in OUTPUT.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 with saveBeforeTimeout off), the notices already saved stay in the dataset and are charged; OUTPUT shows runState: "RUNNING" and complete: 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.
  4. Fetch the results from the run's default dataset: GET /v2/datasets/{defaultDatasetId}/items?format=json&offset=0&limit=1000, paging with offset until fewer than limit items come back. The run summary is the OUTPUT record in the run's key-value store (GET /v2/key-value-stores/{defaultKeyValueStoreId}/records/OUTPUT).
  5. Check what you got. OUTPUT.complete is true only when every selected portal was read to the end and your maximum charge did not cut the output. OUTPUT.runState is "RUNNING" if the run was stopped before it finished. OUTPUT.incompleteSources lists portals that failed, were cut by maxPagesPerSource, 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: chargeLimitReached is false. It is true only when a notice you asked for could not be saved because of the maximum charge.
    • OUTPUT.sourceStates shows each portal's state, and the RUN-STATUS record 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 in incompleteSources. Use a shorter look-back, add filters or raise maxPagesPerSource.
  6. 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-OUT or ABORTED. 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).
  7. Be explicit about the input. If you omit sources, an API call searches four portals including EU TED, and maxResults defaults to 100. Pass the portals you need (for example ["fts", "contractsFinder"]) and a maxResults that fits your use. Fewer portals and a shorter look-back mean shorter runs.
  8. Cap spend with maxTotalChargeUsd when 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.cpvLookup to 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 licence and attribution.
  • 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.