# Bundesanzeiger Company Filings & Financials (`automation-lab/bundesanzeiger-company-filings-financials`) Actor

Search official Bundesanzeiger company filings and export annual-account metadata, reporting periods, document links, and published XBRL financial figures.

- **URL**: https://apify.com/automation-lab/bundesanzeiger-company-filings-financials.md
- **Developed by:** [Automation Lab](https://apify.com/automation-lab) (community)
- **Categories:** Business
- **Stats:** 1 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.96 / 1,000 filing saveds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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

## Bundesanzeiger Company Filings & Financials

Search official public **Bundesanzeiger company filings** and export filing metadata, reporting periods, official document links, available notice text, and published inline-XBRL financial figures.

The Actor is designed for recurring German-company due diligence, annual-account research, audit evidence, and filing-change monitoring.

### What does this Actor do?

The Actor opens the public German Federal Gazette search service and returns one structured dataset item per publication.

It can:

- search one or many company names or filing keywords;
- focus on accounting and financial reports;
- search business disclosures, capital-market notices, and other Gazette areas;
- apply publication-date filters;
- follow result pagination within a coherent source session;
- extract reporting periods from annual-account titles;
- open filing details and retain available notice text;
- follow official ESEF report links;
- normalize published inline-XBRL figures and retain their provenance attributes;
- cap results globally and per query for predictable monitoring runs.

The Actor does not invent missing financial values. A filing without an exposed ESEF report remains a useful filing-metadata record, while unavailable financial fields are omitted.

### Who is it for?

#### Due-diligence and KYB teams

Check when a German counterparty published annual accounts and retain source-linked evidence for periodic reviews.

#### Credit and investment analysts

Collect filing periods, publication dates, revenue, profit or loss, assets, equity, liabilities, and broader XBRL facts when the issuer published them.

#### Audit and accounting teams

Build a repeatable evidence set for annual-account publication checks without copying rows manually from the Gazette interface.

#### Corporate-intelligence teams

Run the same company watchlist on a schedule and compare filing keys, dates, periods, or financial facts with earlier datasets.

#### Data engineering teams

Send typed filing records to a warehouse, spreadsheet, webhook, or downstream entity-resolution pipeline.

### Why use this Actor?

Bundesanzeiger uses session-scoped Wicket links and separate ESEF report pages.

This Actor manages that navigation in one run and turns the result into integration-ready JSON.

Useful differentiators include:

- official Bundesanzeiger provenance on every row;
- both filing metadata and available financial facts in one record;
- normalized values plus raw XBRL value, context, unit, decimals, and scale;
- a per-query cap so one broad company name does not consume a whole watchlist run;
- graceful metadata-only output when a filing has no structured report;
- no login requirement for the supported public workflow.

### What data can I extract?

| Field | Description |
| --- | --- |
| `query` | Company name or keyword that produced the result |
| `searchArea` | Requested Gazette section |
| `companyName` | Filing party or company displayed by Bundesanzeiger |
| `location` | Published company location |
| `area` | Source filing area |
| `publicationTitle` | Official publication title |
| `publicationDate` | Date displayed by Bundesanzeiger |
| `reportingPeriodStart` | Parsed annual-account period start, when present |
| `reportingPeriodEnd` | Parsed annual-account period end, when present |
| `detailUrl` | Session-scoped official filing detail link |
| `documentUrl` | Official ESEF report link, when exposed |
| `documentName` | Published XHTML report file name |
| `noticeText` | Available detail text, capped at 50,000 characters |
| `keyFinancials` | Selected normalized revenue, profit/loss, assets, equity, liabilities, and currency |
| `financialFacts` | Published numeric XBRL facts with raw and normalized values |
| `sourceUrl` | Official result-page provenance |
| `source` | `Bundesanzeiger` |
| `fetchedAt` | ISO extraction timestamp |

`financialFacts` can contain issuer-specific concepts as well as standard IFRS concepts.

Use `concept`, `contextRef`, and `unitRef` when joining facts into your own accounting model.

### How much does it cost to extract Bundesanzeiger company filings?

The Actor uses pay-per-event pricing:

- one **run started** event: **$0.005**;
- one **filing saved** event for each accepted dataset row;
- BRONZE filing price: **$0.0016** per filing;
- lower filing prices apply on higher Apify tiers.

Financial facts included inside a filing row do not create a separate charge event.

Example BRONZE Actor charges:

| Useful output | Estimated Actor charge |
| --- | ---: |
| 1 filing | $0.0066 |
| 5 filings | $0.0130 |
| 25 filings | $0.0450 |
| 100 filings | $0.1650 |

These are Actor charges before any plan-specific platform usage. Start with a small limit, inspect the output, and then scale a scheduled task.

### How to run the Actor

1. Add one or more legal company names to `queries`.
2. Keep `matchMode` set to `exact_company` for precision-safe monitoring.
3. Keep `searchArea` set to `accounting` for annual accounts.
4. Set `maxItemsPerQuery` for fair watchlist coverage.
5. Set the total `maxItems` budget.
6. Keep `extractFinancials` enabled when you need published ESEF facts.
7. Run the Actor and export the default dataset as JSON, CSV, Excel, XML, or RSS.

A good first input is:

```json
{
  "queries": ["Siemens Aktiengesellschaft"],
  "matchMode": "exact_company",
  "searchArea": "accounting",
  "maxItems": 2,
  "maxItemsPerQuery": 2,
  "includeDetails": true,
  "extractFinancials": true,
  "maxFinancialFacts": 100
}
```

### Input reference

#### `queries`

Legal company names, or filing keywords when `matchMode` is `full_text`.

#### `matchMode`

Controls which Bundesanzeiger search hits become dataset rows:

- `exact_company` (default) compares normalized legal names and rejects related entities that only mention the query in filing text;
- `company_contains` accepts rows whose displayed company name contains the query;
- `full_text` preserves all source results, including records that matched only inside publication text.

Use `exact_company` for recurring due diligence and watchlists. Select `full_text` deliberately for broad filing-keyword research.

#### `searchArea`

Supported values:

- `accounting` for annual accounts and financial reports;
- `business` for business disclosures;
- `capital_market` for capital-market notices;
- `official`, `unofficial`, `judicial`, or `various` for those Gazette sections;
- `all` for a broad search.

#### `fromDate` and `toDate`

Optional publication-date boundaries in `YYYY-MM-DD` format.

#### `maxItems`

Maximum unique filing rows across the run. Allowed range: 1–1,000.

#### `maxItemsPerQuery`

Maximum rows accepted for each query. Use this for fair multi-company monitoring.

#### `includeDetails`

When enabled, the Actor opens the filing detail and includes available text.

#### `extractFinancials`

When enabled, the Actor follows official ESEF links and parses published inline-XBRL numeric facts.

#### `maxFinancialFacts`

Maximum XBRL facts retained per filing. The default is 250.

### Output example

A current real workflow produces records shaped like this:

```json
{
  "query": "Siemens Aktiengesellschaft",
  "searchArea": "accounting",
  "companyName": "Siemens Aktiengesellschaft",
  "location": "Berlin und München",
  "publicationTitle": "Jahres- und Konzernabschluss zum Geschäftsjahr vom 01.10.2021 bis zum 30.09.2022",
  "publicationDate": "01/11/2023",
  "reportingPeriodStart": "2021-10-01",
  "reportingPeriodEnd": "2022-09-30",
  "documentName": "siemens-20220930.xhtml",
  "keyFinancials": {
    "currency": "EUR",
    "revenue": 71977000000,
    "profitLoss": 4392000000,
    "assets": 151502000000,
    "equity": 54805000000,
    "liabilities": 96697000000
  },
  "financialFacts": [
    {
      "concept": "ifrs-full:Revenue",
      "label": "Revenue",
      "value": 71977000000,
      "rawValue": "71.977",
      "contextRef": "CYTD",
      "unitRef": "EUR",
      "decimals": "-6",
      "scale": 6
    }
  ],
  "source": "Bundesanzeiger",
  "fetchedAt": "2026-09-19T06:43:29.850Z"
}
```

Session-scoped URLs can expire. Persist the company, title, date, period, document name, and source metadata as the durable record.

### Monitoring German annual accounts

Create an Apify Task with your company watchlist.

Use a small `maxItemsPerQuery`, schedule the Task weekly or monthly, and compare each new dataset with the previous run.

A practical change key is:

```text
companyName + publicationTitle + publicationDate
```

Send new keys to your compliance queue, CRM, warehouse, or notification workflow.

The Actor returns current source results. It does not maintain cross-run state or send alerts by itself.

### Working with financial facts

`keyFinancials` is a convenience projection of standard concepts found in the report.

`financialFacts` is the richer provenance layer.

For robust analysis:

1. inspect the concept namespace;
2. use `contextRef` to distinguish periods or dimensions;
3. use `unitRef` and currency context;
4. retain `rawValue` for auditability;
5. use normalized `value` for calculations;
6. validate issuer-specific concepts before comparing companies.

A report may contain current and comparative values. The convenience projection selects the first published matching concept, while the fact list preserves the available contexts.

### Reliability and limitations

Bundesanzeiger result and detail links are session-scoped.

The Actor keeps cookies together for search, pagination, filing details, and official report access.

Transient network errors, HTTP 429, and temporary 5xx responses receive bounded retries.

Known limitations:

- not every filing exposes an ESEF XHTML report;
- older or exemption filings may provide metadata but no structured figures;
- official document URLs may expire with the source session;
- `full_text` mode can include related entities because the source may match publication text rather than the displayed company name;
- `exact_company` intentionally omits related subsidiaries, consolidated entity lists, and spelling variants that do not normalize to the requested legal name;
- XBRL taxonomies and issuer-specific concepts vary;
- the Actor does not provide accounting advice or restate source figures;
- broad `all` searches can be less precise than `accounting` searches.

Use `exact_company`, exact legal names, and source-specific filters when precision matters.

### Export and integration workflows

#### Spreadsheet review

Export the default dataset to Excel or CSV and filter on company, date, period, and filing title.

#### Data warehouse

Load JSON records into a raw filing table, then expand `financialFacts` into a child fact table keyed by filing and context.

#### Compliance automation

Use a webhook after a scheduled run, compare source keys, and create a review only for unseen publications.

#### Research pipeline

Join records to an internal German-company identifier, then keep the Bundesanzeiger fields as the official publication provenance.

### API usage with JavaScript

```js
import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('automation-lab/bundesanzeiger-company-filings-financials').call({
  queries: ['BASF SE'],
  searchArea: 'accounting',
  maxItems: 5,
  maxItemsPerQuery: 5,
  extractFinancials: true,
});

const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);
```

### API usage with Python

```python
import os
from apify_client import ApifyClient

client = ApifyClient(os.environ['APIFY_TOKEN'])
run = client.actor('automation-lab/bundesanzeiger-company-filings-financials').call(run_input={
    'queries': ['BASF SE'],
    'searchArea': 'accounting',
    'maxItems': 5,
    'maxItemsPerQuery': 5,
    'extractFinancials': True,
})
items = client.dataset(run['defaultDatasetId']).list_items().items
print(items)
```

### API usage with cURL

```bash
curl -X POST \
  'https://api.apify.com/v2/acts/automation-lab~bundesanzeiger-company-filings-financials/runs?token=YOUR_APIFY_TOKEN' \
  -H 'Content-Type: application/json' \
  -d '{
    "queries": ["Deutsche Bank Aktiengesellschaft"],
    "searchArea": "accounting",
    "maxItems": 3,
    "maxItemsPerQuery": 3,
    "extractFinancials": true
  }'
```

### MCP setup for Claude Desktop, Cursor, and VS Code

Add the Actor to Claude Code:

```bash
claude mcp add --transport http apify \
  "https://mcp.apify.com?tools=automation-lab/bundesanzeiger-company-filings-financials"
```

#### Claude Desktop

Use this server configuration in Claude Desktop:

```json
{
  "mcpServers": {
    "apify": {
      "url": "https://mcp.apify.com?tools=automation-lab/bundesanzeiger-company-filings-financials"
    }
  }
}
```

#### Cursor and VS Code

Use the same MCP server URL in Cursor or VS Code's MCP settings. The server exposes this Actor as an Apify tool under your own client configuration.

Example prompts:

- “Find the latest Bundesanzeiger annual-account publications for BASF SE.”
- “Extract published revenue and equity facts for this German-company filing.”
- “Run my three-company annual-account watchlist and return source-linked changes.”

AI-generated interpretations should be checked against the official filing and its XBRL context.

### Legality, privacy, and responsible use

The Actor accesses public Bundesanzeiger pages without a private account. It is an independent extraction tool and is not affiliated with, endorsed by, or certified by Bundesanzeiger Verlag.

The Actor does not use AI and sends no input or source records to an AI model provider. Optional MCP clients may process results under the user's own model and provider configuration.

It creates no external cache or company-controlled copy. Apify datasets, key-value stores, and logs follow the user's Apify account retention settings and can be deleted through Apify storage controls.

You are responsible for:

- using the data for a lawful purpose;
- respecting applicable terms, database rights, and rate limits;
- applying GDPR and other privacy obligations;
- validating material decisions against the official publication;
- keeping schedules and limits proportionate;
- avoiding claims that a missing result proves a company has no filing.

This Actor is a data-extraction tool, not legal, audit, tax, credit, or investment advice.

### Troubleshooting

#### Why does a filing have no `keyFinancials`?

The publication may not expose an official ESEF XHTML report, or it may use concepts outside the convenience mapping. Check `documentName`, `financialFacts`, and the official filing.

#### Why do I see a related company?

Bundesanzeiger full-text search can include consolidated-account relationships and related issuer names. Use the exact legal name, the `accounting` area, and downstream entity matching.

#### Why are document links unavailable later?

The source uses session-scoped links. Save durable filing metadata and rerun the query to obtain a fresh source session.

#### Why did I receive fewer rows than `maxItems`?

The source may have fewer matching publications, `maxItemsPerQuery` may be lower, or duplicate filing keys may have been removed.

#### How can I reduce run time?

Set `includeDetails` and `extractFinancials` to false for a metadata-only monitoring pass. Lower `maxFinancialFacts` when you need only a bounded sample of report facts.

### Related Automation Lab Actors

Use these when the buyer job needs a different official surface:

- [Germany Handelsregister Scraper](https://apify.com/automation-lab/germany-handelsregister-scraper) for registry and corporate filing records rather than Bundesanzeiger financial publications.
- [North Data Company, Officers & Financials Scraper](https://apify.com/automation-lab/northdata-company-officers-financials) for company profiles, officers, and timeline enrichment from North Data.
- [German Insolvency Announcements Scraper](https://apify.com/automation-lab/insolvenzbekanntmachungen-de-scraper) when the workflow is official insolvency notices rather than annual accounts.

### FAQ

#### Does the Actor require login?

No. The supported workflow uses public search, filing, and official ESEF pages.

#### Can it search several companies in one run?

Yes. Add several values to `queries` and set `maxItemsPerQuery` for balanced coverage.

#### Does it download PDFs?

No. It follows official XHTML reports for structured facts and records available document provenance.

#### Are financial figures always present?

No. They are included only when published structured facts are available through the filing.

#### Can I schedule recurring monitoring?

Yes. Save the input as an Apify Task, add a schedule, and compare dataset keys across runs.

#### Does the Actor identify the newest filing automatically?

It preserves source order and obeys your limits. Verify chronology using `publicationDate` and reporting periods.

#### Can I use output as final due-diligence evidence?

Use it as source-linked research evidence, then validate material conclusions against the official publication.

# Changelog

This Actor's version history is a separate document: https://apify.com/automation-lab/bundesanzeiger-company-filings-financials/changelog.md

# Actor input Schema

## `queries` (type: `array`):

Legal company names to match, or filing keywords when Full-text source results is selected below.

## `matchMode` (type: `string`):

Exact company name is precision-safe for due diligence. Company name contains supports partial legal names. Full-text source results preserves every Bundesanzeiger result whose filing text matched the query.

## `searchArea` (type: `string`):

Limit results to annual accounts, business disclosures, capital-market notices, or another Bundesanzeiger section.

## `fromDate` (type: `string`):

Optional publication start date in YYYY-MM-DD format.

## `toDate` (type: `string`):

Optional publication end date in YYYY-MM-DD format.

## `maxItems` (type: `integer`):

Maximum number of unique filing records saved across all queries.

## `maxItemsPerQuery` (type: `integer`):

Per-company cap that prevents one broad query from consuming the entire run limit.

## `includeDetails` (type: `boolean`):

Open filing detail pages and include the available notice text.

## `extractFinancials` (type: `boolean`):

Follow official ESEF documents and extract inline-XBRL facts when the filing exposes them.

## `maxFinancialFacts` (type: `integer`):

Safety cap for inline-XBRL facts retained on each filing.

## Actor input object example

```json
{
  "queries": [
    "Siemens Aktiengesellschaft"
  ],
  "matchMode": "exact_company",
  "searchArea": "accounting",
  "maxItems": 20,
  "maxItemsPerQuery": 5,
  "includeDetails": true,
  "extractFinancials": true,
  "maxFinancialFacts": 250
}
```

# Actor output Schema

## `overview` (type: `string`):

Default dataset view containing source-linked Bundesanzeiger filing records and available financial figures.

# 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 = {
    "queries": [
        "Siemens Aktiengesellschaft"
    ],
    "maxItems": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("automation-lab/bundesanzeiger-company-filings-financials").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 = {
    "queries": ["Siemens Aktiengesellschaft"],
    "maxItems": 20,
}

# Run the Actor and wait for it to finish
run = client.actor("automation-lab/bundesanzeiger-company-filings-financials").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 '{
  "queries": [
    "Siemens Aktiengesellschaft"
  ],
  "maxItems": 20
}' |
apify call automation-lab/bundesanzeiger-company-filings-financials --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,automation-lab/bundesanzeiger-company-filings-financials"
        }
    }
}
```

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/alML98DiXWNmI0HAe/builds/hfOLdKcTeczom9Fsy/openapi.json
