# German Public Tenders Scraper – service.bund.de Ausschreibungen (`fast_data_asap/german-public-tenders-bund`) Actor

German public tenders (Ausschreibungen) from the official service.bund.de portal as flat JSON: title, contracting authority, location, category, procedure, CPV, deadline. Filter by keyword, Bundesland, category, date. For B2B lead alerts. Pay per tender.

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

## Pricing

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

## German Public Tenders Scraper – service.bund.de Ausschreibungen

Get **German public tenders (öffentliche Ausschreibungen)** of federal, state and municipal contracting authorities as clean, flat JSON. The Actor queries the official public tender search of **service.bund.de**, the central publication portal of the German federal administration (operated by the Federal Office of Administration, BVA), which aggregates calls for tenders from evergabe.de, Vergabe24, subreport, the Länder procurement platforms and more.

Filter by **keyword, Bundesland, category (construction works, services, supplies), procurement rules and publication date** and receive one row per tender – ready for B2B lead alerts, CRM import, Slack/e-mail notifications, n8n/Make/Zapier workflows or AI agents.

### Who is it for?

- **Companies selling to the public sector** (IT, construction, cleaning, consulting, facility management, healthcare suppliers) who want a daily feed of new tenders that match their offer.
- **Bid managers and tender consultants** monitoring several regions and categories at once.
- **Lead-gen and market-research teams** analysing which authorities buy what, where – including awarded contracts.
- **Developers and AI agents** that need structured German procurement data without parsing HTML.

### Why this Actor?

- **Official source only** – the public service.bund.de search, no login, no API key, no bot-protection tricks.
- **Flat, AI-friendly rows** – title, contracting authority, place of performance, postal code, city, Bundesland, category, procedure rules (VOB/VgV/UVgO), procedure type (Offenes Verfahren, Öffentliche Ausschreibung …), EU/national scope, CPV codes, publication date, deadline with time and the link to the original notice.
- **Real filters** – the same facets as the portal (Bundesland, Leistungen und Erzeugnisse, Vergabeverfahren) plus a "last N days" window, exclude words and a hard `maxItems` cap.
- **Privacy by design** – no contact persons, e-mail addresses or phone numbers are collected; only the contracting organisation.
- **Fast and cheap** – 10 enriched tenders in about 30 seconds; you only pay for tenders that are returned.

### Input

| Field | Description |
|---|---|
| `keywords` | Search terms (German works best). Each keyword is searched separately, results are merged without duplicates. Empty = newest tenders of all topics. |
| `states` | Bundesländer, e.g. `Bayern`, `Nordrhein-Westfalen`, or `Bundesweit / ohne Angabe`. |
| `categories` | `Bauleistungen` (works), `Dienstleistungen` (services), `Lieferleistungen` (supplies) or finer ones like `Informationstechnik`. |
| `lastDays` | Only tenders published in the last N days (0 = all currently open). |
| `maxItems` | Maximum tenders returned and charged per run. |
| `includeDetails` | Adds category, procedure rules, procedure type, scope, CPV codes, Bundesland and the official notice link (default on). |
| `procedureRules` | Optional: `VOB`, `VgV`, `VOL`, `UVgO`, `VOF`, `SektVO`, `KonzVgV`, `VSVgV`, `Sonstige`. |
| `excludeKeywords` | Drop tenders whose title contains one of these words. |
| `awardedContracts` | Return awarded contracts (Vergebene Aufträge) instead of open tenders. |

Example:

```json
{
  "keywords": ["Software"],
  "states": ["Baden-Württemberg", "Bayern"],
  "categories": ["Lieferleistungen", "Dienstleistungen"],
  "lastDays": 14,
  "maxItems": 50
}
```

### Output

One item per tender (real example from a test run on 7 Nov 2026):

```json
{
  "tenderId": "13079",
  "title": "RV Software BCM und ITSCM",
  "contractingAuthority": "civillent GmbH",
  "location": "72770 Reutlingen",
  "postalCode": "72770",
  "city": "Reutlingen",
  "state": "Baden-Württemberg",
  "category": "Lieferleistungen",
  "procedureRules": "Vergabeverordnung (VgV)",
  "procedureType": "Offenes Verfahren",
  "scope": "EU-Ausschreibung",
  "cpvCodes": ["48000000-8", "72263000-6", "72261000-2", "72267100-0"],
  "publishedAt": "2026-11-06T08:06:19+01:00",
  "deadline": "2026-12-07T10:00:00+01:00",
  "publicationEnd": "2026-12-07T10:00:00+01:00",
  "url": "https://www.service.bund.de/IMPORTE/Ausschreibungen/vmp-vpbw/2026/11/13079.html",
  "noticeUrl": "https://vergabeportal-bw.de/Satellite/notice/CXRAYDBYML5",
  "matchedKeywords": ["Software"],
  "feedProvider": "vmp-vpbw",
  "noticeType": "call_for_tender",
  "source": "service.bund.de",
  "status": "ok",
  "snapshotAt": "2026-11-07T13:28:44+00:00"
}
```

`deadline` is the offer deadline (Angebotsfrist) when the publisher states one; `publicationEnd` is the end of the publication on the portal. If a detail page cannot be loaded, the tender is still returned with the search data and `status` says `details_unavailable`.

### Pricing

Pay per result: **$0.002 per tender returned ($2 per 1,000 tenders)**. Searches that return nothing cost nothing beyond the tiny platform start. Set `maxItems` to cap the cost of every run.

### Tips for lead alerts

Schedule the Actor daily with `lastDays: 1` and your keywords, then send new rows to Slack, e-mail, Google Sheets or your CRM via an Apify integration or webhook. Use `excludeKeywords` to drop noise (e.g. `Reinigung` if you only sell software).

### API, n8n and MCP

- **API:** `POST https://api.apify.com/v2/acts/fast_data_asap~german-public-tenders-bund/run-sync-get-dataset-items?token=YOUR_TOKEN` with the input JSON as body.
- **n8n / Make / Zapier:** use the Apify node, Actor `fast_data_asap/german-public-tenders-bund`, operation "Run Actor and get dataset items".
- **MCP (Claude, Cursor, other AI agents):** `https://mcp.apify.com?tools=fast_data_asap/german-public-tenders-bund`

### Data source and legal note

Data comes from the publicly accessible tender search of service.bund.de. The contracting authorities are responsible for the content of their notices; always read the official notice (`noticeUrl`) before bidding. The Actor collects no personal data.

# Actor input Schema

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

Search terms (German works best, e.g. Software, Reinigung, Dachsanierung, Beratung). Each keyword is searched separately and results are merged without duplicates. Leave empty to get the newest tenders of all topics.

## `states` (type: `array`):

Only tenders whose place of performance is in these German states. Empty = all of Germany.

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

Construction works (Bauleistungen), services (Dienstleistungen), supplies (Lieferleistungen) or a finer category. Empty = all.

## `lastDays` (type: `integer`):

Only tenders published within this many days. 0 = no date limit (everything currently open on the portal).

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

Maximum number of tenders returned (and charged) per run.

## `includeDetails` (type: `boolean`):

Opens each tender's public detail page to add category, procedure rules (VOB/VgV/UVgO), procedure type, EU/national scope, CPV codes, Bundesland and the link to the official notice. Slightly slower.

## `procedureRules` (type: `array`):

Optional filter by procurement regulation.

## `excludeKeywords` (type: `array`):

Drop tenders whose title contains any of these words (case-insensitive).

## `awardedContracts` (type: `boolean`):

Return awarded contracts (Vergebene Aufträge) instead of open calls for tenders – useful for competitor and market research.

## Actor input object example

```json
{
  "keywords": [
    "Software"
  ],
  "states": [],
  "categories": [],
  "lastDays": 14,
  "maxItems": 10,
  "includeDetails": true,
  "procedureRules": [],
  "excludeKeywords": [],
  "awardedContracts": false
}
```

# 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 = {
    "keywords": [
        "Software"
    ],
    "lastDays": 14,
    "maxItems": 10
};

// Run the Actor and wait for it to finish
const run = await client.actor("fast_data_asap/german-public-tenders-bund").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": ["Software"],
    "lastDays": 14,
    "maxItems": 10,
}

# Run the Actor and wait for it to finish
run = client.actor("fast_data_asap/german-public-tenders-bund").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": [
    "Software"
  ],
  "lastDays": 14,
  "maxItems": 10
}' |
apify call fast_data_asap/german-public-tenders-bund --silent --output-dataset

```

## MCP server setup

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

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/ErgVjPcjugJWZhtYs/builds/Ar4coxI4cS9ePkfKC/openapi.json
