registercheckby openlaw group
API referenceEvents

List events

GET
/events

Changes the register courts entered for any company, newest register day first. Each item is an event, the same body GET /companies/{company_id}/events lists for one company, with the company named in subject. Across all companies, a company's first entry, its registration, is not listed: new companies are GET /formations.

Events, not entries. One register entry can carry several events: an entry that removes one managing director and appoints another is two company.role.* events with the same source, the register_entry.

Order. Newest register day first, fully specified and stable: effective_date descending, then created_at descending, then id descending. Ties never reorder between pages.

Window. The list covers the last 180 days of register days. An effective_date[gte] older than that answers 400 validation_failed. Without any effective_date[*] or created_at[*] bound, the list covers the last 30 days.

Completeness. Register days before 2026-09-10 are incomplete.

Polling. About 7 % of entries reach Registercheck one or more days after their register day and sort into the middle of the list, so do not poll on effective_date: it misses events. Poll on created_at, the moment an event became available here, or available again:

  1. GET /events?created_at[gte]=<T minus 10 minutes>&limit=100, paging with cursor until next_cursor is null;
  2. keep the latest version of each id: an id you already have is an update;
  3. set T to the largest created_at you received.

Republication. When the register rewrites an entry (its type, day, entry number or the entry before it changes), its event is served again under the same id with the new values and a new created_at. An event that no longer stands for a change (it now restates an earlier entry, or its day left the window) is no longer served, and GET /events/{event_id} answers 404 for it.

Delivery is at-least-once: the 10-minute overlap re-reads events you already have, which is what deduplicating by id is for. An event whose company or person is restricted after you listed it is no longer served; a cursor naming it answers 400 validation_failed, and the recipe above recovers from that.

Scope. Every company's events by default; one company's whole history with subject_id; what one of your monitors matched with monitor_id.

Costs 10 credits per page; free with monitor_id.

Authorization

bearerAuth
AuthorizationBearer <token>

Your API key, sent as Authorization: Bearer rc_live_….

In: header

Query Parameters

type?array<>

Only events of these types. Repeat the parameter for several.

Itemsitems <= 30
subject_id?string

Only this company's events: its whole register history, not just the 180-day window. GET /companies/{company_id}/events is the same list. Cannot be combined with the filters that describe companies (legal_form, state, registered_office, register_court, capital[*], name). An unknown company answers 404; a merged one 301 to the surviving company's history.

Match^cmp_[0-7][0-9a-hjkmnp-tv-z]{25}$
monitor_id?string

Only the events one of your monitors matched, including the ones only a monitor reports (a holder on a filed shareholder list, published annual accounts). Free. Ordered by effective_date descending, then by the moment the monitor matched the event, descending, then by id. Combines with type, effective_date[*], created_at[*], limit and cursor only. Another workspace's monitor, or an unknown one, answers 404.

Match^mon_[0-7][0-9a-hjkmnp-tv-z]{25}$
role_type?array<>

Only company.role.* events about roles of these types. Repeat the parameter for several.

Itemsitems <= 10
effective_date[gte]?string

First register day to include. Without any effective_date[*] or created_at[*] bound, the list covers the last 30 days; with any of them it covers the whole 180-day window. Older than 180 days answers 400 validation_failed.

Match^[0-9]{4}-[0-9]{2}-[0-9]{2}$
Formatdate
effective_date[lte]?string

Last register day to include.

Match^[0-9]{4}-[0-9]{2}-[0-9]{2}$
Formatdate
created_at[gte]?string

Only events that became available through this API at or after this instant. Poll on this.

Match^[0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2}(\.[0-9]+)?Z$
Formatdate-time
created_at[lte]?string

Only events that became available through this API at or before this instant.

Match^[0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2}(\.[0-9]+)?Z$
Formatdate-time
legal_form?array<>

Only companies of these legal forms. Repeat the parameter for several (legal_form=gmbh&legal_form=ug).

Itemsitems <= 40
state?array<>

Only companies in these federal states, as ISO 3166-2 codes (DE-BY). Repeat the parameter for several.

Itemsitems <= 16
registered_office?array<>

Only companies with these registered offices (Sitz). Exact match, ignoring case and umlaut spelling (Muenchen matches München). Repeat the parameter for several.

Itemsitems <= 50
register_court?string

Only companies registered at this court: its code (D2601), its name (Amtsgericht München) or its seat (München), as POST /monitors accepts it.

Length1 <= length <= 100
capital[gte]?string

Minimum registered capital in EUR, as a decimal (25000 or 25000.00). Companies without EUR capital are excluded when either capital bound is set.

Match^(0|[1-9][0-9]{0,11})(\.[0-9]{1,2})?$
capital[lte]?string

Maximum registered capital in EUR, as a decimal.

Match^(0|[1-9][0-9]{0,11})(\.[0-9]{1,2})?$
name?string

Words that must all appear, ignoring case and umlaut spelling, in the company name, the registered office, the court, the register number or the entry's own text. Not matched against people's names.

Length2 <= length <= 100
limit?integer

Page size, 1 to 100.

Range1 <= value <= 100
Default20
cursor?string

The next_cursor of the previous page; leave it out for the first page. Opaque: pass it back as it came. A cursor from another list, or from the same list with other filters, answers 400 validation_failed naming cursor.

Length1 <= length <= 2000

Response Body

application/json

application/problem+json

application/problem+json

application/problem+json

application/problem+json

application/problem+json

application/problem+json

application/problem+json

application/problem+json

curl -X GET "https://api.registercheck.de/v1/events" \  -H "Authorization: Bearer $REGISTERCHECK_API_KEY"
{  "object": "page",  "data": [    {      "object": "event",      "id": "evt_1c9sn8p79z99e9wyrf38nkrkay",      "type": "company.registered_office.changed",      "subject": {        "object": "company",        "id": "cmp_1z3gn9wpvx9j59w8bd9w5rm72n",        "name": "Beispiel Analytics GmbH"      },      "data": {        "previous": "München",        "current": "Augsburg"      },      "source": {        "object": "register_entry",        "id": "rge_5eky11h94ab0x8v3mycttnj4ja",        "number": 7,        "published_on": null,        "text": "Augsburg"      },      "effective_date": "2026-09-21",      "created_at": "2026-09-21T10:14:02Z"    },    {      "object": "event",      "id": "evt_2vfpfhmf2y9dyrz6gv5gymwqv0",      "type": "company.role.added",      "subject": {        "object": "company",        "id": "cmp_4x9gd2pzkf99drrf9e3w59q302",        "name": "Beispiel Bau Holding GmbH"      },      "data": {        "holder": {          "object": "person",          "id": null,          "name": "Erika Mustermann"        },        "role_type": "managing_director"      },      "source": {        "object": "register_entry",        "id": "rge_5rdf656qw1btfsfqeksnp4jt64",        "number": 4,        "published_on": null,        "text": null      },      "effective_date": "2026-09-21",      "created_at": "2026-09-21T09:58:40Z"    }  ],  "next_cursor": "eyJ2IjoxLCJrIjoibGlzdEV2ZW50czozYzFlOWEwYjdkMmY0ZTYxIiwiYSI6IjViN2Q5ZjFhLTNjNWUtNGI3ZC04ZjlhLTFiMmMzZDRlNWY2MCJ9"}