# German Public Tenders (oeffentlichevergabe.de) (`darikami/german-public-tenders`) Actor

German public procurement notices (Vergabe) of a day or date range from the federal Bekanntmachungsservice (CC0 open data): also below the EU thresholds, not on TED. Filter by CPV, NUTS region, buyer, type. Title, buyer, CPV, value, deadline, winners.

- **URL**: https://apify.com/darikami/german-public-tenders.md
- **Developed by:** [DARIKAMI GmbH](https://apify.com/darikami) (community)
- **Categories:** Business, Lead generation
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$3.00 / 1,000 notice 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

## German Public Tenders (oeffentlichevergabe.de)

**German public tenders (Vergabe, Ausschreibung) by day, from the federal Bekanntmachungsservice at oeffentlichevergabe.de (CC0 open data).**
It includes the notices below the EU thresholds, which TED does not publish: on 2026-11-03, 321 of 1,021 notices were national only (VOB, VOL, UVgO).
**USD 0.003 per notice (USD 3 per 1,000).** Filter by CPV, NUTS region, buyer, notice type and keyword. You pay only for the notices that match.

| Title | Buyer | City | CPV | Deadline |
|---|---|---|---|---|
| Softwareconsulting DigiT1DMaster - Weiterentwicklung und Wartung | Helmholtz Zentrum München | Neuherberg | 72000000 | 2026-12-03 |
| Software Assurance MS Lizenzen | Kommunale Wasserwerke Leipzig GmbH | Leipzig | 72000000 | 2026-12-07 |
| 10048442_Microsoft_Unified_Support_Leistungen | Deutsche Gesellschaft für Internationale Zusammenarbeit (GIZ) GmbH | Eschborn | 72261000 | - |
| EiCoNeD2025 - Los 3 (Internet) | Freistaat Thüringen, Thüringer Landesrechenzentrum | Erfurt | 72411000 | 2026-12-03 |
| Rahmenvereinbarung iBS II | DB InfraGO AG | Frankfurt Main | 34632000 | - |

The rows come from a real cloud run of 04.11.2026: calls for tenders of 2026-11-03 with CPV prefix 72 (IT services). The full item is under Output.

### Who uses it

- **Bid teams of suppliers:** every morning, the new calls for tenders in your CPV codes and your region.
- **Tender alert services and CRMs:** a daily feed of structured notices, with deadlines and links.
- **Market analysis:** the contract awards - who won, for which buyer, at what value.

### What it does not do

- The newest day is yesterday: the source exports a day after midnight, German time.
- Few notices state an estimated value (46 of 597 calls for tenders on 2026-11-03).
- Germany only. The output has no contact persons.

### Input

```json
{
  "fromDate": "2026-11-02",
  "toDate": "2026-11-03",
  "noticeTypes": ["competition"],
  "cpvPrefixes": ["72"],
  "regions": ["DE2", "DE30"],
  "buyerContains": ["Stadt"],
  "keywords": ["Software"],
  "nationalOnly": false,
  "maxItems": 500
}
```

All fields are optional.
An empty input returns yesterday's calls for tenders.

| Field | What it does |
|---|---|
| `fromDate`, `toDate` | Publication days, German time (YYYY-MM-DD). Default: yesterday. At most 31 days per run. The newest day is yesterday. The oldest day is 2022-12-01. |
| `noticeTypes` | `competition` (calls for tenders, the default), `result` (contract awards), `planning` (prior information), `contract-modification`, `direct-award` (a direct award announced in advance), `change` (corrections), `completion`. |
| `cpvPrefixes` | CPV codes or their start: `45` = construction work, `72` = IT services, `7131` = engineering services. `45000000-7` means the same as `45`. |
| `regions` | NUTS codes or their start: `DE1` = Baden-Württemberg, `DE2` = Bavaria, `DE30` = Berlin, `DEA` = North Rhine-Westphalia. The actor compares the buyer's region and the place of performance. |
| `buyerContains` | Text in the buyer's name, case ignored. |
| `keywords` | Text in the title, the description or a lot title, case ignored. Most notices are in German. |
| `nationalOnly` | `true` keeps only notices under German law below the EU thresholds. |
| `maxItems` | The run stops after this number of notices. |

In each filter, one matching value is enough.
A notice must pass every filter that you set.

### Output

One item per notice version.
This is a call for tenders of 2026-11-03 (shortened):

```json
{
  "type": "notice",
  "noticeId": "00f90f53-ad69-47d5-bd31-f09a483a92dd",
  "noticeVersion": "01",
  "noticeUrl": "https://oeffentlichevergabe.de/ui/de/search/details?noticeId=00f90f53-ad69-47d5-bd31-f09a483a92dd",
  "publicationDate": "2026-11-03T03:10:25Z",
  "formType": "competition",
  "noticeType": "cn-standard",
  "legalBasis": "32014L0024",
  "scope": "EU",
  "procedureType": "open",
  "title": "GDSK BW Neubau GBG\n\nTiefbau- und Straßenbauarbeiten, DIN 18299 u.a.",
  "description": "Tiefbau- und Straßenbauarbeiten, DIN 18299",
  "internalReference": "26-10225",
  "mainNature": "works",
  "cpvMain": "45221250",
  "cpvCodes": ["45221250"],
  "estimatedValue": 1859249,
  "estimatedValueCurrency": "EUR",
  "lots": [{ "lotId": "LOT-0000", "title": "Tiefbau- und Straßenbauarbeiten, DIN 18299 u.a.", "estimatedValue": 1859249, "currency": "EUR", "cpvCodes": ["45221250"] }],
  "placesOfPerformance": [{ "city": "Bruchsal", "postCode": "76646", "nuts": "DE123", "country": "DEU" }],
  "buyerName": "Staatliches Hochbauamt Heidelberg",
  "buyerCity": "Heidelberg",
  "buyerNuts": "DE125",
  "buyers": [{ "name": "Staatliches Hochbauamt Heidelberg", "identifier": "08-A7182-41", "city": "Heidelberg", "postCode": "69115", "nuts": "DE125", "country": "DEU", "legalType": "omu-lbeh" }],
  "submissionDeadline": "2026-12-09T23:59:00+01:00",
  "participationDeadline": null,
  "awardedValue": null,
  "awardedValueCurrency": null,
  "winners": [],
  "personalDataRemoved": false,
  "exportDay": "2026-11-03",
  "source": "oeffentlichevergabe.de Open Data API (Bekanntmachungsservice, Procurement Office of the German Federal Ministry of the Interior), CC0"
}
```

- `scope`: `EU` = under an EU directive (the notice is also on TED). `national` = German law below the EU thresholds. `unknown` = the notice does not state it.
- `submissionDeadline`: the earliest deadline for tenders of all lots. `participationDeadline`: the earliest deadline for requests to participate (restricted procedures). Both come from the notice's eForms data.
- `winners` (results, modifications, direct awards): the organisations that the notice names as tenderers or winners. `awardedValue` is the total value that the notice states.
- Texts stay in the language of the notice, mostly German.

### Pricing (pay per event)

| Event | Price | When |
|---|---|---|
| `notice` | **USD 0.003** | one notice that matched your filters, pushed to the dataset |

Free: notices that your filters drop, error items, and the note "nothing matched".
1,000 notices cost USD 3.
On 2026-11-03 (a Tuesday) the source published 1,021 notices, of them 597 calls for tenders.
The 7 days from 2026-10-27 to 2026-11-02 had 5,469 notices.

### Personal data

The actor filters persons out, and the filter works on patterns. Before it pushes a notice:

- It does not read a contact point (names, e-mail addresses, telephone numbers of contact persons).
- It removes e-mail addresses and telephone numbers from all texts. They show as `[e-mail removed]` and `[phone removed]`.
- It removes a name after a salutation (Herr, Frau) or a contact label (Ansprechpartner:). The name shows as `[name removed]`.
- A winner keeps its name only when it is a company or a public body. A sole trader or a partnership of persons shows with `nameWithheld: true`. Only its size, region and country stay.

`personalDataRemoved: true` marks a notice that the filter changed.
On 2026-11-03 the filter changed 120 of 1,021 notices and withheld 72 of 355 winner names.
The filter works on patterns.
A name in free text without a salutation or a label can stay.

A company named after a person keeps its name, because it is a legal person.

### Data source and terms

- **Source:** the Open Data API of the Bekanntmachungsservice, `https://oeffentlichevergabe.de/api/notice-exports` (documentation: `https://oeffentlichevergabe.de/documentation/api/opendata`).
  The Procurement Office of the German Federal Ministry of the Interior operates it.
- **Terms (publication policy, read 2026-11-04):** "The publication of the procurement data at https://oeffentlichevergabe.de aims to ensure that all information on public procurement of the Publication Service is accessible online and in open formats, so that it can be used, reused and redistributed by any interested party."
  "The data provided as Open Data is under the Creative Commons CC Zero licence."
- The Publication Service is only the publication platform.
  The contracting authority that issues a notice is responsible for its content.
  For an official procedure, read the notice at `noticeUrl` and the procurement documents.
- The actor sends one request per day of data, and a second one for the deadlines of calls for tenders and corrections.

### Limits

- The newest day is yesterday: the source exports a day after midnight, German time.
- Few notices state an estimated value: 46 of 597 calls for tenders on 2026-11-03.
- A notice without a NUTS code for its buyer and its place of performance does not pass a `regions` filter (77 of 1,021 on 2026-11-03).
- A notice version is one item: a correction of an earlier call comes as a new version (`noticeVersion`).

### Run summary

The run summary is in the default key-value store under `SUMMARY`, the counts under `STATS`.
The data comes as the source publishes it, without warranty.

**More official-data actors by darikami:** [Swiss UID & VAT validator](https://apify.com/darikami/swiss-uid-validator) · [Swiss electricity tariffs](https://apify.com/darikami/swiss-electricity-tariffs) · [Swiss federal law MCP](https://apify.com/darikami/swiss-federal-law-mcp) · [SEC company fundamentals](https://apify.com/darikami/sec-company-fundamentals).
In an AI agent: ask the Apify MCP server (`mcp.apify.com`) for `darikami/german-public-tenders`.

# Actor input Schema

## `fromDate` (type: `string`):

First publication day (YYYY-MM-DD, German time). Empty: yesterday. The export starts on 2022-12-01; the newest day is yesterday.

## `toDate` (type: `string`):

Last publication day, included (YYYY-MM-DD). Empty: yesterday when a start day is set, else the same day. At most 31 days per run.

## `noticeTypes` (type: `array`):

Which notices to return. competition = open calls for tenders (with the deadline), result = contract awards (with the value and the winners), planning = prior information, contract-modification, direct-award = a direct award announced in advance (VEAT), change = corrections, completion = contract completions. Default: competition.

## `cpvPrefixes` (type: `array`):

Keep notices with a CPV code that starts with one of these. 45 = construction work, 72 = IT services, 7131 = engineering services. Trailing zeros and the check digit are ignored (45000000-7 = 45).

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

Keep notices whose buyer or place of performance lies in one of these NUTS regions or their parts. DE1 = Baden-Württemberg, DE2 = Bavaria, DE30 = Berlin, DEA = North Rhine-Westphalia.

## `buyerContains` (type: `array`):

Keep notices whose buyer name contains one of these texts (case ignored), e.g. "Stadt München", "Autobahn".

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

Keep notices whose title, description or lot titles contain one of these words (case ignored). Most notices are in German.

## `nationalOnly` (type: `boolean`):

Keep only notices under German law below the EU thresholds (VOB, VOL, UVgO). TED does not carry these.

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

Stop after this many notices. Empty: no limit.

## Actor input object example

```json
{
  "noticeTypes": [
    "competition"
  ],
  "cpvPrefixes": [
    "72"
  ],
  "nationalOnly": false
}
```

# Actor output Schema

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

One item per notice: title, buyer, CPV codes, places of performance, estimated value, deadline, and for results the awarded value and the winners.

## `summary` (type: `string`):

SUMMARY record: pushed, charged, attempts, errors, stoppedByBudget, ok, message.

## `stats` (type: `string`):

STATS record: days, notices in the export, matched, emitted, charged, calls for tenders with a deadline, notices changed by the privacy filter.

# 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 = {
    "cpvPrefixes": [
        "72"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("darikami/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 = { "cpvPrefixes": ["72"] }

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

```

## MCP server setup

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