# German Public Contract Awards – Competitors & Market (`vapiossi/german-public-contract-awards`) Actor

Who wins public contracts in Germany? Contract awards with winners, prices and bids from the EU TED database, company rankings and market figures. Track competitors, export to Excel.

- **URL**: https://apify.com/vapiossi/german-public-contract-awards.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 $5.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 Contract Awards – Competitors & Market

**Who wins public contracts in Germany – and at what price?** Fill in a simple form and get a clean table of
contract awards or a ranking of the winning companies. Download it as **Excel or CSV**, or schedule it to get
notified whenever a competitor wins a contract. No scraping, no XML, no coding.

The data comes from **TED (Tenders Electronic Daily)**, the EU's official procurement journal: more than
**60,000 German contract award notices from the last 12 months**, updated daily, with company names cleaned up
so that spelling variants (*Drees & Sommer SE / GmbH / und*) count as one company.

### What you can do with it

#### 1. Contract awards – who won what, at what price

One row per award notice: title, buyer, federal state, category, award date, **contract value**,
**number of bids**, procedure type and the **winning companies**.

- **Track competitors**: enter their names under *Winners* (e.g. `Bechtle`, `Drees & Sommer`) to get every
  contract they won.
- **Competitor alerts**: turn on *Only new since last run* and schedule the Actor daily or weekly – each run
  delivers only new awards. Connect it to email, Slack or Google Sheets via Apify integrations.
- **Price research before you bid**: what did similar contracts cost, and how many companies bid?

#### 2. Company ranking – who wins in this market

One row per company, ranked by number of awards won or by contract value: *"Who are the top cleaning
companies in North Rhine-Westphalia?"* or *"Who supplies IT to public buyers in Bavaria?"*

Each run also saves a **market summary** (record `MARKET_SUMMARY`) for the same filters: number of awards,
known contract volume, median price, average number of bids, share of single-bid awards, SME share among
winners, procedure types, top buyers and a monthly trend.

### Filters

Search terms (German, compound words work: `reinigung` finds *Unterhaltsreinigung*), **federal states** and
**categories** (select several), **CPV codes** (e.g. `72, 48` for IT), **buyer** name, **award date range**
and **contract value range**.

### Typical users

- Companies bidding for public contracts – construction, IT, cleaning, facility, security, consulting,
  waste management
- Sales and business development teams looking for buyers and competitors
- Consultants and tender services analysing markets for their clients
- Analysts and journalists researching public spending in Germany

### Output

**Contract awards** (`awards` view):

| Field | Description |
|---|---|
| `title`, `buyer`, `buyer_city` | Contract and contracting authority |
| `federal_states`, `category`, `cpv_codes` | Where and what |
| `published` | Date of the award notice |
| `value`, `currency`, `estimated_value` | Contract value (if disclosed) and estimate |
| `bids` | Number of tenders received |
| `procedure_type` | e.g. open, restricted, negotiated |
| `winners`, `winner_ids`, `winner_count` | Winning companies |
| `winner_city`, `winner_size` | City and size (micro/small/medium/large) – for single-winner awards |
| `url` | Official notice on ted.europa.eu |

**Company ranking** (`companies` view): `rank`, `name`, `city`, `size`, `wins`, `attributable_value`
(value of awards won as the only winner), `last_award`.

### Pricing

You pay only per delivered row (award or company). Set *Maximum results* to control the cost of each run;
with *Only new since last run* a scheduled competitor alert usually delivers just a few rows.

### Good to know

- **Coverage**: Germany, contract award notices published on TED in the last 12 months – mainly contracts
  above the EU thresholds. Smaller national awards not published on TED are not included.
- **Contract values** are not disclosed for every award (roughly half include one). Value filters and sums
  only use known values.
- For awards with **several winners** (framework agreements, lots), TED does not state each winner's share.
  Company values therefore only count awards won as the sole winner.
- Companies are matched by cleaned-up name. Branches with their own name (e.g. *… IT-Systemhaus Hamburg*)
  appear as separate companies.
- Always verify details in the official notice (`url`) – this is a data service, not legal advice.

### Data source

Contains information from TED – Tenders Electronic Daily (ted.europa.eu), © European Union. Every row includes
this attribution in the `source` field.

### Also available

- **Open tenders you can still bid on**: *German Public Tenders (Ausschreibungen) – Search & Excel Export*
  (`vapiossi/german-public-tenders`).
- The same data as a **REST API** on RapidAPI: *German Public Contract Awards – Analytics*.

# Actor input Schema

## `mode` (type: `string`):

**Contract awards**: every award notice with winners, contract value, number of bids and buyer. Add *Winners* to track competitors. **Company ranking**: the companies that win most in the selected market, plus key market figures (volume, median price, competition, SME share) saved as MARKET\_SUMMARY.

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

Full-text search in title, summary, keywords, buyer and description (German texts). Word parts match: `reinigung` also finds `Unterhaltsreinigung`. Use `OR` for alternatives.

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

Place of performance. Empty = all of Germany.

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

Empty = all categories.

## `winners` (type: `array`):

Only awards won by these companies – name or part of it, e.g. `Bechtle`, `Drees & Sommer`. Contract awards mode only. Combine with *Only new* and a schedule to get notified when a competitor wins.

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

EU procurement codes, several separated by commas: `72, 48` = IT services and software, `909` = cleaning, `45` = construction.

## `buyer` (type: `string`):

Part of the contracting authority's name, e.g. `Stadt Köln`, `Deutsche Bahn`.

## `awardedSince` (type: `string`):

Award notices published on or after this date. Data covers the last 12 months.

## `awardedUntil` (type: `string`):

Award notices published on or before this date.

## `minValue` (type: `integer`):

Only awards with a known value of at least this amount. Note: about half of all awards do not disclose a value.

## `maxValue` (type: `integer`):

Only awards with a known value up to this amount.

## `sortBy` (type: `string`):

Contract awards: newest first or highest value first. Company ranking: most wins or highest value won as sole winner.

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

Contract awards mode: returns only awards not delivered by a previous run with the same filters – ideal for scheduled competitor alerts. The first run delivers all current matches.

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

Upper limit of rows (awards or companies). You only pay for delivered rows.

## Actor input object example

```json
{
  "mode": "awards",
  "query": "Reinigung",
  "sortBy": "default",
  "onlyNew": false,
  "maxItems": 100
}
```

# Actor output Schema

## `awards` (type: `string`):

Table of awards (contract awards mode) – download as Excel, CSV or JSON.

## `companies` (type: `string`):

Table of companies (company ranking mode).

## `market` (type: `string`):

Key market figures for the filters (company ranking mode).

# 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": "Reinigung"
};

// Run the Actor and wait for it to finish
const run = await client.actor("vapiossi/german-public-contract-awards").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": "Reinigung" }

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

```

## MCP server setup

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

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/eX2yqcqGA4QBtDxDQ/builds/UIy3s9okAG7ZIN6am/openapi.json
