registercheckby openlaw group
Understand the data

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:

  1. The register index — name, court, register number, legal form, status. Present for every company, refreshed as the register changes.
  2. 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.

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.

On this page