# Ausschreibungs-Radar DE/AT/EU – TED & service.bund.de (`datenfuchs/ausschreibungs-radar-tender-de-at-eu`) Actor

Neue öffentliche Ausschreibungen (Vergabe / public tenders) aus der offiziellen TED API und service.bund.de. Filter: Stichwort, CPV, Land, Bundesland/NUTS, IT oder alle Branchen. Nur neue Treffer seit dem letzten Lauf – ideal täglich per Zeitplan. Keine Personendaten.

- **URL**: https://apify.com/datenfuchs/ausschreibungs-radar-tender-de-at-eu.md
- **Developed by:** [Datenfuchs Labs](https://apify.com/datenfuchs) (community)
- **Categories:** Lead generation, Business, Automation
- **Security:** Limited permissions
- **Stats:** 1 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.00 / 1,000 new tenders

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

## Ausschreibungs-Radar: neue öffentliche Ausschreibungen aus TED & service.bund.de (DE/AT/EU)

By **Datenfuchs Labs** · Deutsch | [English below](#english)

Findet **neue öffentliche Ausschreibungen** (Vergabe, Aufträge der öffentlichen Hand) aus **offiziellen Quellen** – der **TED API** (EU-Amtsblatt) und dem **service.bund.de**-Feed – gefiltert nach Stichwort, **CPV-Code**, Land und **Bundesland / NUTS-Region**. Dank `onlyNew` bekommst du bei jedem Lauf **nur die Ausschreibungen, die du noch nicht gesehen hast**. Perfekt als täglicher Zeitplan mit E-Mail-, Slack- oder Sheets-Integration.

### Für wen?

- **IT-Dienstleister, Software- & Digitalagenturen** (Standard: IT-Fokus per CPV)
- **Bau, Handwerk, Reinigung, Beratung, Facility Management** (Sektor-Filter `off` bzw. eigene CPV-Codes)
- **Vertrieb / Business Development**, das öffentliche Aufträge in einer Region beobachtet

### Warum dieser Actor?

- **Offizielle Quellen:** TED API v3 (EU-weit, inkl. DE/AT) + service.bund.de (auch nationale Ausschreibungen unterhalb der EU-Schwellenwerte)
- **Nur neue Treffer:** Dedupe über Läufe (`onlyNew`), getrennte Gedächtnisse pro Suchprofil (`stateKey`)
- **Regional:** NUTS-Codes (z. B. `DE26` = Unterfranken, `AT13` = Wien) oder Bundesland-Namen (`Bayern`)
- **Günstig:** $0.002 pro neuer Ausschreibung – Läufe ohne neue Treffer kosten (fast) nichts
- **Nur bietbare Ausschreibungen (neu in 0.3):** Vergabe- und Änderungsbekanntmachungen (ca. 40 % des TED-Volumens) werden standardmäßig ausgefiltert – du siehst nur, worauf du dich noch bewerben kannst
- **Wettbewerbs-Radar (neu in 0.3):** `noticeFilter: "awards"` liefert Zuschläge mit Gewinner-Firma und Auftragswert – wer gewinnt in deiner Region welche Aufträge zu welchem Preis?
- **Keine Kontaktdaten:** nur Organisationsnamen (Vergabestelle, bei Zuschlägen die veröffentlichte Gewinner-Firma), keine E-Mails/Telefonnummern

### Schnellstart: täglicher Radar in 3 Schritten

1. Input wie unten anpassen (Stichwörter, CPV, Region) und einmal starten.
2. Als **Task speichern** und unter *Schedules* täglich laufen lassen (z. B. 07:00). `onlyNew` bleibt an.
3. Integration hinzufügen (E-Mail, Slack, Google Sheets, Webhook/Make/n8n) – du bekommst nur Neues.

Mehrere Suchen (z. B. „IT Bayern“ und „Bau NRW“)? Für jede einen eigenen Task mit eigenem `stateKey` anlegen.

### Beispiel-Inputs

**IT-Aufträge in Bayern:**

```json
{
  "keywords": ["Cloud", "Software", "künstliche Intelligenz"],
  "cpvCodes": ["72000000", "48000000"],
  "countries": ["DEU"],
  "regions": ["Bayern"],
  "onlyNew": true,
  "stateKey": "it-bayern"
}
```

**Bauleistungen in Österreich (alle Sektoren):**

```json
{
  "cpvCodes": ["45000000"],
  "countries": ["AUT"],
  "cpvFilter": "off",
  "onlyNew": true,
  "stateKey": "bau-at"
}
```

### Output je Ausschreibung

```json
{
  "source": "ted",
  "id": "700386-2026",
  "title": "Österreich – Reinigung von Abwässerkanälen – SFG: Kanal- und Schachträumung",
  "buyer": "Salzburger Flughafen GmbH",
  "country": "AUT",
  "region": "AUT",
  "cpv": ["90470000", "45232410"],
  "deadline": "2026-11-10+01:00",
  "value": null,
  "currency": null,
  "noticeType": "cn-standard",
  "published": "2026-10-12+02:00",
  "url": "https://ted.europa.eu/de/notice/-/detail/700386-2026"
}
```

Felder: source, id, title, buyer (nur Organisation), country, region (NUTS-Codes bzw. PLZ + Ort, keine Straße), cpv, deadline (früheste Angebotsfrist), value + currency (Summe der geschätzten Los-Werte, falls angegeben), noticeType, formType (competition / planning / result …), bei Zuschlägen winners + awardValue, published, url.

### Input-Felder

| Feld | Standard | |
|---|---|---|
| `keywords` | – | ODER-verknüpft; TED Volltext, service.bund.de Titel/Beschreibung |
| `cpvCodes` | – | z. B. 72000000 IT-Dienste, 48000000 Software, 45000000 Bau (nur TED) |
| `countries` | `["DEU"]` | ISO-3 Käuferland für TED (DEU, AUT, CHE …) |
| `regions` | – | NUTS-Codes oder Bundesland-Name |
| `sources` | `ted`, `bund` | Quellen |
| `noticeFilter` | `open` | `open` = offene Ausschreibungen + Vorinformationen; `awards` = Zuschläge/Änderungen mit Gewinner & Wert; `all` |
| `sinceDate` | vor 14 Tagen | veröffentlicht seit |
| `onlyNew` | true | nur noch nicht gesehene Ausschreibungen |
| `stateKey` | `default` | eigenes Dedupe-Gedächtnis pro Suchprofil |
| `maxResults` | 250 | pro Quelle |
| `cpvFilter` | `auto` | `auto` = IT-Fokus, außer du gibst Nicht-IT-CPV-Codes an; `it`; `off` = alle Branchen |
| `excludeCpvPrefixes` | Breitband, Bau, Vermessung … | nur im IT-Fokus |

### Preise

Pay-per-event ab **27. Oktober 2026**:

- `new-tender`: **$0.002** pro neuer Ausschreibung
- zzgl. Apifys kleiner Startgebühr pro Lauf

Beispiel: täglicher Radar mit ~10 neuen Treffern/Tag ≈ 300 Treffer/Monat ≈ **$0.60/Monat**.

### Grenzen (ehrlich)

- TED-Volltext ignoriert sehr kurze Begriffe: „KI“/„AI“ werden automatisch zu „künstliche Intelligenz“, „artificial intelligence“, „machine learning“ erweitert. Bindestrich-Begriffe wie „IT-Beratung“ werden zu den Wörtern ab 3 Zeichen (→ „beratung“, sehr breit). **Für präzise Treffer CPV-Codes nutzen.**
- service.bund.de-Feed: nur die neuesten ~500 Einträge, keine CPV-Codes, keine Werte; Keyword-Suche nur in Titel/Kurzbeschreibung. Darum regelmäßig (z. B. täglich) laufen lassen.
- Österreich national (z. B. USP/auftrag.at) und Länderportale (z. B. Bayern) sind noch nicht angebunden; AT nur über TED.
- Standard `noticeFilter: "open"` blendet Vergabebekanntmachungen (`can-*`, bereits vergeben) aus; mit `awards` bzw. `all` bekommst du sie (Gewinner/Wert nur, wenn die Vergabestelle sie veröffentlicht).
- Werte aus TED sind Angaben der Vergabestellen und teils unplausibel (z. B. „2 EUR“).
- TED data © Publications Office of the European Union (offene EU-Daten). service.bund.de stellt den RSS-Feed öffentlich bereit.

### English

**Public tender radar for Germany, Austria and the EU.** Collects new public procurement notices from the official **TED API v3** (filter by country, NUTS region, CPV, full text) and the public **service.bund.de** feed (German federal/state/municipal tenders, incl. below EU thresholds). Returns only tenders not seen in earlier runs (`onlyNew`, separate memory per `stateKey`) – schedule it daily and connect email/Slack/Sheets. Sector filter: IT focus by default, or `cpvFilter: "off"` for construction, cleaning, consulting etc. By default only biddable notices (open calls + prior information); `noticeFilter: "awards"` turns it into a competitor radar with winning company and award value. Output: id, title, buyer organisation, country/region, CPV, deadline, value if present, source link. No personal contact data. $0.002 per new tender. Limits: TED full-text ignores short tokens (KI/AI are expanded), use CPV codes for precision; the German feed only holds the latest ~500 items and has no CPV/values; Austrian national portals not yet covered. TED data © Publications Office of the European Union.

### Run locally

`npm install && npm start` with input in `storage/key_value_stores/default/INPUT.json`.

# Changelog

This Actor's version history is a separate document: https://apify.com/datenfuchs/ausschreibungs-radar-tender-de-at-eu/changelog.md

# Actor input Schema

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

Any keyword matches (OR). Full-text on TED; title/description on service.bund.de. Tip: use whole words with ≥ 3 letters ("KI"/"AI" are auto-expanded). For precise results combine with CPV codes.

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

Optional, e.g. 72000000 (IT services), 48000000 (software), 45000000 (construction), 90910000 (cleaning). TED only (service.bund.de feed has no CPV). Combined with keywords via OR.

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

Buyer country for TED, e.g. DEU, AUT, CHE.

## `regions` (type: `array`):

NUTS codes (e.g. DE2 = Bayern, DE26 = Unterfranken, AT13 = Wien) or German state names ('Bayern'). Empty = whole country.

## `sources` (type: `array`):

Sources.

## `noticeFilter` (type: `string`):

TED only. 'open' returns only notices you can still bid on or prepare for (contract notices + prior information notices) and drops award/modification notices (~40% of TED volume). 'awards' returns contract award notices with winning company and award value – useful to watch competitors and market prices. service.bund.de only lists open calls.

## `sinceDate` (type: `string`):

YYYY-MM-DD. Default: 14 days ago.

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

Return only tenders not seen in earlier runs (dedupe via named key-value store 'tender-radar-state'). Best with a daily schedule: each run delivers just the new tenders.

## `stateKey` (type: `string`):

Separate dedupe memory per saved task/profile (e.g. 'it-bayern', 'bau-nrw'), so several searches don't hide each other's results.

## `maxResults` (type: `integer`):

Max results per source.

## `cpvFilter` (type: `string`):

TED only. 'auto' keeps the IT focus unless your CPV codes include non-IT codes (e.g. 45000000), then all sectors are kept. Choose 'off' for construction, crafts, cleaning, consulting etc.

## `excludeCpvPrefixes` (type: `array`):

Only used with IT focus: drop TED notices whose main (first) CPV starts with one of these prefixes (default: ISP/broadband 724, construction 452/453, engineering/geodata 7131-7135, telecom 6420, 3252), unless a keyword matches the title. Set \[] to keep those subtrees; use Sector filter = off to keep all sectors.

## Actor input object example

```json
{
  "keywords": [
    "Cloud",
    "Software",
    "künstliche Intelligenz"
  ],
  "cpvCodes": [
    "72000000"
  ],
  "countries": [
    "DEU"
  ],
  "regions": [],
  "sources": [
    "ted",
    "bund"
  ],
  "noticeFilter": "open",
  "onlyNew": true,
  "stateKey": "default",
  "maxResults": 250,
  "cpvFilter": "auto",
  "excludeCpvPrefixes": [
    "724",
    "453",
    "452",
    "4523",
    "7131",
    "7132",
    "7133",
    "7135",
    "6420",
    "3252"
  ]
}
```

# Actor output Schema

## `overview` (type: `string`):

One item per new tender.

# 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 = {
    "keywords": [
        "Cloud",
        "Software",
        "künstliche Intelligenz"
    ],
    "cpvCodes": [
        "72000000"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("datenfuchs/ausschreibungs-radar-tender-de-at-eu").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 = {
    "keywords": [
        "Cloud",
        "Software",
        "künstliche Intelligenz",
    ],
    "cpvCodes": ["72000000"],
}

# Run the Actor and wait for it to finish
run = client.actor("datenfuchs/ausschreibungs-radar-tender-de-at-eu").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 '{
  "keywords": [
    "Cloud",
    "Software",
    "künstliche Intelligenz"
  ],
  "cpvCodes": [
    "72000000"
  ]
}' |
apify call datenfuchs/ausschreibungs-radar-tender-de-at-eu --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,datenfuchs/ausschreibungs-radar-tender-de-at-eu"
        }
    }
}
```

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/kr1fwR1Eu1rgd9nty/builds/CREuo9xctiXr7eJa0/openapi.json
