Reference

Data fields

Every field returned by the MCP server – per tool, with type, meaning and the rule for when a field is empty (null).

Search deliberately returns only a compact summary card per hit – not the full data. That is by design (fast and lean). The full record is fetched on demand by the agent via get_company_details or get_full_record.
search_companies

10-field card per hit – for searching, ranking, scanning.

get_company_details

Full profile of a company (all sections below).

get_full_record

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).

FieldTypeMeaningnull when …
fnrstringFirmenbuch number (e.g. 078052h)never
namestringCompany namenever
legal_formstringLegal-form label (e.g. GmbH)unknown
bundeslandstringBundesland label (e.g. Wien)unknown
postal_codestringpostal code of the seat (e.g. 1010)not provided
citystringseat city (e.g. Wien)not provided
streetstringstreet + house numberoften empty
is_financial_institutionboolbank/insurer per the official register (UGB figures are then absent by design)– (always set)
size_gklstringUGB filing class: W micro, K small, M medium, G large (not equal to balance-sheet size – holdings often file as small)unknown
bilanzsumme_bandstringhonest size band by balance-sheet totalno statement available
bilanzsumme_latestnumber €Balance-sheet total of the most recent statementno statement available
manager_namestringName of the primary authorised representative (public Firmenbuch data; year of birth yes, no day/month)not provided
equity_ratio_latest0–1Equity ratio (most recent year)not calculable
revenue_latestnumber €Revenue (most recent year)no P&L in the most recent statement
growth_profilestringshrinking/stable/growing/fast_growing< 2 comparable years
has_guv_latestbooldoes the most recent statement have a P&L?– (always set)
geschaeftszweigstringline of business (Firmenbuch free text)not registered (~15 %)
industry_sectionstringÖNACE 2025 section AV (details under industry)no classification available
oenace_divisionstringÖNACE 2025 division (2-digit, e.g. 85)no classification available
oenace_division_labelstringGerman division title (e.g. Erziehung und Unterricht)no classification available
oenace_groupstringÖNACE 2025 group (3-digit, e.g. 85.5)no classification available
oenace_group_labelstringGerman 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

FieldTypeMeaning
fnrstringFirmenbuch number
register_idstringtechnical ID, format AT_<fnr>
euidstring | nullEuropean Unique Identifier (BRIS), e.g. ATBRA.030444-000 — the EU-wide unique company ID
namestringCompany name
legal_formstringLegal form as code (GES = GmbH family; all codes)
statusstringactive / historical / deleted
courtstring | nullresponsible Firmenbuch court (often empty)

location · Registered seat

FieldTypeMeaning
countrystringCountry, always AUT
bundeslandstringBundesland as code, e.g. W Wien, O Oberösterreich (all codes)
citystringCity
postal_codestringPostal code
streetstring | nullStreet (often empty)

company · Key data

FieldTypeMeaning
stammkapitalnumber | nullShare capital in € (often empty)
first_filing_yearintfirst available statement year
last_filing_yearintmost recent available statement year
filing_years_availableintnumber of available statement years
founded_yearint | nullfounding year from the register's first registration (Neueintragung); available for companies registered from ~1995 on, else null
founded_sourcestring | nullorigin of the founded year
descriptionnullnot populated in V1

size · Size classification

FieldTypeMeaning
gklstringSize class: W micro, K small, M medium, G large
bilanzsumme_bandstringBalance-sheet-total band, small to very_large
peer_percentilesobjectPercentile 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).

FieldTypeMeaning
latest_yearintmost recent statement year
has_guv_latestbooldoes the most recent year have a P&L?
revenue_basisstring | nullorigin of the revenue value
latestobjectheadline values for the most recent year (subset)
bilanzobjectBalance-sheet positions (see below)
guvobjectP&L positions (see below; empty {} when there is no P&L)

Balance-sheet positions in financials.bilanz

PositionMeaning
Total
bilanzsummeBalance-sheet total (sum of all assets, equal to sum of liabilities and equity)
Assets
anlagevermoegenNon-current assets (long-term assets)
sachanlagenProperty, plant and equipment (land, buildings, machinery)
finanzanlagenFinancial assets (participations, securities)
umlaufvermoegenCurrent assets (short-term assets)
vorraeteInventory (stock on hand)
forderungenReceivables (e.g. trade receivables)
cashCash and equivalents (cash on hand, bank balances)
Liabilities & equity
eigenkapitalEquity
stammkapitalShare capital (subscribed capital)
kapitalruecklagenCapital reserves
gewinnruecklagenRetained earnings reserves
bilanzgewinn_verlustNet profit / loss carried forward
rueckstellungenProvisions
verbindlichkeitenLiabilities (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.

PositionMeaning
umsatzerloeseRevenue — only under the total-cost format (Gesamtkostenverfahren, ~59% of P&Ls)
rohergebnisGross profit (revenue less cost of sales) — only under the cost-of-sales format (Umsatzkostenverfahren, ~63% of P&Ls)
materialaufwandCost of materials — total-cost format only
personalaufwandPersonnel expenses
abschreibungenDepreciation and amortisation
ebitBetriebserfolg (operating result before financial result and taxes), § 231 (2) — present on almost every P&L
ebitdaOperating result plus depreciation
jahresueberschussNet income / loss for the year — present on almost every P&L
operating_resultOperating result, correctly named (identical to ebit) — only when the P&L breaks out financial result and taxes (~8%)
ebit_stricttrue EBIT = pre-tax result + interest expense — only when those lines are disclosed (~8%), otherwise not included
Two P&L formats: Every company reports under exactly one of two formats, never both. The total-cost format (Gesamtkostenverfahren) discloses 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.
Note on EBIT: The Austrian UGB statement (§ 231 (2)) reports no EBIT. 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.
Balance sheet only, no P&L: Where no P&L is present, 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.

RatioMeaning
equity_ratioEquity ratio (equity / balance-sheet total)
debt_ratioDebt ratio (debt / balance-sheet total)
debt_to_equityDebt-to-equity ratio (debt / equity)
working_capital_ratioWorking-capital ratio
anlagedeckungsgrad_1Fixed-asset coverage I (equity / non-current assets)
ebit_marginmargin on operating-result basis (operating_result / revenue)
ebit_strict_marginmargin on true EBIT (ebit_strict / revenue); null when ebit_strict is null
ebitda_marginEBITDA margin (EBITDA / revenue)
net_marginNet margin (net income / revenue)
personalkostenquotePersonnel-cost ratio (personnel expenses / revenue)
materialaufwandsquoteMaterial-cost ratio (cost of materials / revenue)
roaReturn on assets (ROA)
roeReturn on equity (ROE)
capital_profilequalitative 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

FieldTypeMeaning
profilestring | nullshrinking / stable / growing / fast_growing (empty with < 2 comparable years)
methodstring | nullcalculation basis for the profile

employees · Employees

FieldTypeMeaning
latest / latest_year / historyobject | nullEmployee count per year – often empty, since the Firmenbuch records employee counts only sporadically

filings · Filed annual statements + events

filings[] fieldTypeMeaning
stichtagstringBalance-sheet date of the statement
formatstringSource format (e.g. legacy_finanzonline, jab_4_0)
parsedboolparsed by machine?
gklstringSize class at filing time
doc_key · document_url · pdf_doc_keystring | nullDocument 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.

FieldTypeMeaning
kindstringbank, insurer, pensionskasse, vorsorgekasse, fund, other_financial
sourcestringregister (official list, unambiguous) or heuristic (name fallback)
caveatstringNote: 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.

FieldTypeMeaning
geschaeftszweigstringoriginal activity text (free text)
oenace.section / section_label_de / section_label_enstringÖNACE 2025 section AV + title DE/EN
oenace.division / division_label_de / division_label_enstringdivision (2-digit, e.g. 68) + title DE/EN
oenace.group / group_label_de / group_label_enstringgroup (e.g. 68.3) + title DE/EN
oenace.class / subclass / code + *_label_de/*_label_enstringclass (e.g. 11.07), 5-digit subclass + code = the verbatim 5-digit ÖNACE code (e.g. 11070) — present when source=register
oenace.versionstringOENACE_2025
nace.section / division / group + *_labelstringEU NACE Rev. 2.1: identical codes, official English titles, version = NACE_REV_2.1
code_2008stringthe assigned ÖNACE 2008 class — only on free-text-classified docs (not when source=register)
source · classified_fromstringregister (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

FieldTypeMeaning
n_signatories_latestintNumber of authorised signatories (most recent year)
signatories_stable_yearsintYears of stable management
primary_manager.ageintcurrent age of the primary manager (year-based)
primary_manager.birth_yearintYear of birth (year only)
primary_manager.role_labelstringRole (e.g. Managing Director)
primary_manager.vertretungstring | nullType of representation (sole / joint)
signatories[]listFull authorized-signatory roster (all officers: managing directors + Prokuristen …) — each with name (only with a lawful basis), role_label, vertretung, birth_year (year only), age
Privacy (GDPR): Names of authorised representatives (e.g. managing directors) come from the public Firmenbuch and are returned for per-query lookup. Birth data is year-granular only (age / year of birth, no day or month). Bulk extraction and resale are prohibited by the terms of use.

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&L
  • management.signatories_history – authorised signatories per year
  • derivationsmetrics_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

ArgumentMeaning
typesone or more of name_change / seat_change / legal_form_change / capital_change / management_change
since / untiltime range (ISO date); default: last 30 days
bundesland · oenace_section · oenace_division · legal_formthe same facets as search_companies
fnrswatchlist – watch only these Firmenbuch numbers
page · page_sizepage (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.

Two layers: detailed events (with before/after) from 1 July 2026; coarser historical register events (type + date, 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.

FilterMeaning
nameSubstring of the company name
legal_formLegal form, e.g. GmbH
bundeslandPlain name, e.g. Wien
size_gklSize class W/K/M/G
bilanzsumme_min / _maxBalance-sheet total from / to (€)
equity_ratio_min / _maxEquity ratio from / to (0–1)
revenue_min / _maxRevenue from / to (€)
employees_min / _maxEmployees from / to
growth_profileshrinking / stable / growing / fast_growing
has_guv · has_guv_latestonly companies with a P&L (ever / in the most recent year)
last_filing_year_minmost recent statement at least from this year
founded_year_min / _maxYear founded from / to
gf_age_minprimary manager at least X years old (succession screen)
manager_nameSubstring of the authorised representative's name (public Firmenbuch data)
oenace_section / oenace_division / oenace_groupindustry by ÖNACE 2025: section (AV), division (68) or group (68.3, precise peers)
geschaeftszweigsubstring of the free-text line of business
postal_code / cityPLZ prefix (1010 exact, 10 = all 10xx) or city (substring)
nearRadius 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.
queryFree-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_untiltime window for event_signal (ISO date); default: the last 365 days
statusactive / 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).

Response helpers. Every search also returns 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.