REST API · V1

Firmenatlas API-Dokumentation

Österreichische Unternehmens-, Finanz-, Beteiligungs- und Personendaten strukturiert abrufen. Hier findest du konkrete Abläufe, Parameter und kopierbare Beispiele.

Erste Anfrage

Schnellstart

Erstelle oder rotiere deinen Key in der Accountverwaltung. Der vollständige Key wird nur einmal angezeigt. Trage ihn in Swagger unter Authorize ohne das Wort Bearer ein; in eigenen Requests wird er als Bearer-Token gesendet.

export FIRMENATLAS_API_KEY="fa_api_DEIN_VOLLSTAENDIGER_KEY"

curl "https://api.firmenatlas.com/v1/companies?query=Firmenatlas&limit=10" \
  -H "Authorization: Bearer $FIRMENATLAS_API_KEY"

Eine erfolgreiche Antwort enthält die Nutzdaten unter data und technische Metadaten unter meta. Alle erfolgreichen V1-Endpunkte liefern HTTP 200, auch POST-Operationen.

{
  "data": {
    "unternehmen": [
      {
        "firmenbuchnummer": "123456a",
        "name": "Beispiel GmbH",
        "sitz": "Wien",
        "rechtsform": "Gesellschaft mit beschränkter Haftung",
        "status": "Aktiv"
      }
    ]
  },
  "meta": {
    "requestId": "req_...",
    "generatedAt": "2026-08-19T10:15:30.000Z",
    "limit": 10,
    "nextCursor": null,
    "hasMore": false
  }
}

Konventionen

Grundlagen

Basis-URL

https://api.firmenatlas.com

IDs und Schlüssel

ParameterTypVorgabeBedeutung
firmenbuchnummerstringÖsterreichische Firmenbuchnummer ohne Leerzeichen, zum Beispiel 123456a. Sie kommt aus der Firmen- oder erweiterten Suche.
personIdstringUndurchsichtige Referenz aus GET /v1/people. Für Profil und Netzwerk genau diese ID verwenden; Personenreferenzen in Unternehmensprofilen können anders aufgebaut sein.
documentKeystringKommt aus der Dokumentliste. Als URL-Pfadsegment URL-encodieren und nicht selbst zusammensetzen.
listId / itemIdstringWerden von den Listen-Endpunkten zurückgegeben und anschließend unverändert verwendet.

Pagination

Bei der ersten Anfrage lässt du cursor weg. Wenn meta.hasMore den Wert true hat, übergibst du meta.nextCursor unverändert an die nächste Anfrage. Der Cursor darf nicht interpretiert oder verändert werden.

GET /v1/companies?query=Beispiel&limit=10
GET /v1/companies?query=Beispiel&limit=10&cursor=eyJvZmZzZXQiOjEwfQ

Alle Endpunkte

GET/v1/companiesUnternehmen suchen
GET/v1/companies/{firmenbuchnummer}Unternehmensprofil
GET/v1/companies/{firmenbuchnummer}/financial-statementsFinanzdaten
GET/v1/companies/{firmenbuchnummer}/documentsDokumente
POST/v1/documents/{documentKey}/download-linkDownload-Link
GET/v1/companies/{firmenbuchnummer}/ownershipDirekte Beziehungen
GET/v1/companies/{firmenbuchnummer}/ownership-graphEigentümergraph
POST/v1/companies/searchErweiterte Suche
GET/v1/company-search/fieldsVerfügbare Suchfelder
POST/v1/company-search/facetsFacetten und Verteilungen
GET/v1/peoplePersonen suchen
GET/v1/people/{personId}Personenprofil
GET/v1/people/{personId}/relationship-graphPersonennetzwerk
GET/v1/listsListen abrufen
POST/v1/listsListe anlegen
GET/v1/lists/{listId}Liste mit Einträgen
POST/v1/lists/{listId}/itemsUnternehmen hinzufügen
DELETE/v1/lists/{listId}/items/{itemId}Eintrag entfernen
GET/v1/usageKontingent abrufen

Unternehmen

Suchen und Profil abrufen

GET/v1/companies

Die einfache Suche ist für Namens- und Firmenbuchnummern-Lookups gedacht. Sie liefert kompakte Treffer, aber noch kein vollständiges Unternehmensprofil, und zählt nicht zum Monatskontingent.

ParameterTypVorgabeBedeutung
querystringerforderlichFirmenname, früherer Name oder Firmenbuchnummer; 1 bis 120 Zeichen.
limitinteger10Treffer pro Seite; zulässig sind 1 bis 20.
cursorstringBeim ersten Aufruf leer lassen, danach meta.nextCursor übernehmen.
GET/v1/companies/{firmenbuchnummer}

Lädt Registerdaten, die letzten Finanzkennzahlen und kompakte Beziehungskennzahlen. Vollständige Abschlüsse und Eigentümerdaten haben eigene Endpunkte.

curl "https://api.firmenatlas.com/v1/companies/123456a" \
  -H "Authorization: Bearer $FIRMENATLAS_API_KEY"
KI-Recherche: Recherchierte Unternehmensinformationen wie Zusammenfassung, Angebote und Zielkunden sind bewusst nicht Bestandteil dieses Standardabrufs. Sie werden später als getrennte Erweiterung angeboten.

Jahresabschlüsse

Finanzdaten abrufen

GET/v1/companies/{firmenbuchnummer}/financial-statements
ParameterTypVorgabeBedeutung
yearsstringKommagetrennte Geschäftsjahre, zum Beispiel 2025,2024; maximal zwölf Jahre.
limitinteger1Maximale Zahl ausgelieferter Abschlüsse; zulässig sind 1 bis 12.
cursorstringCursor für weitere ältere Abschlüsse.
curl "https://api.firmenatlas.com/v1/companies/123456a/financial-statements?years=2025,2024&limit=2" \
  -H "Authorization: Bearer $FIRMENATLAS_API_KEY"

verfuegbareGeschaeftsjahre nennt alle bekannten Jahre; ausgelieferteGeschaeftsjahre die aktuelle Antwort und fehlendeGeschaeftsjahre explizit angeforderte Jahre ohne Daten. Jeder Abschluss enthält Währung, Bilanz, Gewinn- und Verlustrechnung, Kennzahlen, Mitarbeiterwerte und Quelle.

bilanzsumme

Gesamtsumme der Aktiv- bzw. Passivseite

eigenkapital

Bilanzielles Eigenkapital

eigenkapitalquote

Eigenkapital im Verhältnis zur Bilanzsumme

jahresueberschuss

Ergebnis des Geschäftsjahres

workingCapital

Umlaufvermögen abzüglich kurzfristiger Verpflichtungen

gesamtkapitalrentabilitaet

Ertrag im Verhältnis zum eingesetzten Gesamtkapital

Firmenbuchdokumente

Dokument finden und herunterladen

Der Download besteht bewusst aus zwei Schritten: zuerst den Dokument-Key finden, danach einen kurzlebigen signierten Link erzeugen.

GET/v1/companies/{firmenbuchnummer}/documents?limit=20
POST/v1/documents/{documentKey}/download-link
# 1. Dokumente auflisten
curl "https://api.firmenatlas.com/v1/companies/123456a/documents?limit=20" \
  -H "Authorization: Bearer $FIRMENATLAS_API_KEY"

# 2. dokumentKey aus der Antwort URL-encodiert einsetzen
curl -X POST "https://api.firmenatlas.com/v1/documents/DOKUMENT_KEY/download-link" \
  -H "Authorization: Bearer $FIRMENATLAS_API_KEY"
Der erzeugte downloadUrl ist standardmäßig fünf Minuten gültig. Er enthält bereits die Download-Autorisierung und sollte weder dauerhaft gespeichert noch protokolliert werden. In V1 kann derselbe Link innerhalb dieser Zeit mehrfach verwendet werden. Die Link-Erstellung zählt als Nutzung, die einzelnen Downloads werden nicht zusätzlich auf das Monatskontingent angerechnet.

Analytics

Erweiterte Unternehmenssuche

POST/v1/companies/search

Verwende diesen Endpunkt für Filterkombinationen, ausgewählte Ergebnisfelder und Sortierung. Die gültigen öffentlichen Feldpfade kommen aus GET /v1/company-search/fields. Verfügbare Kategorien und Verteilungen liefert POST /v1/company-search/facets.

curl -X POST "https://api.firmenatlas.com/v1/companies/search" \
  -H "Authorization: Bearer $FIRMENATLAS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "filters": {
      "rechtsformen": ["Gesellschaft mit beschränkter Haftung"],
      "bundeslaender": ["Wien"],
      "bilanzsumme": { "min": 1000000 }
    },
    "fields": [
      "firmenbuchnummer",
      "name",
      "letztesGeschaeftsjahr.bilanzsumme"
    ],
    "sort": {
      "field": "letztesGeschaeftsjahr.bilanzsumme",
      "order": "desc"
    },
    "page": 1,
    "pageSize": 50
  }'
ParameterTypVorgabeBedeutung
filtersobjectFilter mit deutschen öffentlichen Feldnamen. Zulässige Werte und Operatoren stehen im Felder-Endpunkt.
fieldsstring[]Gewünschte Ergebnisfelder; maximal 64. Unbekannte Felder erscheinen unter ignorierteFelder.
sortobjectSortierbares öffentliches Feld und Reihenfolge asc oder desc.
pageinteger1Seitennummer, beginnend bei 1.
pageSizeinteger50Ergebnisse je Seite; maximal 100.
Interne Elasticsearch-Feldnamen werden nicht akzeptiert. Ungültige Filterwerte oder widersprüchliche Zahlenbereiche liefern 400 INVALID_REQUEST.

Eigentum

Direkte Beziehungen und Graph

GET/v1/companies/{firmenbuchnummer}/ownership
ParameterTypVorgabeBedeutung
directionenumbothowners: Eigentümer des Unternehmens; holdings: Beteiligungen des Unternehmens; both: beide Gruppen.
statusenumcurrentcurrent liefert nur aktuelle, all zusätzlich historische Beziehungen.
limitinteger50Beziehungen je Seite; 1 bis 100.
cursorstringCursor für die nächste Seite.
GET/v1/companies/{firmenbuchnummer}/ownership-graph
ParameterTypVorgabeBedeutung
directionenumbothupstream verfolgt Eigentümer nach oben, downstream Beteiligungen nach unten, both beide Richtungen.
depthinteger3Automatische Expansionstiefe ab der Wurzel; zulässig sind 1 bis 3.
statusenumcurrentcurrent liefert den aktuellen Graphen, all bezieht historische Beziehungen ein.

Eine Kante zeigt immer vom Eigentümer zum Beteiligungsziel. Der Wurzelknoten hat Tiefe 0. Personen werden nicht rekursiv expandiert; eindeutig identifizierte Unternehmen schon. Zyklen werden gemeldet und nicht weiterverfolgt.

Pro Antwort gelten dieselben Grenzen wie in der UI: Tiefe 3, maximal 200 Knoten und 5.000 Kanten. Bei Erreichen einer Grenze bleibt der ermittelte Teilgraph erhalten und abgeschnitten sowie abbruchgruendeerklären den Abbruch.

Personen

Suchen, Profil und Netzwerk

GET/v1/people
ParameterTypVorgabeBedeutung
querystringerforderlichName der gesuchten Person; 2 bis 120 Zeichen.
birthYearintegerOptionales Geburtsjahr zur Unterscheidung gleichnamiger Personen.
limitinteger10Treffer pro Seite; 1 bis 20.
cursorstringCursor für die nächste Seite.
GET /v1/people?query=Max%20Mustermann&birthYear=1975&limit=10

Die Suche liefert eine personId. Verwende genau diese ID anschließend für Profil und Netzwerk. Sie ist eine undurchsichtige Routenreferenz und keine dauerhaft garantierte Stammdaten-ID. Eine Personenreferenz aus einem Unternehmensprofil kann anders aufgebaut sein und soll nicht allein anhand der ID mit Suchtreffern dedupliziert werden.

GET/v1/people/{personId}?status=current&limit=50

Das Profil enthält Name, Geburtsdaten soweit verfügbar, Aliasnamen, Funktionen, persönliche Beteiligungen, verbundene Unternehmen und exakte Kennzahlen. Mit status=all werden auch historische Beziehungen geliefert. Die Pagination begrenzt nur die ausgelieferte Funktionsliste; Kennzahlen, verbundene Unternehmen, verbundene Personen und der Personengraph bleiben unabhängig von limit und cursor.

GET/v1/people/{personId}/relationship-graph?limit=100

Das Netzwerk beginnt bei der Person, ergänzt direkt verbundene Unternehmen und dort verbundene Personen. Weitere Personen werden innerhalb derselben Antwort nicht rekursiv expandiert. Für weitere Tiefe rufst du deren personId als neue Wurzel auf.

Accountweite Daten

Listen verwalten

Listen gehören dem Account und stehen damit allen entsprechend berechtigten Account-Nutzern zur Verfügung. Der typische Ablauf ist: Listen abrufen oder anlegen, Unternehmen hinzufügen, Liste mit Einträgen laden.

# Liste anlegen
curl -X POST "https://api.firmenatlas.com/v1/lists" \
  -H "Authorization: Bearer $FIRMENATLAS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "name": "Wiener Zielkunden" }'

# Unternehmen hinzufügen
curl -X POST "https://api.firmenatlas.com/v1/lists/LISTEN_ID/items" \
  -H "Authorization: Bearer $FIRMENATLAS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "firmenbuchnummer": "123456a",
    "kommentar": "Im nächsten Quartal kontaktieren"
  }'
GETListen abrufen
/v1/lists
POSTListe anlegen
/v1/lists
GETEinträge und Finanzansicht
/v1/lists/{listId}
POSTUnternehmen hinzufügen
/v1/lists/{listId}/items
DELETEEintrag entfernen
/v1/lists/{listId}/items/{itemId}

Kontingent

Nutzung und Limits

GET/v1/usage

REST und MCP teilen das monatliche Account-Kontingent. api_access steuert nur die REST-API-Key-Freischaltung; MCP bleibt unabhängig davon per OAuth erreichbar und seine erfolgreichen Tool-Aufrufe werden trotzdem erfasst. Einfache Firmen- und Personensuchen sowie Lookup-Metadaten zählen nicht. Erweiterte Suchen und erfolgreiche Datenabrufe zählen grundsätzlich einmal. Fehlgeschlagene Aufrufe werden nicht gezählt.

{
  "data": {
    "monatlichesLimit": null,
    "diesenMonatVerbraucht": 27,
    "diesenMonatVerbleibend": null,
    "einfacheSuchenZaehlen": false,
    "erweiterteSuchenZaehlen": true,
    "zurueckgesetztAm": "2026-09-01T00:00:00.000Z"
  }
}
Solange für den Account kein Monatslimit konfiguriert ist, sindmonatlichesLimit und diesenMonatVerbleibend null. Das kurzfristige Rate-Limit gilt trotzdem. Für MCP gelten standardmäßig zusätzlich 60 HTTP-Anfragen pro Account und Minute.

Fehlerbehandlung

Fehler maschinell verarbeiten

Verlasse dich auf HTTP-Status und error.code. Die Nachricht ist für Menschen gedacht. Gib bei Support-Anfragen immer die requestId an.

{
  "error": {
    "code": "INVALID_REQUEST",
    "message": "Die Anfrage ist ungültig.",
    "details": {},
    "requestId": "req_..."
  }
}
ParameterTypVorgabeBedeutung
400 INVALID_REQUESTClientParameter, Filter oder Request-Body sind ungültig.
401 UNAUTHENTICATEDAuthAPI-Key fehlt, ist ungültig, abgelaufen oder gesperrt.
403 INSUFFICIENT_SCOPEAuthDem Key oder Account fehlt die erforderliche Berechtigung.
404 *_NOT_FOUNDDatenUnternehmen, Person, Liste oder andere Ressource wurde nicht gefunden.
429 RATE_LIMITEDLimitKurzfristiges Rate-Limit erreicht; später erneut versuchen.
429 MONTHLY_LIMIT_REACHEDLimitMonatliches Account-Kontingent ist ausgeschöpft.
500 INTERNAL_ERRORServerUnerwarteter Fehler; requestId für Support aufbewahren.

Wir verwenden Cookies, um grundlegende Funktionen der Plattform sicherzustellen und anonymisierte Nutzungsstatistiken zu erfassen. Durch einen Klick auf "Akzeptieren" stimmst du der Verwendung dieser Cookies zu.