/v1/account/monitors
account/monitors
Monitoring: zleć obserwowanie firm, twórz, wstrzymuj, usuwaj.
Monitor obserwuje firmę za ciebie. W stałym odstępie sprawdzamy nowe sygnały i wysyłamy każdy nowy sygnał przez webhook do twoich endpointów webhooków.
Koszty i limity
| Co | Kredyty |
|---|---|
| Monitor sprawdzany codziennie, przez 30 dni | 50 |
| Monitor sprawdzany co 3 dni, przez 30 dni | 40 |
| Monitor sprawdzany co 7 dni, przez 30 dni | 20 |
| Monitor sprawdzany co 30 dni, przez 30 dni | 10 |
| Każde kolejne udane sprawdzenie w okresie | +2 |
Limit: 30 zapytań na minutę. Tworzenie, zmiana i usuwanie: 10 na minutę.
Utworzenie monitora i pierwszy stan bazowy są bezpłatne. Cykl 30 dni jest naliczany, gdy tylko monitor staje się aktywny. Cena zależy od częstotliwości sprawdzania i obejmuje wszystkie sprawdzenia, które częstotliwość przewiduje w jednym cyklu.
Częstotliwość między dwoma stopniami kosztuje tyle co najbliższy częstszy stopień: co cztery dni kosztuje tyle co co trzy dni.
Dodatkowe sprawdzenia zdarzają się głównie wtedy, gdy skrócisz odstęp w trakcie cyklu. Każde udane dodatkowe sprawdzenie kosztuje kwotę z tabeli.
Po 30 dniach cykl odnawia się automatycznie po cenie obowiązującej w tym momencie. Nieudane sprawdzenia nic nie kosztują. Przy wstrzymaniu, archiwizacji lub zmianie odstępu niczego nie zwracamy.
Każde konto może mieć jednocześnie do 50 monitorów, jeden na firmę. W ciągu 24 godzin możesz utworzyć do 50 monitorów; zarchiwizowane też się liczą.
Cenę danej częstotliwości dostajesz bezpłatnie przez GET /v1/account/monitoring/pricing, tutaj dla sprawdzenia co siedem dni:
curl -G "https://handelsregister.ai/api/v1/account/monitoring/pricing" \ -H "x-api-key: TWOJ_KLUCZ_API" \ --data-urlencode 'poll_interval_days=7'
import requests response = requests.get( "https://handelsregister.ai/api/v1/account/monitoring/pricing", headers={"x-api-key": "TWOJ_KLUCZ_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": "TWOJ_KLUCZ_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}
Jak działa monitor
- Utworzenie. Podajesz firmę, częstotliwość sprawdzania i co najmniej jeden zweryfikowany endpoint webhooka. Monitor startuje ze statusem
initializing. - Stan bazowy. Sygnały z ostatnich kilku dni zapisujemy jako znane. Nie są dostarczane, więc dostajesz tylko to, co nowe po tym momencie.
- Aktywacja. Naliczamy cykl, monitor staje się
activei od razu sprawdza po raz pierwszy. - Sprawdzanie. Potem sprawdza w wybranym odstępie. Każdy nowy sygnał wywołuje jedną wiadomość na monitor do twoich endpointów webhooków.
- Odnowienie. Po każdym cyklu następny jest naliczany automatycznie, dopóki saldo go pokrywa.
Częstotliwość sprawdzania wynosi od 1 do 30 dni. Dokładna chwila sprawdzenia może się wahać w ramach godziny. Każde sprawdzenie patrzy kilka dni wstecz, więc wpisy opublikowane z opóźnieniem też docierają.
Monitor dostarcza tematy Signals twojego planu: pięć na każdym koncie, Niewypłacalności w Pro, Przekształcenia i M&A w Max. Webhook niesie w polu data.signal ten sam sygnał co signals.
| Status | Znaczenie |
|---|---|
| initializing | Utworzony; trwa stan bazowy i aktywacja. |
| active | Sprawdza w wybranym odstępie. |
| paused_user | Wstrzymany przez ciebie. |
| paused_configuration | Nie jest już podłączony żaden aktywny, zweryfikowany endpoint webhooka. |
| paused_billing | Twoje saldo nie pokrywa cyklu ani dodatkowego sprawdzenia. Albo cena się zmieniła i czeka na twoją zgodę. |
| error | Kilka sprawdzeń z rzędu się nie udało. |
| archived | Zakończony na stałe. Monitor możesz nadal odczytać po ID, ale nie pojawia się już na liście. |
Dla wstrzymanych monitorów i błędów status_reason wyjaśnia powód, np. no_verified_endpoint lub insufficient_cycle_floor.
Endpointy
Wszystkie ścieżki są pod /v1/account. Czytasz i zapisujesz kluczem API w nagłówku x-api-key.
| Metoda | Ścieżka | Cel |
|---|---|---|
| GET |
/v1/account/monitors |
Wszystkie monitory, najnowsze najpierw, bez zarchiwizowanych. |
| POST |
/v1/account/monitors |
Utwórz monitor. |
| GET |
/v1/account/monitors/{id} |
Jeden monitor z cyklem i ostatnimi sprawdzeniami. |
| PATCH |
/v1/account/monitors/{id} |
Zmień częstotliwość sprawdzania. |
| POST |
/v1/account/monitors/{id}/pause |
Wstrzymaj. |
| POST |
/v1/account/monitors/{id}/resume |
Wznów. |
| DELETE |
/v1/account/monitors/{id} |
Zarchiwizuj. |
| GET |
/v1/account/monitoring/pricing |
Cena częstotliwości. |
Idempotency-Key
Każde zapytanie zapisujące wymaga nagłówka Idempotency-Key, unikalnej wartości na operację, najlepiej UUID. Bez niego API odpowiada 428.
Jeśli powtórzysz zapytanie z tym samym kluczem i tymi samymi danymi w ciągu 24 godzin, dostajesz z powrotem zapisaną odpowiedź. Ma ona nagłówek Idempotency-Status: replayed. Dzięki temu błąd sieci nie tworzy drugiego monitora.
Dotyczy to też odpowiedzi z błędem. Do nowej próby po poprawce użyj więc nowego klucza. Ten sam klucz z innymi danymi zwraca 409.
Dozwolone do 128 znaków: litery, cyfry i . _ : -. Pierwszy znak to litera lub cyfra. Klucz w innym formacie zwraca 400.
Utwórz monitor
Potrzebujesz entity_id firmy i co najmniej jednego zweryfikowanego endpointu webhooka, zobacz account/webhook-endpoints.
curl -X POST "https://handelsregister.ai/api/v1/account/monitors" \ -H "x-api-key: TWOJ_KLUCZ_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": "TWOJ_KLUCZ_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": "TWOJ_KLUCZ_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();
| Nazwa | Typ | Opis | Przykład |
|---|---|---|---|
| Idempotency-KeyHeader | stringwymagany | Unikalna wartość na operację, najlepiej UUID. Zobacz Idempotency-Key.Granice: od 1 do 128 znaków |
req-20260802-01 |
| entity_idBody | stringwymagany |
entity_id firmy z fetch-organization lub search-organizations.Granice: od 1 do 128 znaków |
94eb910fef13f94585c48c263fa446d4 |
| labelBody | stringopcjonalny | Nazwa monitora.Granice: najwyżej 200 znaków |
Hetzner Online GmbH |
| poll_interval_daysBody | integerwymagany | Częstotliwość sprawdzania w dniach.Granice: od 1 do 30 |
7 |
| endpoint_idsBody | lista stringwymagany |
ID twoich endpointów webhooków (wep_…). Każdy musi być aktywny i zweryfikowany.Granice: od 1 do 10 pozycji |
["wep_01m6b3j1g0cdz98hw8zdefbf52"] |
API odpowiada 202: monitor jest utworzony, a stan bazowy i aktywacja działają w tle. meta.billing.charged_credits pokazuje, że nic za to nie naliczono.
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}
Wyświetl i zmień monitory
GET /v1/account/monitors zwraca do 100 monitorów w monitors, z total. Zarchiwizowanych nie ma na liście.
GET /v1/account/monitors/{id} pokazuje też bieżący cykl w billing_cycle i ostatnie sprawdzenia w recent_runs.
curl -G "https://handelsregister.ai/api/v1/account/monitors/mon_01m65pn3vm11sjjp1j076cbvec" \ -H "x-api-key: TWOJ_KLUCZ_API"
import requests response = requests.get( "https://handelsregister.ai/api/v1/account/monitors/mon_01m65pn3vm11sjjp1j076cbvec", headers={"x-api-key": "TWOJ_KLUCZ_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": "TWOJ_KLUCZ_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}
| Pole | Znaczenie |
|---|---|
| id |
ID monitora, zaczyna się od mon_.
|
| entity_id | Obserwowana firma. |
| poll_interval_days | Częstotliwość sprawdzania w dniach. |
| status, status_reason |
Status, zobacz wyżej. status_reason podaje powód.
|
| baseline_completed_at, activated_at, last_succeeded_at | Czasy stanu bazowego, aktywacji i ostatniego udanego sprawdzenia. |
| next_poll_at | Następne zaplanowane sprawdzenie, tylko dla aktywnych monitorów. |
| billing_cycle | Bieżący cykl: początek, koniec, cena, wliczone sprawdzenia i dotychczas wykonane. |
| recent_runs |
Ostatnie sprawdzenia z wynikiem, naliczeniem i liczbą nowych sygnałów w events_new.
|
PATCH /v1/account/monitors/{id} zmienia częstotliwość sprawdzania. Następne sprawdzenie nastąpi wtedy w nowym odstępie, liczonym od zmiany.
Bieżący cykl zachowuje cenę i wliczone sprawdzenia. Nowa cena obowiązuje od następnego cyklu. Krótszy odstęp może wywołać dodatkowe sprawdzenia w bieżącym cyklu.
curl -X PATCH "https://handelsregister.ai/api/v1/account/monitors/mon_01m6b3m7945dn7cyvexzv41kjz" \ -H "x-api-key: TWOJ_KLUCZ_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": "TWOJ_KLUCZ_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": "TWOJ_KLUCZ_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}
Wstrzymaj, wznów, zarchiwizuj
POST …/{id}/pause zatrzymuje aktywny monitor. Opłacony cykl biegnie do końca, nic nie jest zwracane.
POST …/{id}/resume wznawia wstrzymany monitor lub monitor z błędem. Ponownie sprawdzamy endpointy webhooków, saldo i cenę.
W ramach bieżącego opłaconego cyklu wznowienie nic nie kosztuje. Jeśli cykl się skończył, teraz zaczyna się nowy cykl po aktualnej cenie. meta.request_credit_cost pokazuje kwotę.
Jeśli np. brakuje zweryfikowanego endpointu webhooka, API mimo to odpowiada 200, ale z meta.activated: false. Status monitora i status_reason podają powód.
Jeśli cena się zmieniła, aktywny monitor zatrzymuje się na końcu cyklu z pricing_consent_required. Przez resume akceptujesz nową cenę.
DELETE …/{id} archiwizuje monitor na stałe. To ostateczne i nic nie jest zwracane.
curl -X POST "https://handelsregister.ai/api/v1/account/monitors/mon_01m6b3m7945dn7cyvexzv41kjz/resume" \ -H "x-api-key: TWOJ_KLUCZ_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": "TWOJ_KLUCZ_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": "TWOJ_KLUCZ_API", "Idempotency-Key": crypto.randomUUID(), }, }); const data = await response.json();
paused_configuration. Po włączeniu endpointu wznów monitor przez resume.
Błędy
Błędy mają strukturę {"error": "…", "meta": {"message": "…"}}. W programie sprawdzaj wartość error. Tekst w meta.message jest po angielsku i może się zmieniać. Błędy nic nie kosztują.
| Status | Przyczyna | Co możesz zrobić |
|---|---|---|
| 400 |
api_key jest w URL. |
Wysyłaj klucz w nagłówku x-api-key. |
| 400 |
Idempotency-Key ma nieprawidłowy format. |
Popraw format, np. użyj UUID. |
| 401 | Brak klucza API lub tokenu albo są nieprawidłowe. |
Wysyłaj klucz w nagłówku x-api-key. |
| 403 |
Bearer tokenowi brakuje uprawnienia account:read. |
Użyj klucza API lub tokenu z account:read. |
| 403 | Adres e-mail twojego konta nie jest jeszcze potwierdzony albo konto jest zablokowane. | Otwórz link z e-maila potwierdzającego. Jeśli konto jest zablokowane, pomoże support. |
| 403 |
Bearer tokenowi brakuje uprawnienia monitoring:manage. |
Użyj klucza API lub tokenu admina. |
| 404 | Brak monitora o tym ID na twoim koncie. | Sprawdź ID. |
| 409 |
Monitor dla tej firmy już istnieje (duplicate_monitor). |
Użyj istniejącego monitora albo najpierw go zarchiwizuj. |
| 409 |
Idempotency-Key był już użyty z innymi danymi, jest starszy niż 24 godziny lub jest jeszcze przetwarzany. |
Użyj nowego klucza lub odczekaj chwilę. |
| 422 |
Wartość jest nieprawidłowa: invalid_subject, invalid_interval, endpoint_required, monitor_limit lub not_resumable. |
Popraw wartość. |
| 428 |
Brakuje nagłówka Idempotency-Key. |
Wyślij nagłówek. |
| 429 | Za dużo zapytań. |
Spróbuj ponownie po Retry-After. |
| 429 |
creation_rate_limited: za dużo nowych monitorów w ciągu 24 godzin. |
Spróbuj ponownie po Retry-After. |
| 503 | Monitoring jest chwilowo niedostępny. | Spróbuj ponownie nieco później. |
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}