UK EU Tender Notices Scraper avatar

UK EU Tender Notices Scraper

Pricing

from $4.76 / 1,000 results

Go to Apify Store
UK EU Tender Notices Scraper

UK EU Tender Notices Scraper

Search Contracts Finder and TED for public tender notices and get titles, buyers, countries, status, publication and deadline dates, values and CPV codes. The Actor combines results from both official APIs in a shared record format, with no API key required.

Pricing

from $4.76 / 1,000 results

Rating

0.0

(0)

Developer

Axiom Works

Axiom Works

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

11 days ago

Last modified

Categories

Share

UK & EU Public Tenders Scraper

Returns: one row per tender notice with title, buyerName, country, status, publishedDate, deadlineDate, valueHigh and cpvCodes. Input: {"searchTerms":["construction"],"sources":["contractsFinder","ted"],"status":"open","maxItems":20} Best for: public tender monitoring and bid alerts, sales lead lists for government suppliers, market research on public procurement spending.

This public tenders scraper works as a UK Contracts Finder API and EU TED API in one tool. It searches both official procurement portals, then returns every notice in the same flat format, so you can compare UK and European opportunities in one table.

{
"source": "contractsFinder",
"id": "cf-83d37637-0fb5-4370-9b4e-53882b62a218",
"title": "BBV HS2 MWCC NORTH - Fire Engineer Services",
"buyerName": "Balfour Beatty Vinci HS2",
"country": "GBR",
"publishedDate": "2026-10-08T08:10:07+01:00",
"deadlineDate": "2026-10-16T12:00:00+01:00",
"valueHigh": 2500000
}

What does UK & EU Public Tenders Scraper do?

UK & EU Public Tenders Scraper searches two open government data sources: Contracts Finder, the UK portal for public sector contracts, and Tenders Electronic Daily (TED), the EU journal for public procurement. You give it keywords, CPV classification codes, a status, a date range, a value range and optionally buyer countries or UK regions. It returns the matching tender notices as one dataset.

Both portals publish their data through official, anonymous APIs, so the Actor does not open web pages, does not need a login and does not need a proxy. Requests are made at about one per second per host, with automatic retries when a portal answers with a rate limit or a temporary error.

Typical uses include building a daily list of new open tenders in your sector, collecting awarded contracts to see which suppliers win work, finding buyers that regularly procure a given service, and feeding procurement data into a spreadsheet, CRM or dashboard.

You can also paste individual notice links. The Actor fetches those notices directly, which is handy when you want the full record for a tender you found elsewhere.

What data can you get?

Every record has the same fields, whichever portal it came from. Fields that a portal does not publish are returned as null (or an empty list), so your downstream code never has to handle two shapes.

FieldTypeDescription
idstringStable unique ID: cf-<GUID> for Contracts Finder, ted-<publication number> for TED
sourceUrlstringNotice page the record came from
sourcestringcontractsFinder or ted
noticeIdstringContracts Finder GUID or TED publication number
titlestringTender title
descriptionstringFull description text (TED descriptions are in the buyer's language)
buyerNamestringContracting authority
buyerCitystringBuyer city (TED)
buyerEmailstringBuyer organisation contact email (TED)
buyerWebsitestringBuyer organisation website (TED notices that publish it; null for Contracts Finder)
buyerLegalTypestringBuyer legal type code(s) such as body-pl (TED; null for Contracts Finder)
countrystringISO alpha-3 buyer country, GBR for Contracts Finder
regionstringUK region text, or TED NUTS place-of-performance codes
postcodestringBuyer postcode (Contracts Finder or TED); contact postcode fallback in Contracts Finder notice-URL mode
noticeTypestringNotice type such as Contract or cn-standard
statusstringOpen, Closed, Awarded or Withdrawn
procedureTypestringProcurement procedure (TED)
contractNaturestringservices, supplies or works (TED)
publishedDatestringPublication date
deadlineDatestringTender submission deadline; earliest valid lot date on TED
valueLow / valueHighnumberDisclosed value range; null when the buyer did not disclose a value
currencystringCurrency of the values
cpvCodesarrayUnique 8-digit CPV codes
cpvDescriptionstringPlain-text CPV description (Contracts Finder)
awardedDatestringAward date (Contracts Finder award notices)
awardedValuenumberContracts Finder awarded value; sum of disclosed TED winning tender values
awardedSuppliersarrayNames of winning suppliers
suitableForSmebooleanSME suitability flag (Contracts Finder)
contractStart / contractEndstringPlanned contract dates (Contracts Finder; TED when lots publish dates)
documentUrlsobjectTED notice PDF and XML links
searchTermstringThe input term that found the record
scrapedAtstringISO timestamp of the scrape

Many tenders do not disclose a value. In both portals a value of zero means not disclosed, and the Actor turns it into null instead of reporting a misleading zero.

How to use

  1. Open the Actor in Apify Console and go to the Input tab.
  2. Type one or more search terms, for example software or cleaning. You can also enter CPV codes instead of keywords.
  3. Choose the sources. Both are selected by default.
  4. Pick a status. open returns tenders that still accept bids, awarded returns notices that name a winner, closed returns tenders whose deadline has passed and any removes the filter.
  5. Set maxItems to cap the number of records and click Start.
  6. Download the dataset as JSON, CSV, Excel or HTML, or read it through the API.

When you select several sources and several search terms, the Actor splits maxItems evenly across every source and term combination, then tops up from the combinations that still have results. The run never returns more than maxItems records. Duplicate notices are removed, so the same tender found by two terms appears once.

Contracts Finder does not return results sorted by date, and it does not page. The Actor handles this for you: when a search matches more than a thousand notices it splits the date range into smaller windows and walks backwards from the newest one, so the newest notices come first.

Input

For recurring tender alerts, set datePreset to last_7_days, last_30_days, last_90_days or year_to_date. The default none leaves the existing date filters unchanged. Day presets include today and use UTC calendar dates; a seven-day run includes today plus the previous six days. An explicit publishedFrom takes precedence over the preset, and publishedTo remains an independent upper bound. For daily monitoring, use an overlapping window and deduplicate across runs using id, since publications can arrive late.

To refresh known notices without rebuilding links, pass noticeIds, for example {"noticeIds":["681373-2026"],"maxItems":1}. Contracts Finder GUIDs also work. You can combine IDs with existing noticeUrls; duplicate IDs are emitted once. With neither keywords nor CPV codes, these inputs run direct lookups only. Adding keywords or CPV codes also starts searches, sharing the same total maxItems cap. A nonexistent ID is skipped, and other targets continue. Direct lookups ignore search filters and sources: the link or identifier chooses the portal. If every direct target is missing or unrecognised, the run returns zero records and its status message explains which link or identifier format to supply.

FieldTypeDescription
searchTermsarrayKeywords to search, for example ["software"]. Each term is searched in every selected source
sourcesarraycontractsFinder, ted or both (default both)
statusstringopen (default), awarded, closed or any
maxItemsintegerTotal record cap, 1 to 10000, default 50
publishedFrom / publishedTostringPublication date bounds in YYYY-MM-DD format
cpvCodesarray8-digit CPV codes, for example ["72000000"]
countriesarrayBuyer countries as alpha-3 codes, TED only
ukRegionsarrayUK regions to keep, Contracts Finder only
minValue / maxValueintegerContract value bounds in the notice currency
datePresetstringRelative publication window; default none. Explicit publishedFrom overrides it.
noticeIdsarrayContracts Finder GUIDs or TED publication numbers; default empty.
noticeUrlsarrayContracts Finder notice URLs or TED notice URLs, as {"url": ...} objects
includeDescriptionbooleanInclude the full description text (default true)
proxyConfigurationobjectApify Proxy settings; off by default because both APIs work without it

Example input for open IT tenders from German and French buyers:

{
"cpvCodes": ["72000000"],
"sources": ["ted"],
"countries": ["DEU", "FRA"],
"status": "open",
"maxItems": 20
}

Example input for awarded UK cleaning contracts published since September, worth at least 10,000:

{
"searchTerms": ["cleaning"],
"sources": ["contractsFinder"],
"status": "awarded",
"publishedFrom": "2026-09-01",
"minValue": 10000,
"maxItems": 15
}

The UK region filter is applied by the Actor after download, because the Contracts Finder API ignores it. Notices marked "Any region" are kept. The country filter exists only on the TED side, so it has no effect on UK notices.

Output

Each run writes one dataset item per notice. A Contracts Finder item looks like this:

{
"source": "contractsFinder",
"id": "cf-12f64315-e80b-4070-8d3f-08816bd8e838",
"sourceUrl": "https://www.contractsfinder.service.gov.uk/Notice/12f64315-e80b-4070-8d3f-08816bd8e838",
"title": "Repair Works to Heritage Site - Ellesmere Yard",
"buyerName": "Canal & River Trust",
"country": "GBR",
"postcode": "SY12 9AA",
"noticeType": "Contract",
"status": "Open",
"publishedDate": "2026-10-01T15:49:55+01:00",
"deadlineDate": "2026-10-16T17:00:00+01:00",
"valueLow": 3000000,
"valueHigh": 4000000,
"currency": "GBP",
"cpvCodes": ["45212350"],
"cpvDescription": "Buildings of particular historical or architectural interest",
"suitableForSme": true,
"searchTerm": "construction"
}

Titles and descriptions from Contracts Finder arrive with HTML entities such as &amp;; the Actor decodes them into plain text. TED notices carry titles that the EU machine-translates into every official language, so the English title is used when present. Buyer names and descriptions on TED come in the original language of the notice.

How much does it cost?

The Actor is charged per result: you pay for each tender record added to the dataset, and nothing for searches that return no records. See the Pricing tab of the Actor for the current rate. Because maxItems is a hard cap, you can set the most a run can return before you start it.

Use with AI agents (MCP)

You can call this Actor from any MCP-compatible assistant through the Apify MCP server. Add the Actor to the tools list in the server URL:

{
"mcpServers": {
"apify": {
"url": "https://mcp.apify.com?tools=axiomworks/uk-eu-public-tenders-scraper"
}
}
}

Example prompts:

  1. "Find open UK and EU tenders about cybersecurity and list the buyer, deadline and value for the ten newest."
  2. "Search awarded Contracts Finder notices for cleaning services since 1 September and tell me which suppliers won."
  3. "Get the notice at https://ted.europa.eu/en/notice/-/detail/681373-2026 and summarise what the buyer wants."

Integrations and API

Run the Actor from code with the Apify API clients, or connect it to Make, Zapier, n8n, Google Sheets or a webhook on the Integrations tab. Schedule it daily with a publishedFrom date to build an alert feed.

Python

from apify_client import ApifyClient
client = ApifyClient("<APIFY_TOKEN>")
run = client.actor("axiomworks/uk-eu-public-tenders-scraper").call(run_input={
"searchTerms": ["software"],
"status": "open",
"maxItems": 50,
})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
print(item["title"], item["buyerName"], item["deadlineDate"])

JavaScript

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: '<APIFY_TOKEN>' });
const run = await client.actor('axiomworks/uk-eu-public-tenders-scraper').call({
searchTerms: ['software'],
status: 'open',
maxItems: 50,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
process.stdout.write(`${items.length} tenders\n`);

cURL

curl -X POST "https://api.apify.com/v2/acts/axiomworks~uk-eu-public-tenders-scraper/run-sync-get-dataset-items" \
-H "Authorization: Bearer $APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{"searchTerms": ["software"], "status": "open", "maxItems": 50}'

FAQ

Why do I get fewer results than I asked for? maxItems is a ceiling, not a target. A narrow keyword on the UK portal can match only a handful of open notices, especially since most above-threshold UK tenders moved to the separate Find a Tender service under the Procurement Act 2023. Add TED as a source, broaden the keyword, or switch the status to any.

Why are some value fields empty? Buyers often do not publish an estimated value. The portals then report zero, and this Actor returns null.

What currency are the values in? Contracts Finder values are in GBP. TED values use the currency stated in the notice, usually EUR, and the currency field says which.

Can I fetch one specific notice? Yes. Put its link in noticeUrls as a URL object, or its TED publication number or Contracts Finder GUID in noticeIds. In that mode a few extra Contracts Finder fields, such as the buyer contact email and town, are filled from the notice itself.

What happens with a bad input? A search that matches nothing finishes with zero items and a warning. A notice link that does not exist is skipped with a warning. If every request fails, the run stops with an error message that says so.

Does it need a proxy or an API key? No. Both APIs are open and anonymous. The proxy setting exists in case your own network blocks them.

The data comes from official open data services. Contracts Finder notices are published under the Open Government Licence, and TED data may be reused under the European Commission's reuse policy. The Actor reads only public notices through the portals' public APIs, with no login and a modest request rate. Notices can contain names or contact details of procurement officers, so handle them under the data protection rules that apply to you, such as GDPR. This Actor is not affiliated with or endorsed by Contracts Finder, TED or the European Union. This is general information, not legal advice.

Feedback

Found a missing field, a wrong value or a filter you need? Open an issue from the Actor page in the Apify Store and include the input you used and the notice link. Reports with a concrete example are fixed fastest.