ZVG-Portal Scraper — German Judicial Property Auctions avatar

ZVG-Portal Scraper — German Judicial Property Auctions

Pricing

from $5.00 / 1,000 result scrapeds

Go to Apify Store
ZVG-Portal Scraper — German Judicial Property Auctions

ZVG-Portal Scraper — German Judicial Property Auctions

Extract forced-auction (Zwangsversteigerung) property listings from ZVG-Portal.de, the official German court-auction calendar shared by the Bund and all 16 Länder. Get case numbers, courts, property addresses, market value (Verkehrswert), auction dates, and official notice/appraisal PDFs.

Pricing

from $5.00 / 1,000 result scrapeds

Rating

0.0

(0)

Developer

Studio Amba

Studio Amba

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

2 days ago

Last modified

Categories

Share

ZVG-Portal Scraper

Extract forced-auction (Zwangsversteigerung) property listings from ZVG-Portal.de — the official German court-auction calendar operated on behalf of the Bund and all German Länder — into structured JSON with case numbers, courts, addresses, market value, and auction dates.

What is ZVG-Portal Scraper?

ZVG-Portal Scraper pulls structured data out of Germany's official statutory forced-auction publication portal, helping you find distressed/below-market properties, track auction volume by state and court, and automate court-auction lead generation — without manually browsing hundreds of Amtsgericht listings.

  • Find distressed-property leads: every listing is a court-ordered Zwangsversteigerung under German civil procedure — debt-recovery and foreclosure sales, published because courts are legally required to disclose them
  • Monitor auction activity by state or court: filter by Bundesland or a single Amtsgericht and track how many properties go to auction, the spread of market values, and which courts are most active
  • Automate market research: export case numbers, market values (Verkehrswert), and auction dates to build datasets for valuation models or regional distress analysis
  • Get the official documents: every active listing includes links to the official notice (amtliche Bekanntmachung) and, where published, the court appraisal (Gutachten) and info sheet (Exposee) PDFs
  • Build automated alerts: schedule daily runs and get notified when new lots matching your criteria (state, price range) appear

ZVG-Portal.de has no public API and no export feature. This scraper queries the same search form the website itself uses and parses the resulting HTML — no browser automation needed, it's a plain server-rendered government site.

How to scrape ZVG Portal data

The input is simple: pick a Bundesland (or "alle" for all states), optionally a court and a market-value range, and run.

Input options

FieldTypeRequiredDescription
bundeslandStringNo2-letter German state code, e.g. "nw" (Nordrhein-Westfalen), "by" (Bayern), "be" (Berlin). Default: "nw". Use "alle" to loop over all 14 states that publish through this portal
gerichtIdIntegerNoFilter to a single Amtsgericht by its internal court ID. Default 0 = every court in the selected state(s)
vonWertIntegerNoMinimum Verkehrswert (market value, EUR)
bisWertIntegerNoMaximum Verkehrswert (market value, EUR)
includeCancelledBooleanNoInclude auctions marked "wurde aufgehoben" (cancelled). Default false — these carry no address, value, or detail link and aren't useful leads
scrapeDetailsBooleanNoFetch each listing's detail page for the real court name, full description, Grundbuch, venue address, and PDF links (default true). The search results list alone doesn't expose the court name
maxResultsIntegerNoMaximum active listings to return (default: 200, max: 5000)
proxyConfigurationObjectNoApify proxy settings. The site has no anti-bot protection (verified) — not required for success

Tips for best results

  • Start with a single state: bundesland: "nw" (Nordrhein-Westfalen) is the largest single-state dataset on the portal, currently ~950 active listings
  • Use "alle" for full national coverage: loops all 14 active states in one run (Hamburg and Mecklenburg-Vorpommern always return 0 — they publish through a separate regional system and are skipped automatically)
  • Use vonWert/bisWert for lead qualification: e.g. vonWert: 50000, bisWert: 200000 to target a specific investment band
  • Leave scrapeDetails: true: the court name (Amtsgericht) is only available from the detail page — the search list only shows the state
  • Schedule daily runs: new lots are published continuously across Germany's Amtsgerichte

Output

Results are stored in a dataset you can download as JSON, CSV, Excel, XML, or HTML directly from the Apify Console.

Output fields

FieldTypeExample
titleString"Einfamilienhaus — Bad Salzuflen"
priceNumber | null226000 (Verkehrswert / market value, EUR)
currencyString"EUR"
listingTypeString"auction" (always — every listing is a court-ordered forced sale)
propertyTypeString"einfamilienhaus"
addressString"Schillerstraße 11, 32105 Bad Salzuflen, Bad Salzuflen"
cityString"Bad Salzuflen"
postalCodeString"32105"
provinceString"nw" (2-letter Bundesland code)
courtString"Lemgo" (competent Amtsgericht, only when scrapeDetails: true)
procedureNumberString"0013 K 0042/2025" (Aktenzeichen)
auctionTypeString"Zwangsversteigerung zum Zwecke der Aufhebung der Gemeinschaft"
auctionDateString (ISO)"2026-08-12T09:00:00"
auctionDateRawString"Mittwoch, 12. August 2026, 09:00 Uhr" (original German format)
landRegisterString"Bad Salzuflen Blatt 5664" (Grundbuch)
venueAddressString"Amtsgericht Lemgo, Hauptgebäude, Am Lindenhaus 2, 32657 Lemgo, Sitzungssaal 102"
courtWebsiteStringCourt's own website, when published
geoServerUrl / googleMapsUrlStringMap links for the property address
descriptionStringFull free-text property description (Beschreibung)
pdfUrlsArray[{ "label": "Gutachten", "url": "..." }, ...] — official notice, appraisal, info sheet, photos
isCancelledBooleantrue if the auction was cancelled (wurde aufgehoben)
lastUpdatedStringSite's own "letzte Aktualisierung" timestamp
urlStringDetail page URL
scrapedAtString (ISO)Scrape timestamp

Example output

{
"title": "unbebautes Grundstück — Inden",
"price": 8300,
"currency": "EUR",
"url": "https://www.zvg-portal.de/index.php?button=showZvg&zvg_id=167766&land_abk=nw",
"scrapedAt": "2026-08-11T19:48:13.411Z",
"listingType": "auction",
"province": "nw",
"procedureNumber": "0007 K 0021/2025",
"isCancelled": false,
"propertyType": "unbebautes grundstück",
"address": "Frenzer Driesch, 52459 Inden, Frenz",
"city": "Inden",
"postalCode": "52459",
"auctionDate": "2026-08-12T08:45:00",
"auctionDateRaw": "Mittwoch, 12. August 2026, 08:45 Uhr",
"court": "Jülich",
"auctionType": "Zwangsversteigerung zum Zwecke der Aufhebung der Gemeinschaft",
"landRegister": "Frenz Blatt 100",
"description": "Unbebautes Grundstück im bauplanungsrechtlichen Außenbereich in Inden-Frenz",
"venueAddress": "Amtsgericht Jülich, Hauptgebäude, Wilhelmstr. 15, 52428 Jülich, Etage 1., Sitzungssaal 1.06",
"courtWebsite": "http://www.ag-juelich.nrw.de",
"pdfUrls": [
{ "label": "Gutachten", "url": "https://www.zvg-portal.de/index.php?button=showAnhang&land_abk=nw&file_id=376389&zvg_id=167766" },
{ "label": "amtliche Bekanntmachung", "url": "https://www.zvg-portal.de/index.php?button=showAnhang&land_abk=nw&file_id=376388&zvg_id=167766" }
]
}

How much does it cost to scrape ZVG-Portal?

ZVG-Portal Scraper uses only HTTP requests (no browser), making it fast and cheap to run.

ScenarioEst. costTime
20 listings with full details~$0.11~10 sec
200 listings with full details (one state)~$1.01~1-2 min
All 14 states, 1000+ listings (bundesland: "alle")~$5+several minutes

Pricing breakdown:

  • Per run start: $0.01
  • Per result: $0.005

Usage cost only settles once a run reports SUCCEEDED — reading the dataset mid-run will undercount what you'll actually be charged.

Can I integrate this with other apps?

Yes, through Apify integrations:

  • Google Sheets — automatically export auction leads to a spreadsheet
  • Slack / Email — get notified when new lots match your criteria
  • Zapier / Make — trigger workflows when a run finishes
  • Airtable — build a searchable auction-property database
  • REST API — call the scraper programmatically from any language

Can I use this as an API?

Yes. Use the Apify API to run it programmatically.

Python:

from apify_client import ApifyClient
client = ApifyClient("YOUR_API_TOKEN")
run = client.actor("studio-amba/zvg-portal-scraper").call(run_input={
"bundesland": "nw",
"vonWert": 50000,
"bisWert": 300000,
"maxResults": 200,
})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
print(f"{item['title']} — €{item['price']:,}" if item.get("price") else item["title"])

JavaScript:

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: 'YOUR_API_TOKEN' });
const run = await client.actor('studio-amba/zvg-portal-scraper').call({
bundesland: 'nw',
vonWert: 50000,
bisWert: 300000,
maxResults: 200,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);

Check the API tab for full documentation.

FAQ

What is ZVG-Portal.de?

ZVG-Portal.de (Zwangsversteigerungstermine) is the official German court-auction publication portal, operated on behalf of the Bund and the Länder as part of the shared Justizportal infrastructure. Every listing is a court-ordered forced sale (Zwangsversteigerung) — properties sold under German civil procedure, typically as part of debt-recovery or foreclosure proceedings, at values a court-appointed appraiser has set as the Verkehrswert.

How does this scraper work?

It submits the same search form the website's own "Termine suchen" page uses (with &all=1 to get the full unbounded result set in one request, not paginated), then fetches each active listing's detail page for the court name, description, and official document links. No browser automation needed — it's a plain server-rendered site.

Can I filter by market value?

Yes. vonWert and bisWert filter directly on the source's Verkehrswert field.

Why do some listings have price: null?

A small minority of courts paste a rich, Word-formatted breakdown into the market-value field instead of a single figure (nested tables, multiple sub-totals like "Lfd. Nr. 1" / "Lfd. Nr. 2", or "davon entfällt auf Zubehör" accessory components). Rather than guess which numbers to sum — real risk of double-counting a sub-component — this scraper leaves price as null for those and extracts everything else normally. The figure is still visible on the source site's detail page.

The underlying data (forced-auction notices) is a statutory public disclosure under German ZVG law — courts are legally required to publish it. The site's robots.txt does disallow the specific detail-page and attachment endpoints this scraper uses, which is a real (if purely technical, not legal-prose) signal worth being aware of. As with any scraping tool, use the data responsibly and in compliance with applicable laws; this scraper does not access anything not already shown to any visitor of the public site.

Limitations

  • Germany only, covering the 14 states that publish through this specific portal. Hamburg and Mecklenburg-Vorpommern use a separate regional system and always return 0 results here.
  • Court name requires scrapeDetails: true. The search results list only states the Bundesland, not the Amtsgericht — the real court name is only on the detail page.
  • A minority of listings have no clean market value. See the FAQ above — some courts format the Verkehrswert field as a rich breakdown rather than a plain figure; those come through with price: null rather than a guessed number.
  • Cancelled auctions carry almost no data. By default (includeCancelled: false) they're excluded — a cancelled listing has no address, value, court, or detail link, just the case number and cancellation notice.
  • PDFs are linked, not downloaded. pdfUrls gives you the official notice/appraisal/info-sheet links; this scraper doesn't fetch or parse the PDF contents themselves.

Combine with these for broader European judicial-auction and real estate coverage:

Your feedback

Found a bug or have a feature request? Open an issue on the Issues tab. We actively maintain this scraper and respond to all reports.