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.
Company data
Scrape the German Bundesanzeiger: search by company or HRB number, export Jahresabschluss figures, court notices and capital market filings as JSON or CSV.
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.
| 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 |
query (Suchbegriff): a company name, an HRB/HRA register number, or any keyword.area).extractFinancials on if you want balance sheet figures.maxItems (up to 100 per run) and click Start.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 |
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
}
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.
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.
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.
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.
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.
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.
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.
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.