# German Public Tenders (Ausschreibungen) – Search & Excel Export (`vapiossi/german-public-tenders`) Actor

Search open public tenders from Germany (EU TED database) by keyword, federal state and category. Summaries in German, updated daily. Export to Excel/CSV or schedule daily alerts for new tenders.

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

## Pricing

from $2.00 / 1,000 results

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

## German Public Tenders (Ausschreibungen) – Search & Excel Export

Find **public contracts in Germany you can still bid on** – fill in a simple form, get a clean
table, download it as **Excel or CSV**. No scraping, no XML, no coding.

The data comes from **TED (Tenders Electronic Daily)**, the official EU procurement journal, **plus the national
tenders below the EU thresholds** from the German federal notice service – the many smaller contracts of
municipalities, districts and federal states that TED does not contain (about 4 times as many open calls).
Updated daily, deduplicated and enriched with a **short AI summary in plain German**, a category and keywords.

### What you can do with it

- **Search by keyword** – the search understands German compound words: `reinigung` also finds
  *Unterhaltsreinigung*. Use `OR` for alternatives (`photovoltaik OR solar`) and quotes for phrases.
- **Filter by federal state** (Bayern, NRW, Sachsen, ...) and **category** (IT & Software,
  Bau & Handwerk, Reinigung & Facility, Entsorgung & Abfall, Sicherheit & Bewachung, ...). Select several at once.
- **Only open calls** by default – tenders whose deadline has not passed. Contract awards
  ("who won what") and prior information notices are available too.
- **Skip tight deadlines** with *Minimum days until deadline*.
- **Choose the source**: all tenders, only EU-wide (TED) or only national tenders below the EU thresholds.
- **Daily alerts**: schedule the Actor (e.g. every morning) and turn on **Only new since last run** –
  each run delivers only tenders you have not seen yet. Connect it to email, Slack, Google Sheets
  or Zapier/Make via Apify integrations.
- **Use it from AI assistants** (Claude, ChatGPT, Cursor, ...) through Apify's MCP server.

### Typical users

- Construction, IT, cleaning, facility, waste management, security and consulting companies looking for new contracts
- Sales teams building a lead list of public buyers
- Consultants and tender services monitoring the market for clients
- Analysts researching public spending in Germany (use notice type *Contract awards*)

### Output

One row per tender. The table view shows the most important columns; the export contains all fields:

| Field | Description |
|---|---|
| `title` | Notice title (German) |
| `buyer`, `buyer_city` | Contracting authority and its city |
| `federal_states` | Federal state(s) of the place of performance |
| `category` | Category, e.g. *IT & Software* |
| `deadline`, `days_left` | Next relevant deadline and days remaining |
| `deadline_type` | `tender` = submit a bid, `participation` = submit a request to participate first |
| `published` | Publication date |
| `summary` | Short plain-language summary (German); `ai_summary` tells whether AI wrote it |
| `keywords`, `cpv_codes` | Keywords (German) and EU procurement codes (CPV) |
| `description` | Original description |
| `origin` | `ted` = EU-wide notice, `national` = national tender below the EU thresholds |
| `url` | Link to the official notice (TED) or to the tender documents on the procurement platform (national) |
| `id`, `region_codes`, `status`, `source` | Notice ID (TED number or `doe-…`), NUTS codes, notice type, attribution |

Example row:

```json
{
  "title": "Unterhaltsreinigung Rathaus und Schulen",
  "buyer": "Stadt Musterstadt",
  "buyer_city": "Köln",
  "federal_states": "Nordrhein-Westfalen",
  "category": "Reinigung & Facility",
  "deadline": "2026-10-20",
  "days_left": 23,
  "deadline_type": "tender",
  "published": "2026-09-25",
  "summary": "Die Stadt sucht einen Dienstleister für die Unterhaltsreinigung von Rathaus und drei Schulen für 4 Jahre.",
  "url": "https://ted.europa.eu/..."
}
```

### Pricing

**$2 per 1,000 tenders** – you pay only for delivered results. Set *Maximum results* to control the cost of
each run; with *Only new since last run* a daily schedule usually delivers just a handful of rows.

### Coverage & limitations

- Germany: all notices published on TED (contracts above the EU thresholds) **and** national calls for tenders
  below the EU thresholds from the federal notice service (Datenservice Öffentlicher Einkauf). National notices are
  calls for tenders only – contract awards come from TED.
- Summaries, keywords and categories are generated automatically and may contain errors –
  always check the official notice (`url`) before bidding.
- Texts are German (as published by the buyers); field names are English.

### Data source

Contains information from TED – Tenders Electronic Daily (ted.europa.eu), © European Union, and from the
Datenservice Öffentlicher Einkauf (oeffentlichevergabe.de, Beschaffungsamt des BMI, CC0).
Every row includes this attribution in the `source` field.

### Also available as an API

Need the data in your own software? The same data is available as a REST API on RapidAPI
("German Public Tenders API").

# Actor input Schema

## `query` (type: `string`):

Full-text search in title, summary, keywords, buyer and description (German texts). Matches word parts, e.g. `reinigung` also finds `Unterhaltsreinigung`. Words are combined with AND; use `OR` between words for alternatives and quotes for phrases. Leave empty to get all tenders matching the other filters.

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

Place of performance. Select one or more German federal states. Empty = all of Germany.

## `categories` (type: `array`):

Select one or more categories. Empty = all categories.

## `cpv` (type: `string`):

EU procurement vocabulary (CPV) prefix, e.g. `72` = IT services, `45` = construction, `90911` = cleaning.

## `status` (type: `string`):

By default only open calls for tenders whose deadline has not passed are returned.

## `origin` (type: `string`):

National tenders below the EU thresholds (municipalities, districts, federal states) come from the German federal notice service; EU-wide notices from TED.

## `minDaysLeft` (type: `integer`):

Only tenders whose deadline is at least this many days away – skip what you cannot prepare in time.

## `publishedSince` (type: `string`):

Only notices published on or after this date. Absolute (YYYY-MM-DD) or relative, e.g. `7 days`.

## `includeExpired` (type: `boolean`):

With notice type 'open': also return calls whose deadline has already passed.

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

Perfect for schedules: returns only tenders that were not delivered by a previous run with the same filters. The first run delivers all current matches.

## `sort` (type: `string`):

Order of the results. Relevance only applies when search terms are set.

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

Upper limit of tenders to return. You only pay for delivered results.

## Actor input object example

```json
{
  "query": "Photovoltaik",
  "status": "open",
  "origin": "all",
  "minDaysLeft": 0,
  "includeExpired": false,
  "onlyNew": false,
  "sort": "published",
  "maxItems": 100
}
```

# Actor output Schema

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

Table of found tenders – download as Excel, CSV or JSON.

# 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 = {
    "query": "Photovoltaik"
};

// Run the Actor and wait for it to finish
const run = await client.actor("vapiossi/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 = { "query": "Photovoltaik" }

# Run the Actor and wait for it to finish
run = client.actor("vapiossi/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 '{
  "query": "Photovoltaik"
}' |
apify call vapiossi/german-public-tenders --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,vapiossi/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/XpGrMd500oBvxqooT/builds/RiaHKLwOjpNezhZ1l/openapi.json
