/v1/account/monitors
account/monitors
Monitoramento: mandar monitorar empresas, criar, pausar, excluir.
Um monitor acompanha uma empresa por você. Num intervalo fixo, verificamos se há novos sinais e enviamos cada novo sinal por webhook aos seus endpoints de webhook.
Custos e limites
| O quê | Créditos |
|---|---|
| Monitor verificado todo dia, por 30 dias | 50 |
| Monitor verificado a cada 3 dias, por 30 dias | 40 |
| Monitor verificado a cada 7 dias, por 30 dias | 20 |
| Monitor verificado a cada 30 dias, por 30 dias | 10 |
| Cada verificação adicional bem-sucedida no período | +2 |
Limite: 30 requisições por minuto. Criar, alterar e excluir: 10 por minuto.
Criar um monitor e a primeira linha de base são grátis. Um ciclo de 30 dias é cobrado assim que o monitor fica ativo. O preço depende do intervalo de verificação e cobre todas as verificações que o intervalo agenda dentro de um ciclo.
Um intervalo entre dois degraus custa tanto quanto o próximo degrau mais frequente: a cada quatro dias custa tanto quanto a cada três dias.
Verificações extras acontecem principalmente quando você encurta o intervalo no meio de um ciclo. Cada verificação extra bem-sucedida custa o valor da tabela.
Após 30 dias, o ciclo se renova automaticamente pelo preço vigente. Verificações que falham não custam nada. Quando você pausa, arquiva ou muda o intervalo, não reembolsamos nada.
Cada conta pode ter até 50 monitores ao mesmo tempo, um por empresa. Em 24 horas, você pode criar até 50 monitores; os arquivados também contam.
Você obtém o preço de um intervalo de graça com GET /v1/account/monitoring/pricing, aqui para uma verificação a cada sete dias:
curl -G "https://handelsregister.ai/api/v1/account/monitoring/pricing" \ -H "x-api-key: SUA_CHAVE_DE_API" \ --data-urlencode 'poll_interval_days=7'
import requests response = requests.get( "https://handelsregister.ai/api/v1/account/monitoring/pricing", headers={"x-api-key": "SUA_CHAVE_DE_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": "SUA_CHAVE_DE_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}
Como um monitor funciona
- Criar. Você indica a empresa, o intervalo de verificação e pelo menos um endpoint de webhook verificado. O monitor começa com o status
initializing. - Linha de base. Registramos os sinais dos últimos dias como conhecidos. Eles não são entregues, então você só recebe o que for novo depois disso.
- Ativar. Cobramos o ciclo, o monitor fica
activee verifica pela primeira vez na hora. - Verificar. Depois disso, ele verifica no intervalo escolhido. Cada novo sinal gera uma mensagem por monitor aos seus endpoints de webhook.
- Renovar. Após cada ciclo, o próximo é cobrado automaticamente, desde que o seu saldo cubra.
O intervalo de verificação fica entre 1 e 30 dias. O horário exato de uma verificação pode variar dentro de uma hora. Cada verificação olha alguns dias para trás, então registros publicados com atraso também chegam.
Um monitor entrega os temas de Signals do seu plano: cinco em qualquer conta, Insolvências com o Pro, Transformações & M&A com o Max. Um webhook traz no campo data.signal o mesmo sinal que signals.
| Status | Significado |
|---|---|
| initializing | Criado; linha de base e ativação em andamento. |
| active | Verifica no intervalo escolhido. |
| paused_user | Pausado por você. |
| paused_configuration | Nenhum endpoint de webhook ativo e verificado está mais conectado. |
| paused_billing | O seu saldo não cobre o ciclo ou uma verificação extra. Ou o preço mudou e aguarda seu consentimento. |
| error | Várias verificações seguidas falharam. |
| archived | Encerrado definitivamente. Você ainda pode ler o monitor pelo ID, mas ele não aparece mais na lista. |
Para monitores pausados e erros, status_reason explica o motivo, por exemplo no_verified_endpoint ou insufficient_cycle_floor.
Endpoints
Todos os caminhos ficam em /v1/account. Você lê e escreve com sua chave de API no header x-api-key.
| Método | Caminho | Finalidade |
|---|---|---|
| GET |
/v1/account/monitors |
Todos os monitores, os mais recentes primeiro, sem os arquivados. |
| POST |
/v1/account/monitors |
Criar um monitor. |
| GET |
/v1/account/monitors/{id} |
Um monitor com seu ciclo e as últimas verificações. |
| PATCH |
/v1/account/monitors/{id} |
Mudar o intervalo de verificação. |
| POST |
/v1/account/monitors/{id}/pause |
Pausar. |
| POST |
/v1/account/monitors/{id}/resume |
Retomar. |
| DELETE |
/v1/account/monitors/{id} |
Arquivar. |
| GET |
/v1/account/monitoring/pricing |
Preço de um intervalo. |
Idempotency-Key
Toda requisição de escrita precisa do header Idempotency-Key, um valor único por operação, de preferência um UUID. Sem ele, a API responde com 428.
Se você repetir uma requisição com a mesma chave e os mesmos dados em até 24 horas, recebe de volta a resposta armazenada. Ela traz o header Idempotency-Status: replayed. Assim um erro de rede não cria um segundo monitor.
Isso vale também para respostas de erro. Por isso, para uma nova tentativa após uma correção, use uma chave nova. A mesma chave com dados diferentes retorna 409.
São permitidos até 128 caracteres: letras, dígitos e . _ : -. O primeiro caractere é uma letra ou um dígito. Uma chave em qualquer outro formato retorna 400.
Criar um monitor
Você precisa do entity_id da empresa e de pelo menos um endpoint de webhook verificado, veja account/webhook-endpoints.
curl -X POST "https://handelsregister.ai/api/v1/account/monitors" \ -H "x-api-key: SUA_CHAVE_DE_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": "SUA_CHAVE_DE_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": "SUA_CHAVE_DE_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 | Descrição | Exemplo |
|---|---|---|---|
| Idempotency-KeyHeader | stringobrigatório | Um valor único por operação, de preferência um UUID. Veja Idempotency-Key.Limites: 1 a 128 caracteres |
req-20260802-01 |
| entity_idBody | stringobrigatório |
O entity_id da empresa de fetch-organization ou search-organizations.Limites: 1 a 128 caracteres |
94eb910fef13f94585c48c263fa446d4 |
| labelBody | stringopcional | Um nome para o monitor.Limites: no máximo 200 caracteres |
Hetzner Online GmbH |
| poll_interval_daysBody | inteiroobrigatório | Intervalo de verificação em dias.Limites: 1 a 30 |
7 |
| endpoint_idsBody | lista de stringobrigatório |
Os IDs dos seus endpoints de webhook (wep_…). Cada um precisa estar ativo e verificado.Limites: 1 a 10 entradas |
["wep_01m6b3j1g0cdz98hw8zdefbf52"] |
A API responde com 202: o monitor é criado, e linha de base e ativação rodam em segundo plano. meta.billing.charged_credits mostra que nada foi cobrado por isso.
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}
Listar e alterar monitores
GET /v1/account/monitors retorna até 100 monitores em monitors, com total. Os arquivados não estão na lista.
GET /v1/account/monitors/{id} também mostra o ciclo atual em billing_cycle e as últimas verificações em recent_runs.
curl -G "https://handelsregister.ai/api/v1/account/monitors/mon_01m65pn3vm11sjjp1j076cbvec" \ -H "x-api-key: SUA_CHAVE_DE_API"
import requests response = requests.get( "https://handelsregister.ai/api/v1/account/monitors/mon_01m65pn3vm11sjjp1j076cbvec", headers={"x-api-key": "SUA_CHAVE_DE_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": "SUA_CHAVE_DE_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 | Significado |
|---|---|
| id |
ID do monitor, começa com mon_.
|
| entity_id | A empresa monitorada. |
| poll_interval_days | Intervalo de verificação em dias. |
| status, status_reason |
Status, veja acima. status_reason informa o motivo.
|
| baseline_completed_at, activated_at, last_succeeded_at | Horários da linha de base, da ativação e da última verificação bem-sucedida. |
| next_poll_at | A próxima verificação agendada, só para monitores ativos. |
| billing_cycle | O ciclo atual: início, fim, preço, verificações incluídas e verificações feitas até agora. |
| recent_runs |
As últimas verificações com resultado, cobrança e o número de novos sinais em events_new.
|
PATCH /v1/account/monitors/{id} muda o intervalo de verificação. A próxima verificação segue então no novo intervalo, contado a partir da mudança.
O ciclo atual mantém seu preço e suas verificações incluídas. O novo preço vale a partir do próximo ciclo. Um intervalo mais curto pode gerar verificações extras no ciclo atual.
curl -X PATCH "https://handelsregister.ai/api/v1/account/monitors/mon_01m6b3m7945dn7cyvexzv41kjz" \ -H "x-api-key: SUA_CHAVE_DE_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": "SUA_CHAVE_DE_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": "SUA_CHAVE_DE_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}
Pausar, retomar, arquivar
POST …/{id}/pause para um monitor ativo. O ciclo pago continua até o fim, e nada é reembolsado.
POST …/{id}/resume retoma um monitor pausado ou um monitor com erro. Verificamos de novo endpoints de webhook, saldo e preço.
Dentro do ciclo pago atual, retomar não custa nada. Se o ciclo terminou, um novo ciclo começa agora pelo preço atual. meta.request_credit_cost mostra o valor.
Se, por exemplo, faltar um endpoint de webhook verificado, a API ainda responde com 200, mas com meta.activated: false. O status do monitor e status_reason informam o motivo.
Se o preço mudou, um monitor ativo para no fim do ciclo com pricing_consent_required. Com resume, você aceita o novo preço.
DELETE …/{id} arquiva o monitor definitivamente. Isso é final e não reembolsa nada.
curl -X POST "https://handelsregister.ai/api/v1/account/monitors/mon_01m6b3m7945dn7cyvexzv41kjz/resume" \ -H "x-api-key: SUA_CHAVE_DE_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": "SUA_CHAVE_DE_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": "SUA_CHAVE_DE_API", "Idempotency-Key": crypto.randomUUID(), }, }); const data = await response.json();
paused_configuration. Depois de ativar o endpoint de webhook, retome o monitor com resume.
Erros
Erros têm a estrutura {"error": "…", "meta": {"message": "…"}}. No seu programa, verifique o valor de error. O texto em meta.message está em inglês e pode mudar. Erros não custam nada.
| Status | Causa | O que você pode fazer |
|---|---|---|
| 400 |
api_key está na URL. |
Envie a chave no header x-api-key. |
| 400 |
O Idempotency-Key tem formato inválido. |
Corrija o formato, por exemplo use um UUID. |
| 401 | Nenhuma chave de API ou token, ou um inválido. |
Envie a chave no header x-api-key. |
| 403 |
Falta ao bearer token a permissão account:read. |
Use a chave de API ou um token com account:read. |
| 403 | O endereço de e-mail da sua conta ainda não foi confirmado, ou a conta está bloqueada. | Abra o link do e-mail de confirmação. Se a conta estiver bloqueada, o suporte pode ajudar. |
| 403 |
Falta ao bearer token a permissão monitoring:manage. |
Use a chave de API ou o admin token. |
| 404 | Nenhum monitor com este ID na sua conta. | Confira o ID. |
| 409 |
Já existe um monitor para esta empresa (duplicate_monitor). |
Use o monitor existente ou arquive-o antes. |
| 409 |
O Idempotency-Key já foi usado com outros dados, tem mais de 24 horas ou ainda está sendo processado. |
Use uma chave nova ou espere um pouco. |
| 422 |
Um valor é inválido: invalid_subject, invalid_interval, endpoint_required, monitor_limit ou not_resumable. |
Corrija o valor. |
| 428 |
O header Idempotency-Key está faltando. |
Envie o header. |
| 429 | Requisições demais. |
Tente de novo depois de Retry-After. |
| 429 |
creation_rate_limited: novos monitores demais em 24 horas. |
Tente de novo depois de Retry-After. |
| 503 | O Monitoramento está temporariamente indisponível. | Tente de novo um pouco mais tarde. |
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}