German Handelsregister API — Company Data & KYB
Pricing
from $0.005 / actor start
German Handelsregister API — Company Data & KYB
German company data & KYB API. Look up firms across all 5 German registers via handelsregister.de: Handelsregister (HRB/HRA), Genossenschaft (eG), Gesellschaftsregister (eGbR), Partnerschaft & Verein. Returns JSON — registration number, court, legal form, status, address. Firmendaten. Unofficial.
Pricing
from $0.005 / actor start
Rating
0.0
(0)
Developer
Patrick Lierse
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
0
Monthly active users
3 hours ago
Last modified
Categories
Share
German Handelsregister Lookup — all five public registers
Look up German entities in the official register portal (handelsregister.de) and get clean, structured JSON back: registration number, court, legal form, status and more.
One portal, five registers — all covered:
| Register | Section | Typical entities |
|---|---|---|
| Handelsregister | HRB / HRA | GmbH, AG, SE, UG, KG, OHG, e.K. |
| Genossenschaftsregister | GnR | eG — Volksbanken, Raiffeisen, housing & energy co-ops |
| Gesellschaftsregister (new since 2024) | GsR | eGbR — registered civil-law partnerships (property-holding GbRs) |
| Partnerschaftsregister | PR | PartG / PartG mbB — law, tax & audit firms |
| Vereinsregister | VR | e.V. — registered associations |
The same search handles every section — pass a name, or a register number with
its prefix (HRB 50000, GnR 23, GsR 4711, PR 512, VR 642). The
Gesellschaftsregister (eGbR) is a 2024 register that no other Apify actor
covers — useful for verifying the registered GbRs that now appear in land and
beneficial-ownership records.
Unofficial tool. This actor is not affiliated with or endorsed by the Bundesministerium der Justiz or any German authority. It retrieves the same publicly available register data any person can view free of charge on the official portal — register publicity is statutory (§ 9 HGB for the commercial register; equivalent provisions govern the cooperative, partnership, association and company registers, all free and login-free via the common portal since DiRUG, Aug 2022). It does so politely: hard rate limit, caching, no personal data by default.
Example
Input
{"companyName": "Allianz SE","maxResults": 1}
Output (one dataset item per company match, trimmed)
{"companyName": "Allianz SE","registrationNumber": "HRB 164232","registrationCourt": "München","legalForm": "SE","registeredAddress": "München","status": "aktuell"}
(Full records also include registrationDate, persons, sourceUrl,
cachedAt and dataSource — see the field notes below.)
Beyond the commercial register — the same actor resolves cooperatives, partnerships, associations and the new eGbR register. Real results from a live QA run (2026-06-13):
{ "companyName": "Berliner Volksbank eG", "registrationNumber": "GnR 23", "registrationCourt": "Berlin (Charlottenburg)", "legalForm": "eG", "status": "aktuell" }{ "companyName": "eGbR Lützowgärten KH", "registrationNumber": "GsR 4711", "registrationCourt": "Berlin (Charlottenburg)", "legalForm": "eGbR", "status": "aktuell" }{ "companyName": "Noerr Partnerschaftsgesellschaft mbB …", "registrationNumber": "PR 512", "registrationCourt": "München", "legalForm": "PartG mbB","status": "aktuell" }
Associations (VR) carry no legal-form suffix, so legalForm is null for
them by design — the register type is always available from the
registrationNumber prefix.
What it does
You give it a company name and/or a registration number (e.g. HRB 50000),
optionally a registration court (Amtsgericht). It searches the official
register portal and returns up to maxResults structured records. Successful
lookups are cached for 72 hours — registry data changes slowly, and cache
hits cost zero requests against the portal.
Rate limits — read this before bulk use
The portal's terms of use cap automated retrieval at 60 queries per hour. This actor enforces that limit internally with a sliding-window limiter (strictly at most 60 requests in any rolling hour, budget persisted across runs) — it is a feature, not a bug, and it cannot be disabled:
- When the budget is exhausted, the actor waits (it does not fail, does not rotate proxies, does not evade). A run that needs more requests than the hourly budget simply takes longer.
- The internal queue accepts at most 200 pending lookups. Beyond that the run fails fast with a clear error rather than accepting work it cannot politely complete.
- Repeat lookups within 72 hours are served from cache instantly and consume no quota.
If you need thousands of fresh records per hour, this is the wrong tool — and under the portal's terms, so is every other tool.
Input
| Field | Type | Default | Notes |
|---|---|---|---|
companyName | string | — | Name or keywords. Required if no registrationNumber. |
registrationNumber | string | — | With section prefix: HRB/HRA, GnR, GsR, PR, VR (e.g. GnR 23). Required if no companyName. |
registrationCourt | string | — | Amtsgericht name, narrows the search. |
includePersons | boolean | false | GDPR safety default. Reserved for deep-record retrieval of directors/officers — not yet functional; persons stays empty and nothing extra is charged. |
maxResults | integer | 10 | 1–100. |
Example input
{"companyName": "Allianz SE","maxResults": 2,"includePersons": false}
Example output (real result from a live QA run, 2026-06-11)
{"companyName": "AREVA GmbH","registrationNumber": "HRB 7817","registrationCourt": "Fürth","federalState": "Bayern","legalForm": "GmbH","registeredAddress": "Erlangen","registrationDate": null,"status": "aktuell","formerNames": ["Siemens Nuclear Power GmbH", "Framatome ANP GmbH", "AREVA NP GmbH"],"formerSeats": ["Erlangen"],"persons": [],"sourceUrl": "https://www.handelsregister.de/rp_web/erweitertesuche/welcome.xhtml","cachedAt": "2026-06-11T21:28:00.000Z","dataSource": "handelsregister.de/erweitertesuche"}
The search result grid reliably provides name, court, register number, federal
state (Bundesland), seat, status, and company history — formerNames and
formerSeats (the register's renaming/relocation trail; null when none).
These are all company data (no personal-data dimension).
Field availability honesty: registrationDate and persons — plus deeper
fields some competitors show (business purpose/Gegenstand, capital,
representatives/Prokuristen) — live only in the full filing document (a deep
record, the SI/AD/CD extracts). The portal serves those only through
JavaScript command-link postbacks that this plain-HTTP actor deliberately does
not replicate (no headless browser, no anti-bot workarounds). Consequently
persons is currently always empty (even with includePersons: true, which
logs a notice instead) and registrationDate is always null. The
deep-record event is never charged, and we do not fabricate these fields.
Searching by name: know this limitation
The register matches your keywords against registered legal names, not
brands. "Allianz SE" and "Siemens AG" resolve fine; "BMW AG" does not —
the registered name is "Bayerische Motoren Werke Aktiengesellschaft", which
contains neither "BMW" nor "AG". For brand-only names, search by
registrationNumber (e.g. HRB 42243) and add registrationCourt
(e.g. München) to disambiguate — register numbers repeat across courts and
the court filter is applied locally by the actor. Results are relevance-ranked
before maxResults is applied, because the portal itself returns up to 100
alphabetically sorted fuzzy matches.
Pricing (pay per event)
| Event | Price | When charged |
|---|---|---|
| Actor start | $0.005 | once per run |
| Structured result | $0.004 | per record returned ($4 per 1,000) |
| Deep record | $0.04 | per full filing document actually retrieved — feature not yet live, this event is currently never charged |
Examples: 1,000 basic company lookups ≈ $4.01–$4.05 depending on how many runs you batch them into. Deep records will be charged only on successful retrieval once the feature ships — today it never fires.
GDPR note
Company register data is public by statutory design (§ 9 HGB). Personal data
(names of directors/officers) is off by default and retrieved only when
you explicitly enable includePersons — at that point you are choosing to
process personal data and need your own lawful basis. See COMPLIANCE.md in
the repository for the operator's Legitimate Interest Assessment.
Every HTTP request the actor makes is timestamped and saved to the run's
key-value store under AUDIT_LOG.
Troubleshooting
- "results grid not found" — the portal changed its markup (it has before).
The raw HTML is saved to the run's KV store under
PARSE_FAILURE_HTML; please report it. No fabricated data is ever emitted. - Slow run — that's the 60/hour limit working as designed; see above.
- The portal itself warns that its search can be flaky. Precise queries (exact name, or register number + court) work best.
Contact
Support: patrick.lierse@googlemail.com