/v1/account/webhook-endpoints

account/webhook-endpoints

Webhooks: πού στέλνει το Monitoring τα νέα Signals και πώς τα επαληθεύεις.

Κόστος και όρια

Κόστος και όρια
Τι Πιστώσεις
Διαχείριση endpoints webhook και παραδόσεων δωρεάν

Όριο: 30 αιτήματα ανά λεπτό. Δημιουργία, ενημέρωση και διαγραφή: 10 ανά λεπτό. Έλεγχος, δοκιμή και νέο secret: 6 ανά λεπτό.

Admin token ή κλειδί API

Endpoints

Μέθοδος
Μέθοδος Διαδρομή Σκοπός Πρόσβαση
GET /v1/account/webhook-endpoints Όλα τα endpoints webhook, χωρίς τα αρχειοθετημένα. Κλειδί API ή admin token
POST /v1/account/webhook-endpoints Δημιουργία endpoint webhook. Admin token
POST /v1/account/webhook-endpoints/{id}/verify Επαλήθευση. Κλειδί API ή admin token
POST /v1/account/webhook-endpoints/{id}/test Αποστολή δοκιμαστικού μηνύματος. Κλειδί API ή admin token
POST /v1/account/webhook-endpoints/{id}/rotate-secret Νέο secret υπογραφής. Admin token
POST /v1/account/webhook-endpoints/{id}/enable Ενεργοποίηση. Admin token
POST /v1/account/webhook-endpoints/{id}/disable Απενεργοποίηση. Admin token
DELETE /v1/account/webhook-endpoints/{id} Αρχειοθέτηση. Admin token
GET /v1/account/webhook-deliveries Οι τελευταίες 50 παραδόσεις. Κλειδί API ή admin token
POST /v1/account/webhook-deliveries/{id}/retry Εκ νέου αποστολή μιας αποτυχημένης παράδοσης. Κλειδί API ή admin token
GET /v1/account/webhook-events Τα τελευταία 50 γεγονότα. Κλειδί API ή admin token

Δημιουργία endpoint webhook

curl -X POST "https://handelsregister.ai/api/v1/account/webhook-endpoints" \
  -H "Authorization: Bearer YOUR_ADMIN_TOKEN" \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "CRM-Sync",
    "url": "https://hooks.example.com/handelsregister",
    "headers": {
        "X-Receiver-Token": "YOUR_RECEIVER_TOKEN"
    }
}'
Παράμετροι
Όνομα Τύπος Περιγραφή Παράδειγμα
Idempotency-KeyHeader stringυποχρεωτικό Μια μοναδική τιμή ανά λειτουργία, ιδανικά ένα UUID. Βλ. Idempotency-Key.Όρια: 1 έως 128 χαρακτήρες req-20260802-01
nameBody stringυποχρεωτικό Ένα όνομα για δική σου αναφορά.Όρια: 1 έως 120 χαρακτήρες CRM-Sync
urlBody string (uri)υποχρεωτικό Η διεύθυνση του διακομιστή σου: δημόσια προσβάσιμη, https στη θύρα 443, με όνομα host αντί για διεύθυνση IP.Όρια: 1 έως 2.048 χαρακτήρες https://hooks.example.com/handelsregister
headersBody objectπροαιρετικό Προσαρμοσμένα headers που στέλνονται με κάθε μήνυμα, όπως ένα token για τον διακομιστή σου.Όρια: το πολύ 10 καταχωρίσεις {"X-Receiver-Token":"YOUR_RECEIVER_TOKEN"}
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 · Παράδειγμα απάντησης: ένα νέο endpoint webhook, με το secret συντομευμένο εδώ

Επαλήθευση

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}
Το μήνυμα που λαμβάνει ο διακομιστής σου κατά την επαλήθευση
curl -X POST "https://handelsregister.ai/api/v1/account/webhook-endpoints/wep_01m6b3j1g0cdz98hw8zdefbf52/verify" \
  -H "x-api-key: YOUR_API_KEY" \
  -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 · Παράδειγμα απάντησης σε μια επιτυχή επαλήθευση
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 · Παράδειγμα απάντησης σε ένα δοκιμαστικό μήνυμα

Επαλήθευση της υπογραφής

Header
Header Σημασία
webhook-id ID του μηνύματος (msg_…). Μένει ίδιο στις επαναλήψεις. Χρησιμοποίησέ το για να εντοπίζεις διπλότυπα.
webhook-timestamp Χρονική στιγμή αυτής της προσπάθειας παράδοσης σε δευτερόλεπτα Unix.
webhook-signature Μία ή περισσότερες υπογραφές της μορφής v1,<Base64>, χωρισμένες με κενά.
import base64, hashlib, hmac, time

def verify_webhook(secret: str, headers: dict, body: bytes) -> bool:
    msg_id = headers["webhook-id"]
    timestamp = headers["webhook-timestamp"]
    # Απόρριψε μηνύματα παλαιότερα από πέντε λεπτά
    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()
    # Κατά την εναλλαγή secret, το header περιέχει δύο υπογραφές
    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

Πεδίο
Πεδίο Σημασία
id ID του μηνύματος, ίσο με το header webhook-id.
event_id ID του γεγονότος (evt_…).
type Τύπος του γεγονότος, βλ. παρακάτω.
timestamp Πότε εντοπίσαμε το γεγονός, σε UTC.
schema_version Έκδοση της δομής, προς το παρόν 1.
data Τα δεδομένα του γεγονότος.
Τύποι γεγονότων
Τύπος γεγονότος Σημασία
organization.signal.detected Ένα monitor βρήκε νέο signal. Το data.signal έχει την ίδια δομή με ένα signal στο signals, καθώς και data.monitor και, στο data.links.signal, τον σύνδεσμο προς το signal στο API.
organization.signal.sample Ένα παράδειγμα από το πραγματικό ιστορικό της εταιρείας, που στάλθηκε από το Λογαριασμός › Monitoring. Ίδια δομή όπως παραπάνω, καθώς και data.sample: true.
endpoint.test Δοκιμαστικό μήνυμα μέσω /test.
endpoint.verification Challenge κατά την επαλήθευση.
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}
Παράδειγμα μηνύματος για τη Hetzner Online GmbH, Ansbach HRB 6089: η συγχώνευση της Headtrip GmbH, Nürnberg HRB 33432, σταλμένη ως παράδειγμα από το ιστορικό

Παραδόσεις και επαναλήψεις

Παραδίδουμε κάθε μήνυμα τουλάχιστον μία φορά, αλλά όχι με σταθερή σειρά. Εντόπιζε τα διπλότυπα με βάση το webhook-id. Απάντησε γρήγορα και επεξεργάσου το μήνυμα μόνο μετά.
Κατάσταση μιας παράδοσης
Κατάσταση Σημασία
withheld Περιμένει μέχρι να χρεωθεί ο έλεγχος.
pending Περιμένει να σταλεί.
in_flight Στέλνεται αυτή τη στιγμή.
retry_wait Περιμένει την επόμενη προσπάθεια.
succeeded Παραδόθηκε.
exhausted Όλες οι προσπάθειες απέτυχαν.
blocked_endpoint Το endpoint webhook δεν μπορεί να λάβει τίποτα αυτή τη στιγμή.
cancelled Ακυρώθηκε, για παράδειγμα επειδή το μήνυμα έληξε.

Ενεργοποίηση, απενεργοποίηση, αρχειοθέτηση

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

Σφάλματα

Σφάλματα
Status Αιτία Τι μπορείς να κάνεις
400 Το api_key βρίσκεται στο URL. Στείλε το κλειδί στο header x-api-key.
400 Το URL δεν επιτρέπεται ως προορισμός, ένα header δεν επιτρέπεται, έχει συμπληρωθεί ο μέγιστος αριθμός ή το endpoint webhook δεν είναι ενεργό. Το meta.message δίνει την αιτία. Διόρθωσε την τιμή ή κάνε πρώτα επαλήθευση.
400 Το Idempotency-Key έχει μη έγκυρη μορφή. Διόρθωσε τη μορφή, για παράδειγμα χρησιμοποίησε ένα UUID.
401 Κανένα κλειδί API ή token ή μη έγκυρο. Στείλε το κλειδί στο header x-api-key.
403 Στο bearer token λείπει το δικαίωμα account:read. Χρησιμοποίησε το κλειδί API ή ένα token με account:read.
403 Η διεύθυνση email του λογαριασμού σου δεν έχει επιβεβαιωθεί ακόμη ή ο λογαριασμός είναι κλειδωμένος. Άνοιξε τον σύνδεσμο από το email επιβεβαίωσης. Αν ο λογαριασμός είναι κλειδωμένος, η υποστήριξη μπορεί να βοηθήσει.
403 Αυτή η κλήση χρειάζεται το admin token. Ένα κλειδί API δεν αρκεί, ούτε άλλο token. Στείλε το με Authorization: Bearer και το admin token.
403 Στο bearer token λείπει το δικαίωμα monitoring:manage. Χρησιμοποίησε το κλειδί API ή το admin token.
404 Κανένα endpoint webhook ή παράδοση με αυτό το ID. Έλεγξε το ID.
409 Το Idempotency-Key έχει ήδη χρησιμοποιηθεί με διαφορετικά δεδομένα, είναι παλαιότερο από 24 ώρες ή βρίσκεται ακόμη υπό επεξεργασία. Χρησιμοποίησε νέο κλειδί ή περίμενε λίγο.
422 Μια τιμή λείπει ή δεν είναι έγκυρη, όπως name ή url. Το errors κατονομάζει το πεδίο. Διόρθωσε την τιμή και δοκίμασε ξανά με νέο κλειδί.
422 Η επαλήθευση απέτυχε. Έλεγξε το header challenge και το status 2xx, και δοκίμασε ξανά με νέο κλειδί.
428 Λείπει το header Idempotency-Key. Στείλε το header.
429 Πάρα πολλά αιτήματα. Δοκίμασε ξανά μετά το Retry-After.
503 Η επαλήθευση, η δοκιμή και η εκ νέου αποστολή δεν είναι προσωρινά διαθέσιμες. Δοκίμασε ξανά λίγο αργότερα.
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 · Ένα endpoint webhook που δεν έχει επαληθευτεί ακόμη δεν μπορεί να λάβει δοκιμαστικό μήνυμα