Data fields
Every field returned by the MCP server – per tool, with type, meaning
and the rule for when a field is empty (null).
get_company_details or get_full_record.
10-field card per hit – for searching, ranking, scanning.
Full profile of a company (all sections below).
Superset of the profile: full taxonomy + lineage.
1 search_companies → card
Compact extract. Codes are already resolved to labels here
(e.g. GmbH, Oberösterreich).
| Field | Type | Meaning | null when … |
|---|---|---|---|
fnr | string | Firmenbuch number (e.g. 078052h) | never |
name | string | Company name | never |
legal_form | string | Legal-form label (e.g. GmbH) | unknown |
bundesland | string | Bundesland label (e.g. Wien) | unknown |
postal_code | string | postal code of the seat (e.g. 1010) | not provided |
city | string | seat city (e.g. Wien) | not provided |
street | string | street + house number | often empty |
is_financial_institution | bool | bank/insurer per the official register (UGB figures are then absent by design) | – (always set) |
size_gkl | string | UGB filing class: W micro, K small, M medium, G large (not equal to balance-sheet size – holdings often file as small) | unknown |
bilanzsumme_band | string | honest size band by balance-sheet total | no statement available |
bilanzsumme_latest | number € | Balance-sheet total of the most recent statement | no statement available |
manager_name | string | Name of the primary authorised representative (public Firmenbuch data; year of birth yes, no day/month) | not provided |
equity_ratio_latest | 0–1 | Equity ratio (most recent year) | not calculable |
revenue_latest | number € | Revenue (most recent year) | no P&L in the most recent statement |
growth_profile | string | shrinking/stable/growing/fast_growing | < 2 comparable years |
has_guv_latest | bool | does the most recent statement have a P&L? | – (always set) |
geschaeftszweig | string | line of business (Firmenbuch free text) | not registered (~15 %) |
industry_section | string | ÖNACE 2025 section A–V (details under industry) | no classification available |
oenace_division | string | ÖNACE 2025 division (2-digit, e.g. 85) | no classification available |
oenace_division_label | string | German division title (e.g. Erziehung und Unterricht) | no classification available |
oenace_group | string | ÖNACE 2025 group (3-digit, e.g. 85.5) | no classification available |
oenace_group_label | string | German group title (e.g. Sonstiger Unterricht) | no classification available |
2 get_company_details → profile
The company sits under result. Raw codes are returned here
(e.g. legal_form: "GES" = GmbH, bundesland: "O" = Oberösterreich).
The full code tables are further down under
Code tables.
identity · Master data
| Field | Type | Meaning |
|---|---|---|
fnr | string | Firmenbuch number |
register_id | string | technical ID, format AT_<fnr> |
euid | string | null | European Unique Identifier (BRIS), e.g. ATBRA.030444-000 — the EU-wide unique company ID |
name | string | Company name |
legal_form | string | Legal form as code (GES = GmbH family; all codes) |
status | string | active / historical / deleted |
court | string | null | responsible Firmenbuch court (often empty) |
location · Registered seat
| Field | Type | Meaning |
|---|---|---|
country | string | Country, always AUT |
bundesland | string | Bundesland as code, e.g. W Wien, O Oberösterreich (all codes) |
city | string | City |
postal_code | string | Postal code |
street | string | null | Street (often empty) |
company · Key data
| Field | Type | Meaning |
|---|---|---|
stammkapital | number | null | Share capital in € (often empty) |
first_filing_year | int | first available statement year |
last_filing_year | int | most recent available statement year |
filing_years_available | int | number of available statement years |
founded_year | int | null | founding year from the register's first registration (Neueintragung); available for companies registered from ~1995 on, else null |
founded_source | string | null | origin of the founded year |
description | null | not populated in V1 |
size · Size classification
| Field | Type | Meaning |
|---|---|---|
gkl | string | Size class: W micro, K small, M medium, G large |
bilanzsumme_band | string | Balance-sheet-total band, small to very_large |
peer_percentiles | object | Percentile rank per ratio within the company's own size class (e.g. bilanzsumme: 99.3 = larger than 99.3%) |
financials · Financial data
First the header fields, then the positions – each as a time series (year → value).
| Field | Type | Meaning |
|---|---|---|
latest_year | int | most recent statement year |
has_guv_latest | bool | does the most recent year have a P&L? |
revenue_basis | string | null | origin of the revenue value |
latest | object | headline values for the most recent year (subset) |
bilanz | object | Balance-sheet positions (see below) |
guv | object | P&L positions (see below; empty {} when there is no P&L) |
Balance-sheet positions in financials.bilanz
| Position | Meaning |
|---|---|
| Total | |
bilanzsumme | Balance-sheet total (sum of all assets, equal to sum of liabilities and equity) |
| Assets | |
anlagevermoegen | Non-current assets (long-term assets) |
sachanlagen | Property, plant and equipment (land, buildings, machinery) |
finanzanlagen | Financial assets (participations, securities) |
umlaufvermoegen | Current assets (short-term assets) |
vorraete | Inventory (stock on hand) |
forderungen | Receivables (e.g. trade receivables) |
cash | Cash and equivalents (cash on hand, bank balances) |
| Liabilities & equity | |
eigenkapital | Equity |
stammkapital | Share capital (subscribed capital) |
kapitalruecklagen | Capital reserves |
gewinnruecklagen | Retained earnings reserves |
bilanzgewinn_verlust | Net profit / loss carried forward |
rueckstellungen | Provisions |
verbindlichkeiten | Liabilities (debt) |
P&L positions in financials.guv · only when has_guv (~3% of companies)
Under § 277 UGB, only medium-sized and large capital companies are required to disclose the profit-and-loss statement (P&L). The decisive question is whether at least two of the following thresholds (§ 221 UGB; since 2024) are exceeded on two consecutive balance-sheet dates:
- balance-sheet total of €6.25 million
- revenue of €12.5 million
- 50 employees on average
Small and micro capital companies are required to disclose only the balance sheet under § 278 UGB.
| Position | Meaning |
|---|---|
umsatzerloese | Revenue — only under the total-cost format (Gesamtkostenverfahren, ~59% of P&Ls) |
rohergebnis | Gross profit (revenue less cost of sales) — only under the cost-of-sales format (Umsatzkostenverfahren, ~63% of P&Ls) |
materialaufwand | Cost of materials — total-cost format only |
personalaufwand | Personnel expenses |
abschreibungen | Depreciation and amortisation |
ebit | Betriebserfolg (operating result before financial result and taxes), § 231 (2) — present on almost every P&L |
ebitda | Operating result plus depreciation |
jahresueberschuss | Net income / loss for the year — present on almost every P&L |
operating_result | Operating result, correctly named (identical to ebit) — only when the P&L breaks out financial result and taxes (~8%) |
ebit_strict | true EBIT = pre-tax result + interest expense — only when those lines are disclosed (~8%), otherwise not included |
umsatzerloese and materialaufwand;
the cost-of-sales format (Umsatzkostenverfahren) discloses
rohergebnis (revenue less cost of sales) instead. That is why about 40% of
P&Ls carry no umsatzerloese line — the revenue sits in rohergebnis.
The revenue_basis field on the record states which of the two the revenue figure
came from.ebit is the Betriebserfolg (operating result
before financial result and taxes) and is present on almost every statement;
operating_result is the same figure, correctly named. True EBIT
(ebit_strict, including the financial result = pre-tax result + interest expense)
and operating_result appear only when the P&L breaks out financial result and
taxes — about 8% of statements; otherwise those two fields are absent. For companies with a
material financial or participation result (e.g. holdings) the operating result and true EBIT
deviate noticeably.guv = {}, revenue_latest = null, and margin-based ratios stay empty.
Filter explicitly with has_guv / has_guv_latest.ratios · Financial ratios
13 ratios, each as a time-series object. Margin and return ratios require a P&L and otherwise stay empty.
| Ratio | Meaning |
|---|---|
equity_ratio | Equity ratio (equity / balance-sheet total) |
debt_ratio | Debt ratio (debt / balance-sheet total) |
debt_to_equity | Debt-to-equity ratio (debt / equity) |
working_capital_ratio | Working-capital ratio |
anlagedeckungsgrad_1 | Fixed-asset coverage I (equity / non-current assets) |
ebit_margin | margin on operating-result basis (operating_result / revenue) |
ebit_strict_margin | margin on true EBIT (ebit_strict / revenue); null when ebit_strict is null |
ebitda_margin | EBITDA margin (EBITDA / revenue) |
net_margin | Net margin (net income / revenue) |
personalkostenquote | Personnel-cost ratio (personnel expenses / revenue) |
materialaufwandsquote | Material-cost ratio (cost of materials / revenue) |
roa | Return on assets (ROA) |
roe | Return on equity (ROE) |
capital_profile | qualitative capital-structure profile |
Each ratio object contains, among others, latest,
latest_year, history (year → value), avg_3y/avg_5y,
min_5y/max_5y, volatility, trend as well as
growth measures.
growth · Growth
| Field | Type | Meaning |
|---|---|---|
profile | string | null | shrinking / stable / growing / fast_growing (empty with < 2 comparable years) |
method | string | null | calculation basis for the profile |
employees · Employees
| Field | Type | Meaning |
|---|---|---|
latest / latest_year / history | object | null | Employee count per year – often empty, since the Firmenbuch records employee counts only sporadically |
filings · Filed annual statements + events
| filings[] field | Type | Meaning |
|---|---|---|
stichtag | string | Balance-sheet date of the statement |
format | string | Source format (e.g. legacy_finanzonline, jab_4_0) |
parsed | bool | parsed by machine? |
gkl | string | Size class at filing time |
doc_key · document_url · pdf_doc_key | string | null | Document references (partly empty) |
events[] – register events (Vollzüge), derived from the daily change feed from 1 July 2026. The official extract carries no change log, so on every daily update we compare the master data and record differences as typed events (name_change, seat_change, legal_form_change, management_change, capital_change) with date, description and source. Capital changes also carry capital_from/capital_to, management changes managers_added/managers_removed (role + name). Two layers: the detailed events (with before/after) are recorded from 1 July 2026; in addition there are coarser historical register events (type + date only, source=change_feed: founding, deletion, merger, split, conversion, capital_change, legal_form_change, and more) back to ~2020. Queryable across companies via list_events (see below).
financial_institution · Regulated financial institution
Present only for banks, insurers and similar regulated institutions. Sourced from the official register (OeNB bank list, joined by company-register number; insurers via EIOPA/GLEIF in progress) – no name guessing.
| Field | Type | Meaning |
|---|---|---|
kind | string | bank, insurer, pensionskasse, vorsorgekasse, fund, other_financial |
source | string | register (official list, unambiguous) or heuristic (name fallback) |
caveat | string | Note: banks (BWG) / insurers (VAG) report under their own regime, so UGB ratios are absent/not comparable |
The search card additionally carries the is_financial_institution flag (bool).
industry · Industry (ÖNACE / NACE)
For roughly 95% of companies the industry is the official ÖNACE 2025 assignment from the register (Statistik Austria open HVD dataset, source = register) — deterministic, updated monthly, with the full path down to the 5-digit subclass. Only the remaining ~5% (with no official assignment) are classified from the free-text Firmenbuch Geschäftszweig. oenace and nace are structurally symmetric and carry identical codes by construction (ÖNACE 2025 = EU NACE Rev. 2.1); ÖNACE with German and English titles, NACE with the official English ones (NACE has no national subclass and stops at class level). The original activity text is always kept. Note: this block was previously called branch; it was renamed and extended.
| Field | Type | Meaning |
|---|---|---|
geschaeftszweig | string | original activity text (free text) |
oenace.section / section_label_de / section_label_en | string | ÖNACE 2025 section A–V + title DE/EN |
oenace.division / division_label_de / division_label_en | string | division (2-digit, e.g. 68) + title DE/EN |
oenace.group / group_label_de / group_label_en | string | group (e.g. 68.3) + title DE/EN |
oenace.class / subclass / code + *_label_de/*_label_en | string | class (e.g. 11.07), 5-digit subclass + code = the verbatim 5-digit ÖNACE code (e.g. 11070) — present when source=register |
oenace.version | string | OENACE_2025 |
nace.section / division / group + *_label | string | EU NACE Rev. 2.1: identical codes, official English titles, version = NACE_REV_2.1 |
code_2008 | string | the assigned ÖNACE 2008 class — only on free-text-classified docs (not when source=register) |
source · classified_from | string | register (official Statistik Austria assignment, authoritative) — otherwise lexicon / llm · basis official_register resp. geschaeftszweig/name |
Without a Geschäftszweig, nothing is guessed: only unambiguous company names are classified (classified_from: name), otherwise industry stays empty. The search card carries geschaeftszweig, industry_section and oenace_division/oenace_group with German labels.
management · Management
| Field | Type | Meaning |
|---|---|---|
n_signatories_latest | int | Number of authorised signatories (most recent year) |
signatories_stable_years | int | Years of stable management |
primary_manager.age | int | current age of the primary manager (year-based) |
primary_manager.birth_year | int | Year of birth (year only) |
primary_manager.role_label | string | Role (e.g. Managing Director) |
primary_manager.vertretung | string | null | Type of representation (sole / joint) |
signatories[] | list | Full authorized-signatory roster (all officers: managing directors + Prokuristen …) — each with name (only with a lawful basis), role_label, vertretung, birth_year (year only), age |
3 get_full_record → full record
Contains everything from the profile plus:
financials.positions– the complete 317-position taxonomy (every UGB position)financials.passthrough– unknown source codes including history (lossless)financials.completeness– quality measure (position count per year)financials.guv_years– list of years with a P&Lmanagement.signatories_history– authorised signatories per yearderivations–metrics_version+ formula registry of the ratios
Same rule here: officer names are public Firmenbuch data (per-query), birth data year-granular only.
4 list_events · get_event_stats → change feed (Pro)
Cross-company feed of register changes – the market-watch / deal-sourcing view: "which companies changed management / raised capital / relocated – where, since when". For the change history of one known company, use get_company_details (field events[]).
list_events · filters
| Argument | Meaning |
|---|---|
types | one or more of name_change / seat_change / legal_form_change / capital_change / management_change |
since / until | time range (ISO date); default: last 30 days |
bundesland · oenace_section · oenace_division · legal_form | the same facets as search_companies |
fnrs | watchlist – watch only these Firmenbuch numbers |
page · page_size | page (1) · hits per page (25, max 100) |
Per event: fnr, name, date, type, description, for capital capital_from/capital_to, for management managers_added/managers_removed (role + name), plus bundesland, legal_form, industry_section. Sorted by date (newest first).
get_event_stats returns, for the same filters, counts by type and by Bundesland – for market dashboards ("how many capital increases in Upper Austria this month").
Companies rather than events? To find companies that had an event – with financial context, ranked by size – use the event_signal filter in search_companies (see section 5). The triggering events then attach to each company card.
source=change_feed) back to ~2020. An empty result means no change in the period – not missing data.5 Filters, sorting, pages
Arguments of search_companies.
| Filter | Meaning |
|---|---|
name | Substring of the company name |
legal_form | Legal form, e.g. GmbH |
bundesland | Plain name, e.g. Wien |
size_gkl | Size class W/K/M/G |
bilanzsumme_min / _max | Balance-sheet total from / to (€) |
equity_ratio_min / _max | Equity ratio from / to (0–1) |
revenue_min / _max | Revenue from / to (€) |
employees_min / _max | Employees from / to |
growth_profile | shrinking / stable / growing / fast_growing |
has_guv · has_guv_latest | only companies with a P&L (ever / in the most recent year) |
last_filing_year_min | most recent statement at least from this year |
founded_year_min / _max | Year founded from / to |
gf_age_min | primary manager at least X years old (succession screen) |
manager_name | Substring of the authorised representative's name (public Firmenbuch data) |
oenace_section / oenace_division / oenace_group | industry by ÖNACE 2025: section (A–V), division (68) or group (68.3, precise peers) |
geschaeftszweig | substring of the free-text line of business |
postal_code / city | PLZ prefix (1010 exact, 10 = all 10xx) or city (substring) |
near | Radius search: { place, radius_km } or { postal_code, radius_km } (exactly one; radius 1–150 km). Hits carry distance_km and sort by distance. An ambiguous town name is rejected with the candidate PLZs. |
query | Free-text search over name and activity; combines freely with every structured filter. Each card carries match_reason (which field matched). |
event_signal (Pro) | Event-driven discovery – only companies that had a corporate-event signal in the window: ownership_change (shareholder capital change, often a share transfer), leadership_change (management/officer change), capital_raise, restructuring (merger/split/contribution/…), new_company, closure, rebrand, relocation. Combines with every financial/profile filter; each card gains the triggering events + latest_event_date. This is the deal-sourcing / sales-trigger surface. |
event_since / event_until | time window for event_signal (ISO date); default: the last 365 days |
status | active / inactive / all |
Sorting: sort = { field, descending } over
bilanzsumme, revenue, equity_ratio,
employees, last_filing_year,
revenue_growth_1y, revenue_growth_3y, revenue_growth_5y
(revenue growth: 1-year, 3- and 5-year CAGR; only where a multi-year GuV exists, others sort last)
(or distance with a
near filter). Default: Bilanzsumme descending. An unknown sort field is rejected with the
list of valid fields.
Pages: page (from 1), page_size (default 25).
has_more (more pages exist), applied_filters (the filters as
actually applied after normalization — e.g. "Wien" → W) and, when a search
with ≥ 2 filters yields 0 hits, relaxations: which
single filter to drop to get hits (with the match count per variant). So an AI
agent finds the right constraint in one call instead of guessing blindly.
Name searches are relevance-ranked (exact/prefix matches first).6 Code tables
Bundesland (code → plain name): B Burgenland · K Kärnten ·
N Niederösterreich · O Oberösterreich · S Salzburg ·
St Steiermark · T Tirol · V Vorarlberg · W Wien.
Legal form: The granular Firmenbuch code is in the profile
(legal_form). The GmbH family is the prefix GE…
(GES ≈ 99.7%); the search card labels it as GmbH.
Size class gkl: W micro · K small ·
M medium · G large.
7 Example response
This is what a full get_company_details response looks like for a sample
company (abbreviated; time series are illustrative). Fields with
null or empty objects/lists are also part of the response and are sent
where useful, so the agent can tell the difference between "not present"
and "unknown".
Note: this example is a sample record illustrating the structure.
// Response envelope "schema_version": "1.0", "data_version": "2026-06-27", "provenance": { "source": "Österreichisches Firmenbuch / BMJ – Justiz", "license": "CC BY 4.0", "data_version": "2026-06-27", "schema_version": "1.0", "built_at": "2026-06-27T07:32:14Z" }, "result": { "identity": { "fnr": "999999x", "register_id": "AT_999999x", "name": "Beispiel Industrie GmbH", "legal_form": "GES", // code → label "GmbH" (see §5) "status": "active", "court": null }, "location": { "country": "AUT", "bundesland": "O", // Oberösterreich "city": "Linz", "postal_code": "4020", "street": null }, "company": { "stammkapital": 35000, "first_filing_year": 2014, "last_filing_year": 2024, "filing_years_available": 11, "founded_year": 2013, "founded_source": "first_filing-1", "description": "Unternehmensberatung" }, "size": { "gkl": "M", // medium "bilanzsumme_band": "large", "peer_percentiles": { "bilanzsumme": 82.4, "equity_ratio": 71.3, "revenue": 68.9 } }, "financials": { "latest_year": 2024, "has_guv_latest": true, "revenue_basis": "umsatzerloese", "latest": { "bilanzsumme": 12450000, "eigenkapital": 5230000, "umsatzerloese": 18900000, "ebit": 1430000, "ebitda": 2210000, "jahresueberschuss": 980000 }, "bilanz": { "bilanzsumme": { "latest": 12450000, "latest_year": 2024, "history": { "2022": 10840000, "2023": 11620000, "2024": 12450000 } }, "eigenkapital": { "latest": 5230000, "history": { "2022": 4380000, "2023": 4790000, "2024": 5230000 } } // … more balance-sheet positions (verbindlichkeiten, anlagevermoegen, vorraete, cash, …) }, "guv": { "umsatzerloese": { "latest": 18900000, "history": { "2022": 16200000, "2023": 17550000, "2024": 18900000 } }, "ebit": { "latest": 1430000, "history": { "2022": 1180000, "2023": 1290000, "2024": 1430000 } } "materialaufwand": { "latest": -9100000 }, "personalaufwand": { "latest": -5200000 }, "abschreibungen": { "latest": -780000 }, "ebitda": { "latest": 2210000 }, "jahresueberschuss": { "latest": 980000 } // cost-of-sales format instead: "rohergebnis" in place of umsatzerloese + materialaufwand } }, "ratios": { "equity_ratio": { "latest": 0.42, "latest_year": 2024, "history": { "2022": 0.404, "2023": 0.412, "2024": 0.42 }, "avg_3y": 0.412, "min_5y": 0.39, "max_5y": 0.42, "trend": "rising", "growth_1y": 0.019, "growth_3y_cagr": 0.021 }, "ebit_margin": { "latest": 0.076, "trend": "stable" } // … debt_ratio, debt_to_equity, working_capital_ratio, anlagedeckungsgrad_1, // ebitda_margin, net_margin, personalkostenquote, materialaufwandsquote, // roa, roe, capital_profile }, "growth": { "profile": "growing", "method": "revenue_3y_cagr" }, "employees": null, // only sporadically recorded in the Firmenbuch "management": { "n_signatories_latest": 2, "signatories_stable_years": 4, "primary_manager_name": "Maria Beispiel", // public Firmenbuch data (name served) "primary_manager": { "age": 52, "birth_year": 1974, // year only (GDPR) "role_label": "GESCHÄFTSFÜHRER/IN (handelsrechtlich)", "vertretung": "selbständig" } }, "filings": [ { "stichtag": "2024-12-31", "format": "jab40_semantic", "parsed": true, "gkl": "M", "eingereicht": "2025-08-12", "document_url": "https://justizonline.gv.at/…", "pdf_doc_key": null } // … older statements, sorted by stichtag descending ], "events": [], "industry": { // industry – derived from the Geschäftszweig "geschaeftszweig": "Unternehmensberatung", "oenace": { // ÖNACE 2025 (national), titles DE + EN "section": "N", "section_label_de": "Erbringung von freiberuflichen, wissenschaftlichen und technischen Dienstleistungen", "section_label_en": "Professional, scientific and technical activities", "division": "70", "division_label_de": "Verwaltung und Führung von Unternehmen; Unternehmensberatung", "division_label_en": "Activities of head offices and management consultancy", "group": "70.2", "group_label_de": "Unternehmensberatung", "group_label_en": "Business and other management consultancy activities", "version": "OENACE_2025" }, "nace": { // EU NACE Rev. 2.1 – same codes, English titles "section": "N", "section_label": "Professional, scientific and technical activities", "division": "70", "division_label": "Activities of head offices and management consultancy", "group": "70.2", "group_label": "Business and other management consultancy activities", "version": "NACE_REV_2.1" }, "code_2008": "70.22", // assigned ÖNACE 2008 class "source": "llm", // or "lexicon" "classified_from": "geschaeftszweig" // or "name" } }
In the search card (search_companies)
codes are already resolved to labels (e.g. legal_form: "GmbH",
bundesland: "Oberösterreich"). In the full profile and in
get_full_record the raw codes are returned; the tables above in §5 explain
the resolution.
8 Status & warranty
Every response carries provenance.data_version and built_at
(build time of the delivered data). The data comes from the
Austrian Firmenbuch (BMJ – Justiz, EU High Value Dataset,
CC BY 4.0), is processed automatically and provided without warranty
as to accuracy, completeness or timeliness. The official Firmenbuch extract is
always authoritative.
Developer variant of this page: FIELD_REFERENCE.md in the repo.