Grundbegriffe
Was du einmal verstehen musst, um mit jeder Antwort sicher umzugehen.
Acht Begriffe tragen die ganze API. Wer sie kennt, liest jede Antwort richtig und weiß vorher, was eine Anfrage kostet.
Firmen eindeutig finden
Der Parameter q von fetch-organization nimmt drei Arten von Angaben. Die Beispiele auf dieser Seite sind Anfragen für die Hetzner Online GmbH, Ansbach HRB 6089:
| Angabe | Beispiel | Wann sie passt |
|---|---|---|
| Firmenname |
Hetzner Online GmbH |
Für den Einstieg. Schreib den Namen so vollständig, wie er im Register steht. |
| Registergericht und Registernummer |
Ansbach HRB 6089 |
Eindeutig für jede eingetragene Firma. Gericht, Registerart und Nummer gehören zusammen. |
| entity_id |
94eb910fef13f94585c48c263fa446d4 |
Für Folgeabfragen. Du bekommst sie in jeder Antwort. |
Die Registernummer allein reicht nicht, denn jedes Registergericht vergibt eigene Nummern. Die Reihenfolge ist dagegen frei: HRB 6089 Ansbach findet im Beispiel dieselbe Firma.
curl -G "https://handelsregister.ai/api/v1/fetch-organization" \ -H "x-api-key: DEIN_API_SCHLUESSEL" \ --data-urlencode 'q=Ansbach HRB 6089'
import requests response = requests.get( "https://handelsregister.ai/api/v1/fetch-organization", headers={"x-api-key": "DEIN_API_SCHLUESSEL"}, params={ "q": "Ansbach HRB 6089", }, ) data = response.json()
const url = new URL("https://handelsregister.ai/api/v1/fetch-organization"); url.searchParams.append("q", "Ansbach HRB 6089"); const response = await fetch(url, { headers: { "x-api-key": "DEIN_API_SCHLUESSEL" }, }); const data = await response.json();
entity_id.
Findet die API keine Firma, antwortet sie mit 404 und berechnet nichts. Für unscharfe Angaben gibt es den AI-Mode (ai_search=on-default): Er findet die Firma auch aus Namensteilen und recherchiert dazu im Web. Er kostet 20 Credits zusätzlich, auch wenn er keine Firma findet. Mehrere Kandidaten auf einmal liefert Suche & Export.
Features
Jedes Firmenprofil enthält die Basisdaten, darunter Name, Rechtsform, Status, Registereintrag, Anschrift, Gegenstand, Branche, Kapital und Vertretungsregelung. Alles Weitere forderst du als Feature an, etwa related_persons für die Geschäftsführung oder financial_kpi für die Finanz-KPIs.
Mehrere Features gibst du mit wiederholtem feature an oder als Liste: features=related_persons,financial_kpi. Jedes Feature steht in der Antwort unter seinem eigenen Schlüssel. Nur publications heißt dort history.
curl -G "https://handelsregister.ai/api/v1/fetch-organization" \ -H "x-api-key: DEIN_API_SCHLUESSEL" \ --data-urlencode 'q=Hetzner Online GmbH' \ --data-urlencode 'feature=related_persons' \ --data-urlencode 'feature=financial_kpi'
import requests response = requests.get( "https://handelsregister.ai/api/v1/fetch-organization", headers={"x-api-key": "DEIN_API_SCHLUESSEL"}, params={ "q": "Hetzner Online GmbH", "feature": ["related_persons", "financial_kpi"], }, ) data = response.json()
const url = new URL("https://handelsregister.ai/api/v1/fetch-organization"); url.searchParams.append("q", "Hetzner Online GmbH"); url.searchParams.append("feature", "related_persons"); url.searchParams.append("feature", "financial_kpi"); const response = await fetch(url, { headers: { "x-api-key": "DEIN_API_SCHLUESSEL" }, }); const data = await response.json();
Unbekannte Namen ignoriert die API ohne Fehlermeldung, prüf also die Schreibweise. Features, die dein Plan nicht enthält, lässt sie weg und berechnet sie nicht.
Alle Features mit Preis stehen bei fetch-organization, jedes Feld im Datenkatalog.
Credits
Datenabrufe kosten Credits. Für ein Firmenprofil gelten diese Regeln:
- Der Grundpreis von 5 Credits fällt an, wenn die API eine Firma liefert.
- Ein Feature kostet nur, wenn es in der Antwort Daten liefert. Ein leeres Feature ist kostenlos, auch
insolvency_publicationsohne Einträge. - Echtzeit und AI-Mode sind keine Features, sondern Aufschläge mit eigenen Regeln:
- Echtzeit kostet 10 Credits zusätzlich, sobald der Live-Abruf gelingt. Das gilt auch, wenn er nichts Neues zeigt.
- Der AI-Mode kostet 20 Credits zusätzlich, auch wenn er keine Firma findet. Nur wenn die API die Anfrage mit 408 abbricht, weil sie zu lange dauert, entfällt der Aufschlag.
- Alle anderen Fehler kosten nichts.
Die Regel für jedes einzelne Feature steht unter Abrechnung, die Preise bei fetch-organization.
Ein Beispiel: Die Basisdaten mit related_persons und financial_kpi kosten 5 + 2 + 1 = 8 Credits, wenn beide Features Daten liefern.
Vor jeder Anfrage prüft die API, ob dein Guthaben für den höchstmöglichen Preis reicht. Reicht es nicht, antwortet die API mit 402 und berechnet nichts. Was tatsächlich berechnet wurde, steht in meta.request_credit_cost, dein Guthaben danach in meta.credits_remaining.
1{2 "meta": {3 "request_credit_cost": 5,4 "credits_remaining": 1455 }6}
Credits bekommst du als Startcredits, mit einem Credit-Abo jeden Monat neu oder einmalig als Top-up Credits. Ohne Credit-Abo gelten Startcredits und Top-up Credits 30 Tage, mit aktivem Abo verfallen sie nicht. Alles Weitere steht unter Abrechnung.
Aktuelle Daten und Echtzeit
Ohne weitere Angabe kommt das Firmenprofil aus unserem Datenbestand. Wie aktuell eine Angabe ist, hängt von ihrer Quelle ab.
Handelsregister
Basisdaten, Personen und Registerbekanntmachungen halten wir in unserem Datenbestand aus dem Register aktuell. Das geht schnell und reicht für die meisten Zwecke.
Mit Echtzeit (realtime_mode=handelsregister-default) holt die API im Moment der Anfrage den Aktuellen Abdruck (AD) live aus dem Handelsregister und liefert ihn als JSON. Du bekommst dabei die aktuell eingetragenen Personen unter related_persons.current, ohne das Feature extra zu bezahlen.
Ob der Live-Abruf geklappt hat, zeigt _realtime_mode.status. Nur bei success berechnen wir die 10 Credits für Echtzeit.
curl -G "https://handelsregister.ai/api/v1/fetch-organization" \ -H "x-api-key: DEIN_API_SCHLUESSEL" \ --data-urlencode 'q=Hetzner Online GmbH' \ --data-urlencode 'realtime_mode=handelsregister-default'
import requests response = requests.get( "https://handelsregister.ai/api/v1/fetch-organization", headers={"x-api-key": "DEIN_API_SCHLUESSEL"}, params={ "q": "Hetzner Online GmbH", "realtime_mode": "handelsregister-default", }, ) data = response.json()
const url = new URL("https://handelsregister.ai/api/v1/fetch-organization"); url.searchParams.append("q", "Hetzner Online GmbH"); url.searchParams.append("realtime_mode", "handelsregister-default"); const response = await fetch(url, { headers: { "x-api-key": "DEIN_API_SCHLUESSEL" }, }); const data = await response.json();
1{2 "name": "Hetzner Online GmbH",3 "_realtime_mode": {4 "mode": "handelsregister-default",5 "status": "success"6 },7 "related_persons": {8 "current": [9 {10 "entity_id": "78ad32e16ff779f589a9e88d23356f74",11 "label": "MANAGING_DIRECTOR",12 "role": {13 "en": {14 "long": "Managing Director",15 "short": "MD"16 },17 "de": {18 "long": "Geschäftsführer",19 "short": "GF"20 }21 },22 "name": "Max Mustermann",23 "name_parts": {24 "given": "Max",25 "family": "Mustermann",26 "maiden": null,27 "canonical_name": "Mustermann, Max",28 "aliases": [29 "Mustermann, Max"30 ],31 "previous_names": null32 },33 "start_date": null,34 "end_date": null,35 "birth_date": "1976-01-15",36 "location": {37 "home": {38 "city": "Musterheim"39 }40 },41 "organization_representation_scheme": {42 "current": [43 "Ist nur ein Geschäftsführer bestellt, so vertritt er die Gesellschaft allein. Sind mehrere Geschäftsführer bestellt, so wird die Gesellschaft durch zwei Geschäftsführer oder durch einen Geschäftsführer gemeinsam mit einem Prokuristen vertreten."44 ],45 "history": []46 },47 "role_representation_scheme": {48 "current": [49 "einzelvertretungsberechtigt",50 "mit der Befugnis, im Namen der Gesellschaft mit sich im eigenen Namen oder als Vertreter eines Dritten Rechtsgeschäfte abzuschließen"51 ],52 "history": []53 }54 },55 {56 "entity_id": "73549375ff7d709b9e7e2941ad1ffaa3",57 "label": "MANAGING_DIRECTOR",58 "role": {59 "en": {60 "long": "Managing Director",61 "short": "MD"62 },63 "de": {64 "long": "Geschäftsführer",65 "short": "GF"66 }67 },68 "name": "Paul Musterwald",69 "name_parts": {70 "given": "Paul",71 "family": "Musterwald",72 "maiden": null,73 "canonical_name": "Musterwald, Paul",74 "aliases": [75 "Musterwald, Paul"76 ],77 "previous_names": null78 },79 "start_date": null,80 "end_date": null,81 "birth_date": "1989-07-18",82 "location": {83 "home": {84 "city": "Probebrück"85 }86 },87 "organization_representation_scheme": {88 "current": [89 "Ist nur ein Geschäftsführer bestellt, so vertritt er die Gesellschaft allein. Sind mehrere Geschäftsführer bestellt, so wird die Gesellschaft durch zwei Geschäftsführer oder durch einen Geschäftsführer gemeinsam mit einem Prokuristen vertreten."90 ],91 "history": []92 },93 "role_representation_scheme": {94 "current": [95 "einzelvertretungsberechtigt"96 ],97 "history": []98 }99 },100 {101 "entity_id": "cfecded2c1d17946c8ab0379aa786eed",102 "label": "MANAGING_DIRECTOR",103 "role": {104 "en": {105 "long": "Managing Director",106 "short": "MD"107 },108 "de": {109 "long": "Geschäftsführer",110 "short": "GF"111 }112 },113 "name": "Jan Musterhuber",114 "name_parts": {115 "given": "Jan",116 "family": "Musterhuber",117 "maiden": null,118 "canonical_name": "Musterhuber, Jan",119 "aliases": [120 "Musterhuber, Jan"121 ],122 "previous_names": null123 },124 "start_date": null,125 "end_date": null,126 "birth_date": "1955-11-06",127 "location": {128 "home": {129 "city": "Probeingen"130 }131 },132 "organization_representation_scheme": {133 "current": [134 "Ist nur ein Geschäftsführer bestellt, so vertritt er die Gesellschaft allein. Sind mehrere Geschäftsführer bestellt, so wird die Gesellschaft durch zwei Geschäftsführer oder durch einen Geschäftsführer gemeinsam mit einem Prokuristen vertreten."135 ],136 "history": []137 },138 "role_representation_scheme": {139 "current": [140 "einzelvertretungsberechtigt"141 ],142 "history": []143 }144 }145 ]146 },147 "meta": {148 "request_credit_cost": 15,149 "credits_remaining": 145150 }151}
Gelingt der Live-Abruf nicht, liefert die API die gespeicherten Daten aus unserem Datenbestand. Du erkennst das an _realtime_mode.status, das dann nicht success lautet. Echtzeit wird dann nicht berechnet, das zeigt auch meta.request_credit_cost.
Echtzeit lohnt sich, wenn es auf den Stand von heute ankommt. Du prüfst damit etwa neue Geschäftspartner vor einer Unterschrift oder siehst, wer die Firma gerade vertreten darf.
Jahresabschlüsse
Neu veröffentlichte Jahresabschlüsse suchen wir täglich. Firmen haben für die Veröffentlichung aber bis zu zwölf Monate nach dem Ende des Geschäftsjahres Zeit (§ 325 HGB), und viele nutzen die Frist aus. Einzelne Firmen halten die gesetzliche Frist bewusst nicht ein und veröffentlichen noch später.
Der neueste Abschluss betrifft deshalb oft das vorletzte Geschäftsjahr. Mehr dazu unter Aktualität.
Insolvenzbekanntmachungen
Die Insolvenzgerichte veröffentlichen ihre Bekanntmachungen meist am Tag der Entscheidung oder kurz danach. Du bekommst sie über das Feature insolvency_publications, jeweils mit Gericht, Aktenzeichen und Datum.
Nachrichten
Das Feature news liefert Nachrichten über die Firma aus dem Web, mit Titel, Quelle, Datum und Link. Wie aktuell sie sind, hängt davon ab, wann zuletzt über die Firma berichtet wurde. Zu kleinen Firmen gibt es oft nur wenige passende Meldungen.
Historie und Gültigkeit
Viele Angaben ändern sich mit der Zeit. Die API liefert deshalb den aktuellen Stand und die Historie nebeneinander:
currentist der Stand von heute.historylistet jeden eingetragenen Stand miteffective_fromundeffective_to. Isteffective_tonull, gilt der Stand bis heute.- Personen stehen in
related_persons.currentundrelated_persons.past, jeweils mitstart_dateundend_date.
Jede Angabe mit Historie stammt aus den Registern und Veröffentlichungen, etwa aus dem Chronologischen Abdruck (CD) des Handelsregisters oder aus allen veröffentlichten Jahresabschlüssen.
So sieht das in unserem Beispiel für die Vertretungsregelung der Hetzner Online GmbH aus. In der Beispielantwort nennt sie bis zum 28.07.2015 den Vorstand, seitdem die Geschäftsführer:
1{2 "representation_scheme": {3 "current": [4 "Ist nur ein Geschäftsführer bestellt, so vertritt er die Gesellschaft allein. Sind mehrere Geschäftsführer bestellt, so wird die Gesellschaft durch zwei Geschäftsführer oder durch einen Geschäftsführer gemeinsam mit einem Prokuristen vertreten."5 ],6 "history": [7 {8 "value": [9 "Ist nur ein Vorstandsmitglied bestellt, so vertritt es die Gesellschaft allein. Sind mehrere Vorstandsmitglieder bestellt, so wird die Gesellschaft durch zwei Vorstandsmitglieder oder durch ein Vorstandsmitglied gemeinsam mit einem Prokuristen vertreten."10 ],11 "effective_from": "2002-10-15",12 "effective_to": "2015-07-28"13 },14 {15 "value": [16 "Ist nur ein Geschäftsführer bestellt, so vertritt er die Gesellschaft allein. Sind mehrere Geschäftsführer bestellt, so wird die Gesellschaft durch zwei Geschäftsführer oder durch einen Geschäftsführer gemeinsam mit einem Prokuristen vertreten."17 ],18 "effective_from": "2015-07-28",19 "effective_to": null20 }21 ]22 }23}
Die meisten Datumsangaben kommen im Format JJJJ-MM-TT. Wie weit die Historie zurückreicht, steht unter Alter und Historie.
Leere Werte
Nicht jede Firma hat zu jedem Feld eine Angabe. Die API zeigt das auf zwei Arten:
null: Für dieses Feld liegt kein Wert vor.[]: Die Liste hat keine Einträge, etwa keine Insolvenzbekanntmachungen.
Ein angefordertes Feature ohne Daten kommt als null oder [] und kostet nichts.
1{2 "name": "dm-drogerie markt GmbH + Co. KG",3 "legal_form": "GmbH & Co. KG",4 "contact_data": {5 "website": "https://www.dm.de",6 "phone_number": "+49 721 55920",7 "email": null8 },9 "capital": {10 "current": null,11 "history": []12 },13 "mergers_and_acquisitions": null,14 "insolvency_publications": []15}
Behandle in deinem Code einen fehlenden Schlüssel, null und [] gleich, denn manche leeren Objekte kommen als []. Lies Felder außerdem über ihre Namen, denn die Reihenfolge der Schlüssel steht nicht fest.
Fehlt ein Wert, muss die Firma ihn meist gar nicht veröffentlichen. Was das Gesetz je nach Rechtsform und Größe verlangt, steht unter Datenverfügbarkeit. Einzelne Angaben halten wir bewusst zurück; sie tragen dann redacted: true.
Stabilität und Versionen
Die API wächst additiv. Neue Daten und Features kommen als neue Felder dazu. Bestehende Felder entfernen wir nie, wir benennen sie nicht um und ändern weder ihren Typ noch ihre Bedeutung. So bleibt jede Version abwärtskompatibel.
Änderungen, die bestehenden Code brechen würden, gibt es nur in einer neuen API-Version, etwa unter /v2. Die aktuelle Version läuft unter /v1.
Lass deinen Client deshalb unbekannte Felder ignorieren und unbekannte Werte als allgemeinen Fall behandeln. Neue Felder und Features stehen im Changelog.
Pläne
Firmenprofil, Dokumente, Suche & Export und Signals nutzt du mit jedem Konto, auch ohne Credit-Abo. Ein Credit-Abo bringt jeden Monat neue Credits und schaltet weitere Daten frei:
| Was dazukommt | Plus | Pro | Max |
|---|---|---|---|
| Personenprofil: Rollen und Beteiligungen von Personen | enthalten | enthalten | enthalten |
| Suche & Export: Filter nach Eigentum, Führung & Insolvenz | nicht enthalten | enthalten | enthalten |
| Firmenprofil: Über 90 erweiterte Finanz-KPIs | nicht enthalten | enthalten | enthalten |
| Firmenprofil: Tätigkeitsabschlüsse von Energieversorgern (§ 6b EnWG) | nicht enthalten | nicht enthalten | enthalten |
Firmenprofil: Tiefe Gesellschafter (shareholders_deep) |
nicht enthalten | nicht enthalten | enthalten |
Firmen-Netzwerk (network) |
nicht enthalten | enthalten | enthalten |
| Signals: Insolvenzen | nicht enthalten | enthalten | enthalten |
| Signals: Umwandlungen & M&A | nicht enthalten | nicht enthalten | enthalten |
Features außerhalb deines Plans lässt die API ohne Fehler weg und berechnet sie nicht. Personenprofile und Suchfilter außerhalb deines Plans lehnt sie mit 403 ab, ebenfalls ohne Kosten. Bei Signals gilt das für Themen, die du ausdrücklich anfragst; ohne Angabe bekommst du einfach alle Themen deines Plans.
Preise und Credits der Pläne findest du in der Preisübersicht.