Companies
What a company record contains, which fields are reliable, and where they come from.
Where a company record comes from
Two sources, and the difference matters:
- The register index — name, court, register number, legal form, status. Present for every company, refreshed as the register changes.
- The register extract — address, purpose, capital, representatives, incorporation date. Only present once the extract has been fetched and successfully parsed for that company.
A company with only source 1 is not an error. It is a company whose extract has not been retrieved. See Data coverage for how often that is the case.
The record
{
"id": "c359aa06-1ac0-4dab-9c60-d5c69a06ff2c",
"object": "company",
"name": "Enduro Reise & Training GmbH",
"status": "active",
"legal_form": {
"code": "gmbh",
"name": "Gesellschaft mit beschränkter Haftung",
"abbreviation": "GmbH",
"elf_code": "2HBR"
},
"register": {
"court": { "code": "M1401", "name": "Amtsgericht Memmingen" },
"type": "HRB",
"number": "13557",
"display": "Amtsgericht Memmingen HRB 13557",
"country": "DE"
},
"address": {
"street": "In der Paint 14",
"postal_code": "87730",
"city": "Bad Grönenbach",
"state": "Bayern",
"country": "DE",
"formatted": "In der Paint 14, 87730 Bad Grönenbach",
"coordinates": { "latitude": 47.87, "longitude": 10.25 }
},
"purpose": "Planung und Durchführung von Motorrad-Sicherheitstraining …",
"capital": { "amount": "25000.00", "currency": "EUR" },
"general_representation_rule": "Ist ein Geschäftsführer bestellt, so vertritt er allein.",
"identifiers": { "euid": "DEM1401.HRB13557", "lei": null },
"industries": [{ "system": "wz2025", "code": "85.53", "name": "Fahr- und Flugschulen", "level": 4 }],
"incorporation_date": "2008-11-21",
"termination_date": null,
"last_register_entry_date": "2025-01-26",
"counts": { "current_officers": 1, "documents": 4, "financial_statements": 15 }
}The record is the register entry as it stands today. Officers, documents, statements,
ownership and history are separate endpoints, which is why counts is here: it tells you
whether calling one is worth a credit before you spend it.
register
The identity of the entry. display is the human-readable form you would quote to a
lawyer. court.name is given as the register writes it (Amtsgericht Berlin (Charlottenburg)), which is not always the court's colloquial name; court.code is the
official court code, stable across spellings, and is what you should match on.
number is a string, here and everywhere else. A register number is an identifier,
not a quantity — it can carry letter suffixes, and leading zeros are meaningful.
name
The full legal name including the legal form. Former names are not in this object — they
are in the register history, as
company.name.changed events carrying what the entry replaced.
status
One of active, liquidation, terminated or unknown.
unknown means what it says: the register data does not tell us. It is not a synonym for
inactive, and the field will never claim active for a company we cannot confirm is
trading — for a KYC decision, a wrong active is the one answer you cannot absorb.
This was wrong in the old API
The retired /api derived this from a comparison that never matched, so nearly every
company was reported active, including entries the register had deleted. v1 reads the
stored value, and falls back to unknown rather than guessing.
legal_form
code is the value to branch on — gmbh, gmbh_co_kg, ug, ev and so on. name and
abbreviation are for display, and elf_code is the ISO 20275 code where one applies.
The register stores this as free text with more than 20,000 distinct spellings, so
legal_form is null for the 7.6% of companies whose wording we cannot classify
confidently. A null is "we could not read it", never "it has no legal form".
address
The seat as registered, which is the address for service — not necessarily a trading
address. formatted is the single-line form. Any component may be null; city is by
far the most commonly populated.
capital
Registered share capital (Stammkapital / Grundkapital), in the currency stated in the
register. The amount is a decimal string so it never loses precision in a JSON parser
that reads numbers as floats. Pre-2002 entries can still be denominated in DEM. This is
the capital the register records, which is not the same as equity, and is never updated by
trading.
incorporation_date
The date the entry records as the company's founding. This is normally the date of the articles of association, which precedes the date the company was entered in the register — external sources showing the entry date will differ by days or weeks. Neither is wrong; they are different dates.
counts
How much related data exists: current officers, documents on file, financial statements. Counted from the record itself, so it costs nothing extra. A zero means there is nothing to fetch, which is worth checking before spending a credit on the sub-resource.
Officers are their own endpoint
Representatives, board members and authorised signatories are one collection at
GET /companies/{company_id}/officers,
because to a caller they are the same thing: a person or a company holding a role. That
replaces the old split between representation and prokura_persons, and with it the
register fields that used to hang off a person-shaped row when the officer was a company.
An empty list means "no extract parsed", not "nobody is in charge" — check whether
address and purpose are also null before concluding anything.