# EU TED Tenders Scraper and Monitor

> TED tenders scraper for EU public procurement. Filter by CPV code, country and notice type. Get deadlines, values and links. Monitor mode for new tenders.

URL: https://cliqtomedia.com/actors/eu-ted-tenders-scraper/

Category: Government & open data · Status: live on Apify Store · Apify page: https://apify.com/cliqtomedia/eu-ted-tenders-scraper?fpr=cliqto

Find EU public tenders on TED with your own filters. Get one row per notice with buyer, deadline and value. Run it every morning to see only new tenders.

## How to use it: 3 steps

1. **Make a free Apify account.** Apify is the cloud platform where our tools run. The free plan gives you $5 of usage every month, no credit card needed. You pay Apify, not us.
2. **Paste your input and press Start.** No code needed: you fill in a form (the input). It already has a working example. For example: `72000000` in CPV codes. Each start is one run.
3. **Download the results.** When the run ends, the results are in a table (the dataset). Open Output, press Export and pick Excel or CSV. JSON and the API are there too.

## What it does

EU TED Tenders Scraper & Monitor searches public tender notices on TED (Tenders Electronic Daily, the EU's official journal for public procurement) by publication date, CPV code, buyer country, notice type and keywords, and saves one clean row per notice: title, buyer, deadline with time zone, estimated value with currency, lots and direct TED links.

- search — returns every matching notice in the date window, newest first, up to `maxResults`.
- monitor — returns only notices that earlier runs of the same monitor did not deliver yet. Schedule it every day and you get only new tenders.

### Good for

- Sales and bid teams who want new contract notices for their CPV codes and countries every morning.
- Market research on who buys what in the EU: award notices with values and currencies.
- Lead generation: buyer name, country, city and website for each tender.

### Not a good fit

- Full tender documents. The Actor gives `procurementDocumentsUrl`, `pdfUrl` and `xmlUrl`, but does not download them.
- Personal contacts. E-mail addresses and phone numbers are not in the output; e-mails inside descriptions are replaced with `[e-mail removed]`.
- Very old archives in one run. One run covers at most 31 days.

## Price

Pay per event. Apify bills you, not us.

| What you pay for | Price | When |
|---|---|---|
| Start fee | $0.01 | Charged once per run. This tool uses 1 GB of memory or less by default; more memory costs more. |
| Notice record | $0.0035 | One TED notice saved to the Dataset. Runs with no matches and monitor runs with no new notices save no records. |

- One tender notice: about $0.01.
- 1,000 tender notices: about $3.51.
- Every day 100 tender notices, for 30 days: about $10.80 a month.

Free to try: the Apify free plan gives you $5 of usage every month, no credit card needed.

Prices checked on 24 October 2026. Current price: https://apify.com/cliqtomedia/eu-ted-tenders-scraper?fpr=cliqto

## Questions

### Do I need a TED account or API key?

No. The tool uses the public TED Search API without a key.

### Does it download the tender documents?

No. It gives you links to the documents, PDF and XML. You open them yourself.

### Why do I see one procedure many times?

A procedure can have several notices, like a correction or an award. Each notice is one row.

### When does TED publish new notices?

TED publishes on working days, Monday to Friday.

### Is this an official TED product?

No. This Actor is not affiliated with or endorsed by the Publications Office of the European Union. Source: TED — Tenders Electronic Daily, Publications Office of the European Union, reused under the Commission's reuse decision 2011/833/EU. Always check the official notice before you bid. Each row links to the official notice on ted.europa.eu.

### How fresh is the data?

Each run reads TED live, so you get what TED shows at that moment. TED publishes new notices on working days (Monday–Friday).

### Why are there several rows with the same procedure?

A procedure can have several notices: a contract notice, corrections, an award notice. Each notice is its own row; `procedureId` connects them.

### What is a CPV code?

The Common Procurement Vocabulary is the EU code list for what is bought. You can search codes on SIMAP.

## Data fields

- `publicationNumber` (string): TED publication number, e.g. 674231-2026. One row per published notice; a corrected or changed notice is a new row with its own number.
- `noticeId` (string): eForms notice identifier (UUID). Null for legacy notices published before eForms.
- `noticeVersion` (integer): eForms notice version (1, 2, …). Null for legacy notices.
- `procedureId` (string): eForms procedure identifier (UUID) shared by all notices of one procedure. A procedure is not a notice: several rows can share it.
- `isChangeNotice` (boolean): True when this notice changes an earlier notice (eForms change notice).
- `changesNotice` (string): Which notice this one changes, as given by TED: a publication number (657981-2026) or an eForms notice id with version suffix.
- `changeReasonCode` (string): TED change reason code, e.g. cor-buy (buyer correction), cor-pub, update-add.
- `noticeType` (string): eForms notice type, e.g. cn-standard (contract notice), can-standard (award), pin-only (prior information), corr (legacy correction).
- `noticeSubtype` (string): eForms notice subtype number (1–40, E1–E6) as published.
- `formType` (string): eForms form type: planning, competition, result, dir-awa-pre, cont-modif, change, consultation.
- `procedureType` (string): Procedure type code, e.g. open, restricted, neg-w-call. Null when TED gives none.
- `publicationDate` (string): Publication day in the Official Journal S (YYYY-MM-DD, as published, not shifted to UTC).
- `publicationDateRaw` (string): Publication date exactly as TED returns it, with its time zone offset, e.g. 2026-10-01+02:00.
- `dispatchDate` (string): Day the buyer sent the notice to TED (YYYY-MM-DD).
- `ojsNumber` (string): Official Journal S issue, e.g. 190/2026.
- `title` (string): Notice title in the preferred language, or the fallback shown in titleLanguage.
- `titleLanguage` (string): Language of title (ISO 639-2, e.g. ENG). Differs from preferredLanguage when TED had no translation.
- `originalTitle` (string): Short procedure title in the buyer's original language.
- `description` (string): Procedure description in the preferred language or the fallback in descriptionLanguage, cut at 4,000 characters. Usually only in the original language.
- `descriptionLanguage` (string): Language of description (ISO 639-2).
- `buyerName` (string): Buyer (contracting authority) name. TED publishes it only in the original language, so buyerNameLanguage often differs from preferredLanguage.
- `buyerNameLanguage` (string): Language of buyerName (ISO 639-2).
- `buyerNames` (array): All buyer names of a joint procurement, in the same language as buyerName.
- `buyerCountry` (string): Buyer country, ISO 3166-1 alpha-3 (e.g. DEU).
- `buyerCountries` (array): All buyer countries (alpha-3), for joint cross-border procurements.
- `buyerCity` (string): Buyer city as published.
- `buyerWebsite` (string): Buyer organisation website as published in TED; some buyers give a bare domain without https://. Not a personal contact.
- `cpvCodes` (array): All CPV codes of the procedure and its lots, without duplicates (8 digits, no check digit).
- `mainCpvCode` (string): Main CPV code of the procedure.
- `placeOfPerformanceCountries` (array): Countries of performance (alpha-3), when published.
- `tenderDeadline` (string): Earliest deadline for tenders across lots, ISO 8601 with the published offset, e.g. 2026-11-04T10:00:00+01:00. Only the date when TED gives no time (see tenderDeadlineDateOnly). Null when the notice has no tender deadline (e.g. award or prior information notices).
- `tenderDeadlineDateOnly` (boolean): True when TED gave a deadline day without a time. Null when there is no deadline.
- `requestDeadline` (string): Earliest deadline for requests to participate (restricted and negotiated procedures): ISO 8601 date-time with the offset published by TED, or a YYYY-MM-DD date when TED gives no time.
- `estimatedValue` (number): Estimated value without VAT: the procedure estimate, or the sum of lot estimates when all lots have one in the same currency (see estimatedValueSource). Null when not published — never 0 as a placeholder.
- `estimatedValueCurrency` (string): Currency of estimatedValue (ISO 4217, e.g. EUR, CZK).
- `estimatedValueSource` (string): procedure = published procedure estimate; lots_sum = sum of the lot estimates.
- `totalValue` (number): TED total value: for award notices the total awarded value, for other notices the total published value. Null when absent or published in several currencies.
- `totalValueCurrency` (string): Currency of totalValue.
- `lotsCount` (integer): Number of lots in the notice (0 for legacy notices without lot data).
- `lotIds` (array): Lot identifiers, e.g. LOT-0001. A lot is part of the notice, never its own row.

## Input settings

- `mode` (string): search: every matching notice in the date window. monitor: only notices that earlier runs of the same monitor (monitorStateName) have not delivered yet — schedule it daily to get new tenders only. The first monitor run returns every match.
- `lastDays` (integer): Publication window when Date from is empty: the last N calendar days (UTC), including today. TED publishes on working days (Monday–Friday). 1–31, default 7, so the window always contains several working days.
- `dateFrom` (string): First publication day (YYYY-MM-DD), inclusive. Overrides Last N days. The window may be at most 31 days.
- `dateTo` (string): Last publication day (YYYY-MM-DD), inclusive. Default: today (or Date from, when it is in the future).
- `cpvCodes` (array): Up to 50 CPV codes (8 digits; a -N check digit is ignored), e.g. 72000000 for IT services or 45000000 for construction. TED also matches every sub-code of a broader code. Empty: all CPV codes.
- `buyerCountries` (array): ISO 3166-1 alpha-3 codes of the buyer country, e.g. DEU, FRA, POL (two-letter EU codes such as DE are converted). Empty: all countries.
- `noticeTypes` (array): eForms notice types. Empty: all types. Most bidders want cn-standard (contract notices); market research often adds can-standard (award notices).
- `keywords` (string): Optional full-text search in TED (all languages of the notice), e.g. cloud computing. Up to 200 characters; quotes, brackets and operators are removed.
- `preferredLanguage` (string): Language for title, description and links. When TED has no text in it, the row falls back to English, then to the notice's original language, and says which language was used (titleLanguage, buyerNameLanguage). Buyer names are usually only in the original language.
- `maxResults` (integer): Maximum notices (Dataset rows) per run, newest first. Each row is one paid notice event. 1–2500, default 100.
- `monitorStateName` (string): Monitor mode only: name of the snapshot of delivered notices (a-z, 0-9, -). Use a different name for each saved search, e.g. it-services-de. Stored in your named key-value store eu-ted-tenders-monitor.

## Step by step on Apify

1. Open the Input tab. The form is already filled: CPV `72000000`, last 7 days, 20 notices.
2. Optional: add buyer countries, for example `DEU` and `FRA`, or choose a notice type such as `cn-standard`.
3. Click Start.
4. Open the Output tab and look at the Overview view: title, buyer, country, deadline, value and link.

## Use cases

| Task | Input | Key fields | Next step |
|---|---|---|---|
| Find open tenders to bid on | `cpvCodes`, `buyerCountries`, `noticeTypes: ["cn-standard"]` | `title`, `tenderDeadline`, `estimatedValue`, `procurementDocumentsUrl` | Send to a sheet or CRM |
| Daily tender alerts | `mode: "monitor"`, schedule | `monitorStatus`, `title`, `noticeUrl` | Slack or e-mail via integrations |
| Market and competitor research | `noticeTypes: ["can-standard"]`, `dateFrom`/`dateTo` | `buyerName`, `totalValue`, `totalValueCurrency`, `cpvCodes` | Export to CSV or BI |
| Public-sector lead lists | `buyerCountries`, `cpvCodes` | `buyerName`, `buyerCity`, `buyerWebsite` | Enrich in your CRM |

## Tips

- Use monitor mode on a daily schedule. You get only notices you have not seen.
- One run covers up to 31 days. Use several runs for longer periods.
- Always open the official TED link and check the notice before you bid.

## Limits



- Window: at most 31 days per run. For longer periods, run once per month.
- Rows: at most 2,500 rows per run (`maxResults`). In our tests 2,500 rows took about 25 seconds.
- TED query window: TED serves only the first 15,000 notices of one query. A monitor run with very broad filters stops there with status `PARTIAL` and a warning; narrow the filters or use `lastDays` of 1–3.
- Run time: the Actor stops reading TED after about 4 minutes and keeps the rows it has (`PARTIAL`).
- Values as published: deadlines keep the time zone offset that TED publishes, even if it looks unusual. An `estimatedValue` of `0` means the buyer published 0; a missing value is `null`.
- Languages: buyer names and descriptions are often only in the original language. The `…Language` fields tell you which language you got.
- No personal contacts: contact e-mails and phone numbers are not returned.

## Sample result

```json
{
  "publicationNumber": "700154-2026",
  "procedureId": "c8e5ed0b-9c1a-4c7b-b32a-130c6ceda6a4",
  "noticeType": "cn-standard",
  "formType": "competition",
  "procedureType": "open",
  "publicationDate": "2026-10-09",
  "title": "Germany – IT services: consulting, software development, Internet and support – Wartungleistungen von Server- und Storagesystemen sowie Switchen",
  "titleLanguage": "ENG",
  "buyerName": "Land Hessen, vertreten durch die Hessische Zentrale für Datenverarbeitung",
  "buyerNameLanguage": "DEU",
  "buyerCountry": "DEU",
  "buyerCity": "Wiesbaden",
  "buyerWebsite": "https://vergabe.hessen.de",
  "mainCpvCode": "72000000",
  "tenderDeadline": "2026-11-09T10:00:00+01:00",
  "tenderDeadlineDateOnly": false,
  "requestDeadline": null,
  "estimatedValue": 345600,
  "estimatedValueCurrency": "EUR",
  "estimatedValueSource": "procedure",
  "lotsCount": 1,
  "lotIds": ["LOT-0000"],
  "noticeUrl": "https://ted.europa.eu/en/notice/-/detail/700154-2026",
  "pdfUrl": "https://ted.europa.eu/en/notice/700154-2026/pdf",
  "xmlUrl": "https://ted.europa.eu/en/notice/700154-2026/xml",
  "linkLanguage": "ENG",
  "dataModel": "eforms",
  "monitorStatus": null,
  "source": "TED",
  "fetchedAt": "2026-10-11T02:17:31.898Z"
}
```

## Use it from code

Actor ID: `cliqtomedia/eu-ted-tenders-scraper`

```python
from apify_client import ApifyClient

client = ApifyClient("YOUR_APIFY_TOKEN")
run = client.actor("cliqtomedia/eu-ted-tenders-scraper").call(run_input={
    "mode": "search",
    "lastDays": 7
})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)
```

```bash
curl -X POST "https://api.apify.com/v2/acts/cliqtomedia~eu-ted-tenders-scraper/run-sync-get-dataset-items?token=YOUR_APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"mode": "search", "lastDays": 7}'
```

```python
# pip install langchain-apify
# set APIFY_TOKEN in your environment
from langchain_apify import ApifyActorsTool

tool = ApifyActorsTool("cliqtomedia/eu-ted-tenders-scraper")
result = tool.invoke({"run_input": {"mode": "search", "lastDays": 7}})
print(result)
```

run-sync waits up to 300 seconds; for longer runs start a run and use a webhook. LlamaIndex and MCP: https://cliqtomedia.com/actors/ai-agents/

## Use cases with this tool

- [Reach out when the company is ready](https://cliqtomedia.com/actors/use-cases/buying-signals/): Know when a company hires, raises money or wins a contract. Reach out at the right moment.

## Similar tools

- [USAspending Federal Awards & Recipient Monitor](https://cliqtomedia.com/actors/usaspending-federal-awards-monitor/)
- [France Company & SIRET Search](https://cliqtomedia.com/actors/france-sirene-company-search/)
- [UK Bank Holidays & Business Day Calculator](https://cliqtomedia.com/actors/uk-bank-holidays-business-days/)
- [UK Postcode Lookup](https://cliqtomedia.com/actors/gb-postcode-lookup/)
- [VIN Decoder & Vehicle Recalls](https://cliqtomedia.com/actors/vin-decoder-vehicle-recalls/)
- [FDA Recalls & Enforcement Monitor](https://cliqtomedia.com/actors/fda-recalls-enforcement-monitor/)
