Ingesting the Handelsregister: 1.2M announcements a year at 3.1-hour median latency

S. Haugen · DE ingest·2026-06-30·17 min

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.
Worth knowing

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

MetricValue
Announcements ingested per year1.2M
Median latency, publication to API3.1 h
Within 24 hours97.8%
Parser corrections backfilled, 202614
Courts with a bespoke poll schedule17

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.