Registry Monitors
Create company monitors for German registry mirror changes and receive Svix-compatible webhooks. Monitor routes are direct API routes, not enrichments, because the create response returns a one-time signing secret.
[!WARNING]
Registry monitor routes require the German registry feature flag and are disabled by default.
Create Monitor
POST /api/registry/monitors
Authorization: Bearer eak_...
Content-Type: application/json
{
"subject_type": "company",
"company_id": "DE-HRB-F1103-267645",
"callback_url": "https://your-app.example/webhooks/registry"
}
Only company monitors are supported. Person monitors return 422.
Callback URLs are validated with SSRF protection. The validated URL, host, port, and resolved IP are stored and reused for delivery with IP pinning.
Change Detection
A scheduler compares the Skael registry mirror state of every active monitor every 10 minutes. When the fingerprint of the company, its publications, or its owners snapshot changes, a registry.company.changed webhook is queued for your callback_url.
Webhook Payload
Every delivery sends a JSON body with these fields:
| Field |
Content |
event |
The event name registry.company.changed. |
monitor_id |
Id of the monitor the event belongs to. |
company_id |
Canonical company id, format DE-HRB-F1103-267645. |
previous_hash |
Fingerprint of the last known state. |
current_hash |
Fingerprint of the new state. |
company |
Current state of the company: register type, court code, register number, legal name, legal form, status, state, city, postal code, address, people, capital, raw_payload_hash. |
publications |
Fingerprint entries of the company's publications (up to 100). |
publication_count |
Total number of publications, also above the 100 entries listed. |
publication_set_hash |
Fingerprint of the whole publication set. |
owners_snapshot |
Fingerprint of the newest shareholder list (source_document_id, document_date, owners_hash, owner_count, warnings), null when none exists. |
occurred_at |
Time the change was detected, ISO 8601. |
{
"event": "registry.company.changed",
"monitor_id": 123,
"company_id": "DE-HRB-F1103-267645",
"previous_hash": "9f2c…",
"current_hash": "4b7e…",
"company": {"legal_name": "Muster GmbH", "legal_form": "GmbH", "status": "active"},
"publications": [{"publication_id": "…", "category": "balance_sheet", "publication_date": "2026-09-30"}],
"publication_count": 2,
"publication_set_hash": "a1d3…",
"owners_snapshot": {"source_document_id": "…", "document_date": "2026-09-30", "owners_hash": "77ab…", "owner_count": 2, "warnings": []},
"occurred_at": "2026-11-10T09:00:00.000000Z"
}
The svix-signature header signs the exact raw body shown above; verify it before parsing (see Webhook Signing).
Created (201)
{
"data": {
"id": 123,
"company_id": "DE-HRB-F1103-267645",
"callback_url": "https://your-app.example/webhooks/registry",
"callback_resolved_ip": "93.184.216.34",
"callback_resolved_host": "your-app.example",
"callback_resolved_port": 443,
"status": "active",
"signing_secret_redacted": "whsec_********",
"signing_secret": "whsec_..."
}
}
Store signing_secret immediately. It is returned only on create and is encrypted at rest.
List Monitors
GET /api/registry/monitors
Authorization: Bearer eak_...
List responses redact the signing secret.
Delete Monitor
DELETE /api/registry/monitors/{monitor_id}
Authorization: Bearer eak_...
Returns 204 and does not charge credits.
Webhook Signing
Deliveries include Svix-compatible headers:
svix-id
svix-timestamp
svix-signature
The signature payload is:
{svix-id}.{svix-timestamp}.{raw-json-body}
The signature value is:
v1,{base64(hmac_sha256(signature_payload, base64_decode(secret_without_whsec_prefix)))}
Retry Schedule
Failed deliveries retry up to eight times, after:
10s, 30s, 120s, 300s, 1800s, 7200s, 21600s, 86400s
After the schedule is exhausted, the delivery is marked dead_letter.
Pricing
- Create monitor: 50 credits.
- List monitors: 0 credits.
- Delete monitor: 0 credits.
German overview
Overview page in German: Neugründungen und Registeränderungen.