/v1/account/monitors
account/monitors
Monitoring : faire surveiller des entreprises, créer, mettre en pause, supprimer.
Un moniteur surveille une entreprise pour toi. À intervalle fixe, nous vérifions s’il y a de nouveaux signals et envoyons chaque nouveau signal par webhook à tes endpoints webhook.
Coûts et limites
| Quoi | Crédits |
|---|---|
| Moniteur vérifié chaque jour, pendant 30 jours | 50 |
| Moniteur vérifié tous les 3 jours, pendant 30 jours | 40 |
| Moniteur vérifié tous les 7 jours, pendant 30 jours | 20 |
| Moniteur vérifié tous les 30 jours, pendant 30 jours | 10 |
| Chaque vérification réussie supplémentaire dans la période | +2 |
Limite : 30 requêtes par minute. Créer, modifier et supprimer : 10 par minute.
La création d’un moniteur et la première référence sont gratuites. Un cycle de 30 jours est facturé dès que le moniteur devient actif. Le prix dépend de l’intervalle de vérification et couvre toutes les vérifications que l’intervalle prévoit dans un cycle.
Un intervalle entre deux paliers coûte autant que le palier plus fréquent suivant : tous les quatre jours coûte autant que tous les trois jours.
Des vérifications supplémentaires ont lieu surtout quand tu raccourcis l’intervalle en cours de cycle. Chaque vérification supplémentaire réussie coûte le montant du tableau.
Après 30 jours, le cycle se renouvelle automatiquement au prix alors en vigueur. Les vérifications échouées ne coûtent rien. Si tu mets en pause, archives ou changes l’intervalle, nous ne remboursons rien.
Chaque compte peut avoir jusqu’à 50 moniteurs en même temps, un par entreprise. En 24 heures, tu peux créer jusqu’à 50 moniteurs ; les moniteurs archivés comptent aussi.
Tu obtiens gratuitement le prix d’un intervalle avec GET /v1/account/monitoring/pricing, ici pour une vérification tous les sept jours :
curl -G "https://handelsregister.ai/api/v1/account/monitoring/pricing" \ -H "x-api-key: TA_CLE_API" \ --data-urlencode 'poll_interval_days=7'
import requests response = requests.get( "https://handelsregister.ai/api/v1/account/monitoring/pricing", headers={"x-api-key": "TA_CLE_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": "TA_CLE_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}
Fonctionnement d’un moniteur
- Création. Tu indiques l’entreprise, l’intervalle de vérification et au moins un endpoint webhook vérifié. Le moniteur démarre avec le statut
initializing. - Référence. Nous enregistrons les signals des derniers jours comme connus. Ils ne sont pas livrés : tu ne reçois que ce qui est nouveau ensuite.
- Activation. Nous facturons le cycle, le moniteur devient
activeet vérifie immédiatement une première fois. - Vérification. Ensuite, il vérifie à l’intervalle choisi. Chaque nouveau signal déclenche un message par moniteur vers tes endpoints webhook.
- Renouvellement. Après chaque cycle, le suivant est facturé automatiquement, tant que ton solde le couvre.
L’intervalle de vérification est compris entre 1 et 30 jours. L’heure exacte d’une vérification peut varier d’une heure. Chaque vérification regarde quelques jours en arrière, pour que les inscriptions publiées tardivement arrivent aussi.
Un moniteur livre les thèmes Signals de ton plan : cinq dans chaque compte, Insolvabilités avec Pro, Transformations & fusions-acquisitions avec Max. Un webhook porte dans le champ data.signal le même signal que signals.
| Statut | Signification |
|---|---|
| initializing | Créé ; référence et activation en cours. |
| active | Vérifie à l’intervalle choisi. |
| paused_user | Mis en pause par toi. |
| paused_configuration | Plus aucun endpoint webhook actif et vérifié n’est connecté. |
| paused_billing | Ton solde ne couvre pas le cycle ou une vérification supplémentaire. Ou le prix a changé et attend ton accord. |
| error | Plusieurs vérifications consécutives ont échoué. |
| archived | Terminé définitivement. Tu peux encore lire le moniteur par son identifiant, mais il n’apparaît plus dans la liste. |
Pour les moniteurs en pause et les erreurs, status_reason explique pourquoi, par exemple no_verified_endpoint ou insufficient_cycle_floor.
Endpoints
Tous les chemins se trouvent sous /v1/account. Tu lis et écris avec ta clé API dans le header x-api-key.
| Méthode | Chemin | Usage |
|---|---|---|
| GET |
/v1/account/monitors |
Tous les moniteurs, les plus récents en premier, sans les archivés. |
| POST |
/v1/account/monitors |
Créer un moniteur. |
| GET |
/v1/account/monitors/{id} |
Un moniteur avec son cycle et ses dernières vérifications. |
| PATCH |
/v1/account/monitors/{id} |
Changer l’intervalle de vérification. |
| POST |
/v1/account/monitors/{id}/pause |
Mettre en pause. |
| POST |
/v1/account/monitors/{id}/resume |
Reprendre. |
| DELETE |
/v1/account/monitors/{id} |
Archiver. |
| GET |
/v1/account/monitoring/pricing |
Prix d’un intervalle. |
Idempotency-Key
Chaque requête d’écriture nécessite le header Idempotency-Key, une valeur unique par opération, idéalement un UUID. Sans lui, l’API répond 428.
Si tu répètes une requête avec la même clé et les mêmes données dans les 24 heures, tu reçois la réponse enregistrée. Elle porte le header Idempotency-Status: replayed. Ainsi, une erreur réseau ne crée pas de second moniteur.
Cela vaut aussi pour les réponses d’erreur. Pour une nouvelle tentative après une correction, utilise donc une nouvelle clé. La même clé avec des données différentes renvoie 409.
Jusqu’à 128 caractères sont autorisés : lettres, chiffres et . _ : -. Le premier caractère est une lettre ou un chiffre. Une clé dans tout autre format renvoie 400.
Créer un moniteur
Il te faut l’entity_id de l’entreprise et au moins un endpoint webhook vérifié, voir account/webhook-endpoints.
curl -X POST "https://handelsregister.ai/api/v1/account/monitors" \ -H "x-api-key: TA_CLE_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": "TA_CLE_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": "TA_CLE_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();
| Nom | Type | Description | Exemple |
|---|---|---|---|
| Idempotency-KeyHeader | chaîneobligatoire | Une valeur unique par opération, idéalement un UUID. Voir Idempotency-Key.Limites: 1 à 128 caractères |
req-20260802-01 |
| entity_idBody | chaîneobligatoire |
L’entity_id de l’entreprise issu de fetch-organization ou search-organizations.Limites: 1 à 128 caractères |
94eb910fef13f94585c48c263fa446d4 |
| labelBody | chaînefacultatif | Un nom pour le moniteur.Limites: au plus 200 caractères |
Hetzner Online GmbH |
| poll_interval_daysBody | entierobligatoire | Intervalle de vérification en jours.Limites: 1 à 30 |
7 |
| endpoint_idsBody | liste de stringobligatoire |
Les identifiants de tes endpoints webhook (wep_…). Chacun doit être actif et vérifié.Limites: 1 à 10 entrées |
["wep_01m6b3j1g0cdz98hw8zdefbf52"] |
L’API répond 202 : le moniteur est créé, la référence et l’activation s’exécutent en arrière-plan. meta.billing.charged_credits montre que rien n’a été facturé pour cela.
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}
Lister et modifier des moniteurs
GET /v1/account/monitors renvoie jusqu’à 100 moniteurs sous monitors, avec total. Les moniteurs archivés ne figurent pas dans la liste.
GET /v1/account/monitors/{id} montre aussi le cycle en cours dans billing_cycle et les dernières vérifications dans recent_runs.
curl -G "https://handelsregister.ai/api/v1/account/monitors/mon_01m65pn3vm11sjjp1j076cbvec" \ -H "x-api-key: TA_CLE_API"
import requests response = requests.get( "https://handelsregister.ai/api/v1/account/monitors/mon_01m65pn3vm11sjjp1j076cbvec", headers={"x-api-key": "TA_CLE_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": "TA_CLE_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}
| Champ | Signification |
|---|---|
| id |
Identifiant du moniteur, commence par mon_.
|
| entity_id | L’entreprise surveillée. |
| poll_interval_days | Intervalle de vérification en jours. |
| status, status_reason |
Statut, voir ci-dessus. status_reason indique la raison.
|
| baseline_completed_at, activated_at, last_succeeded_at | Moments de la référence, de l’activation et de la dernière vérification réussie. |
| next_poll_at | La prochaine vérification prévue, uniquement pour les moniteurs actifs. |
| billing_cycle | Le cycle en cours : début, fin, prix, vérifications incluses et vérifications effectuées jusqu’ici. |
| recent_runs |
Les dernières vérifications avec résultat, facturation et nombre de nouveaux signals dans events_new.
|
PATCH /v1/account/monitors/{id} change l’intervalle de vérification. La vérification suivante a alors lieu au nouvel intervalle, compté à partir du changement.
Le cycle en cours conserve son prix et ses vérifications incluses. Le nouveau prix s’applique à partir du cycle suivant. Un intervalle plus court peut déclencher des vérifications supplémentaires dans le cycle en cours.
curl -X PATCH "https://handelsregister.ai/api/v1/account/monitors/mon_01m6b3m7945dn7cyvexzv41kjz" \ -H "x-api-key: TA_CLE_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": "TA_CLE_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": "TA_CLE_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}
Mettre en pause, reprendre, archiver
POST …/{id}/pause arrête un moniteur actif. Le cycle payé continue de courir, et rien n’est remboursé.
POST …/{id}/resume reprend un moniteur en pause ou en erreur. Nous vérifions de nouveau les endpoints webhook, le solde et le prix.
Dans le cycle payé en cours, la reprise ne coûte rien. Si le cycle est écoulé, un nouveau cycle commence maintenant au prix actuel. meta.request_credit_cost indique le montant.
S’il manque par exemple un endpoint webhook vérifié, l’API répond quand même 200, mais avec meta.activated: false. Le statut du moniteur et status_reason en indiquent la raison.
Si le prix a changé, un moniteur actif s’arrête à la fin du cycle avec pricing_consent_required. Avec resume, tu acceptes le nouveau prix.
DELETE …/{id} archive définitivement le moniteur. C’est irréversible et rien n’est remboursé.
curl -X POST "https://handelsregister.ai/api/v1/account/monitors/mon_01m6b3m7945dn7cyvexzv41kjz/resume" \ -H "x-api-key: TA_CLE_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": "TA_CLE_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": "TA_CLE_API", "Idempotency-Key": crypto.randomUUID(), }, }); const data = await response.json();
paused_configuration. Après avoir réactivé l’endpoint webhook, reprends le moniteur avec resume.
Erreurs
Les erreurs ont la structure {"error": "…", "meta": {"message": "…"}}. Dans ton programme, vérifie la valeur de error. Le texte dans meta.message est en anglais et peut changer. Les erreurs ne coûtent rien.
| Statut | Cause | Que faire |
|---|---|---|
| 400 |
api_key figure dans l’URL. |
Envoie la clé dans le header x-api-key. |
| 400 |
L’Idempotency-Key a un format invalide. |
Corrige le format, par exemple en utilisant un UUID. |
| 401 | Aucune clé API ni aucun token, ou une valeur invalide. |
Envoie la clé dans le header x-api-key. |
| 403 |
Il manque au bearer token le droit account:read. |
Utilise la clé API ou un token avec account:read. |
| 403 | L’adresse e-mail de ton compte n’est pas encore confirmée, ou le compte est bloqué. | Ouvre le lien de l’e-mail de confirmation. Si le compte est bloqué, le support peut t’aider. |
| 403 |
Il manque au bearer token le droit monitoring:manage. |
Utilise la clé API ou le token admin. |
| 404 | Aucun moniteur avec cet identifiant dans ton compte. | Vérifie l’identifiant. |
| 409 |
Un moniteur existe déjà pour cette entreprise (duplicate_monitor). |
Utilise le moniteur existant ou archive-le d’abord. |
| 409 |
L’Idempotency-Key a déjà été utilisée avec d’autres données, date de plus de 24 heures ou est encore en cours de traitement. |
Utilise une nouvelle clé ou attends brièvement. |
| 422 |
Une valeur est invalide : invalid_subject, invalid_interval, endpoint_required, monitor_limit ou not_resumable. |
Corrige la valeur. |
| 428 |
Le header Idempotency-Key manque. |
Envoie le header. |
| 429 | Trop de requêtes. |
Réessaie après Retry-After. |
| 429 |
creation_rate_limited : trop de nouveaux moniteurs en 24 heures. |
Réessaie après Retry-After. |
| 503 | Le Monitoring est temporairement indisponible. | Réessaie un peu plus tard. |
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}