# German Foreclosure Auctions — Zwangsversteigerung (`us0r/zwangsversteigerungen-de`) Actor

Court-ordered property auctions from Germany's official portal (zvg-portal.de), all 16 states. Auction date and time, court, file number, property type, full address, market value and the 50%/70% marks. Cancelled dates included. Around 3,400 live proceedings; run it as a monitor.

- **URL**: https://apify.com/us0r/zwangsversteigerungen-de.md
- **Developed by:** [us0r](https://apify.com/us0r) (community)
- **Categories:** Real estate, Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $4.00 / 1,000 auction records

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/platform/actors/running/actors-in-store#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

## German Foreclosure Auctions Scraper (Zwangsversteigerung)

Every court-ordered property auction in Germany is published on the official
portal `zvg-portal.de`, run jointly by the justice ministries of the federal
states. This Actor collects the live inventory — **all 16 states** — with the
auction date, the court, the property, its full address and its appraised
market value.

About **3,400 proceedings** are listed nationwide at any time, and roughly
**90 of them change every day**.

### What you get

| Field | Example |
|---|---|
| `terminIso`, `terminUhrzeit` | `2026-09-09`, `09:30` — when the auction is held |
| `terminAufgehoben` | `true` when the court has cancelled the date |
| `objektart`, `objektKategorien` | `Eigentumswohnung (3 bis 4 Zimmer)`, `["Wohnung"]` |
| `adresse`, `strasse`, `plz`, `ort`, `ortsteil` | `Moorstr. 7, 28237 Bremen, Gröpelingen` |
| `verkehrswert` | `216000.0` — the court's appraised market value in EUR |
| `verkehrswert50Prozent`, `verkehrswert70Prozent` | the 50% and 70% marks of that value |
| `verfahrensart` | `Zwangsversteigerung (Zwangsvollstreckung)` or `Teilungsversteigerung` |
| `gericht`, `aktenzeichen` | `Bremen-Blumenthal`, `0026 K 0059/2025` |
| `bundesland`, `bundeslandCode` | `Bremen`, `hb` |
| `standIso` | when the court last touched the entry |
| `portalUrl` | deep link into the portal, for you to open |
| `id` | stable identifier, for deduplication across runs |

Fields an entry does not contain are `null` — never guessed.

### Three things this Actor does that the source makes hard

**1. It tells partition auctions apart.** The portal does not show the type of
proceeding in its result list, so the Actor determines it separately. This
matters: **25% of all German proceedings are partition auctions**
(*Teilungsversteigerung*, 22% in NRW and 42% in Bavaria), where the 50% and 70%
value marks of §§ 74a and 85a ZVG do not apply at all. The Actor therefore
leaves `verkehrswert50Prozent` and `verkehrswert70Prozent` empty there instead
of publishing a number that means nothing. Those two fields are plain
arithmetic on the published value, not legal advice.

**2. It reads the market value correctly when the court writes prose.** 27% of
value cells contain more than a number. Real examples from a single day:

```
119.000,--
349.600,- Euro
zu 1: 85.000 € zu 2: 20.000 €
Flst. 66 - 146.000 EUR   Flst. 68 - 89.000,00 EUR
Lfd.Nr. 11: 653,00 Euro  Lfd.Nr. 12: 390,00 Euro
Lfd.Nr. 13: 264.000,00 Euro   Gesamtverkehrswert: 265.043,00 Euro
```

Taking the first number in that last cell would report **653 € for a property
worth 265,043 €**. The Actor looks for a stated total first, then checks whether
one amount is the sum of the others, and only then falls back to the first —
marking the record `verkehrswertMehrdeutig` when it had to. Every amount found
is kept in `verkehrswertPositionen`, and the original sentence in
`verkehrswertHinweis`.

**3. It keeps cancelled auctions.** About 5% of entries read "Der Termin … wurde
aufgehoben." They carry no property data, so they are easy to drop — but if you
are monitoring a debtor, a cancelled auction is the news. Set
`ohneAufgehobeneTermine` to drop them, or `nurAufgehobeneTermine` to see nothing
else.

### Typical uses

- **Property sourcing** — filter by postcode, category and value, get the
  auction date weeks ahead
- **Distressed asset monitoring** — watch a region or a value band and be told
  what changed since yesterday
- **Credit risk** — 13 proceedings nationwide are filed by an insolvency
  administrator; they connect directly to insolvency monitoring
- **Market analysis** — 1.13 bn EUR of appraised value across 3,400 properties,
  broken down by state, court, category and value

### Related Actors

Insolvency proceedings are published on a different federal portal, and the same
people tend to watch both. **[German Insolvency Announcements](https://apify.com/us0r/insolvenzbekanntmachungen-de)**
covers openings, dismissals for lack of assets and distribution lists — including
the appointed administrator with phone number and email. The 13 auctions here that
were filed by an insolvency administrator are the point where the two meet.

**[German Insolvency Check](https://apify.com/us0r/insolvenz-check-de)** takes the
other route: hand it a list of names and it reports, per name, whether the
insolvency register has anything on it, at which court, under which file number,
and whether the proceeding is still running. Useful for putting a name you found
in an auction listing straight through the register.

The justice administration auctions **movable** goods as well — vehicles,
machinery, jewellery, tools seized by bailiffs — alongside what customs and
municipalities sell off. **[German Government Auctions](https://apify.com/us0r/government-auctions-de)**
covers both official portals in one schema, with the current bid, the closing
time, the pickup address and the case worker's phone number and e-mail.

### Input

Everything is optional. The defaults cover all states and stop after 50 entries,
so a first trial run finishes in about three seconds — set `maxErgebnisse` to 0
for a real run.

| Option | Default | Meaning |
|---|---|---|
| `bundeslaender` | all 16 | Which federal states to cover |
| `objektKategorien` | all | `Haus`, `Wohnung`, `Grundstück`, `Gewerbe`, `Stellplatz`, `Teileigentum` |
| `verfahrensarten` | all | Restrict to enforcement, partition auctions, … |
| `verkehrswertMin` / `verkehrswertMax` | — | Value band in EUR |
| `plzPraefix` | — | Postcode prefixes, e.g. `["80", "81"]` for Munich |
| `ort` | — | Substring of town, district or street |
| `terminInnerhalbTagen` | — | Only auctions within the next N days |
| `ohneAufgehobeneTermine` / `nurAufgehobeneTermine` | `false` | Handle cancellations |
| `verfahrensartErmitteln` | `true` | Determine the type of proceeding (≈5 extra requests per state) |
| `nurNeue` | `false` | Only entries that are new or that the court has changed |
| `maxErgebnisse` | `50` | Stop after N entries; **0 = no limit** |
| `statusSpeicher` | `zvg-gesehen` | Named store for `nurNeue`; use different names for independent monitors |
| `pauseSekunden` | `0.2` | Delay before each request to the portal |

**For monitoring, set `nurNeue: true` and schedule the Actor.** An entry counts
as new when it appears for the first time *or* when the court has updated it,
which is what `standIso` records. You are not charged twice for an entry nobody
touched.

### Scale and speed

A complete national run is **3,400 proceedings from 67 requests in about
2.5 minutes** — 51 records per request. One state takes seconds. The Actor
talks plain HTTP to the portal, no headless browser, which is why it is fast and
cheap to run.

### Limits, honestly

- **Four states barely use this portal.** Hamburg and Mecklenburg-Vorpommern
  currently list nothing at all, Schleswig-Holstein one entry, and
  Baden-Württemberg only about 50. That is the source, not the Actor.
- **Only the result list.** The portal's robots.txt disallows crawling the
  detail view and the PDF attachments, so the Actor never requests them — you
  get `portalUrl` and the `anhaenge` count and open them yourself. Everything
  worth having (value, date, address, property type) is in the list anyway.
- **The type of proceeding is not free.** Determining it costs about five extra
  requests per state. Turn `verfahrensartErmitteln` off if you do not need it —
  the 50%/70% marks then stay empty, because they cannot be computed safely
  without it.
- **The market value is the court's appraisal**, often a year or more old, and
  sometimes stated per parcel rather than per property. Check
  `verkehrswertHinweis` whenever it is set.
- **Entries disappear** once the auction has been held. There is no archive to
  go back to.
- **Property addresses are property addresses**, not debtor addresses. The
  portal does not publish debtor names.

### Pricing

Pay per event:

| Event | What it covers |
|---|---|
| `actor-start` | once per run |
| `treffer` | one proceeding with all parsed fields |

***

Keywords: Zwangsversteigerung, Zwangsversteigerungstermine, ZVG, ZVG-Portal,
Teilungsversteigerung, Verkehrswert, Immobilien Zwangsversteigerung, foreclosure
auction Germany, German court auctions, Amtsgericht Versteigerung,
Immobilien-Leads, distressed real estate Germany.

# Actor input Schema

## `bundeslaender` (type: `array`):

Which states to cover. Leave empty for all 16. Note that Hamburg, Mecklenburg-Vorpommern and Schleswig-Holstein publish almost nothing on this portal.

## `objektKategorien` (type: `array`):

Keep only these kinds of property. Courts type the property type as free text, so the Actor sorts it into robust buckets — 'Haus' also matches misspellings like 'Einfamillienhaus'. Leave empty for everything.

## `verfahrensarten` (type: `array`):

Restrict to certain proceedings. Setting this also forces the Actor to determine the type for every entry.

## `verkehrswertMin` (type: `integer`):

Skip properties valued below this. Entries without a stated value are skipped as well when this is set.

## `verkehrswertMax` (type: `integer`):

Skip properties valued above this.

## `plzPraefix` (type: `array`):

Keep only postcodes starting with one of these, e.g. "80" for Munich or "1" for all of eastern Berlin and Brandenburg.

## `ort` (type: `string`):

Only keep entries whose town, district or street contains this text (case-insensitive).

## `terminInnerhalbTagen` (type: `integer`):

Keep only auctions scheduled within this many days. Leave empty for all — the median auction is about 48 days out, the furthest over four years.

## `ohneAufgehobeneTermine` (type: `boolean`):

About 5% of entries are cancelled auction dates. They carry no property data — but they are news if you are watching a debtor.

## `nurAufgehobeneTermine` (type: `boolean`):

The inverse: return nothing but cancellations.

## `verfahrensartErmitteln` (type: `boolean`):

The portal does not show the type in the result list, so the Actor asks for it separately. Costs about 5 extra requests per state and matters: the 50%/70% value marks (§§ 74a, 85a ZVG) do not apply to partition auctions, which are 22% of cases in NRW and 42% in Bavaria.

## `nurNeue` (type: `boolean`):

Remembers what previous runs returned and skips anything the court has not touched since. Turn this on for monitoring so you are not charged for the same entry twice.

## `maxErgebnisse` (type: `integer`):

Stop after this many entries. Set 0 for no limit — that is what you want for a real run; the default of 50 only keeps the first trial run short. All of Germany is about 3,400 entries.

## `statusSpeicher` (type: `string`):

Named key-value store holding what has already been seen. Use different names to run several independent monitors.

## `pauseSekunden` (type: `number`):

Seconds to wait before each request to the portal.

## Actor input object example

```json
{
  "bundeslaender": [],
  "objektKategorien": [],
  "verfahrensarten": [],
  "plzPraefix": [],
  "ohneAufgehobeneTermine": false,
  "nurAufgehobeneTermine": false,
  "verfahrensartErmitteln": true,
  "nurNeue": false,
  "maxErgebnisse": 50,
  "statusSpeicher": "zvg-gesehen",
  "pauseSekunden": 0.2
}
```

# Actor output Schema

## `auctions` (type: `string`):

Every proceeding collected in this run: date, court, property, address and market value.

## `valuations` (type: `string`):

The same run reduced to valuations, the 50%/70% marks and any caveat the court published with the value.

# 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 = {};

// Run the Actor and wait for it to finish
const run = await client.actor("us0r/zwangsversteigerungen-de").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 = {}

# Run the Actor and wait for it to finish
run = client.actor("us0r/zwangsversteigerungen-de").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 '{}' |
apify call us0r/zwangsversteigerungen-de --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,us0r/zwangsversteigerungen-de"
        }
    }
}

```

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/56UAALfXozrX54XDf/builds/RNj518VHnkodcxDVG/openapi.json
