/v1/account/monitors
account/monitors
Monitoring: far monitorare aziende, creare, mettere in pausa, eliminare.
Un monitor sorveglia un’azienda per te. A intervallo fisso controlliamo se ci sono nuovi segnali e inviamo ogni nuovo segnale via webhook ai tuoi endpoint webhook.
Costi e limiti
| Cosa | Crediti |
|---|---|
| Monitor controllato ogni giorno, per 30 giorni | 50 |
| Monitor controllato ogni 3 giorni, per 30 giorni | 40 |
| Monitor controllato ogni 7 giorni, per 30 giorni | 20 |
| Monitor controllato ogni 30 giorni, per 30 giorni | 10 |
| Ogni ulteriore controllo riuscito nel periodo | +2 |
Limite: 30 richieste al minuto. Creare, modificare ed eliminare: 10 al minuto.
Creare un monitor e la prima baseline sono gratuiti. Un ciclo di 30 giorni viene addebitato non appena il monitor diventa attivo. Il prezzo dipende dall’intervallo di controllo e copre tutti i controlli che l’intervallo prevede in un ciclo.
Un intervallo tra due gradini costa quanto il gradino successivo più frequente: ogni quattro giorni costa quanto ogni tre giorni.
I controlli aggiuntivi avvengono soprattutto quando accorci l’intervallo a metà ciclo. Ogni controllo aggiuntivo riuscito costa l’importo indicato nella tabella.
Dopo 30 giorni il ciclo si rinnova automaticamente al prezzo valido in quel momento. I controlli non riusciti non costano nulla. Quando metti in pausa, archivi o cambi l’intervallo, non rimborsiamo nulla.
Ogni account può avere fino a 50 monitor contemporaneamente, uno per azienda. Entro 24 ore puoi creare fino a 50 monitor; contano anche quelli archiviati.
Il prezzo di un intervallo lo ottieni gratuitamente con GET /v1/account/monitoring/pricing, qui per un controllo ogni sette giorni:
curl -G "https://handelsregister.ai/api/v1/account/monitoring/pricing" \ -H "x-api-key: LA_TUA_CHIAVE_API" \ --data-urlencode 'poll_interval_days=7'
import requests response = requests.get( "https://handelsregister.ai/api/v1/account/monitoring/pricing", headers={"x-api-key": "LA_TUA_CHIAVE_API"}, 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": "LA_TUA_CHIAVE_API" }, }); 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}
Come funziona un monitor
- Creare. Indichi l’azienda, l’intervallo di controllo e almeno un endpoint webhook verificato. Il monitor parte con lo stato
initializing. - Baseline. Registriamo come noti i segnali degli ultimi giorni. Non vengono consegnati, così ricevi solo ciò che è nuovo da lì in poi.
- Attivare. Addebitiamo il ciclo, il monitor diventa
activee controlla subito per la prima volta. - Controllare. Poi controlla all’intervallo scelto. Ogni nuovo segnale genera un messaggio per monitor verso i tuoi endpoint webhook.
- Rinnovare. Dopo ogni ciclo il successivo viene addebitato automaticamente, finché il tuo saldo lo copre.
L’intervallo di controllo è tra 1 e 30 giorni. Il momento esatto di un controllo può variare entro un’ora. Ogni controllo guarda indietro di qualche giorno, così arrivano anche le iscrizioni pubblicate in ritardo.
Un monitor consegna i temi Signals del tuo piano: cinque in ogni account, Insolvenze con Pro, Trasformazioni & M&A con Max. Un webhook porta lo stesso segnale nel campo data.signal come fa signals.
| Stato | Significato |
|---|---|
| initializing | Creato; baseline e attivazione in corso. |
| active | Controlla all’intervallo scelto. |
| paused_user | Messo in pausa da te. |
| paused_configuration | Non è più collegato alcun endpoint webhook attivo e verificato. |
| paused_billing | Il tuo saldo non copre il ciclo o un controllo aggiuntivo. Oppure il prezzo è cambiato e attende il tuo consenso. |
| error | Più controlli di fila sono falliti. |
| archived | Terminato definitivamente. Puoi ancora leggere il monitor tramite il suo ID, ma non compare più nella lista. |
Per i monitor in pausa e gli errori, status_reason spiega il perché, ad esempio no_verified_endpoint o insufficient_cycle_floor.
Endpoint
Tutti i percorsi sono sotto /v1/account. Leggi e scrivi con la tua chiave API nell’header x-api-key.
| Metodo | Percorso | Scopo |
|---|---|---|
| GET |
/v1/account/monitors |
Tutti i monitor, il più recente per primo, senza quelli archiviati. |
| POST |
/v1/account/monitors |
Creare un monitor. |
| GET |
/v1/account/monitors/{id} |
Un monitor con il suo ciclo e gli ultimi controlli. |
| PATCH |
/v1/account/monitors/{id} |
Cambiare l’intervallo di controllo. |
| POST |
/v1/account/monitors/{id}/pause |
Mettere in pausa. |
| POST |
/v1/account/monitors/{id}/resume |
Riprendere. |
| DELETE |
/v1/account/monitors/{id} |
Archiviare. |
| GET |
/v1/account/monitoring/pricing |
Prezzo di un intervallo. |
Idempotency-Key
Ogni richiesta di scrittura richiede l’header Idempotency-Key, un valore univoco per operazione, idealmente un UUID. Senza, l’API risponde con 428.
Se ripeti una richiesta con la stessa chiave e gli stessi dati entro 24 ore, ricevi la risposta salvata. Porta l’header Idempotency-Status: replayed. Così un errore di rete non crea un secondo monitor.
Vale anche per le risposte di errore. Per un nuovo tentativo dopo una correzione usa quindi una nuova chiave. La stessa chiave con dati diversi restituisce 409.
Sono ammessi fino a 128 caratteri: lettere, cifre e . _ : -. Il primo carattere è una lettera o una cifra. Una chiave in qualsiasi altro formato restituisce 400.
Creare un monitor
Ti servono l’entity_id dell’azienda e almeno un endpoint webhook verificato, vedi account/webhook-endpoints.
curl -X POST "https://handelsregister.ai/api/v1/account/monitors" \ -H "x-api-key: LA_TUA_CHIAVE_API" \ -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": "LA_TUA_CHIAVE_API", "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": "LA_TUA_CHIAVE_API", "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();
| Nome | Tipo | Descrizione | Esempio |
|---|---|---|---|
| Idempotency-KeyHeader | stringaobbligatorio | Un valore univoco per operazione, idealmente un UUID. Vedi Idempotency-Key.Limiti: da 1 a 128 caratteri |
req-20260802-01 |
| entity_idBody | stringaobbligatorio |
L’entity_id dell’azienda da fetch-organization o search-organizations.Limiti: da 1 a 128 caratteri |
94eb910fef13f94585c48c263fa446d4 |
| labelBody | stringafacoltativo | Un nome per il monitor.Limiti: al massimo 200 caratteri |
Hetzner Online GmbH |
| poll_interval_daysBody | interoobbligatorio | Intervallo di controllo in giorni.Limiti: da 1 a 30 |
7 |
| endpoint_idsBody | lista di stringobbligatorio |
Gli ID dei tuoi endpoint webhook (wep_…). Ciascuno deve essere attivo e verificato.Limiti: da 1 a 10 voci |
["wep_01m6b3j1g0cdz98hw8zdefbf52"] |
L’API risponde con 202: il monitor è creato, baseline e attivazione girano in background. meta.billing.charged_credits mostra che per questo non è stato addebitato nulla.
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}
Elencare e modificare i monitor
GET /v1/account/monitors restituisce fino a 100 monitor in monitors, con total. Quelli archiviati non sono nella lista.
GET /v1/account/monitors/{id} mostra anche il ciclo attuale in billing_cycle e gli ultimi controlli in recent_runs.
curl -G "https://handelsregister.ai/api/v1/account/monitors/mon_01m65pn3vm11sjjp1j076cbvec" \ -H "x-api-key: LA_TUA_CHIAVE_API"
import requests response = requests.get( "https://handelsregister.ai/api/v1/account/monitors/mon_01m65pn3vm11sjjp1j076cbvec", headers={"x-api-key": "LA_TUA_CHIAVE_API"}, ) 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": "LA_TUA_CHIAVE_API" }, }); 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}
| Campo | Significato |
|---|---|
| id |
ID del monitor, inizia con mon_.
|
| entity_id | L’azienda monitorata. |
| poll_interval_days | Intervallo di controllo in giorni. |
| status, status_reason |
Stato, vedi sopra. status_reason indica il motivo.
|
| baseline_completed_at, activated_at, last_succeeded_at | Momenti della baseline, dell’attivazione e dell’ultimo controllo riuscito. |
| next_poll_at | Il prossimo controllo previsto, solo per i monitor attivi. |
| billing_cycle | Il ciclo attuale: inizio, fine, prezzo, controlli inclusi e controlli eseguiti finora. |
| recent_runs |
Gli ultimi controlli con esito, addebito e numero di nuovi segnali in events_new.
|
PATCH /v1/account/monitors/{id} cambia l’intervallo di controllo. Il controllo successivo segue allora il nuovo intervallo, contato dalla modifica.
Il ciclo attuale mantiene il suo prezzo e i controlli inclusi. Il nuovo prezzo vale dal ciclo successivo. Un intervallo più breve può generare controlli aggiuntivi nel ciclo attuale.
curl -X PATCH "https://handelsregister.ai/api/v1/account/monitors/mon_01m6b3m7945dn7cyvexzv41kjz" \ -H "x-api-key: LA_TUA_CHIAVE_API" \ -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": "LA_TUA_CHIAVE_API", "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": "LA_TUA_CHIAVE_API", "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}
Mettere in pausa, riprendere, archiviare
POST …/{id}/pause ferma un monitor attivo. Il ciclo pagato continua fino alla scadenza e non viene rimborsato nulla.
POST …/{id}/resume riprende un monitor in pausa o con un errore. Verifichiamo di nuovo endpoint webhook, saldo e prezzo.
All’interno del ciclo pagato in corso, riprendere non costa nulla. Se il ciclo è scaduto, parte ora un nuovo ciclo al prezzo attuale. meta.request_credit_cost mostra l’importo.
Se, ad esempio, manca un endpoint webhook verificato, l’API risponde comunque con 200, ma con meta.activated: false. Lo stato del monitor e status_reason indicano il motivo.
Se il prezzo è cambiato, un monitor attivo si ferma alla fine del ciclo con pricing_consent_required. Con resume accetti il nuovo prezzo.
DELETE …/{id} archivia il monitor definitivamente. È definitivo e non rimborsa nulla.
curl -X POST "https://handelsregister.ai/api/v1/account/monitors/mon_01m6b3m7945dn7cyvexzv41kjz/resume" \ -H "x-api-key: LA_TUA_CHIAVE_API" \ -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": "LA_TUA_CHIAVE_API", "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": "LA_TUA_CHIAVE_API", "Idempotency-Key": crypto.randomUUID(), }, }); const data = await response.json();
paused_configuration. Dopo aver riattivato l’endpoint webhook, riprendi il monitor con resume.
Errori
Gli errori hanno la struttura {"error": "…", "meta": {"message": "…"}}. Nel tuo programma controlla il valore di error. Il testo in meta.message è in inglese e può cambiare. Gli errori non costano nulla.
| Stato | Causa | Cosa puoi fare |
|---|---|---|
| 400 |
api_key è nell’URL. |
Invia la chiave nell’header x-api-key. |
| 400 |
L’Idempotency-Key ha un formato non valido. |
Correggi il formato, ad esempio usa un UUID. |
| 401 | Nessuna chiave API o token, o uno non valido. |
Invia la chiave nell’header x-api-key. |
| 403 |
Al bearer token manca l’abilitazione account:read. |
Usa la chiave API o un token con account:read. |
| 403 | L’indirizzo email del tuo account non è ancora confermato, oppure l’account è bloccato. | Apri il link dall’email di conferma. Se l’account è bloccato, il supporto può aiutarti. |
| 403 |
Al bearer token manca l’abilitazione monitoring:manage. |
Usa la chiave API o l’admin token. |
| 404 | Nessun monitor con questo ID nel tuo account. | Controlla l’ID. |
| 409 |
Esiste già un monitor per questa azienda (duplicate_monitor). |
Usa il monitor esistente o archivialo prima. |
| 409 |
L’Idempotency-Key è già stato usato con dati diversi, è più vecchio di 24 ore oppure è ancora in elaborazione. |
Usa una nuova chiave o aspetta un momento. |
| 422 |
Un valore non è valido: invalid_subject, invalid_interval, endpoint_required, monitor_limit o not_resumable. |
Correggi il valore. |
| 428 |
Manca l’header Idempotency-Key. |
Invia l’header. |
| 429 | Troppe richieste. |
Riprova dopo Retry-After. |
| 429 |
creation_rate_limited: troppi nuovi monitor entro 24 ore. |
Riprova dopo Retry-After. |
| 503 | Monitoring è temporaneamente non disponibile. | Riprova poco più tardi. |
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}