/v1/account/webhook-endpoints

account/webhook-endpoints

Webhookit: minne Monitoring lähettää uudet Signals-tapahtumat ja miten tarkistat ne.

Kustannukset ja rajat

Kustannukset ja rajat
Mitä Krediitit
Webhook-päätepisteiden ja toimitusten hallinta maksuton

Raja: 30 pyyntöä minuutissa. Luonti, muutos ja poisto: 10 minuutissa. Tarkistus, testi ja uusi secret: 6 minuutissa.

Admin-token tai API-avain

Päätepisteet

Metodi
Metodi Polku Tarkoitus Pääsy
GET /v1/account/webhook-endpoints Kaikki webhook-päätepisteet ilman arkistoituja. API-avain tai admin-token
POST /v1/account/webhook-endpoints Luo webhook-päätepiste. Admin-token
POST /v1/account/webhook-endpoints/{id}/verify Vahvista. API-avain tai admin-token
POST /v1/account/webhook-endpoints/{id}/test Lähetä testiviesti. API-avain tai admin-token
POST /v1/account/webhook-endpoints/{id}/rotate-secret Uusi allekirjoitussecret. Admin-token
POST /v1/account/webhook-endpoints/{id}/enable Ota käyttöön. Admin-token
POST /v1/account/webhook-endpoints/{id}/disable Poista käytöstä. Admin-token
DELETE /v1/account/webhook-endpoints/{id} Arkistoi. Admin-token
GET /v1/account/webhook-deliveries Viimeiset 50 toimitusta. API-avain tai admin-token
POST /v1/account/webhook-deliveries/{id}/retry Lähetä epäonnistunut toimitus uudelleen. API-avain tai admin-token
GET /v1/account/webhook-events Viimeiset 50 tapahtumaa. API-avain tai admin-token

Luo webhook-päätepiste

curl -X POST "https://handelsregister.ai/api/v1/account/webhook-endpoints" \
  -H "Authorization: Bearer SINUN_ADMIN_TOKENISI" \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "CRM-Sync",
    "url": "https://hooks.example.com/handelsregister",
    "headers": {
        "X-Receiver-Token": "SINUN_VASTAANOTTAJA_TOKENISI"
    }
}'
Parametrit
Nimi Tyyppi Kuvaus Esimerkki
Idempotency-KeyHeader merkkijonopakollinen Yksilöllinen arvo toimintoa kohden, mieluiten UUID. Katso Idempotency-Key.Rajat: 1–128 merkkiä req-20260802-01
nameBody merkkijonopakollinen Nimi omaa käyttöäsi varten.Rajat: 1–120 merkkiä CRM-Sync
urlBody merkkijono (uri)pakollinen Palvelimesi osoite: julkisesti tavoitettava, https portissa 443, isäntänimellä IP-osoitteen sijaan.Rajat: 1–2 048 merkkiä https://hooks.example.com/handelsregister
headersBody objektivalinnainen Mukautetut headerit, jotka lähetetään jokaisen viestin mukana, kuten token palvelimellesi.Rajat: enintään 10 kohdetta {"X-Receiver-Token":"SINUN_VASTAANOTTAJA_TOKENISI"}
1{2  "endpoint": {3    "id": "wep_01m6b3j1g0cdz98hw8zdefbf52",4    "name": "CRM-Sync",5    "url": "hooks.example.com/…",6    "status": "pending_verification",7    "verified_at": null,8    "header_names": [9      "X-Receiver-Token"10    ],11    "consecutive_failures": 0,12    "created_at": "2026-11-01T08:28:01+00:00"13  },14  "signing_secret": "whsec_…",15  "meta": {16    "message": "Endpoint created. Store the signing secret now — it is shown only once.",17    "request_credit_cost": 0,18    "credits_remaining": 14519  }20}
201 · Esimerkkivastaus: uusi webhook-päätepiste, secret tässä lyhennettynä

Vahvista

1{2  "id": "msg_01m6b3jsqq7ntwzkdj099ayraz",3  "type": "endpoint.verification",4  "timestamp": "2026-11-01T08:28:26.743Z",5  "schema_version": 1,6  "data": {7    "challenge": "189fb34b2af819bb13cb47d9806dbf30"8  }9}
Viesti, jonka palvelimesi vastaanottaa vahvistuksessa
curl -X POST "https://handelsregister.ai/api/v1/account/webhook-endpoints/wep_01m6b3j1g0cdz98hw8zdefbf52/verify" \
  -H "x-api-key: SINUN_API_AVAIMESI" \
  -H "Idempotency-Key: $(uuidgen)"
1{2  "verified": true,3  "endpoint": {4    "id": "wep_01m6b3j1g0cdz98hw8zdefbf52",5    "name": "CRM-Sync",6    "url": "hooks.example.com/…",7    "status": "active",8    "verified_at": "2026-11-01T08:28:26+00:00",9    "header_names": [10      "X-Receiver-Token"11    ],12    "consecutive_failures": 0,13    "created_at": "2026-11-01T08:28:01+00:00"14  },15  "meta": {16    "request_credit_cost": 0,17    "credits_remaining": 14518  }19}
200 · Esimerkkivastaus onnistuneeseen vahvistukseen
1{2  "delivery": {3    "id": "del_01m6b3jsyrnc3sz1mt31dq6107",4    "message_id": "msg_01m6b3jsynxzhvagm7n2nq7mpv",5    "event_id": "evt_01m6b3jsynxzhvagm7n2nq7mpt",6    "event_type": "endpoint.test",7    "endpoint_id": "wep_01m6b3j1g0cdz98hw8zdefbf52",8    "status": "succeeded",9    "attempts": 1,10    "last_status_code": 200,11    "last_error_category": null,12    "next_attempt_at": "2026-11-01T08:28:26+00:00",13    "succeeded_at": "2026-11-01T08:28:26+00:00",14    "created_at": "2026-11-01T08:28:26+00:00"15  },16  "meta": {17    "request_credit_cost": 0,18    "credits_remaining": 14519  }20}
200 · Esimerkkivastaus testiviestiin

Tarkista allekirjoitus

Header
Header Merkitys
webhook-id Viestin tunniste (msg_…). Se pysyy samana uudelleenyrityksissä. Tunnista sillä kaksoiskappaleet.
webhook-timestamp Tämän toimitusyrityksen ajankohta Unix-sekunteina.
webhook-signature Yksi tai useampi allekirjoitus muodossa v1,<Base64>, välilyönnein erotettuina.
import base64, hashlib, hmac, time

def verify_webhook(secret: str, headers: dict, body: bytes) -> bool:
    msg_id = headers["webhook-id"]
    timestamp = headers["webhook-timestamp"]
    # Hylkää yli viisi minuuttia vanhat viestit
    if abs(time.time() - int(timestamp)) > 300:
        return False
    key = base64.b64decode(secret.removeprefix("whsec_"))
    signed = f"{msg_id}.{timestamp}.".encode() + body
    expected = base64.b64encode(hmac.new(key, signed, hashlib.sha256).digest()).decode()
    # Secretin vaihdon aikana headerissa on kaksi allekirjoitusta
    for part in headers["webhook-signature"].split(" "):
        version, _, signature = part.partition(",")
        if version == "v1" and hmac.compare_digest(signature, expected):
            return True
    return False

Payload

Kenttä
Kenttä Merkitys
id Viestin tunniste, sama kuin header webhook-id.
event_id Tapahtuman tunniste (evt_…).
type Tapahtuman tyyppi, katso alla.
timestamp Milloin havaitsimme tapahtuman, UTC-ajassa.
schema_version Rakenteen versio, tällä hetkellä 1.
data Tapahtuman data.
Tapahtumatyypit
Tapahtumatyyppi Merkitys
organization.signal.detected Monitori on löytänyt uuden signaalin. data.signal on rakenteeltaan sama kuin signaali päätepisteessä signals, lisäksi data.monitor ja kentässä data.links.signal linkki signaaliin API:ssa.
organization.signal.sample Esimerkki yrityksen todellisesta historiasta, lähetetty kohdasta Tili › Monitorointi. Sama rakenne kuin yllä, lisäksi data.sample: true.
endpoint.test Testiviesti polun /test kautta.
endpoint.verification Haaste vahvistuksessa.
1{2  "id": "msg_01m65pqg9x0176cteqvtxw68sa",3  "event_id": "evt_01m65pqg9sx7mwmw0edc1mfbbe",4  "type": "organization.signal.sample",5  "timestamp": "2026-10-30T06:07:37.000Z",6  "schema_version": 1,7  "data": {8    "monitor": {9      "id": "mon_01m65pn3vm11sjjp1j076cbvec",10      "type": "organization.signals"11    },12    "sample": true,13    "signal": {14      "event": {15        "id": "36c7c8fddf99bb0299d6815bcaa01013",16        "topic": "TRANSFORMATIONS",17        "topic_name": {18          "de": "Umwandlungen & M&A",19          "en": "Transformations & M&A"20        },21        "occurred_on": "2022-12-22",22        "announced_on": "2023-08-10",23        "date_basis": "SOURCE_EVENT"24      },25      "organization": {26        "type": "ORGANIZATION",27        "entity_id": "94eb910fef13f94585c48c263fa446d4",28        "current_profile": {29          "name": "Hetzner Online GmbH",30          "registration": {31            "register_type": "HRB",32            "register_number": "6089",33            "court": "Ansbach",34            "register_locality": "Ansbach",35            "registration_authority_id": "D3201",36            "register_entity_name": "Ansbach HRB 6089"37          },38          "legal_form": {39            "name": {40              "de": "Gesellschaft mit beschränkter Haftung"41            },42            "short": {43              "de": "GmbH"44            }45          },46          "seat": {47            "city": "Gunzenhausen"48          },49          "status": {50            "code": "ACTIVE"51          }52        }53      },54      "parties": {55        "counterparty": {56          "entity": {57            "type": "ORGANIZATION",58            "entity_id": "dd4d2d6854b2dbd1ffce74e669f3852e",59            "current_profile": {60              "name": "Headtrip GmbH",61              "registration": {62                "register_type": "HRB",63                "register_number": "33432",64                "court": "Nürnberg",65                "register_locality": "Nuremberg",66                "registration_authority_id": "D3310",67                "register_entity_name": "Nürnberg HRB 33432"68              },69              "legal_form": {70                "name": {71                  "de": "Gesellschaft mit beschränkter Haftung"72                },73                "short": {74                  "de": "GmbH"75                }76              },77              "seat": {78                "city": "Nürnberg"79              },80              "status": {81                "code": "INACTIVE"82              }83            }84          },85          "relationship": "TRANSFERRING_COMPANY"86        }87      },88      "register_entry": {89        "entry_number": "3",90        "entry_date": "2023-08-10",91        "description_text": "Verschmelzung zur Aufnahme der Headtrip GmbH",92        "context": "PRIMARY",93        "flags": []94      },95      "source": {96        "kind": "COMMERCIAL_REGISTER"97      },98      "details": {99        "schema": "TRANSFORMATION",100        "kind": "MERGER",101        "specifics": {102          "merger_target": "ABSORPTION"103        },104        "direction": "INCOMING",105        "is_cross_border": false,106        "resolution_date": "2022-12-22",107        "agreement_date": "2022-12-22"108      }109    },110    "links": {111      "signal": "https://handelsregister.ai/api/v1/signals/36c7c8fddf99bb0299d6815bcaa01013"112    }113  }114}
Esimerkkiviesti yritykselle Hetzner Online GmbH, Ansbach HRB 6089: Headtrip GmbH:n, Nürnberg HRB 33432, sulautuminen, lähetetty esimerkkinä historiasta

Toimitukset ja uudelleenyritykset

Toimitamme jokaisen viestin vähintään kerran, mutta emme kiinteässä järjestyksessä. Tunnista kaksoiskappaleet kentän webhook-id perusteella. Vastaa nopeasti ja käsittele viesti vasta sen jälkeen.
Toimituksen tila
Tila Merkitys
withheld Odottaa, kunnes tarkistus on veloitettu.
pending Odottaa lähetystä.
in_flight Lähetetään parhaillaan.
retry_wait Odottaa seuraavaa yritystä.
succeeded Toimitettu.
exhausted Kaikki yritykset epäonnistuivat.
blocked_endpoint Webhook-päätepiste ei voi juuri nyt vastaanottaa mitään.
cancelled Peruttu, esimerkiksi koska viesti vanheni.

Ota käyttöön, poista käytöstä, arkistoi

curl -X POST "https://handelsregister.ai/api/v1/account/webhook-endpoints/wep_01m6b3j1g0cdz98hw8zdefbf52/disable" \
  -H "Authorization: Bearer SINUN_ADMIN_TOKENISI" \
  -H "Idempotency-Key: $(uuidgen)"

Virheet

Virheet
Tila Syy Mitä voit tehdä
400 api_key on URL-osoitteessa. Lähetä avain headerissa x-api-key.
400 URL ei ole sallittu kohde, header ei ole sallittu, enimmäismäärä on saavutettu tai webhook-päätepiste ei ole aktiivinen. meta.message kertoo syyn. Korjaa arvo tai vahvista ensin.
400 Idempotency-Key:n muoto on virheellinen. Korjaa muoto, esimerkiksi käytä UUID:tä.
401 API-avain tai token puuttuu tai on virheellinen. Lähetä avain headerissa x-api-key.
403 Bearer-tokenilta puuttuu oikeus account:read. Käytä API-avainta tai tokenia, jolla on account:read.
403 Tilisi sähköpostiosoitetta ei ole vielä vahvistettu, tai tili on lukittu. Avaa vahvistussähköpostin linkki. Jos tili on lukittu, tuki voi auttaa.
403 Tämä kutsu tarvitsee admin-tokenin. API-avain ei riitä, eikä myöskään muu token. Lähetä se muodossa Authorization: Bearer admin-tokenin kanssa.
403 Bearer-tokenilta puuttuu oikeus monitoring:manage. Käytä API-avainta tai admin-tokenia.
404 Tällä tunnisteella ei ole webhook-päätepistettä tai toimitusta. Tarkista tunniste.
409 Idempotency-Key on jo käytetty eri datalla, on yli 24 tuntia vanha tai on yhä käsittelyssä. Käytä uutta avainta tai odota hetki.
422 Arvo puuttuu tai on virheellinen, kuten name tai url. errors nimeää kentän. Korjaa arvo ja yritä uudelleen uudella avaimella.
422 Vahvistus epäonnistui. Tarkista haasteheader ja 2xx-tila ja yritä sitten uudelleen uudella avaimella.
428 Header Idempotency-Key puuttuu. Lähetä header.
429 Liian monta pyyntöä. Yritä uudelleen ajan Retry-After jälkeen.
503 Vahvistus, testaus ja uudelleenlähetys eivät ole tilapäisesti käytettävissä. Yritä hieman myöhemmin uudelleen.
1{2  "error": "invalid_request",3  "meta": {4    "message": "The endpoint is not active.",5    "request_credit_cost": 0,6    "credits_remaining": 1457  }8}
400 · Webhook-päätepiste, jota ei ole vielä vahvistettu, ei voi vastaanottaa testiviestiä