Ingesting the Handelsregister: 1.2M announcements a year at 3.1-hour median latency
Germany publishes company changes through 17 state portals, a federal gazette and a common register interface that agree with each other most of the time. Getting to a 3.1-hour median is mostly a story about disagreement.
Poll shape beats poll frequency
Announcements do not arrive uniformly. They cluster around court business hours, and they spike on the first working day after a holiday. A flat 15-minute poll wastes most of its calls and is still late on the spike.
We poll on a schedule derived from each court's observed publication histogram, tightened to 5 minutes in a court's active window and relaxed to 60 outside it. Same request budget, median latency down from 5.4 h to 3.1 h.
The XML that lies
The register XML is well-formed and frequently wrong in ways a schema cannot catch.
- Aenderungsdatum is sometimes the date of the filing and sometimes the date of the publication, depending on the court and the filing type. The difference is up to 11 days.
- Legal form appears in a structured field, in the name string, and occasionally in neither, in which case it is in a free-text remark.
- A company that changes its seat between courts appears as a deletion in one and a new registration in the other, with no cross-reference. Treating that as a dissolution and an incorporation was our single largest source of wrong history, and fixing it required matching on the register number *and* the officers.
We keep the raw document forever and re-derive fields from it. Every parser bug we have fixed since 2023 has been backfilled without re-fetching anything, because the source of truth on disk is the document, not our interpretation of it.
The holiday that became an alert
In November 2024 our DE freshness alert fired for eleven hours. Nothing was broken: it was Buß- und Bettag, a public holiday in Saxony and nowhere else, and the Dresden court published nothing all day.
The fix was not to widen the threshold — that hides real outages. Court holiday calendars are now an ingest input. The alert compares against the expected volume for that court on that day, and a silent Dresden on a Saxon holiday is expected. A silent Hamburg on a Tuesday is not.
A monitoring system that does not know the domain will either page you at 3am about a public holiday, or be tuned until it never pages you at all.
What the numbers look like now
| Metric | Value |
|---|---|
| Announcements ingested per year | 1.2M |
| Median latency, publication to API | 3.1 h |
| Within 24 hours | 97.8% |
| Parser corrections backfilled, 2026 | 14 |
| Courts with a bespoke poll schedule | 17 |
Live per-jurisdiction lag is on the status page, including whenever this one is behind.
Try it against your own data
The Developer plan is free forever and needs no card. 2,500 credits is enough to answer the only question that matters: does it resolve your records.