# German Court Decisions — Rechtsprechung im Internet (`relevate/de-court-decisions`) Actor

Full text of German federal court decisions (BGH, BVerfG, BVerwG, BFH, BAG, BSG, BPatG) from the official Rechtsprechung im Internet corpus. Filter by court, date, case number and keywords. Monitor mode returns only new decisions — a clean feed for legal-tech, RAG pipelines and AI agents.

- **URL**: https://apify.com/relevate/de-court-decisions.md
- **Developed by:** [Relevate](https://apify.com/relevate) (community)
- **Categories:** Agents, AI, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $4.00 / 1,000 court decision returneds

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?

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 Court Decisions Scraper — Rechtsprechung im Internet (BGH, BVerfG, BVerwG, BFH, BAG, BSG, BPatG)

Get the **full text of German federal court decisions** as clean, structured JSON — straight from [Rechtsprechung im Internet](https://www.rechtsprechung-im-internet.de), the official corpus published by the German Federal Ministry of Justice and the Federal Office of Justice.

**~84,000 decisions** from **seven federal courts**, from January 2010 to last week.

### Why this actor

- ✅ **Official source, open data** — the Bund publishes this corpus for free reuse. No protected sites, no fragile selectors, no legal gray zone.
- ✅ **Real full text, not snippets** — headnote (*Leitsatz*), tenor, facts (*Tatbestand*) and reasons (*Gründe*) as plain text, plus ECLI, cited norms and the previous instance.
- ✅ **Full-text search over the whole corpus** — the official site has no bulk search API; this actor gives you one.
- ✅ **Monitor mode** — schedule it and receive only decisions you have not seen yet. A daily case-law alert with zero noise.
- ✅ **Built for RAG and AI agents** — one flat JSON object per decision, ready to chunk and embed. Already anonymised at source: German court decisions are published pseudonymised.

### Courts covered

| Code | Court | Domain |
|---|---|---|
| `BGH` | Bundesgerichtshof | Civil & criminal — the largest share of the corpus |
| `BVerfG` | Bundesverfassungsgericht | Constitutional |
| `BVerwG` | Bundesverwaltungsgericht | Administrative |
| `BFH` | Bundesfinanzhof | Tax |
| `BAG` | Bundesarbeitsgericht | Labour |
| `BSG` | Bundessozialgericht | Social security |
| `BPatG` | Bundespatentgericht | Patents & trademarks |

### Typical use cases

| Who | How |
|---|---|
| Legal-tech & LegalAI builders | Bulk-load a court's decisions into a vector store; ground your model in real German case law |
| Law firms | Daily monitor on `BAG` + `Kündigung` → new labour-law decisions in your inbox |
| Tax advisors | `BFH` decisions citing a specific norm (`§ 15 UStG`) |
| Patent attorneys | `BPatG` decisions on a trademark class or an opposition topic |
| Compliance & research | Track how a statute is applied over time — export to CSV/Excel and analyse |

### Input

| Field | Example | Notes |
|---|---|---|
| `courts` | `["BGH", "BAG"]` | Empty = all seven federal courts. |
| `dateFrom` / `dateTo` | `"2026-01-01"` | Decision date, not publication date. Corpus starts 2010-01-04. |
| `keywords` | `Kündigung Betriebsrat OR "fristlose Kündigung"` | Full-text. AND between terms, `OR` between groups, `"quotes"` for phrases. Umlaut-insensitive (`Kundigung` finds `Kündigung`). |
| `caseNumber` | `"IX ZB 72/08"` | Substring match on the Aktenzeichen. |
| `docTypes` | `["Urteil"]` | Urteil, Beschluss, Gerichtsbescheid… |
| `includeFullText` | `true` | Off = lightweight citation index (fast, cheap). |
| `monitorMode` | `true` | Only decisions not returned by a previous run with the same filters. |
| `maxResults` | `50` | Safety cap. |
| `maxScanned` | `600` | How deep a keyword search digs before stopping. |

### Output example

```json
{
    "docId": "JURE100054597",
    "ecli": "ECLI:DE:BVERWG:2010:080110B9B3.09.0",
    "court": "BVerwG",
    "courtBody": "9. Senat",
    "decisionDate": "2010-01-08",
    "caseNumber": "9 B 3/09",
    "docType": "Beschluss",
    "norms": ["§ 133 Abs 3 S 1 VwGO"],
    "title": "Verwerfung der Nichtzulassungsbeschwerde",
    "guidingPrinciple": null,
    "previousInstance": "vorgehend Oberverwaltungsgericht des Landes Sachsen-Anhalt, 2. September 2008, Az: 4 L 572/04, Urteil",
    "tenor": "Die Beschwerde des Klägers gegen die Nichtzulassung der Revision … wird verworfen.",
    "reasons": "Die Beschwerde ist als unzulässig zu verwerfen. Sie ist nicht innerhalb von zwei Monaten …",
    "sourceUrl": "https://www.rechtsprechung-im-internet.de/jportal/?quelle=jlink&docid=JURE100054597&psml=bsjrsprod.psml&max=true",
    "source": "rechtsprechung-im-internet.de"
}
```

Every run also writes a `RUN_SUMMARY` record to the key-value store — result counts, how many documents were downloaded, and the resolved filters. Handy for integrations, debugging and AI agents.

### Scheduling a case-law alert

1. Set `courts` + `keywords`, enable `monitorMode`.
2. Create a **Schedule** in Apify Console (e.g. every weekday at 7:00).
3. Add an **integration** (email, Slack, webhook, Make, Zapier) — you are only notified when something new lands.

Set `minExpectedResults` on a broad scheduled run to be alerted if the upstream corpus ever stops updating.

### Pricing

Pay per event: a small fee per run start plus a fee per decision returned. A monitor run that finds nothing new costs almost nothing.

### A note on the connection

The corpus is served from a German edge that refuses connections from most cloud datacenters, so the actor routes its requests through Apify Proxy. The default (Apify Proxy, automatic) works out of the box — you do not need to configure anything, and you do not need a specific proxy country.

### Data source & fair use

All data comes from [rechtsprechung-im-internet.de](https://www.rechtsprechung-im-internet.de), operated by the *Bundesministerium der Justiz* and the *Bundesamt für Justiz*, and offered for free reuse. Decisions are published in pseudonymised form by the courts themselves — this actor adds no personal data and performs no re-identification. Downloads are rate-limited and run at a low, polite concurrency.

### Roadmap

- Austrian (RIS) and Czech (NSS / ÚS) case law through the same output schema
- Norm-level filtering (`§ 15 UStG`) as a first-class input
- Landesgerichte via openJur

# Actor input Schema

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

Federal courts to include. Leave empty for all of them.

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

Only decisions issued on or after this date (YYYY-MM-DD). The corpus starts in January 2010.

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

Only decisions issued on or before this date (YYYY-MM-DD).

## `keywords` (type: `string`):

Searches the whole decision text (headnote, tenor, facts, reasons, cited norms). Terms are combined with AND, "quoted phrases" match as a unit, and uppercase OR separates alternatives — e.g. `Kündigung Betriebsrat OR "fristlose Kündigung"`. Case- and umlaut-insensitive. Leave empty to skip content filtering (much faster).

## `caseNumber` (type: `string`):

Substring match on the file number, e.g. `IX ZB 72/08` or just `ZB 72`.

## `docTypes` (type: `array`):

German decision types. Leave empty for all.

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

Output tenor, facts and reasons as plain text — what a RAG pipeline or legal AI agent needs. Turn off for a lightweight citation index (much faster and cheaper when no keyword filter is used).

## `sortOrder` (type: `string`):

Newest decisions first (default) or oldest first.

## `monitorMode` (type: `boolean`):

Remembers which decisions this filter combination already returned and outputs only the ones you have not seen. Combine with a Schedule to get a zero-noise daily feed of new case law.

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

Safety cap on the number of decisions returned.

## `maxScanned` (type: `integer`):

How deep a keyword search may dig. Only decisions that pass the court/date filter are downloaded; raise this if a narrow keyword returns too few hits.

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

The source is a German government site that refuses connections from most cloud datacenters, so runs on the platform go through a proxy. Leave the default (Apify Proxy, automatic) unless you have a reason to change it — a specific country selection is usually unnecessary and needs a paid proxy plan.

## `minExpectedResults` (type: `integer`):

Fail the run if fewer than this many decisions are returned. Use it in scheduled pipelines to get alerted when the upstream source changes. 0 disables the check.

## Actor input object example

```json
{
  "courts": [
    "BGH"
  ],
  "keywords": "Kündigung OR \"fristlose Kündigung\"",
  "docTypes": [],
  "includeFullText": true,
  "sortOrder": "newest",
  "monitorMode": false,
  "maxResults": 50,
  "maxScanned": 600,
  "proxyConfiguration": {
    "useApifyProxy": true
  },
  "minExpectedResults": 0
}
```

# 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"
    ]
};

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

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

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,relevate/de-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/ep9hu3cqAoftiO3N1/builds/ZTdKUfz79FZGO6ofg/openapi.json
