← Blog

Company data

Bundesanzeiger Scraper: Jahresabschluss and Insolvency Data

Scrape the German Bundesanzeiger: search by company or HRB number, export Jahresabschluss figures, court notices and capital market filings as JSON or CSV.

Epic Scrapers

The Bundesanzeiger is Germany’s official federal gazette. Around 1.5 million German companies publish there, and it’s the primary source for annual accounts (Jahresabschlüsse), shareholder notices (Gesellschaftsbekanntmachungen), court notices (Gerichtlicher Teil) and capital market announcements. It’s free to read, but the site has no export, no API, a 20-results-per-page search, and annual accounts that open one at a time.

The Bundesanzeiger Scraper turns a Bundesanzeiger search into structured records. It runs the search, pages through the results, opens each publication and returns company name, registered seat (Sitz), publication area, title, date, a text excerpt and a direct link. For annual accounts it also tries to pull revenue (Umsatzerlöse), total assets (Bilanzsumme), equity (Eigenkapital), net income (Jahresüberschuss) and headcount.

What data you get

Field Meaning
entity_name Company name (Unternehmensname)
entity_city Registered seat (Sitz der Gesellschaft)
publication_area Area of the gazette, in German (e.g. Rechnungslegung/Finanzberichte)
publication_title Title of the notice (e.g. Jahresabschluss zum Geschäftsjahr …)
publication_date Publication date in DD.MM.YYYY
fiscal_year_end Balance sheet date (Stichtag), for annual accounts
revenue Umsatzerlöse in EUR
total_assets Bilanzsumme in EUR
total_equity Eigenkapital in EUR
net_income Jahresüberschuss in EUR
employee_count Average number of employees, if stated
document_url Link to the publication on bundesanzeiger.de
document_excerpt First 1,000 characters of the cleaned publication text
scraped_at ISO timestamp of extraction

How to use the Bundesanzeiger Scraper

  1. Open the Bundesanzeiger Scraper on Apify.
  2. Enter a query (Suchbegriff): a company name, an HRB/HRA register number, or any keyword.
  3. Optionally pick a publication area (area).
  4. Leave extractFinancials on if you want balance sheet figures.
  5. Set maxItems (up to 100 per run) and click Start.
  6. Export the dataset as JSON, CSV or Excel.

Publication areas (Veröffentlichungsbereiche)

The area input accepts these values:

area Bereich What’s in it
"" Alle Bereiche Everything
"22" Rechnungslegung/Finanzberichte Annual accounts, financial reports
"5" Gerichtlicher Teil Court notices, including insolvency-related ones
"6" Gesellschaftsbekanntmachungen Shareholder meetings, dividends, corporate changes
"7" Kapitalmarkt Capital market announcements
"1" Amtlicher Teil Official section
"2" Nichtamtlicher Teil Non-official section
"8" Verschiedene Bekanntmachungen Miscellaneous notices

Jahresabschluss download for a company

To get a company’s annual accounts with extracted figures:

{
  "query": "BMW AG",
  "area": "22",
  "extractFinancials": true,
  "maxItems": 5
}

For smaller GmbHs the company name is often ambiguous. Searching by register number is more precise:

{
  "query": "HRB 12345",
  "area": "22",
  "extractFinancials": true,
  "maxItems": 10
}

German insolvency and court notices

To monitor court notices for companies in a city, search the Gerichtlicher Teil with a location or company keyword:

{
  "query": "Berlin",
  "area": "5",
  "extractFinancials": false,
  "maxItems": 25
}

Turning extractFinancials off for non-financial searches keeps runs fast, since there’s no balance sheet to parse.

Sample output

A Jahresabschluss record with extracted figures (values illustrative):

{
  "entity_name": "Müller Feinmechanik GmbH",
  "entity_city": "Stuttgart",
  "publication_area": "Rechnungslegung/Finanzberichte",
  "publication_title": "Jahresabschluss zum Geschäftsjahr vom 01.01.2025 bis zum 31.12.2025",
  "publication_date": "14.08.2026",
  "fiscal_year_end": "31.12.2025",
  "revenue": 18450000,
  "total_assets": 12930000,
  "total_equity": 5410000,
  "net_income": 742000,
  "employee_count": 96,
  "document_url": "https://www.bundesanzeiger.de/pub/de/suchen2?...",
  "document_excerpt": "Müller Feinmechanik GmbH Stuttgart Jahresabschluss zum Geschäftsjahr vom 01.01.2025 bis zum 31.12.2025 Bilanz Aktiva ...",
  "scraped_at": "2026-10-03T09:12:44.310Z"
}

Financial extraction is best-effort. German annual accounts vary widely in layout, and some are published as ESEF/XBRL viewers that don’t expose readable text. When the scraper can read the text, it fills the figures; otherwise you still get the metadata, fiscal year end, excerpt and link. Small companies that file only a shortened balance sheet (verkürzte Bilanz) usually don’t report revenue at all.

Bundesanzeiger data via API

Use the Apify API to run searches from a script or a scheduled job. Keep your token in APIFY_TOKEN.

cURL:

curl -X POST \
  "https://api.apify.com/v2/acts/epicscrapers~bundesanzeiger-scraper/run-sync-get-dataset-items" \
  -H "Authorization: Bearer $APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"query": "SAP SE", "area": "6", "maxItems": 20}'

Python (pip install apify-client), pulling accounts for a list of companies:

import os
from apify_client import ApifyClient

client = ApifyClient(os.environ["APIFY_TOKEN"])
companies = ["SAP SE", "Siemens AG", "Bayerische Motoren Werke AG"]

rows = []
for q in companies:
    run = client.actor("epicscrapers/bundesanzeiger-scraper").call(
        run_input={"query": q, "area": "22", "extractFinancials": True, "maxItems": 3}
    )
    rows += client.dataset(run["defaultDatasetId"]).list_items().items

for r in rows:
    print(r["entity_name"], r.get("fiscal_year_end"), r.get("revenue"), r.get("total_equity"))

Remember that publication_date is a German-format string (DD.MM.YYYY); parse it with datetime.strptime(d, "%d.%m.%Y") before sorting.

Use cases

Credit risk and counterparty screening. Pull the latest Bilanzsumme, Eigenkapital and Jahresüberschuss for each supplier or customer, calculate an equity ratio, and flag companies whose accounts are overdue or whose equity is shrinking.

Insolvency and compliance monitoring. Schedule a daily search of the Gerichtlicher Teil for your customer names or region and push new records to Slack or a CRM. Combined with a check of publication_title, this gives collections and compliance teams early warning.

M&A and investor research. Track Gesellschaftsbekanntmachungen and Kapitalmarkt notices for DACH targets: shareholder meetings, dividend notices, mergers and capital changes.

B2B sales with financial filters. Build lead lists of German companies with known revenue or headcount bands, instead of guessing company size from a website.

Research and journalism. Assemble primary-source financial data across a sector without paying per document to commercial data resellers.

For other European and Latin American registers, see the Pappers scraper guide for French companies and the Brazil CNPJ data guide.

FAQ

Does the Bundesanzeiger have an API?

No public API is offered for searching and exporting publications. The Bundesanzeiger Scraper gives you API access in practice: you start runs via the Apify API and get JSON back.

Can I search by Handelsregister number?

Yes. Put the register number in query, for example "HRB 12345". Because many companies share similar names, an HRB or HRA number is the most reliable way to target one company. Add the court city to the query if the number alone matches several registers.

Why do I get fewer results than expected?

The Bundesanzeiger search returns 20 results per page and the actor returns at most 100 records per run. For bigger jobs, use more specific queries (an HRB number, company name plus city) and split them across several runs.

The Bundesanzeiger exists to make these notices public, and the actor only reads publicly accessible pages. Use the data for legitimate purposes, keep request volumes reasonable and follow GDPR for any personal data in notices. This is not legal advice.

Do I need proxies?

No. The scraper uses a plain HTTP session with cookies and runs on Apify’s default IPs.

Enter a company name or HRB number, choose "22" for annual accounts and run it with maxItems set to 5. Open the Bundesanzeiger Scraper on Apify or see the actor page.