/v1/account/webhook-endpoints
account/webhook-endpoints
Webhooks: πού στέλνει το Monitoring τα νέα Signals και πώς τα επαληθεύεις.
Ένα endpoint webhook είναι η διεύθυνση HTTPS του διακομιστή σου στην οποία στέλνουμε τα νέα signals των monitors σου. Κάθε μήνυμα είναι υπογεγραμμένο, ώστε να μπορείς να ελέγξεις ότι προέρχεται από εμάς.
Κόστος και όρια
| Τι | Πιστώσεις |
|---|---|
| Διαχείριση endpoints webhook και παραδόσεων | δωρεάν |
Όριο: 30 αιτήματα ανά λεπτό. Δημιουργία, ενημέρωση και διαγραφή: 10 ανά λεπτό. Έλεγχος, δοκιμή και νέο secret: 6 ανά λεπτό.
Κάθε λογαριασμός μπορεί να έχει έως 10 endpoints webhook· τα αρχειοθετημένα δεν μετρούν. Κάθε endpoint webhook μπορεί να φέρει έως 10 προσαρμοσμένα headers.
Admin token ή κλειδί API
Χρειάζεσαι το admin token για να δημιουργήσεις secret υπογραφής και για να ενεργοποιήσεις, να απενεργοποιήσεις ή να αρχειοθετήσεις endpoints webhook. Το δημιουργείς στο Λογαριασμός › Κλειδιά API στην ενότητα «Για προγραμματιστές: διαχείριση κλειδιών μέσω του API». Ισχύει ένα έτος, και ένα νέο αντικαθιστά το παλιό.
Στείλε το admin token ως Authorization: Bearer YOUR_ADMIN_TOKEN. Όλες οι άλλες κλήσεις λειτουργούν και με το κλειδί API.
Όπως στο account/monitors, όλες οι κλήσεις εγγραφής χρειάζονται το header Idempotency-Key.
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" } }'
import uuid import requests response = requests.post( "https://handelsregister.ai/api/v1/account/webhook-endpoints", headers={ "Authorization": "Bearer YOUR_ADMIN_TOKEN", "Idempotency-Key": str(uuid.uuid4()), }, json={ "name": "CRM-Sync", "url": "https://hooks.example.com/handelsregister", "headers": { "X-Receiver-Token": "YOUR_RECEIVER_TOKEN" } }, ) data = response.json()
const response = await fetch("https://handelsregister.ai/api/v1/account/webhook-endpoints", { method: "POST", headers: { "Authorization": "Bearer YOUR_ADMIN_TOKEN", "Idempotency-Key": crypto.randomUUID(), "Content-Type": "application/json", }, body: JSON.stringify({ "name": "CRM-Sync", "url": "https://hooks.example.com/handelsregister", "headers": { "X-Receiver-Token": "YOUR_RECEIVER_TOKEN" } }), }); const data = await response.json();
| Όνομα | Τύπος | Περιγραφή | Παράδειγμα |
|---|---|---|---|
| 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"} |
Τα ονόματα των headers δεν επιτρέπεται να ξεκινούν με webhook- ούτε να υπερισχύουν τυπικών headers όπως Content-Type ή Host. Οι τιμές είναι μόνο για εγγραφή· αργότερα το API δείχνει μόνο τα ονόματα.
Η απάντηση περιέχει το secret υπογραφής whsec_…. Το δείχνουμε μόνο αυτή τη μία φορά. Αποθήκευσέ το αμέσως.
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}
Ένα νέο endpoint webhook έχει την κατάσταση pending_verification και λαμβάνει μηνύματα μόνο αφού επαληθευτεί. Το όνομα, το URL και τα headers δεν μπορούν να αλλάξουν αργότερα. Για νέα διεύθυνση, δημιούργησε νέο endpoint webhook.
Στις απαντήσεις, το url δείχνει μόνο τον host· συντομεύουμε τη διαδρομή σε /….
Επαλήθευση
Με το POST …/{id}/verify στέλνουμε ένα υπογεγραμμένο μήνυμα τύπου endpoint.verification στο URL σου. Το data.challenge περιέχει μια τυχαία τιμή.
Ο διακομιστής σου απαντά μέσα σε 15 δευτερόλεπτα με status 2xx και επιστρέφει την τιμή στο header απάντησης webhook-verification. Το endpoint webhook γίνεται τότε active.
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)"
import uuid import requests response = requests.post( "https://handelsregister.ai/api/v1/account/webhook-endpoints/wep_01m6b3j1g0cdz98hw8zdefbf52/verify", headers={ "x-api-key": "YOUR_API_KEY", "Idempotency-Key": str(uuid.uuid4()), }, ) data = response.json()
const response = await fetch("https://handelsregister.ai/api/v1/account/webhook-endpoints/wep_01m6b3j1g0cdz98hw8zdefbf52/verify", { method: "POST", headers: { "x-api-key": "YOUR_API_KEY", "Idempotency-Key": crypto.randomUUID(), }, }); const data = await response.json();
Αν πετύχει, το API απαντά με "verified": true, διαφορετικά με 422 και "verified": false. Για μια νέα προσπάθεια χρειάζεσαι νέο Idempotency-Key.
Κάθε endpoint webhook επιτρέπει 6 προσπάθειες ανά ώρα.
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}
Στη συνέχεια, το POST …/{id}/test στέλνει ένα υπογεγραμμένο δοκιμαστικό μήνυμα τύπου endpoint.test όποτε θέλεις. Η απάντηση δείχνει το αποτέλεσμα της παράδοσης.
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}
Επαλήθευση της υπογραφής
Κάθε μήνυμα είναι υπογεγραμμένο σύμφωνα με το ανοιχτό πρότυπο Standard Webhooks. Επαλήθευσε την υπογραφή πριν επεξεργαστείς ένα μήνυμα.
| Header | Σημασία |
|---|---|
| webhook-id |
ID του μηνύματος (msg_…). Μένει ίδιο στις επαναλήψεις. Χρησιμοποίησέ το για να εντοπίζεις διπλότυπα.
|
| webhook-timestamp | Χρονική στιγμή αυτής της προσπάθειας παράδοσης σε δευτερόλεπτα Unix. |
| webhook-signature |
Μία ή περισσότερες υπογραφές της μορφής v1,<Base64>, χωρισμένες με κενά.
|
Πώς επαληθεύεις ένα μήνυμα:
- Πάρε το μέρος του secret μετά το
whsec_και αποκωδικοποίησέ το από Base64. Αυτό είναι το κλειδί. - Σχημάτισε το κείμενο
webhook-id.webhook-timestamp.Bodyαπό τα δύο headers και το αμετάβλητο σώμα. - Υπολόγισε το HMAC-SHA256 του με το κλειδί και κωδικοποίησε το αποτέλεσμα σε Base64.
- Σύγκρινε το αποτέλεσμα σε σταθερό χρόνο με κάθε υπογραφή
v1στο header. Αν ταιριάζει μία, το μήνυμα είναι γνήσιο.
Χρησιμοποίησε το σώμα ακριβώς όπως φτάνει, όχι JSON που σειριοποιήθηκε ξανά. Απόρριψε μηνύματα των οποίων η χρονοσφραγίδα αποκλίνει περισσότερο από πέντε λεπτά.
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
import crypto from "node:crypto"; export function verifyWebhook(secret, headers, rawBody) { const msgId = headers["webhook-id"]; const timestamp = headers["webhook-timestamp"]; // Απόρριψε μηνύματα παλαιότερα από πέντε λεπτά if (Math.abs(Date.now() / 1000 - Number(timestamp)) > 300) return false; const key = Buffer.from(secret.replace(/^whsec_/, ""), "base64"); const expected = crypto .createHmac("sha256", key) .update(`${msgId}.${timestamp}.${rawBody}`) .digest(); // Κατά την εναλλαγή secret, το header περιέχει δύο υπογραφές return headers["webhook-signature"].split(" ").some((part) => { const [version, signature] = part.split(","); const given = Buffer.from(signature ?? "", "base64"); return version === "v1" && given.length === expected.length && crypto.timingSafeEqual(given, expected); }); }
Αντί να γράψεις δικό σου κώδικα, μπορείς να χρησιμοποιήσεις τις επίσημες βιβλιοθήκες Standard Webhooks, όπως το πακέτο standardwebhooks για Python και JavaScript.
Με το POST …/{id}/rotate-secret λαμβάνεις νέο secret, μία φορά, στην απάντηση. Για 7 ημέρες τα μηνύματα φέρουν δύο υπογραφές, μία με το νέο και μία με το παλιό secret. Έτσι κάνεις τη μετάβαση χωρίς διακοπή.
Payload
Κάθε μήνυμα είναι ένα αντικείμενο JSON με τον ίδιο φάκελο. Ό,τι αποτελεί το γεγονός βρίσκεται στο data.
| Πεδίο | Σημασία |
|---|---|
| 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}
Ένα μήνυμα είναι το πολύ 20 KB. Αν ένα signal γίνει μεγαλύτερο, τα details και register_entry παραλείπονται και το data.truncated είναι true. Ανακτάς τότε ολόκληρο το signal μέσω του συνδέσμου.
Αγνόησε τύπους γεγονότων που δεν γνωρίζεις και απάντησε παρ’ όλα αυτά με 2xx. Έτσι ο διακομιστής σου παραμένει σταθερός όταν προστίθενται νέοι τύποι.
Παραδόσεις και επαναλήψεις
Μια παράδοση θεωρείται επιτυχής όταν ο διακομιστής σου απαντά μέσα σε 15 δευτερόλεπτα με status 2xx. Δεν ακολουθούμε ανακατευθύνσεις.
Διαφορετικά προσπαθούμε ξανά: έως 10 προσπάθειες, με αυξανόμενα διαστήματα σε περίπου τρεις ημέρες. Αν ο διακομιστής σου στείλει Retry-After, το τηρούμε.
Αν ο διακομιστής σου απαντήσει με 410, σταματάμε τις παραδόσεις και απενεργοποιούμε το endpoint webhook.
Αν 5 διαδοχικές παραδόσεις αποτύχουν οριστικά, το endpoint webhook απενεργοποιείται με disabled_failures. Με το POST …/{id}/enable το ενεργοποιείς ξανά.
webhook-id. Απάντησε γρήγορα και επεξεργάσου το μήνυμα μόνο μετά.
Το GET /v1/account/webhook-deliveries δείχνει τις τελευταίες 50 παραδόσεις, με ?endpoint=wep_… για ένα endpoint webhook. Το GET /v1/account/webhook-events δείχνει τα τελευταία 50 γεγονότα.
Μια παράδοση που απέτυχε οριστικά τη στέλνεις ξανά με POST /v1/account/webhook-deliveries/{id}/retry, με το ίδιο webhook-id και το ίδιο σώμα. Αυτό λειτουργεί για 30 ημέρες· τόσο διατηρούμε τα μηνύματα.
| Κατάσταση | Σημασία |
|---|---|
| withheld | Περιμένει μέχρι να χρεωθεί ο έλεγχος. |
| pending | Περιμένει να σταλεί. |
| in_flight | Στέλνεται αυτή τη στιγμή. |
| retry_wait | Περιμένει την επόμενη προσπάθεια. |
| succeeded | Παραδόθηκε. |
| exhausted | Όλες οι προσπάθειες απέτυχαν. |
| blocked_endpoint | Το endpoint webhook δεν μπορεί να λάβει τίποτα αυτή τη στιγμή. |
| cancelled | Ακυρώθηκε, για παράδειγμα επειδή το μήνυμα έληξε. |
Ενεργοποίηση, απενεργοποίηση, αρχειοθέτηση
Το POST …/{id}/disable σταματά προσωρινά τις παραδόσεις. Τα monitors χωρίς άλλο endpoint webhook μπαίνουν τότε σε παύση με paused_configuration.
Το POST …/{id}/enable ενεργοποιεί ξανά ένα επαληθευμένο endpoint webhook. Στη συνέχεια συνέχισε τα monitors σε παύση με resume.
Το DELETE …/{id} αρχειοθετεί οριστικά το endpoint webhook. Για να το σταματήσεις για λίγο, απενεργοποίησέ το αντί γι’ αυτό.
curl -X POST "https://handelsregister.ai/api/v1/account/webhook-endpoints/wep_01m6b3j1g0cdz98hw8zdefbf52/disable" \ -H "Authorization: Bearer YOUR_ADMIN_TOKEN" \ -H "Idempotency-Key: $(uuidgen)"
import uuid import requests response = requests.post( "https://handelsregister.ai/api/v1/account/webhook-endpoints/wep_01m6b3j1g0cdz98hw8zdefbf52/disable", headers={ "Authorization": "Bearer YOUR_ADMIN_TOKEN", "Idempotency-Key": str(uuid.uuid4()), }, ) data = response.json()
const response = await fetch("https://handelsregister.ai/api/v1/account/webhook-endpoints/wep_01m6b3j1g0cdz98hw8zdefbf52/disable", { method: "POST", headers: { "Authorization": "Bearer YOUR_ADMIN_TOKEN", "Idempotency-Key": crypto.randomUUID(), }, }); const data = await response.json();
Σφάλματα
Τα σφάλματα έχουν την ίδια δομή όπως στο account/monitors: ένας κωδικός στο error, η εξήγηση στο meta.message. Τα σφάλματα δεν κοστίζουν τίποτα.
| 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}