# German Government Auctions — Zoll & Justiz (`us0r/government-auctions-de`) Actor

Live lots from Germany's two official public-sector auction portals: zoll-auktion.de (customs, municipalities) and justiz-auktion.de (courts, bailiffs). Current bid, bid count, end time, selling authority, pickup address, contact person and parsed vehicle specs.

- **URL**: https://apify.com/us0r/government-auctions-de.md
- **Developed by:** [us0r](https://apify.com/us0r) (community)
- **Categories:** E-commerce, 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 lots

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 Government Auctions Scraper (Zoll-Auktion & Justiz-Auktion)

German public authorities sell what they seize, confiscate, find and retire —
on two official portals, both run by the state itself:

- **`zoll-auktion.de`**, operated by the German customs administration
  (*Generalzolldirektion*) for the federal government, the states and
  municipalities — **2,225 live lots**
- **`justiz-auktion.de`**, operated by the justice administration for courts
  and bailiffs, Germany and Austria — **307 live lots**

This Actor collects both into **one schema**: current bid, bid count, end time,
the selling authority, the pickup address, the case worker's phone number and
e-mail, and the item specifications parsed out of the free-text description.

Everything sold here is **collection-only and sold as-is**, which is exactly why
the location and the contact matter as much as the price.

### What you get

| Field | Example |
|---|---|
| `titel`, `beschreibung` | `Volkswagen Caddy 1.6 TDI AHK -nicht fahrbereit` plus the full text |
| `aktuellesGebot`, `gebote` | `1550.0`, `11` — the live bid and how many were placed |
| `mindestgebot` | `1600.0` — what the next valid bid has to be |
| `beginntIso`, `endetIso`, `restlaufzeit` | `2026-07-21T16:00:00+02:00`, `2026-08-19T16:00:00`, `noch 6 Minuten` |
| `anbieter` | `Gemeinde Eichenau` — the authority that put the lot up |
| `ansprechpartner` | `[{"name": "Rene Kretschmer", "telefon": "08141730332", "email": "hochbau@eichenau.de"}]` |
| `strasse`, `adresszusatz`, `plz`, `ort`, `bundesland`, `land` | `Holzkirchner Str. 4`, `Bauhof der Gemeinde Eichenau`, `82223`, `Eichenau`, `Bayern`, `DE` |
| `merkmale` | `{"Marke (Hersteller)": "VW", "Kilometerstand": "132.350 km", "Fahrzeug-Ident-Nr.": "WV1ZZZ2KZBX278110", "HU": "abgelaufen seit 11/2025", …}` |
| `kategorie`, `kategoriePfad` | `sonstige Nutzfahrzeuge`, `["Fahrzeuge", "LKW, Sonder-, Einsatz- & Nutzfahrzeuge", …]` |
| `auktionsart` | `Privatrechtliche Auktion` · or which legal basis a justice lot is sold under |
| `abholung`, `versand`, `zahlung`, `ustAusgewiesen` | `true`, `false`, `Überweisung`, `false` |
| `aufrufe`, `beobachter` | `5462`, `41` — how much attention a lot is getting |
| `beendet` | `true` once the end time has passed |
| `charge` | `09950-2026` — the depositing authority's own lot reference |
| `bildUrl`, `portalUrl` | full-size photo, and a deep link into the portal |
| `id`, `quelle`, `losId` | `zoll-971571`, `zoll-auktion`, `971571` |

Fields a lot does not contain are `null` — never guessed.

### Four things this Actor does that the portals make hard

**1. It brings you the contact, not just the listing.** Every lot on
zoll-auktion.de names a case worker, and the Actor got a phone number and an
e-mail address for **2,224 of 2,225 lots** across **611 different authorities**
in a full sweep. That data sits on the detail page only — a result-list scraper
never sees it. The portal itself splits those addresses with layout hyphens, so
a naive read returns `name@` and `behoerde.de` as two fragments.

**2. It parses the specifications out of prose.** Authorities type the
description by hand, but most keep to `Label: value` per line. The Actor turns
that into a `merkmale` object — **80% of lots carry one, averaging 7.8 fields**,
and cars bring a median of 13: make, model, first registration, mileage, fuel,
transmission, emission class, inspection status, VIN, tyre tread depth, listed
defects. That is what makes the data filterable instead of readable.

About one lot in ten has several attributes crammed into a single line because
the line break was missed while typing (`Fahrzeug-Ident-Nr.: WV1ZZZ… Leistung:
103 kW …`). Read literally, the VIN comes back with half the line attached. The
Actor splits those apart — and knows to leave `103 kW (140 PS)` intact while
doing it.

**3. `null` means no bid, not zero.** Both portals display `0,00 €` for a lot
nobody has bid on, and zoll-auktion.de puts the starting price into the same
field its structured data uses for the current bid. Reading either literally
tells you a Caddy is going for nothing. Here `aktuellesGebot` is `null` until
someone actually bids — **54% of lots are in that state** — while the starting
price stays in `mindestgebot`, and price filters fall back to it.

**4. In monitor mode you only get — and only pay for — lots that actually
changed.** Switch on `nurGeaenderte` and the Actor compares bid, bid count,
minimum bid and end time against the previous run, and keeps quiet about
everything else. A second run over all 307 justice lots right after the first
returns **zero records**.

Where the portal allows it, that saving reaches the requests too:
zoll-auktion.de keeps honest `lastmod` stamps in its sitemap (1,976 distinct
values across 2,225 lots, spread over days), so unchanged detail pages are
never fetched. justiz-auktion.de stamps every request with the current time —
that value is worthless as a change signal, and the Actor does not pretend
otherwise; there it still reads the pages but reports only real changes.

Without monitor mode, a full sweep is 2,532 lots in about three minutes.

### Typical uses

- **Dealer sourcing** — filter by category and postcode radius, get vehicles,
  machinery or IT hardware with specs, location and closing time
- **Bid monitoring** — run it on a schedule with `nurGeaenderte` and watch bids
  move on the lots you care about; nobody can reconstruct that history later
- **Price research** — what does a retired municipal transporter actually
  fetch, by state and category
- **Public-sector procurement leads** — 611 authorities with named contacts,
  each of them regularly disposing of assets

### Input

Everything is optional. With no input at all the Actor returns the **20 lots
closing next** across both portals.

| Setting | Meaning |
|---|---|
| `quellen` | Which of the two portals to cover. Default: both. |
| `maxErgebnisse` | Stop after this many lots. `0` = everything (~2,530). Default 20. |
| `suchbegriff` | Full-text search, filtered by the portals themselves. |
| `kategorien` | 65 categories, from `PKW` to `Musikinstrumente` (zoll-auktion only). |
| `plzUmkreis` + `umkreisKm` | Radius search around a postcode, 10 to 200 km. |
| `preisMin`, `preisMax` | Price band in EUR. |
| `endetInnerhalbTagen` | Only lots closing within N days. |
| `nurMitGeboten` | Only contested lots. |
| `bundeslaender`, `plzPraefix` | Region filters that work across both portals. |
| `nurGeaenderte` | Monitor mode — only what changed since the last run. |
| `parallel`, `pauseSekunden` | How gently to treat the servers. Default 4 at once. |

### Notes on the source

Both portals explicitly allow crawling: `zoll-auktion.de` publishes
`Allow: /`, `justiz-auktion.de` an empty `Disallow:`, and both link their
sitemaps from `robots.txt`. The Actor uses those sitemaps as its index and
reads the `schema.org` structured data the portals maintain for search engines.

Lots disappear from both portals once an auction has ended, so historical data
cannot be recovered afterwards — only collected as it happens.

The contact details in `ansprechpartner` are official addresses that the
authorities publish themselves for exactly this purpose: so that interested
buyers can get in touch.

### Related Actors

- [German Insolvency Announcements](https://apify.com/us0r/insolvenzbekanntmachungen-de)
  — insolvency filings from the official register, with administrator contacts
  and claim deadlines
- [German Insolvency Check](https://apify.com/us0r/insolvenz-check-de) — screen
  a list of company or personal names against that register, one row per name
- [German Foreclosure Auctions](https://apify.com/us0r/zwangsversteigerungen-de)
  — court-ordered property auctions with dates, appraised values and addresses

# Actor input Schema

## `quellen` (type: `array`):

Which of the two official portals to cover. zoll-auktion.de is run by the German customs administration and carries the bulk (~2,250 lots) — customs seizures plus anything municipalities, fire brigades and state agencies retire. justiz-auktion.de is run by the justice administration (~300 lots) and carries pledged goods from bailiffs as well as found and confiscated property, from Germany and Austria.

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

Stop after this many lots. 0 means everything the portals list (~2,550), which takes roughly three minutes. With a limit set, the Actor uses the portal search, which returns lots sorted by soonest end — so a small number gives you the auctions closing next.

## `suchbegriff` (type: `string`):

Full-text search, e.g. 'Mercedes', 'Bagger', 'iPhone'. Both portals filter server-side, so this is much cheaper than downloading everything and filtering afterwards.

## `kategorien` (type: `array`):

Restrict to these categories. Applies to zoll-auktion.de, the only one of the two with a category search. Leave empty for all.

## `plzUmkreis` (type: `string`):

Centre of a radius search on zoll-auktion.de, e.g. '80331'. Everything sold there is collection-only, so distance is the deciding factor for most buyers.

## `umkreisKm` (type: `string`):

How far around the postcode above. Ignored unless a postcode is set.

## `preisMin` (type: `integer`):

Skip lots below this bid.

## `preisMax` (type: `integer`):

Skip lots above this bid.

## `endetInnerhalbTagen` (type: `integer`):

Keep only lots ending within this many days — the filter for 'what should I bid on this week'.

## `nurMitGeboten` (type: `boolean`):

Keep only contested lots. Roughly half of all lots sit at zero bids until the final hours.

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

Keep only lots collected in these states. Leave empty for all. Austrian states appear on justiz-auktion.de as well.

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

Keep only lots whose postcode starts with one of these, e.g. \['80', '81'] for Munich. Works across both portals, unlike the radius search.

## `nurGeaenderte` (type: `boolean`):

Monitor mode. Both portals stamp every lot with a last-modified time, and a bid changes it — so this returns exactly the lots where something happened, at one request per portal. Needs the same 'Status store' across runs.

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

Named key-value store that remembers what was already seen. Only relevant with the monitor mode above. Use different names to keep several monitors apart.

## `parallel` (type: `integer`):

How many detail pages to fetch at once. These are government servers — leave this low unless you need a full sweep quickly.

## `pauseSekunden` (type: `integer`):

Extra delay per request, in seconds. Normally not needed; neither portal sets a crawl delay.

## Actor input object example

```json
{
  "quellen": [
    "justiz-auktion",
    "zoll-auktion"
  ],
  "maxErgebnisse": 20,
  "kategorien": [],
  "umkreisKm": "3",
  "nurMitGeboten": false,
  "bundeslaender": [],
  "plzPraefix": [],
  "nurGeaenderte": false,
  "statusSpeicher": "auktionen-gesehen",
  "parallel": 4,
  "pauseSekunden": 0
}
```

# Actor output Schema

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

Every lot collected in this run: current bid, bid count, end time, selling authority and location.

## `contacts` (type: `string`):

The same run reduced to the selling authority, the pickup address and the case worker's phone number and e-mail.

## `specs` (type: `string`):

The same run reduced to the parsed specifications — make, model, mileage, first registration, power, condition.

# 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/government-auctions-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/government-auctions-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/government-auctions-de --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,us0r/government-auctions-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/9GtcObV9QmMBOka6w/builds/tAJfyZHJXh4SgBqUU/openapi.json
