/v1/account/monitors
account/monitors
Monitoring: bedrijven laten bewaken, aanmaken, pauzeren, verwijderen.
Een monitor bewaakt een bedrijf voor je. Met een vast interval controleren we op nieuwe signalen en sturen we elk nieuw signaal via webhook naar je webhook-endpoints.
Kosten en limieten
| Wat | Credits |
|---|---|
| Monitor elke dag gecontroleerd, gedurende 30 dagen | 50 |
| Monitor elke 3 dagen gecontroleerd, gedurende 30 dagen | 40 |
| Monitor elke 7 dagen gecontroleerd, gedurende 30 dagen | 20 |
| Monitor elke 30 dagen gecontroleerd, gedurende 30 dagen | 10 |
| Elke extra geslaagde controle in de periode | +2 |
Limiet: 30 aanvragen per minuut. Aanmaken, wijzigen en verwijderen: 10 per minuut.
Een monitor aanmaken en de eerste nulmeting zijn gratis. Een cyclus van 30 dagen wordt berekend zodra de monitor actief wordt. De prijs hangt af van het controle-interval en dekt alle controles die het interval binnen één cyclus inplant.
Een interval tussen twee niveaus kost evenveel als het eerstvolgende frequentere niveau: elke vier dagen kost evenveel als elke drie dagen.
Extra controles ontstaan vooral als je het interval midden in een cyclus verkort. Elke geslaagde extra controle kost het bedrag uit de tabel.
Na 30 dagen wordt de cyclus automatisch verlengd tegen de dan geldende prijs. Mislukte controles kosten niets. Bij pauzeren, archiveren of een wijziging van het interval betalen we niets terug.
Elk account kan tot 50 monitors tegelijk hebben, één per bedrijf. Binnen 24 uur kun je tot 50 monitors aanmaken; gearchiveerde tellen mee.
De prijs van een interval krijg je gratis met GET /v1/account/monitoring/pricing, hier voor een controle elke zeven dagen:
curl -G "https://handelsregister.ai/api/v1/account/monitoring/pricing" \ -H "x-api-key: JOUW_API_SLEUTEL" \ --data-urlencode 'poll_interval_days=7'
import requests response = requests.get( "https://handelsregister.ai/api/v1/account/monitoring/pricing", headers={"x-api-key": "JOUW_API_SLEUTEL"}, 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": "JOUW_API_SLEUTEL" }, }); 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}
Hoe een monitor werkt
- Aanmaken. Je noemt het bedrijf, het controle-interval en minstens één geverifieerd webhook-endpoint. De monitor start met de status
initializing. - Nulmeting. We markeren de signalen van de laatste paar dagen als bekend. Die worden niet geleverd, dus je krijgt alleen wat daarna nieuw is.
- Activeren. We berekenen de cyclus, de monitor wordt
activeen controleert meteen voor het eerst. - Controleren. Daarna controleert hij met het gekozen interval. Elk nieuw signaal levert per monitor één bericht aan je webhook-endpoints op.
- Verlengen. Na elke cyclus wordt de volgende automatisch berekend, zolang je saldo die dekt.
Het controle-interval ligt tussen 1 en 30 dagen. Het precieze tijdstip van een controle kan binnen een uur variëren. Elke controle kijkt een paar dagen terug, zodat ook laat gepubliceerde inschrijvingen binnenkomen.
Een monitor levert de Signals-onderwerpen van je plan: vijf in elk account, Insolventies met Pro, Omzettingen & M&A met Max. Een webhook bevat in het veld data.signal hetzelfde signaal als signals.
| Status | Betekenis |
|---|---|
| initializing | Aangemaakt; nulmeting en activering lopen. |
| active | Controleert met het gekozen interval. |
| paused_user | Door jou gepauzeerd. |
| paused_configuration | Er is geen actief, geverifieerd webhook-endpoint meer gekoppeld. |
| paused_billing | Je saldo dekt de cyclus of een extra controle niet. Of de prijs is gewijzigd en wacht op je toestemming. |
| error | Meerdere controles op rij zijn mislukt. |
| archived | Definitief beëindigd. Je kunt de monitor nog op zijn ID opvragen, maar hij staat niet meer in de lijst. |
Bij gepauzeerde monitors en fouten legt status_reason uit waarom, bijvoorbeeld no_verified_endpoint of insufficient_cycle_floor.
Endpoints
Alle paden staan onder /v1/account. Je leest en schrijft met je API-sleutel in de header x-api-key.
| Methode | Pad | Doel |
|---|---|---|
| GET |
/v1/account/monitors |
Alle monitors, nieuwste eerst, zonder gearchiveerde. |
| POST |
/v1/account/monitors |
Een monitor aanmaken. |
| GET |
/v1/account/monitors/{id} |
Eén monitor met zijn cyclus en laatste controles. |
| PATCH |
/v1/account/monitors/{id} |
Het controle-interval wijzigen. |
| POST |
/v1/account/monitors/{id}/pause |
Pauzeren. |
| POST |
/v1/account/monitors/{id}/resume |
Hervatten. |
| DELETE |
/v1/account/monitors/{id} |
Archiveren. |
| GET |
/v1/account/monitoring/pricing |
Prijs van een interval. |
Idempotency-Key
Elke schrijfaanvraag vraagt de header Idempotency-Key, een unieke waarde per bewerking, bij voorkeur een UUID. Zonder die header antwoordt de API met 428.
Herhaal je een aanvraag binnen 24 uur met dezelfde sleutel en dezelfde gegevens, dan krijg je het opgeslagen antwoord terug. Dat heeft de header Idempotency-Status: replayed. Zo maakt een netwerkfout geen tweede monitor aan.
Dat geldt ook voor foutantwoorden. Gebruik dus voor een nieuwe poging na een correctie een nieuwe sleutel. Dezelfde sleutel met andere gegevens levert 409.
Tot 128 tekens zijn toegestaan: letters, cijfers en . _ : -. Het eerste teken is een letter of een cijfer. Een sleutel in een ander formaat levert 400.
Een monitor aanmaken
Je hebt de entity_id van het bedrijf nodig en minstens één geverifieerd webhook-endpoint, zie account/webhook-endpoints.
curl -X POST "https://handelsregister.ai/api/v1/account/monitors" \ -H "x-api-key: JOUW_API_SLEUTEL" \ -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": "JOUW_API_SLEUTEL", "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": "JOUW_API_SLEUTEL", "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();
| Naam | Type | Beschrijving | Voorbeeld |
|---|---|---|---|
| Idempotency-KeyHeader | stringverplicht | Een unieke waarde per bewerking, bij voorkeur een UUID. Zie Idempotency-Key.Limieten: 1 tot 128 tekens |
req-20260802-01 |
| entity_idBody | stringverplicht |
De entity_id van het bedrijf uit fetch-organization of search-organizations.Limieten: 1 tot 128 tekens |
94eb910fef13f94585c48c263fa446d4 |
| labelBody | stringoptioneel | Een naam voor de monitor.Limieten: hoogstens 200 tekens |
Hetzner Online GmbH |
| poll_interval_daysBody | integerverplicht | Controle-interval in dagen.Limieten: 1 tot 30 |
7 |
| endpoint_idsBody | lijst van stringverplicht |
De ID’s van je webhook-endpoints (wep_…). Elk moet actief en geverifieerd zijn.Limieten: 1 tot 10 items |
["wep_01m6b3j1g0cdz98hw8zdefbf52"] |
De API antwoordt met 202: de monitor is aangemaakt, en nulmeting en activering lopen op de achtergrond. meta.billing.charged_credits laat zien dat hiervoor niets is berekend.
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}
Monitors opvragen en wijzigen
GET /v1/account/monitors levert tot 100 monitors onder monitors, met total. Gearchiveerde staan niet in de lijst.
GET /v1/account/monitors/{id} toont ook de huidige cyclus in billing_cycle en de laatste controles in recent_runs.
curl -G "https://handelsregister.ai/api/v1/account/monitors/mon_01m65pn3vm11sjjp1j076cbvec" \ -H "x-api-key: JOUW_API_SLEUTEL"
import requests response = requests.get( "https://handelsregister.ai/api/v1/account/monitors/mon_01m65pn3vm11sjjp1j076cbvec", headers={"x-api-key": "JOUW_API_SLEUTEL"}, ) 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": "JOUW_API_SLEUTEL" }, }); 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}
| Veld | Betekenis |
|---|---|
| id |
ID van de monitor, begint met mon_.
|
| entity_id | Het bewaakte bedrijf. |
| poll_interval_days | Controle-interval in dagen. |
| status, status_reason |
Status, zie hierboven. status_reason geeft de reden.
|
| baseline_completed_at, activated_at, last_succeeded_at | Tijdstippen van de nulmeting, de activering en de laatste geslaagde controle. |
| next_poll_at | De volgende geplande controle, alleen bij actieve monitors. |
| billing_cycle | De huidige cyclus: begin, einde, prijs, inbegrepen controles en tot nu toe uitgevoerde controles. |
| recent_runs |
De laatste controles met resultaat, afrekening en het aantal nieuwe signalen in events_new.
|
PATCH /v1/account/monitors/{id} wijzigt het controle-interval. De volgende controle volgt dan met het nieuwe interval, gerekend vanaf de wijziging.
De huidige cyclus houdt zijn prijs en inbegrepen controles. De nieuwe prijs geldt vanaf de volgende cyclus. Een korter interval kan in de huidige cyclus extra controles opleveren.
curl -X PATCH "https://handelsregister.ai/api/v1/account/monitors/mon_01m6b3m7945dn7cyvexzv41kjz" \ -H "x-api-key: JOUW_API_SLEUTEL" \ -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": "JOUW_API_SLEUTEL", "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": "JOUW_API_SLEUTEL", "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}
Pauzeren, hervatten, archiveren
POST …/{id}/pause stopt een actieve monitor. De betaalde cyclus loopt gewoon af, en er wordt niets terugbetaald.
POST …/{id}/resume hervat een gepauzeerde monitor of een monitor met een fout. We controleren webhook-endpoints, saldo en prijs opnieuw.
Binnen de huidige betaalde cyclus kost hervatten niets. Is de cyclus afgelopen, dan start er nu een nieuwe cyclus tegen de huidige prijs. meta.request_credit_cost toont het bedrag.
Ontbreekt bijvoorbeeld een geverifieerd webhook-endpoint, dan antwoordt de API toch met 200, maar met meta.activated: false. De status van de monitor en status_reason geven de reden.
Is de prijs gewijzigd, dan stopt een actieve monitor aan het einde van de cyclus met pricing_consent_required. Met resume ga je akkoord met de nieuwe prijs.
DELETE …/{id} archiveert de monitor definitief. Dat is onomkeerbaar en er wordt niets terugbetaald.
curl -X POST "https://handelsregister.ai/api/v1/account/monitors/mon_01m6b3m7945dn7cyvexzv41kjz/resume" \ -H "x-api-key: JOUW_API_SLEUTEL" \ -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": "JOUW_API_SLEUTEL", "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": "JOUW_API_SLEUTEL", "Idempotency-Key": crypto.randomUUID(), }, }); const data = await response.json();
paused_configuration. Hervat de monitor met resume nadat je het webhook-endpoint weer hebt ingeschakeld.
Fouten
Fouten hebben de opbouw {"error": "…", "meta": {"message": "…"}}. Controleer in je programma de waarde van error. De tekst in meta.message is in het Engels en kan veranderen. Fouten kosten niets.
| Status | Oorzaak | Wat je kunt doen |
|---|---|---|
| 400 |
api_key staat in de URL. |
Stuur de sleutel in de header x-api-key. |
| 400 |
De Idempotency-Key heeft een ongeldig formaat. |
Corrigeer het formaat, gebruik bijvoorbeeld een UUID. |
| 401 | Geen API-sleutel of token, of een ongeldige. |
Stuur de sleutel in de header x-api-key. |
| 403 |
Het bearer-token mist het recht account:read. |
Gebruik de API-sleutel of een token met account:read. |
| 403 | Het e-mailadres van je account is nog niet bevestigd, of het account is geblokkeerd. | Open de link uit de bevestigingsmail. Is het account geblokkeerd, dan helpt support. |
| 403 |
Het bearer-token mist het recht monitoring:manage. |
Gebruik de API-sleutel of het admin-token. |
| 404 | Geen monitor met deze ID in je account. | Controleer de ID. |
| 409 |
Er bestaat al een monitor voor dit bedrijf (duplicate_monitor). |
Gebruik de bestaande monitor of archiveer die eerst. |
| 409 |
De Idempotency-Key is al met andere gegevens gebruikt, is ouder dan 24 uur, of wordt nog verwerkt. |
Gebruik een nieuwe sleutel of wacht even. |
| 422 |
Een waarde is ongeldig: invalid_subject, invalid_interval, endpoint_required, monitor_limit of not_resumable. |
Corrigeer de waarde. |
| 428 |
De header Idempotency-Key ontbreekt. |
Stuur de header mee. |
| 429 | Te veel aanvragen. |
Probeer het opnieuw na Retry-After. |
| 429 |
creation_rate_limited: te veel nieuwe monitors binnen 24 uur. |
Probeer het opnieuw na Retry-After. |
| 503 | Monitoring is tijdelijk niet beschikbaar. | Probeer het wat later opnieuw. |
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}