# German Public Tenders (`avorelis/german-public-tenders`) Actor

Find open German public tenders (Ausschreibungen) from the official EU TED database. Filter by keyword, CPV industry, region and deadline.

- **URL**: https://apify.com/avorelis/german-public-tenders.md
- **Developed by:** [Patrick Karban](https://apify.com/avorelis) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.00 / 1,000 tender delivereds

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

### What does German Public Tenders do?

**German Public Tenders** finds open public tenders (Ausschreibungen) from Germany in the official EU procurement database **TED (Tenders Electronic Daily)** and returns them as clean, structured data: title, buyer, CPV industry codes, region, bid deadline, estimated value and direct links to the tender documents. Austria and other EU countries are supported too.

The data comes from the official TED Search API of the Publications Office of the EU. TED notices may be reused freely, also commercially, with attribution (CC BY 4.0). No contact persons, e-mail addresses or phone numbers are included.

Typical uses:

- **Daily or weekly tender alerts** for your industry, e.g. all new IT, cleaning or construction tenders in your region
- **Lead lists for bid teams and consultants** with deadlines and document links
- **Market research** on public demand by region, CPV category and buyer
- **Automations and AI agents** that screen new tenders and draft bid/no-bid decisions

### How to use German Public Tenders

1. Choose filters: keywords, CPV codes (industry) and NUTS regions. All are optional.
2. Keep **Only tenders still open for bids** enabled to get tenders you can still bid on, or set **Published within the last days** (e.g. `7`) for a weekly monitor.
3. Set **Maximum results** to cap the number of tenders and the cost, click **Start**, then export as JSON, CSV or Excel, or schedule the run.

### Input

| Field | Required | Example | Description |
|---|---|---|---|
| `keywords` | no | `Photovoltaik` | Words searched in the full notice text |
| `cpvCodes` | no | `["72"]` | CPV codes, shorter codes include all sub-categories (`72` = IT services, `45` = construction, `90910000` = cleaning) |
| `regions` | no | `["DE3"]` | NUTS codes of the place of performance (`DE3` = Berlin, `DE2` = Bavaria, `DEA` = North Rhine-Westphalia) |
| `countries` | no | `["DEU"]` | Buyer countries (ISO alpha-3), default Germany. Also AUT, LUX, BEL, NLD, FRA, POL, CZE, DNK, ITA, ESP |
| `openOnly` | no | `true` | Only tenders whose bid deadline is today or later (default) |
| `publishedWithinDays` | no | `7` | Only tenders published within this number of days |
| `maxItems` | no | `100` | Stop after this many tenders |

Example input for all open IT tenders in Berlin:

```json
{ "cpvCodes": ["72"], "regions": ["DE3"], "maxItems": 100 }
```

### Output example

```json
{
    "publicationNumber": "654812-2026",
    "title": "Lieferleistung: IT-Hardware-Komponenten für Videokonferenzsysteme in Besprechungsräumen - Vergabe-Nummer: 2370/26",
    "description": "Rahmenvertrag über den Kauf und die Lieferung von IT-Hardware-Komponenten für Videokonferenzsysteme für Besprechungsräume mit verschiedenen Raumgrößen (klein, mittel, groß) an den Standorten des BBR in Berlin, Bonn und Cottbus",
    "buyerName": "Bundesamt für Bauwesen und Raumordnung",
    "buyerCity": "Bonn",
    "buyerType": "cga",
    "country": "DEU",
    "nutsCodes": ["DE300", "DEA22", "DE402", "DEU"],
    "mainCpv": "32232000",
    "cpvCodes": ["32232000"],
    "noticeType": "cn-standard",
    "procedureType": "open",
    "contractNature": "supplies",
    "publicationDate": "2026-09-23",
    "deadline": "2026-10-22T10:30",
    "estimatedValue": 467000,
    "currency": "EUR",
    "durationValue": 4,
    "durationUnit": "YEAR",
    "documentsUrl": "https://www.evergabe-online.de/tenderdocuments.html?id=889045",
    "submissionUrl": "https://www.evergabe-online.de/tenderdetails.html?id=889045",
    "noticeUrl": "https://ted.europa.eu/de/notice/-/detail/654812-2026",
    "pdfUrl": "https://ted.europa.eu/de/notice/654812-2026/pdf",
    "source": "TED - Tenders Electronic Daily, Publications Office of the EU (CC BY 4.0)"
}
```

#### Output fields

| Field | Description |
|---|---|
| `publicationNumber` | TED publication number |
| `title` | Title of the tender, German where available |
| `description` | Short description, max. 1,500 characters, contact details removed |
| `buyerName` | Contracting authority (organisation) |
| `buyerCity` | City of the contracting authority |
| `buyerType` | Legal type of the buyer as TED code, e.g. `cga` = central government |
| `country` | Country of the buyer |
| `nutsCodes` | NUTS codes of the place of performance |
| `mainCpv` | Main CPV code |
| `cpvCodes` | All CPV codes |
| `noticeType` | TED notice type, e.g. `cn-standard` = contract notice |
| `procedureType` | Procedure type, e.g. `open`, `restricted` |
| `contractNature` | `services`, `supplies` or `works` |
| `publicationDate` | Publication date on TED |
| `deadline` | Earliest bid deadline across lots |
| `estimatedValue` | Estimated value, only if published by the buyer (in about 15% of German notices) |
| `currency` | Currency of the estimated value |
| `durationValue` | Contract duration, only if published |
| `durationUnit` | Unit of the duration |
| `documentsUrl` | Tender documents on the buyer's e-tendering platform |
| `submissionUrl` | Where bids are submitted |
| `noticeUrl` | The notice on TED |
| `pdfUrl` | German PDF of the notice |
| `source` | Source and license attribution |

### How much does it cost?

You pay per delivered tender. The price per 1,000 tenders is shown on the **Pricing** tab. Runs that find nothing cost nothing for results, and **Maximum results** plus your own spending limit always cap the cost.

### FAQ

#### Is it legal to use this data?

Yes, TED notices may be reused freely for commercial and non-commercial purposes with attribution (CC BY 4.0), according to the TED legal notice. The Actor uses the official public TED Search API, respects rate limits and returns no personal contact data. Keep the `source` attribution when you republish the data.

#### Why are value and duration often empty?

Many buyers do not publish an estimated value or duration in the notice. The Actor returns what TED publishes and leaves the field empty otherwise.

#### Does it include national tenders below the EU threshold?

No. TED contains tenders above the EU thresholds and some voluntarily published ones. Smaller national tenders are only published on national portals.

#### Why did my run stop early?

Either **Maximum results** or your spending limit was reached. The status message of the run tells you which one.

#### Can I use it through the API or with AI agents?

Yes. Every input field is documented for API and MCP use. Call the Actor with a JSON input like `{"cpvCodes": ["72"], "regions": ["DE3"]}`.

#### I found a problem or need another field

Please open an issue on the **Issues** tab. Issues are answered in writing.

# Actor input Schema

## `keywords` (type: `string`):

Optional words to search in the full notice text, e.g. "Photovoltaik" or "Reinigung Schule". Several words are combined. Leave empty to get all tenders matching the other filters.

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

Optional CPV codes of the procurement category. Shorter codes include all sub-categories, e.g. "72" for all IT services, "45" for construction work, "90910000" for cleaning services.

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

Optional NUTS region codes of the place of performance. Shorter codes include all sub-regions, e.g. "DE3" for Berlin, "DE2" for Bavaria, "DEA" for North Rhine-Westphalia, "DE21" for Upper Bavaria.

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

Countries of the contracting authority as ISO 3166 alpha-3 codes. Default is Germany ("DEU"). Also supported: AUT, LUX, BEL, NLD, FRA, POL, CZE, DNK, ITA, ESP.

## `openOnly` (type: `boolean`):

If enabled, only tenders whose bid deadline is today or later are returned. Disable to also search older, closed tenders.

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

Optional. Only tenders published within this number of days, e.g. 7 for a weekly monitor. Leave empty for no date limit.

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

Stop after this many tenders. Each delivered tender is charged once, so this also caps the cost of a run.

## Actor input object example

```json
{
  "keywords": "Photovoltaik",
  "cpvCodes": [
    "72",
    "48"
  ],
  "regions": [
    "DE3",
    "DE21"
  ],
  "countries": [
    "DEU"
  ],
  "openOnly": true,
  "publishedWithinDays": 7,
  "maxItems": 100
}
```

# Actor output Schema

## `results` (type: `string`):

No description

# 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 = {
    "cpvCodes": [
        "72"
    ],
    "countries": [
        "DEU"
    ],
    "maxItems": 100
};

// Run the Actor and wait for it to finish
const run = await client.actor("avorelis/german-public-tenders").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 = {
    "cpvCodes": ["72"],
    "countries": ["DEU"],
    "maxItems": 100,
}

# Run the Actor and wait for it to finish
run = client.actor("avorelis/german-public-tenders").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 '{
  "cpvCodes": [
    "72"
  ],
  "countries": [
    "DEU"
  ],
  "maxItems": 100
}' |
apify call avorelis/german-public-tenders --silent --output-dataset

```

## MCP server setup

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

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/HApVwL3HMn2KjyGW6/builds/ZBnOdgjBJFDBcwnG8/openapi.json
