# German Court Decisions – BGH, BVerfG, BAG Rulings to JSON (`fast_data_asap/german-federal-court-decisions`) Actor

German federal court decisions (BGH, BVerfG, BVerwG, BFH, BAG, BSG, BPatG) from the official open-data portal as JSON/Markdown: Aktenzeichen, ECLI, Leitsatz, Tenor, Gründe, cited norms. Filter by court, date, file number, keyword. For legal research and RAG.

- **URL**: https://apify.com/fast_data_asap/german-federal-court-decisions.md
- **Developed by:** [Fast Data](https://apify.com/fast_data_asap) (community)
- **Categories:** AI, Developer tools
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$1.00 / 1,000 decisions

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 Federal Court Decisions – BGH, BVerfG, BAG & more to JSON / Markdown

Get **decisions of Germany's federal courts** – Bundesgerichtshof (BGH), Bundesverfassungsgericht (BVerfG), Bundesverwaltungsgericht (BVerwG), Bundesfinanzhof (BFH), Bundesarbeitsgericht (BAG), Bundessozialgericht (BSG), Bundespatentgericht (BPatG) and the Joint Senate (GmS-OGB) – as **clean, structured JSON with Markdown or plain text**. The data comes from the official open-data portal **[rechtsprechung-im-internet.de](https://www.rechtsprechung-im-internet.de)** run by the Federal Ministry of Justice (BMJV), which lists more than **84,000 decisions** since 2010.

**$1 per 1,000 decisions. You only pay for decisions returned.** Downloads that fail are listed with `status: "error"` and are free.

#### Why this actor

- ✅ **Official source, no scraping of search pages**: reads the ministry's own table of contents (`rii-toc.xml`) and the official decision XML files
- ✅ **Structured sections**: `leitsatz` (headnote), `tenor` (operative part), `tatbestand`, `entscheidungsgruende`, `gruende`, `abweichendeMeinung`, cited `normen`, `vorinstanz` (lower instances), `ecli`
- ✅ **LLM-ready text**: the whole decision as one Markdown document with headings and margin numbers (**Rn.**) kept, or as plain text
- ✅ **Filters**: court, date range or "last N days", file number (Aktenzeichen), judgment vs. order, keywords
- ✅ **Fast and polite**: the table of contents is downloaded once per run, at most 4 parallel downloads. 3 decisions finish in about 15 seconds
- ✅ **Public domain data**: court decisions are official works under **§ 5 UrhG** (German Copyright Act) and are not protected by copyright. Decisions on the portal are already anonymised by the courts

**Who it's for:** legal-tech teams, law firms, in-house legal departments, researchers and journalists – and anyone building **RAG pipelines or AI legal assistants** on German case law.

### Use cases

- **Legal research**: pull every BGH tenancy-law decision (`fileNumber: "VIII ZR"`) of the last year in one dataset
- **RAG for legal assistants**: feed `fullTextMarkdown` with ECLI and Aktenzeichen as metadata into your vector database (Pinecone, Qdrant, pgvector, …)
- **Monitoring new rulings on a topic**: schedule a daily run with `lastDays: 7` and `keywords: ["DSGVO"]` and get notified (e-mail, Slack, webhook) when the federal courts publish something new
- **Datasets and analytics**: statistics on courts, senates, document types and cited norms

### Input

| Field | Default | Description |
|---|---|---|
| `courts` | `["BGH"]` | Any of `BGH`, `BVerfG`, `BVerwG`, `BFH`, `BAG`, `BSG`, `BPatG`, `GmS-OGB`. Empty = all courts |
| `lastDays` | 30 | Only decisions dated within the last N days (ignored if `dateFrom` is set, 0 = no limit) |
| `dateFrom` / `dateTo` | – | Decision date range, `YYYY-MM-DD` |
| `fileNumber` | – | Aktenzeichen contains, e.g. `VIII ZR`, `1 BvR`, `IX ZB 72/08` |
| `keywords` | – | Match in title, Leitsatz, Tenor, norms (case-insensitive, any keyword) |
| `keywordsInFullText` | false | Also search the reasons (Gründe) |
| `documentType` | `any` | `Urteil` (judgment), `Beschluss` (order) or `any` |
| `maxDecisions` | 3 | Maximum decisions returned, newest first |
| `includeFullText` | true | Adds Tatbestand, Gründe and `fullTextMarkdown` |
| `outputFormat` | `markdown` | `markdown` or `plain` |
| `maxScan` | 500 | With keyword / type filters: max decisions downloaded to find matches |

```json
{
  "courts": ["BGH"],
  "dateFrom": "2026-01-01",
  "fileNumber": "VIII ZR",
  "documentType": "Urteil",
  "keywords": ["Mietpreisbremse", "Eigenbedarf"],
  "maxDecisions": 50,
  "outputFormat": "markdown"
}
```

### Output

One row per decision (real example from a test run, text shortened):

```json
{
  "status": "ok",
  "court": "BGH",
  "senate": "3. Zivilsenat",
  "decisionDate": "2026-10-22",
  "fileNumber": "III ZR 3/26",
  "ecli": "ECLI:DE:BGH:2026:221026UIIIZR3.26.0",
  "documentType": "Urteil",
  "title": "Gemeindliches Vorkaufsrecht, Beginn der Ausübungsfrist; Entstehung",
  "normen": ["§ 24 Abs 1 S 1 Nr 1 BauGB", "§ 28 Abs 1 S 1 BauGB", "§ 28 Abs 2 S 1 BauGB", "..."],
  "vorinstanz": ["vorgehend Hanseatisches Oberlandesgericht Hamburg, 19. Dezember 2025, Az: 1 U 1/24 Baul", "vorgehend LG Hamburg, 22. November 2024, Az: 351 O 2/23"],
  "leitsatz": "Gemeindliches Vorkaufsrecht, Beginn der Ausübungsfrist; Entstehung\n\n1a. Die Mitteilung des Inhalts des Kaufvertrags, mit der nach § 28 Abs. 2 Satz 1 BauGB ...",
  "tenor": "Die Revision des Beteiligten zu 1 gegen das Urteil des Hanseatischen Oberlandesgerichts - Senat für Baulandsachen - vom 19. Dezember 2025 wird zurückgewiesen. ...",
  "tatbestand": "**1** Die Beteiligten streiten um die Rechtmäßigkeit der Ausübung eines gemeindlichen Vorkaufsrechts durch die Beteiligte zu 3. ...",
  "entscheidungsgruende": "**9** Die Revision hat keinen Erfolg.\n\nI.\n\n**10** Das Berufungsgericht hat ...",
  "gruende": null,
  "fullTextMarkdown": "# BGH 3. Zivilsenat, Urteil vom 2026-10-22 – III ZR 3/26\n\nECLI: ...\n\n## Leitsatz\n\n...",
  "textFormat": "markdown",
  "wordCount": 7176,
  "docId": "KORE300832026",
  "sourceUrl": "https://www.rechtsprechung-im-internet.de/jportal/?quelle=jlink&docid=KORE300832026&psml=bsjrsprod.psml&max=true",
  "zipUrl": "https://www.rechtsprechung-im-internet.de/jportal/docs/bsjrs/jb-KORE300832026.zip",
  "lastModified": "2026-11-03T22:09:08.803Z"
}
```

Margin numbers (Randnummern) are kept as `**12**` at the start of each paragraph in Markdown (`12` in plain text), so you can cite "Rn. 12".

### Pricing

Pay per event: **$0.001 per decision returned** ($1 per 1,000). Failed downloads and decisions removed by your filters are free. Platform compute for a typical run is a fraction of a cent.

### API, n8n, MCP

**API** (Python):

```python
from apify_client import ApifyClient
client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("fast_data_asap/german-federal-court-decisions").call(run_input={
    "courts": ["BAG"], "lastDays": 90, "documentType": "Urteil", "maxDecisions": 20})
for d in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(d["decisionDate"], d["fileNumber"], d["title"])
```

**n8n / Make / Zapier**: use the Apify node with actor `fast_data_asap/german-federal-court-decisions` and "Run actor and get dataset".

**MCP (Claude, Cursor, ChatGPT agents)**: add `https://mcp.apify.com?tools=fast_data_asap/german-federal-court-decisions` as an MCP server, then ask e.g. *"Find the newest BGH judgments on Eigenbedarf and summarise the Leitsätze."*

### Notes and limits

- Coverage is what the federal courts publish on rechtsprechung-im-internet.de (mainly decisions since 2010). Not every decision of a court is published there.
- Dates filter on the **decision date**; decisions often appear on the portal a few days or weeks after they were issued.
- Keyword filters need each candidate decision to be downloaded; narrow the date range or raise `maxScan` for rare terms.
- Only official public open data is used. No personal data beyond what the courts publish in anonymised form.

### Deutsche Kurzfassung

Dieser Actor lädt **Entscheidungen der Bundesgerichte** (BGH, BVerfG, BVerwG, BFH, BAG, BSG, BPatG, GmS-OGB) aus dem offiziellen Open-Data-Portal **rechtsprechung-im-internet.de** des Bundesministeriums der Justiz und liefert sie als **JSON mit Markdown oder Klartext**: Gericht, Senat, Datum, Aktenzeichen, ECLI, Dokumenttyp, Titel, Normen, Vorinstanz, Leitsatz, Tenor, Tatbestand, Entscheidungsgründe / Gründe und den Volltext mit Randnummern. Filter nach Gericht, Zeitraum, Aktenzeichen, Urteil/Beschluss und Stichwörtern. Gerichtsentscheidungen sind amtliche Werke nach **§ 5 UrhG** und gemeinfrei; die Veröffentlichungen sind von den Gerichten anonymisiert. Ideal für Recherche, juristische KI-Assistenten (RAG) und die Überwachung neuer Rechtsprechung zu einem Thema. **Preis: 0,001 $ pro Entscheidung.**

# Actor input Schema

## `courts` (type: `array`):

Federal courts to include. Leave empty for all courts.

## `lastDays` (type: `integer`):

Only decisions dated within the last N days (by decision date). Ignored when 'Date from' is set. 0 = no limit.

## `dateFrom` (type: `string`):

Earliest decision date, YYYY-MM-DD. Overrides 'last N days'.

## `dateTo` (type: `string`):

Latest decision date, YYYY-MM-DD.

## `fileNumber` (type: `string`):

Case-insensitive substring of the Aktenzeichen, e.g. 'VIII ZR' (BGH 8th civil senate, tenancy law), '1 BvR' or 'IX ZB 72/08'.

## `keywords` (type: `array`):

Optional. Only decisions whose title, Leitsatz, Tenor or cited norms (or full text, see below) contain at least one of these words (case-insensitive), e.g. 'Mietpreisbremse', 'DSGVO', '§ 823 BGB'.

## `keywordsInFullText` (type: `boolean`):

Also match keywords in the reasons (Gründe / Tatbestand / Entscheidungsgründe), not only in title, Leitsatz, Tenor and norms.

## `documentType` (type: `string`):

Only judgments (Urteil) or orders (Beschluss). 'any' returns all types.

## `maxDecisions` (type: `integer`):

Maximum number of decisions returned (newest first).

## `includeFullText` (type: `boolean`):

Adds Tatbestand, Entscheidungsgründe / Gründe and the complete decision as Markdown or plain text.

## `outputFormat` (type: `string`):

Format of all text fields.

## `maxScan` (type: `integer`):

Keyword filters need to download each candidate decision. This caps how many candidates are downloaded per run.

## `maxConcurrency` (type: `integer`):

Parallel downloads. Kept low (max 4) to respect the government server.

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

The portal does not answer some cloud IP ranges directly; Apify datacenter proxy (default) works reliably.

## Actor input object example

```json
{
  "courts": [
    "BGH"
  ],
  "lastDays": 30,
  "keywordsInFullText": false,
  "documentType": "any",
  "maxDecisions": 3,
  "includeFullText": true,
  "outputFormat": "markdown",
  "maxScan": 500,
  "maxConcurrency": 4,
  "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 = {
    "courts": [
        "BGH"
    ],
    "lastDays": 30,
    "maxDecisions": 3,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("fast_data_asap/german-federal-court-decisions").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 = {
    "courts": ["BGH"],
    "lastDays": 30,
    "maxDecisions": 3,
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("fast_data_asap/german-federal-court-decisions").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 '{
  "courts": [
    "BGH"
  ],
  "lastDays": 30,
  "maxDecisions": 3,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call fast_data_asap/german-federal-court-decisions --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,fast_data_asap/german-federal-court-decisions"
        }
    }
}
```

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/vKAYZIq6SpQlbopaq/builds/Tq89etnQWhcEEQqkE/openapi.json
