AnpherosAnpheros PlatformDevelopers

Try it free in the sandbox · first FHIR call in 5 minutesFree · 30 synthetic patients · no card

Webhooks

Υπογεγραμμένα, επαναληπτικά, λεπτά συμβάντα για εγγραφές πόρων, αλλαγές συναίνεσης και οριστικοποιημένα έγγραφα, με επαλήθευση υπογραφής σε TypeScript, Dart και Python.

Η πλατφόρμα Anpheros μπορεί να καλέσει τον διακομιστή σας όταν συμβαίνει κάτι στο έργο σας: ένας πόρος γράφτηκε, ένα άτομο παραχώρησε ή ανακάλεσε πρόσβαση, ένα έγγραφο οριστικοποιήθηκε. Τα συμβάντα είναι λιτά: ids, τύπος, έκδοση — ποτέ κλινικό περιεχόμενο. Διαβάστε τον πόρο μέσω του API αν τον χρειάζεστε. Κάθε παράδοση είναι υπογεγραμμένη· επαληθεύστε την υπογραφή πριν την εμπιστευτείτε.

Καταχώρηση ενός endpoint

curl -X POST $BASE/v1/webhooks -H "Authorization: Bearer $KEY" -H "Content-Type: application/json" \
  -d '{"url": "https://your.app/anpheros/hook", "events": ["resource.created", "consent.revoked"], "description": "prod"}'

Η απάντηση περιέχει secret (whsec_…) μία φορά. Αποθηκεύστε το. θα το χρειαστείτε για την επαλήθευση υπογραφών. Το events δέχεται ["*"] ή οποιοδήποτε από τα ακόλουθα:

τύπος πότε data
resource.created / resource.updated / resource.deleted το project σας έγραψε ένα FHIR resource (REST v1, FHIR API ή ένα bundle) — ή ένα άλλο project έγραψε σε ένα record στο οποίο έχετε πρόσβαση (εσείς δημιουργήσατε τον ασθενή, ή έχετε μια ενεργή άδεια). Τότε το data.external είναι true και το data.source λέει ποιος έγραψε: author_type (ασθενής / επαγγελματίας υγείας / συσκευή / εισαγωγή / ai), organization (το εμφανιζόμενο όνομα για λογαριασμό του οποίου ενήργησε ο συγγραφέας), practitioner (όνομα από τον κατάλογο, όταν είναι γνωστό), source_system resource_type, id, patient (το id που βλέπετε), version, last_updated, και για εξωτερικές εγγραφές external, source
consent.granted ένα άτομο παραχώρησε στην εφαρμογή σας πρόσβαση από τη σελίδα συναίνεσης (ή μια αξιόπιστη εφαρμογή συνέδεσε το record της) grant_id, patient, application_id, scopes, purpose, expires_at
consent.revoked το άτομο (ή η πλατφόρμα) έληξε μια άδεια ίδια με παραπάνω συν revoked_at, reason
document.finalized η μεταφόρτωση ενός εγγράφου ολοκληρώθηκε και ελέγχθηκε το checksum id, patient, content_type, size, sha256
proposal.created ένας AI agent πρότεινε μια εγγραφή σε ένα record που μπορείτε να δείτε. Περιμένει την έγκριση του ατόμου. id, patient, action, resource_type
ping ζητήσατε μια δοκιμαστική παράδοση endpoint

Τα endpoints είναι ανά project και περιβάλλον: ένα κλειδί sk_test_ διαχειρίζεται τα sandbox endpoints, ένα κλειδί sk_live_ τα production ones. Οι διευθύνσεις URL πρέπει να είναι δημόσια https:// endpoints. Η καταχώρηση (και οποιαδήποτε μεταγενέστερη αλλαγή του url) απορρίπτει τοπικές, ιδιωτικές, link-local, metadata και άλλες δεσμευμένες διευθύνσεις — localhost, 127.0.0.1, ::1, 10.0.0.0/8, 192.168.0.0/16, fd00::/8 και παρόμοιες — και ονόματα που επιλύονται σε αυτές, με 400 invalid στο πεδίο url. Αυτό ισχύει και στο sandbox. Κάθε παράδοση ελέγχει ξανά τη διεύθυνση και συνδέεται μόνο με τις IP διευθύνσεις που μόλις έλεγξε, οπότε ένα όνομα που αργότερα δείχνει σε ένα ιδιωτικό δίκτυο (DNS rebinding) δεν λαμβάνει τίποτα. Για να λαμβάνετε συμβάντα στη δική σας μηχανή κατά την ανάπτυξη, εκθέστε την μέσω ενός δημόσιου HTTPS tunnel και καταχωρήστε τη διεύθυνση του tunnel. Έως 10 endpoints ανά project και περιβάλλον.

Η παράδοση

POST https://your.app/anpheros/hook
Content-Type: application/json
User-Agent: Anpheros-Webhooks/1.0
Anpheros-Event: resource.created
Anpheros-Event-Id: evt_…
Anpheros-Delivery: whd_…
Anpheros-Signature: t=1789800000,v1=5f3a…

{"id":"evt_…","type":"resource.created","created_at":"2026-09-19T12:00:00.000Z","environment":"production",
 "project":"proj_…","data":{"resource_type":"Observation","id":"…","patient":"…","version":1,"last_updated":"…"}}

Απαντήστε με οποιοδήποτε 2xx εντός 10 δευτερολέπτων. Οτιδήποτε άλλο (ή χρονικό όριο) αποτελεί αποτυχία και η παράδοση επαναλαμβάνεται με εκθετική αύξηση καθυστέρησης για έως και 24 ώρες (10 προσπάθειες), στη συνέχεια επισημαίνεται ως exhausted. Οι παραδόσεις είναι "τουλάχιστον μία φορά" (at-least-once) και ενδέχεται να φτάσουν εκτός σειράς: χρησιμοποιήστε το Anpheros-Event-Id για απο-διπλοποίηση και το data.version για αγνόηση παλιών ενημερώσεων.

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

Το v1 είναι HMAC-SHA256 με το μυστικό σας πάνω από το <t>.<raw body>· απορρίψτε εάν το t είναι παλαιότερο από 5 λεπτά.

import { verifyWebhookSignature } from '@anpheros/sdk';
app.post('/anpheros/hook', express.raw({ type: 'application/json' }), async (req, res) => {
  const ok = await verifyWebhookSignature({ secret: process.env.ANPHEROS_WEBHOOK_SECRET!, header: req.header('anpheros-signature'), body: req.body });
  if (!ok) return res.status(400).end();
  const event = JSON.parse(req.body.toString());
  // … enqueue and return quickly
  res.status(204).end();
});
import 'package:anpheros_sdk/anpheros_sdk.dart';
final ok = verifyWebhookSignature(secret: secret, header: request.headers['anpheros-signature'], body: rawBodyBytes);
import hmac, hashlib, time
def verify(secret: str, header: str, body: bytes, tolerance=300) -> bool:
    parts = dict(p.split("=", 1) for p in header.split(","))
    if abs(time.time() - int(parts["t"])) > tolerance:
        return False
    expected = hmac.new(secret.encode(), f"{parts['t']}.".encode() + body, hashlib.sha256).hexdigest()
    return hmac.compare_digest(expected, parts["v1"])

Λειτουργία

Και τα δύο SDK εκθέτουν αυτό κάτω από το webhooks (create, list, get, update, delete, rotateSecret, ping, deliveries, redeliver).

Try it free in the sandbox · first FHIR call in 5 minutesFree · 30 synthetic patients · no card

Product updates by email

New features, guides and the end of the beta. One email a month at most.

Send me occasional Anpheros Platform updates by email (new features, API changes, guides). I'll confirm by email and can unsubscribe in one click from any email. Privacy