/v1/account/monitors
account/monitors
Monitoring: Firmen überwachen lassen, anlegen, pausieren, löschen.
Ein Monitor beobachtet eine Firma für dich. In festem Rhythmus prüfen wir, ob es neue Signals gibt, und schicken jedes neue Signal per Webhook an deine Webhook-Endpoints.
Kosten und Limits
| Was | Credits |
|---|---|
| Monitor mit Prüfung jeden Tag, für 30 Tage | 50 |
| Monitor mit Prüfung alle 3 Tage, für 30 Tage | 40 |
| Monitor mit Prüfung alle 7 Tage, für 30 Tage | 20 |
| Monitor mit Prüfung alle 30 Tage, für 30 Tage | 10 |
| Jede weitere erfolgreiche Prüfung im Zeitraum | +2 |
Limit: 30 Anfragen pro Minute. Anlegen, Ändern und Löschen: 10 pro Minute.
Anlegen und die erste Bestandsaufnahme sind kostenlos. Berechnet wird ein Zyklus von 30 Tagen, sobald der Monitor aktiv wird. Der Preis hängt vom Prüfrhythmus ab und deckt alle Prüfungen ab, die der Rhythmus in einem Zyklus vorsieht.
Ein Rhythmus zwischen zwei Stufen kostet so viel wie die nächsthäufigere Stufe: alle vier Tage also so viel wie alle drei Tage.
Zusätzliche Prüfungen entstehen vor allem, wenn du den Rhythmus mitten im Zyklus verkürzt. Jede erfolgreiche zusätzliche Prüfung kostet den Betrag in der Tabelle.
Nach 30 Tagen verlängert sich der Zyklus automatisch zum dann gültigen Preis. Fehlgeschlagene Prüfungen kosten nichts. Wenn du pausierst, archivierst oder den Rhythmus änderst, erstatten wir nichts.
Pro Konto sind bis zu 50 Monitore gleichzeitig möglich, pro Firma einer. In 24 Stunden kannst du bis zu 50 Monitore anlegen, archivierte zählen mit.
Den Preis eines Rhythmus fragst du kostenlos mit GET /v1/account/monitoring/pricing ab, hier für eine Prüfung alle sieben Tage:
curl -G "https://handelsregister.ai/api/v1/account/monitoring/pricing" \ -H "x-api-key: DEIN_API_SCHLUESSEL" \ --data-urlencode 'poll_interval_days=7'
import requests response = requests.get( "https://handelsregister.ai/api/v1/account/monitoring/pricing", headers={"x-api-key": "DEIN_API_SCHLUESSEL"}, params={ "poll_interval_days": "7", }, ) data = response.json()
const url = new URL("https://handelsregister.ai/api/v1/account/monitoring/pricing"); url.searchParams.append("poll_interval_days", "7"); const response = await fetch(url, { headers: { "x-api-key": "DEIN_API_SCHLUESSEL" }, }); const data = await response.json();
1{2 "pricing": {3 "policy_version": "2026-08.v2",4 "credits_per_run": 2,5 "cycle_minimum_credits": 20,6 "included_runs": 5,7 "cycle_days": 30,8 "estimated_runs": 5,9 "estimated_credits": 2010 },11 "entitled": true,12 "meta": {13 "request_credit_cost": 0,14 "credits_remaining": 14515 }16}
Ablauf eines Monitors
- Anlegen. Du nennst die Firma, den Prüfrhythmus und mindestens einen verifizierten Webhook-Endpoint. Der Monitor startet mit dem Status
initializing. - Bestandsaufnahme. Wir merken uns die Signals der letzten Tage als bekannt. Sie werden nicht zugestellt, du bekommst also nur, was danach neu dazukommt.
- Aktivieren. Wir buchen den Zyklus, der Monitor wird
activeund prüft sofort zum ersten Mal. - Prüfen. Danach prüft er im gewählten Rhythmus. Jedes neue Signal löst pro Monitor eine Nachricht an deine Webhook-Endpoints aus.
- Verlängern. Nach jedem Zyklus bucht sich der nächste automatisch, solange dein Guthaben reicht.
Der Prüfrhythmus liegt zwischen 1 und 30 Tagen. Die genaue Uhrzeit einer Prüfung kann innerhalb einer Stunde schwanken. Jede Prüfung schaut ein paar Tage zurück, damit auch spät veröffentlichte Einträge ankommen.
Ein Monitor liefert die Signals-Themen deines Plans: fünf in jedem Konto, Insolvenzen ab Pro, Umwandlungen & M&A mit Max. Ein Webhook enthält im Feld data.signal dasselbe Signal wie signals.
| Status | Bedeutung |
|---|---|
| initializing | Angelegt, Bestandsaufnahme und Aktivierung laufen. |
| active | Prüft im gewählten Rhythmus. |
| paused_user | Von dir pausiert. |
| paused_configuration | Kein aktiver, verifizierter Webhook-Endpoint mehr verbunden. |
| paused_billing | Das Guthaben reicht nicht für den Zyklus oder eine zusätzliche Prüfung. Oder der Preis hat sich geändert und wartet auf deine Zustimmung. |
| error | Mehrere Prüfungen in Folge sind fehlgeschlagen. |
| archived | Dauerhaft beendet. Per ID bleibt der Monitor lesbar, in der Liste erscheint er nicht mehr. |
Bei pausierten Monitoren und Fehlern erklärt status_reason den Grund, etwa no_verified_endpoint oder insufficient_cycle_floor.
Endpunkte
Alle Pfade liegen unter /v1/account. Lesen und Schreiben geht mit deinem API-Schlüssel im Header x-api-key.
| Methode | Pfad | Zweck |
|---|---|---|
| GET |
/v1/account/monitors |
Alle Monitore, die neuesten zuerst, ohne archivierte. |
| POST |
/v1/account/monitors |
Monitor anlegen. |
| GET |
/v1/account/monitors/{id} |
Ein Monitor mit Zyklus und letzten Prüfungen. |
| PATCH |
/v1/account/monitors/{id} |
Prüfrhythmus ändern. |
| POST |
/v1/account/monitors/{id}/pause |
Pausieren. |
| POST |
/v1/account/monitors/{id}/resume |
Fortsetzen. |
| DELETE |
/v1/account/monitors/{id} |
Archivieren. |
| GET |
/v1/account/monitoring/pricing |
Preis eines Rhythmus. |
Idempotency-Key
Jede schreibende Anfrage braucht den Header Idempotency-Key, einen eindeutigen Wert pro Vorgang, am besten eine UUID. Ohne ihn antwortet die API mit 428.
Wiederholst du eine Anfrage mit demselben Key und denselben Daten, bekommst du innerhalb von 24 Stunden die gespeicherte Antwort zurück. Sie trägt den Header Idempotency-Status: replayed. So legt ein Netzwerkfehler keinen zweiten Monitor an.
Das gilt auch für Fehlerantworten. Für einen neuen Versuch nach einer Korrektur nimmst du deshalb einen neuen Key. Derselbe Key mit anderen Daten ergibt 409.
Erlaubt sind bis zu 128 Zeichen aus Buchstaben, Ziffern und . _ : -. Das erste Zeichen ist ein Buchstabe oder eine Ziffer. Ein Key in anderem Format ergibt 400.
Monitor anlegen
Du brauchst die entity_id der Firma und mindestens einen verifizierten Webhook-Endpoint, siehe account/webhook-endpoints.
curl -X POST "https://handelsregister.ai/api/v1/account/monitors" \ -H "x-api-key: DEIN_API_SCHLUESSEL" \ -H "Idempotency-Key: $(uuidgen)" \ -H "Content-Type: application/json" \ -d '{ "entity_id": "94eb910fef13f94585c48c263fa446d4", "label": "Hetzner Online GmbH", "poll_interval_days": 7, "endpoint_ids": [ "wep_01m6b3j1g0cdz98hw8zdefbf52" ] }'
import uuid import requests response = requests.post( "https://handelsregister.ai/api/v1/account/monitors", headers={ "x-api-key": "DEIN_API_SCHLUESSEL", "Idempotency-Key": str(uuid.uuid4()), }, json={ "entity_id": "94eb910fef13f94585c48c263fa446d4", "label": "Hetzner Online GmbH", "poll_interval_days": 7, "endpoint_ids": [ "wep_01m6b3j1g0cdz98hw8zdefbf52" ] }, ) data = response.json()
const response = await fetch("https://handelsregister.ai/api/v1/account/monitors", { method: "POST", headers: { "x-api-key": "DEIN_API_SCHLUESSEL", "Idempotency-Key": crypto.randomUUID(), "Content-Type": "application/json", }, body: JSON.stringify({ "entity_id": "94eb910fef13f94585c48c263fa446d4", "label": "Hetzner Online GmbH", "poll_interval_days": 7, "endpoint_ids": [ "wep_01m6b3j1g0cdz98hw8zdefbf52" ] }), }); const data = await response.json();
| Name | Typ | Beschreibung | Beispiel |
|---|---|---|---|
| Idempotency-KeyHeader | stringPflicht | Ein eindeutiger Wert pro Vorgang, am besten eine UUID. Siehe Idempotency-Key.Grenzen: 1 bis 128 Zeichen |
req-20260802-01 |
| entity_idBody | stringPflicht |
Die entity_id der Firma aus fetch-organization oder search-organizations.Grenzen: 1 bis 128 Zeichen |
94eb910fef13f94585c48c263fa446d4 |
| labelBody | stringoptional | Ein Name für den Monitor.Grenzen: höchstens 200 Zeichen |
Hetzner Online GmbH |
| poll_interval_daysBody | integerPflicht | Prüfrhythmus in Tagen.Grenzen: 1 bis 30 |
7 |
| endpoint_idsBody | Liste aus stringPflicht |
Die IDs deiner Webhook-Endpoints (wep_…). Jeder muss aktiv und verifiziert sein.Grenzen: 1 bis 10 Einträge |
["wep_01m6b3j1g0cdz98hw8zdefbf52"] |
Die API antwortet mit 202: Der Monitor ist angelegt, Bestandsaufnahme und Aktivierung laufen im Hintergrund. meta.billing.charged_credits zeigt, dass dabei nichts berechnet wurde.
1{2 "monitor": {3 "id": "mon_01m6b3m7945dn7cyvexzv41kjz",4 "type": "organization.signals",5 "entity_id": "94eb910fef13f94585c48c263fa446d4",6 "label": "Hetzner Online GmbH",7 "poll_interval_days": 7,8 "status": "initializing",9 "status_reason": null,10 "pricing_policy_version": "2026-08.v2",11 "baseline_completed_at": null,12 "activated_at": null,13 "last_succeeded_at": null,14 "next_poll_at": null,15 "created_at": "2026-11-01T08:29:13+00:00"16 },17 "meta": {18 "message": "Monitor created; the free baseline is queued and this request charged 0 credits. The cycle price is charged only when activation succeeds.",19 "baseline_queued": true,20 "billing": {21 "charged_credits": 0,22 "new_cycle": false,23 "floor_transaction_id": null24 },25 "request_credit_cost": 0,26 "credits_remaining": 14527 }28}
Monitore abrufen und ändern
GET /v1/account/monitors liefert bis zu 100 Monitore unter monitors, mit total. Archivierte fehlen in der Liste.
GET /v1/account/monitors/{id} zeigt dazu den laufenden Zyklus in billing_cycle und die letzten Prüfungen in recent_runs.
curl -G "https://handelsregister.ai/api/v1/account/monitors/mon_01m65pn3vm11sjjp1j076cbvec" \ -H "x-api-key: DEIN_API_SCHLUESSEL"
import requests response = requests.get( "https://handelsregister.ai/api/v1/account/monitors/mon_01m65pn3vm11sjjp1j076cbvec", headers={"x-api-key": "DEIN_API_SCHLUESSEL"}, ) data = response.json()
const url = new URL("https://handelsregister.ai/api/v1/account/monitors/mon_01m65pn3vm11sjjp1j076cbvec"); const response = await fetch(url, { headers: { "x-api-key": "DEIN_API_SCHLUESSEL" }, }); const data = await response.json();
1{2 "monitor": {3 "id": "mon_01m65pn3vm11sjjp1j076cbvec",4 "type": "organization.signals",5 "entity_id": "94eb910fef13f94585c48c263fa446d4",6 "label": "Hetzner Online GmbH",7 "poll_interval_days": 1,8 "status": "active",9 "status_reason": null,10 "pricing_policy_version": "2026-08.v2",11 "baseline_completed_at": "2026-10-30T06:06:28+00:00",12 "activated_at": "2026-10-30T06:06:28+00:00",13 "last_succeeded_at": "2026-10-30T06:06:53+00:00",14 "next_poll_at": "2026-10-31T06:19:12+00:00",15 "created_at": "2026-10-30T06:06:18+00:00"16 },17 "billing_cycle": {18 "starts_at": "2026-10-30T06:06:28+00:00",19 "ends_at": "2026-11-29T06:06:28+00:00",20 "floor_credits": 50,21 "credits_per_run": 2,22 "included_runs": 30,23 "successful_runs": 1,24 "extra_credits_settled": 0,25 "pricing_policy_version": "2026-08.v2"26 },27 "recent_runs": [28 {29 "due_slot_at": "2026-10-30T06:06:28+00:00",30 "kind": "activation_catchup",31 "status": "succeeded",32 "charge_state": "covered",33 "charge_credits": 0,34 "events_new": 0,35 "finished_at": "2026-10-30T06:06:55+00:00"36 }37 ],38 "meta": {39 "request_credit_cost": 0,40 "credits_remaining": 14541 }42}
| Feld | Bedeutung |
|---|---|
| id |
ID des Monitors, beginnt mit mon_.
|
| entity_id | Die überwachte Firma. |
| poll_interval_days | Prüfrhythmus in Tagen. |
| status, status_reason |
Status, siehe oben. status_reason nennt den Grund.
|
| baseline_completed_at, activated_at, last_succeeded_at | Zeitpunkte von Bestandsaufnahme, Aktivierung und letzter erfolgreicher Prüfung. |
| next_poll_at | Die nächste geplante Prüfung, nur bei aktiven Monitoren. |
| billing_cycle | Der laufende Zyklus: Beginn, Ende, Preis, enthaltene und bereits erfolgte Prüfungen. |
| recent_runs |
Die letzten Prüfungen mit Ergebnis, Abrechnung und Zahl neuer Signals in events_new.
|
PATCH /v1/account/monitors/{id} ändert den Prüfrhythmus. Die nächste Prüfung folgt dann im neuen Abstand, gerechnet ab der Änderung.
Der laufende Zyklus behält Preis und enthaltene Prüfungen. Der neue Preis gilt ab dem nächsten Zyklus. Ein kürzerer Rhythmus kann im laufenden Zyklus zusätzliche Prüfungen auslösen.
curl -X PATCH "https://handelsregister.ai/api/v1/account/monitors/mon_01m6b3m7945dn7cyvexzv41kjz" \ -H "x-api-key: DEIN_API_SCHLUESSEL" \ -H "Idempotency-Key: $(uuidgen)" \ -H "Content-Type: application/json" \ -d '{ "poll_interval_days": 30 }'
import uuid import requests response = requests.patch( "https://handelsregister.ai/api/v1/account/monitors/mon_01m6b3m7945dn7cyvexzv41kjz", headers={ "x-api-key": "DEIN_API_SCHLUESSEL", "Idempotency-Key": str(uuid.uuid4()), }, json={ "poll_interval_days": 30 }, ) data = response.json()
const response = await fetch("https://handelsregister.ai/api/v1/account/monitors/mon_01m6b3m7945dn7cyvexzv41kjz", { method: "PATCH", headers: { "x-api-key": "DEIN_API_SCHLUESSEL", "Idempotency-Key": crypto.randomUUID(), "Content-Type": "application/json", }, body: JSON.stringify({ "poll_interval_days": 30 }), }); const data = await response.json();
1{2 "monitor": {3 "id": "mon_01m6b3m7945dn7cyvexzv41kjz",4 "type": "organization.signals",5 "entity_id": "94eb910fef13f94585c48c263fa446d4",6 "label": "Hetzner Online GmbH",7 "poll_interval_days": 30,8 "status": "initializing",9 "status_reason": null,10 "pricing_policy_version": "2026-08.v2",11 "baseline_completed_at": null,12 "activated_at": null,13 "last_succeeded_at": null,14 "next_poll_at": null,15 "created_at": "2026-11-01T08:29:13+00:00"16 },17 "meta": {18 "request_credit_cost": 0,19 "credits_remaining": 14520 }21}
Pausieren, fortsetzen, archivieren
POST …/{id}/pause hält einen aktiven Monitor an. Der bezahlte Zyklus läuft weiter ab, erstattet wird nichts.
POST …/{id}/resume setzt einen pausierten Monitor oder einen Monitor mit Fehler fort. Dabei prüfen wir erneut Webhook-Endpoints, Guthaben und Preis.
Im laufenden bezahlten Zyklus kostet das Fortsetzen nichts. Ist er abgelaufen, beginnt ab jetzt ein neuer Zyklus zum aktuellen Preis. meta.request_credit_cost zeigt den Betrag.
Fehlt etwa ein verifizierter Webhook-Endpoint, antwortet die API trotzdem mit 200, aber mit meta.activated: false. Status und status_reason des Monitors nennen den Grund.
Hat sich der Preis geändert, hält ein aktiver Monitor zum Zyklusende mit pricing_consent_required an. Mit resume stimmst du dem neuen Preis zu.
DELETE …/{id} archiviert den Monitor dauerhaft. Der Vorgang ist endgültig und erstattet nichts.
curl -X POST "https://handelsregister.ai/api/v1/account/monitors/mon_01m6b3m7945dn7cyvexzv41kjz/resume" \ -H "x-api-key: DEIN_API_SCHLUESSEL" \ -H "Idempotency-Key: $(uuidgen)"
import uuid import requests response = requests.post( "https://handelsregister.ai/api/v1/account/monitors/mon_01m6b3m7945dn7cyvexzv41kjz/resume", headers={ "x-api-key": "DEIN_API_SCHLUESSEL", "Idempotency-Key": str(uuid.uuid4()), }, ) data = response.json()
const response = await fetch("https://handelsregister.ai/api/v1/account/monitors/mon_01m6b3m7945dn7cyvexzv41kjz/resume", { method: "POST", headers: { "x-api-key": "DEIN_API_SCHLUESSEL", "Idempotency-Key": crypto.randomUUID(), }, }); const data = await response.json();
paused_configuration. Nach dem Aktivieren des Webhook-Endpoints setzt du den Monitor mit resume fort.
Fehler
Fehler haben den Aufbau {"error": "…", "meta": {"message": "…"}}. Prüfe im Programm den Wert von error. Der Text in meta.message ist auf Englisch und kann sich ändern. Fehler kosten nichts.
| Status | Ursache | Was du tun kannst |
|---|---|---|
| 400 |
api_key steht in der URL. |
Den Schlüssel im Header x-api-key schicken. |
| 400 |
Der Idempotency-Key hat ein ungültiges Format. |
Format korrigieren, etwa eine UUID. |
| 401 | Kein oder ein ungültiger API-Schlüssel oder Token. |
Schlüssel im Header x-api-key mitschicken. |
| 403 |
Dem Bearer-Token fehlt die Berechtigung account:read. |
Den API-Schlüssel oder ein Token mit account:read verwenden. |
| 403 | Die E-Mail-Adresse deines Kontos ist noch nicht bestätigt, oder das Konto ist gesperrt. | Den Link aus der Bestätigungsmail öffnen. Ist das Konto gesperrt, hilft der Support. |
| 403 |
Dem Bearer-Token fehlt die Berechtigung monitoring:manage. |
API-Schlüssel oder Admin-Token verwenden. |
| 404 | Kein Monitor mit dieser ID in deinem Konto. | ID prüfen. |
| 409 |
Für diese Firma gibt es schon einen Monitor (duplicate_monitor). |
Den bestehenden Monitor nutzen oder vorher archivieren. |
| 409 |
Der Idempotency-Key wurde schon mit anderen Daten verwendet, ist älter als 24 Stunden oder noch in Bearbeitung. |
Neuen Key verwenden oder kurz warten. |
| 422 |
Eine Angabe ist ungültig: invalid_subject, invalid_interval, endpoint_required, monitor_limit oder not_resumable. |
Angabe korrigieren. |
| 428 |
Der Header Idempotency-Key fehlt. |
Header mitschicken. |
| 429 | Zu viele Anfragen. |
Nach Retry-After wiederholen. |
| 429 |
creation_rate_limited: zu viele neue Monitore in 24 Stunden. |
Nach Retry-After wiederholen. |
| 503 | Monitoring ist vorübergehend nicht verfügbar. | Etwas später wiederholen. |
1{2 "error": "duplicate_monitor",3 "meta": {4 "message": "You already have a monitor for this company.",5 "request_credit_cost": 0,6 "credits_remaining": 1457 }8}