# EU Tenders Monitor Germany & Austria (TED) (`mabun/ted-tenders-dach`) Actor

Get new public tenders from Germany and Austria (and any EU country) from the official TED API (Tenders Electronic Daily). Filter by CPV code, keyword, date and notice type. Monitor mode returns only tenders you haven't seen. German titles, no personal data, no start fee, $3 per 1,000.

- **URL**: https://apify.com/mabun/ted-tenders-dach.md
- **Developed by:** [Maximilian van Elst](https://apify.com/mabun) (community)
- **Categories:** Business, Lead generation, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$3.00 / 1,000 tender returneds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## EU Tenders Monitor Germany & Austria (TED)

**Get new public tenders from Germany and Austria – and any other EU country – as clean JSON, CSV or Excel, straight from the official TED API of the EU Publications Office.** Filter by CPV code, keyword and date, and switch on **monitor mode** to receive (and pay for) only tenders you have not seen before.

EU Tenders Monitor is a lightweight **TED tenders API** for bid managers, sales teams and AI agents: no login, no proxy, no browser, one flat record per notice, German titles by default.

### What does EU Tenders Monitor Germany & Austria do?

- Searches **TED (Tenders Electronic Daily)**, the EU's official journal for public procurement above the EU thresholds ([ted.europa.eu](https://ted.europa.eu))
- Filters by **buyer country**, **CPV code prefixes** (e.g. `72` = IT services), **full-text keywords**, **publication window** and **notice type** (open calls or contract awards)
- Returns **German titles and buyer names by default** (English or French on request) wherever TED provides that language – for German and Austrian notices it does
- **Monitor mode (`onlyNew`)** remembers what you already received – schedule it daily and get a clean feed of new tenders only
- Outputs **no personal data** (no contact persons, e-mails or phone numbers)

### Who uses this TED tender monitor?

- **IT service providers, software vendors, engineering and construction firms** bidding on public contracts in Germany and Austria
- **Bid managers and tender consultants** watching several CPV codes for multiple clients
- **Market researchers** who want to know who buys what – and who won at what price (award notices)
- **AI agent builders** who need a structured tender feed for automatic bid/no-bid qualification

### Use cases: public procurement monitoring for Germany & Austria

- 📬 **Daily tender alert** – schedule at 7:00, send new tenders to Slack, e-mail or a Google Sheet
- 📊 **Contract award analysis** – collect award notices (`noticeTypes: "awards"`) to see awarded values per buyer
- 🤖 **AI bid qualification** – pipe new tenders into an LLM that scores them against your offering
- 🗂️ **CRM enrichment** – push public-sector opportunities into HubSpot, Pipedrive or Airtable via Make, Zapier or n8n

### How to monitor TED tenders in 4 steps

1. Click **Start** – the prefilled input (Germany + Austria, IT services & software, last 7 days, max 20 results) runs in a few seconds.
2. Adjust countries, CPV codes and keywords.
3. For alerts: set `onlyNew: true`, give the search a `monitorId`, and add a **schedule** (e.g. daily at 7:00).
4. Download results as JSON, CSV or Excel, or connect an integration.

### Input example

```json
{
  "countries": ["DEU", "AUT"],
  "cpvCodes": ["72", "48"],
  "keywords": ["cloud", "künstliche Intelligenz"],
  "publishedWithinDays": 7,
  "noticeTypes": "competition",
  "language": "deu",
  "onlyNew": true,
  "monitorId": "it-dach",
  "maxItems": 100
}
```

| Field | Meaning |
|---|---|
| `countries` | Buyer countries, ISO 3166-1 alpha-3 (`DEU`, `AUT`, `LUX`, `NLD` …) |
| `cpvCodes` | CPV prefixes: `72` IT services, `48` software, `45` construction, `79` business services, `71` engineering … Empty = all |
| `keywords` | Full-text search, any match. Avoid very short terms like "KI" – TED matches them very broadly |
| `publishedWithinDays` | Publication window in days (1–365) |
| `noticeTypes` | `competition` (open calls), `awards` (results incl. awarded value) or `all` |
| `language` | `deu`, `eng` or `fra` for titles and buyer names |
| `onlyNew` + `monitorId` | Monitor mode: only notices not returned in earlier runs of the same monitor |
| `maxItems` | Upper limit of returned tenders (cost cap) |

#### Popular CPV codes for German and Austrian tenders

| CPV prefix | Sector |
|---|---|
| `72` | IT services, consulting, software development |
| `48` | Software packages and information systems |
| `45` | Construction work |
| `71` | Architecture and engineering services |
| `79` | Business services (consulting, marketing, HR) |
| `33` | Medical equipment |

### Output: TED tender data fields

Real record from a test run on 21 Oct 2026 (Germany, CPV 72/48, last 7 days):

```json
{
  "publicationNumber": "726794-2026",
  "title": "Auslagerung SAP Basis Betrieb",
  "buyerName": "Universitätsklinikum Aachen AöR",
  "buyerCountry": "DEU",
  "publicationDate": "2026-10-21",
  "deadline": "2026-11-10",
  "cpvCodes": ["72200000"],
  "estimatedValue": null,
  "currency": null,
  "awardedValue": null,
  "city": "Aachen",
  "noticeType": "cn-standard",
  "formType": "competition",
  "procedureType": "open",
  "url": "https://ted.europa.eu/de/notice/-/detail/726794-2026",
  "pdfUrl": "https://ted.europa.eu/de/notice/726794-2026/pdf",
  "scrapedAt": "2026-10-21T19:49:16.187Z"
}
```

Award notice example (`noticeTypes: "awards"`, Austria): `"title": "IT-Dienstleistungen 2025"`, `"buyerName": "… Bundesbeschaffung GmbH"`, `"awardedValue": 35000000`, `"currency": "EUR"`.

Fields TED does not provide for a notice are `null` – many notices have no estimated value, or a deadline only in the tender documents.

### How much does the TED tenders API cost?

Pay-per-event pricing – you only pay for results, platform compute is included:

| Event | Price |
|---|---|
| Tender returned | **$0.003** per tender ($3 per 1,000) |

**No start fee.** Empty runs and notices skipped in monitor mode cost nothing.

- Prefilled test run (max 20 tenders): **≤ $0.06**
- Daily IT-tender alert for DE + AT, CPV 72/48 (our test: 201 notices in one week, ~35 per working day): **about $0.10 per day, ~$2–3 per month**
- One-off 30-day export of 1,000 tenders: **$3**

Use `maxItems` as a hard cost cap. The Apify free plan's monthly credit is enough to try it out.

### Use the TED API from Python, JavaScript or cURL

**Python**

```python
from apify_client import ApifyClient

client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("mabun/ted-tenders-dach").call(run_input={
    "countries": ["DEU", "AUT"], "cpvCodes": ["72"], "publishedWithinDays": 7, "maxItems": 50
})
for tender in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(tender["publicationDate"], tender["title"], tender["url"])
```

**JavaScript**

```js
import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: '<YOUR_APIFY_TOKEN>' });
const run = await client.actor('mabun/ted-tenders-dach').call({ countries: ['AUT'], cpvCodes: ['45'], maxItems: 50 });
const { items } = await client.dataset(run.defaultDatasetId).listItems();
```

**cURL** (synchronous run, returns the tenders directly)

```bash
curl -X POST "https://api.apify.com/v2/acts/mabun~ted-tenders-dach/run-sync-get-dataset-items?token=<YOUR_APIFY_TOKEN>" \
  -H "Content-Type: application/json" \
  -d '{"countries":["DEU"],"cpvCodes":["72"],"maxItems":20}'
```

### Use with AI agents (MCP)

Add the Actor as a tool to Claude, ChatGPT, Cursor or any MCP client via the Apify MCP server:
`https://mcp.apify.com?tools=mabun/ted-tenders-dach`
Example prompt: *"Find new IT tenders from German universities published this week and rank them by fit for an SAP consultancy."*

### Integrations

- **Schedules** – run daily or hourly; with `onlyNew` you get a clean incremental feed
- **Webhooks** – trigger your own endpoint when a run finishes
- **Make, Zapier, n8n, Google Sheets, Slack, Airtable** – via Apify's ready-made integrations

### FAQ

**Does it cover Switzerland?** Only Swiss notices published on TED, which is rare. Switzerland's main platform simap.ch is not part of TED.

**Does it include national tenders below the EU thresholds?** No. TED covers above-threshold tenders. Purely national notices (e.g. only on service.bund.de or regional portals) are not included.

**Which other EU countries work?** Any country that publishes on TED – just change `countries`, e.g. `["NLD", "BEL", "LUX"]`. If TED has no title in your chosen `language`, you get the original-language title (in our test with Dutch and Belgian notices: Dutch and French).

**How does monitor mode work?** Publication numbers are stored in a named key-value store in your account, separately per `monitorId`. The next run returns only notices not seen before.

**Can I search in English?** Yes – set `language: "eng"`. Keywords are matched against the full notice text, so add German and English terms for best recall.

**Is it legal to use TED data?** This Actor does not scrape web pages; it uses TED's public search API. TED data is © European Union and may be reused under the EU Publications Office reuse policy – check the current terms on ted.europa.eu for your use case.

### Limitations

- Above-threshold EU notices only; no below-threshold national portals
- Values (`estimatedValue`, `awardedValue`) depend on what the buyer published – often empty
- `deadline` is the first lot deadline; multi-lot tenders may have several
- `pdfUrl` opens the official notice PDF in a browser; full tender documents are on the buyer's procurement platform
- Up to 10,000 results per run

### Related Actors by the same developer

- [EPO Patent Search & Monitor](https://apify.com/mabun/epo-patent-search) – new European patents by keyword, applicant or CPC
- [RSS Feed Monitor](https://apify.com/mabun/rss-feed-monitor) – only new items from any feed, with keyword alerts
- [PDF to Text & RAG Chunks](https://apify.com/mabun/pdf-text-extractor-rag) – turn linked PDFs into clean text or RAG chunks for LLMs

### Support

Found a bug or need another field or country preset? Open an issue on the Actor's **Issues** tab.

# Actor input Schema

## `countries` (type: `array`):

Country of the contracting authority, e.g. DEU, AUT, LUX, BEL, NLD. Switzerland is not part of TED's EU scope.

## `cpvCodes` (type: `array`):

Common Procurement Vocabulary prefixes, e.g. 72 (IT services), 48 (software), 45 (construction), 79 (business services). Empty = all.

## `keywords` (type: `array`):

Any of these words must appear in the notice text. Use German and English terms, e.g. software, KI, cloud.

## `publishedWithinDays` (type: `integer`):

Only notices published in this time window (TED publishes on working days).

## `noticeTypes` (type: `string`):

Open calls for competition only, or also award results and other notices.

## `language` (type: `string`):

Language used for title and buyer name when available.

## `onlyNew` (type: `boolean`):

Remembers publication numbers in a named key-value store. Combine with a daily schedule to get a feed of new tenders and pay only for new ones.

## `monitorId` (type: `string`):

Separate memory for different searches when onlyNew is on.

## `maxItems` (type: `integer`):

Maximum number of tenders to return (you pay per tender).

## Actor input object example

```json
{
  "countries": [
    "DEU",
    "AUT"
  ],
  "cpvCodes": [
    "72",
    "48"
  ],
  "keywords": [],
  "publishedWithinDays": 7,
  "noticeTypes": "competition",
  "language": "deu",
  "onlyNew": false,
  "monitorId": "default",
  "maxItems": 20
}
```

# Actor output Schema

## `tenders` (type: `string`):

Tender notices (publication number, title, buyer, country, dates, CPV codes, estimated value, link).

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "countries": [
        "DEU",
        "AUT"
    ],
    "cpvCodes": [
        "72",
        "48"
    ],
    "keywords": [],
    "maxItems": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("mabun/ted-tenders-dach").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "countries": [
        "DEU",
        "AUT",
    ],
    "cpvCodes": [
        "72",
        "48",
    ],
    "keywords": [],
    "maxItems": 20,
}

# Run the Actor and wait for it to finish
run = client.actor("mabun/ted-tenders-dach").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "countries": [
    "DEU",
    "AUT"
  ],
  "cpvCodes": [
    "72",
    "48"
  ],
  "keywords": [],
  "maxItems": 20
}' |
apify call mabun/ted-tenders-dach --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,mabun/ted-tenders-dach"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/CViDnnHxx84N360Ov/builds/cWvppawAihgXun4kN/openapi.json
