# e-Vergabe Germany Scraper — Federal Public Procurement Tenders (`studio-amba/evergabe-scraper`) Actor

Search and extract German federal public procurement tender notices from evergabe-online.de (e-Vergabe). Filter by keyword and publication date. Returns buyer info, deadlines, procedure type and place of performance. No API key, no login required.

- **URL**: https://apify.com/studio-amba/evergabe-scraper.md
- **Developed by:** [Studio Amba](https://apify.com/studio-amba) (community)
- **Categories:** Business, Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.20 / 1,000 result scrapeds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## e-Vergabe (Germany) Scraper — Federal Public Procurement Tenders

Search and extract German federal public procurement tender notices from evergabe-online.de (e-Vergabe), the federal platform used by German federal ministries, agencies, and federal-linked bodies to publish calls for bids. Filter by keyword and publication date. Returns the buyer, reference number, procedure type, deadline, place of performance, and a direct link to the notice. No API key, no login required.

### How to scrape evergabe-online.de tender data

This actor drives a real browser session against evergabe-online.de's search results page and reads the notice table directly — the same 7-column table (Bezeichnung, Geschäftszeichen, Vergabestelle, Ort der Leistungserbringung, Verfahrensart, Nächste Frist, veröffentlicht) the site itself renders, so every field this actor returns matches what a human sees on the page.

Enter a keyword (or leave it blank to pull every currently open notice) and an optional publication date window, and run. The actor pages through the results — evergabe-online.de shows 10 notices per page — until it collects `maxResults` notices or runs out of results.

#### Who benefits from this data?

- **Government contractors and system integrators** — Monitor new federal tenders in your sector (IT, construction, facility management, logistics) the moment they're published, instead of checking the portal manually.
- **B2B sales and business development teams** — Build a live list of German federal buyers currently procuring in your category, and see which agencies buy repeatedly.
- **Market and competitive researchers** — Track procurement volume and procedure types (open procedure vs. negotiated) across German federal ministries and agencies over time.
- **Bid consultancies and public-sector advisors** — Feed new tender alerts into a client-facing monitoring tool without maintaining your own scraper against a Wicket-based, bot-defended portal.
- **Journalists and public-spending researchers** — Investigate what the German federal government is buying, from whom, and in which region.

#### Search by keyword

Enter one or more keywords to match against the notice title, description, and reference number. Use `|` or the word `ODER` to search multiple terms at once, e.g. `Software | Bauarbeiten`. Leave `searchQuery` empty to return every currently active notice — evergabe-online.de carried over 1,000 live notices as of the last check.

#### Filter by publication date

Use `publishDateRange` to only return notices published within a relative window — from `TODAY` up to the last 28 days, or `ALL` for no date filter. Useful for daily/weekly monitoring runs that only want fresh notices.

### Input parameters

| Parameter | Type | Default | Description |
|-----------|------|---------|--------------|
| `searchQuery` | String | — (all notices) | Keyword matched against the notice title, description and reference number. Use `\|` or `ODER` for multiple terms |
| `publishDateRange` | Enum | `ALL` | `ALL`, `TODAY`, `YESTERDAY`, `TWO_DAYS`, `SEVEN_DAYS`, `FOURTEEN_DAYS`, `TWENTY_ONE_DAYS`, `TWENTY_EIGHT_DAYS` |
| `maxResults` | Integer | `50` | Maximum number of tender notices to return (1–5,000) |
| `proxyConfiguration` | Object | Apify proxy | Apify proxy settings |

### What data does this scraper extract?

| Field | Type | Description |
|-------|------|--------------|
| `itemTitle` | String | Notice title ("Bezeichnung") |
| `referenceNumber` | String | Buyer's internal reference ("Geschäftszeichen") |
| `organization` | String | Contracting authority ("Vergabestelle") |
| `status` | String | `Open` or `Closed`, derived from whether the deadline has passed |
| `publicationDate` | String | Date the notice was published (ISO date) |
| `deadline` | String | Bid submission deadline (ISO date/time where a time is shown) |
| `estimatedValue` | String | Always empty in this version — see Limitations |
| `currency` | String | Always empty in this version — see Limitations |
| `procedureType` | String | Procurement procedure, e.g. "EU Offenes Verfahren", "National Öffentliche Ausschreibung" |
| `isEuProcedure` | Boolean | `true` if `procedureType` starts with "EU" (subject to EU-wide procurement thresholds) |
| `region` | String | Place of performance ("Ort der Leistungserbringung") |
| `itemDescription` | String | Always empty in this version — see Limitations |
| `contactInfo` | Object | Always empty in this version — see Limitations |
| `url` | String | Direct link to the notice on evergabe-online.de |
| `scrapedAt` | String | ISO timestamp of when the data was scraped |

### Example output

```json
{
    "itemTitle": "Rahmenvertrag - SPK - FWK - Objektplanung Gebäude und Innenräume",
    "referenceNumber": "172145-011",
    "organization": "Bundesamt für Bauwesen und Raumordnung",
    "status": "Open",
    "publicationDate": "2026-09-01",
    "deadline": "2026-09-29T08:00:00",
    "estimatedValue": "",
    "currency": "",
    "procedureType": "EU Verhandlungsverfahren mit TW",
    "isEuProcedure": true,
    "region": "Bonn, Deutschland",
    "itemDescription": "",
    "contactInfo": {},
    "url": "https://www.evergabe-online.de/tenderdetails.html?id=887301",
    "scrapedAt": "2026-09-01T09:05:58.961Z"
}
```

### Tips for best results

- **Daily monitoring**: Schedule a run with `publishDateRange` set to `TODAY` or `SEVEN_DAYS` to catch newly published notices without re-pulling the full active list every time.
- **Broad discovery first**: Leave `searchQuery` empty on the first run to see the full spread of currently open federal notices, then narrow with keywords once you know which terms match your sector.
- **EU vs. national procedures**: Use `isEuProcedure` to separate large, EU-threshold tenders (more competitive, longer timelines) from smaller national procedures.
- **Only the federal portal**: This actor covers evergabe-online.de, the federal e-Vergabe platform. German states (Länder) and municipalities run their own separate e-procurement portals and are not included here.

### How much does it cost to run?

evergabe-online.de is free and requires no login. Your only cost is Apify compute time and proxy usage. The actor loads one search-results page per 10 notices, so run time and cost scale roughly linearly with `maxResults`.

| Search size | Estimated time | Estimated cost |
|-------------|----------------|-----------------|
| 20 notices | ~30 seconds | ~$0.01 (~$0.0005 per result) |
| 100 notices | ~2 minutes | ~$0.05 (~$0.0005 per result) |
| 500 notices | ~8 minutes | ~$0.25 (~$0.0005 per result) |

Actual cost depends on your Apify plan and proxy usage; a run's final usage cost only settles after the run reports SUCCEEDED — reading the dataset mid-run will undercount it.

### Use as an API

```python
from apify_client import ApifyClient

client = ApifyClient("YOUR_API_TOKEN")

run = client.actor("studio-amba/evergabe-scraper").call(run_input={
    "searchQuery": "IT Dienstleistungen",
    "publishDateRange": "SEVEN_DAYS",
    "maxResults": 50,
})

for notice in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(f"{notice['itemTitle']} | {notice['organization']} | deadline {notice['deadline']}")
```

### Limitations

- **`estimatedValue` and `currency` are always empty**: the search-results table on evergabe-online.de does not publish an estimated contract value for open notices, and German federal buyers generally do not disclose budget estimates before award. There is no field to extract here, this is not a scraper gap.
- **`itemDescription` and `contactInfo` are always empty**: this actor reads only the search-results table and does not fetch each notice's detail page, so the longer free-text description and buyer contact details visible on the individual tender page are not included. Use the `url` field to open the full notice if you need those.
- **Federal portal only**: covers evergabe-online.de (the federal e-Vergabe platform). It does not cover German state (Länder) or municipal procurement portals, which run separately.
- **Open notices, not award results**: this actor returns currently published calls for bids, not contract award notices or winner announcements.
- **Pagination is a real browser session**: evergabe-online.de gates its page-2+ pagination behind client-side bot defense, so this actor pages through results with a real, click-driven Playwright session rather than direct requests. Very large `maxResults` values take proportionally longer for this reason.

### Other European procurement scrapers

Check the [Studio AMBA actor catalog](https://apify.com/studio-amba) for more European public procurement data, including BASE.gov.pt (Portugal), eTenders (Ireland), and other national procurement platforms.

### Maintained by Studio Amba

We run 700+ scrapers for European websites, and the priority is keeping
every one of them working. Automated runs test this actor against the live
site and verify the output is complete. When the website changes, the
scraper usually gets repaired the same day, without you having to report
anything. Questions and issues go straight to the people who built it, and
most get an answer the same day.

### Need this data on a schedule, or a custom version?

We run this scraper as a managed service for businesses: scheduled runs,
deduplication, delta detection, and delivery to your inbox, Google Sheets,
or API, maintenance included. We can also build a custom version with your
exact fields and filters, or combine multiple sources into one feed.

See [studioamba.dev/services](https://studioamba.dev/services/) or email
<hello@studioamba.dev> for a free data sample.

### Your feedback

Found a bug or want a feature? Open an issue on the [Issues tab](https://console.apify.com/actors/studio-amba~evergabe-scraper/issues).

# Actor input Schema

## `searchQuery` (type: `string`):

Search notices by keyword, matched against the title, description and reference number. Use the pipe symbol | or the word ODER to search multiple terms (e.g. 'Software | Bauarbeiten'). Leave empty to return all currently open notices.

## `publishDateRange` (type: `string`):

Only return notices published within this relative time window.

## `maxResults` (type: `integer`):

Maximum number of tender notices to return. Each page of the search UI holds 10 notices, so the actor pages through search results in a real browser session until this many notices are collected.

## `proxyConfiguration` (type: `object`):

Apify proxy configuration.

## Actor input object example

```json
{
  "searchQuery": "Software",
  "publishDateRange": "ALL",
  "maxResults": 20,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# 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 = {
    "searchQuery": "Software",
    "maxResults": 20,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("studio-amba/evergabe-scraper").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 = {
    "searchQuery": "Software",
    "maxResults": 20,
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("studio-amba/evergabe-scraper").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 '{
  "searchQuery": "Software",
  "maxResults": 20,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call studio-amba/evergabe-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,studio-amba/evergabe-scraper"
        }
    }
}

```

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/nc8egT0JpC8OzHjxp/builds/FM7aDPcDBC2hOTZQd/openapi.json
