# वेबहुक

> संसाधन लेखन, सहमति परिवर्तन और अंतिम दस्तावेज़ों के लिए हस्ताक्षरित, पुनः प्रयास किए गए, पतले ईवेंट, TypeScript, Dart और Python में हस्ताक्षर सत्यापन के साथ।

Source: https://developers.anpheros.com/hi/guides/webhooks

जब आपके प्रोजेक्ट में कुछ होता है तो Anpheros Platform आपके सर्वर को कॉल कर सकता है: एक संसाधन लिखा गया था, किसी व्यक्ति ने एक्सेस प्रदान या रद्द कर दिया था, एक दस्तावेज़ अंतिम रूप दिया गया था। ईवेंट **पतले** होते हैं: आईडी, प्रकार, संस्करण — कभी भी नैदानिक सामग्री नहीं। यदि आपको इसकी आवश्यकता है तो API के माध्यम से संसाधन पढ़ें। प्रत्येक डिलीवरी हस्ताक्षरित होती है; उस पर भरोसा करने से पहले हस्ताक्षर सत्यापित करें।

## एक एंडपॉइंट पंजीकृत करें

```bash
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` | आपके प्रोजेक्ट ने FHIR संसाधन (REST v1, FHIR API या बंडल) लिखा है (REST v1, FHIR API या बंडल) — **या किसी अन्य प्रोजेक्ट ने ऐसे रिकॉर्ड में लिखा है जिस तक आपकी पहुँच है** (आपने रोगी बनाया है, या आपके पास एक सक्रिय अनुदान है); तब `data.external` `true` है और `data.source` बताता है कि इसे किसने लिखा: `author_type` (रोगी / चिकित्सक / उपकरण / आयात / एआई), `organization` (वह प्रदर्शन नाम जिसके बदले लेखक ने कार्य किया), `practitioner` (निर्देशिका से नाम, जब ज्ञात हो), `source_system` | `resource_type`, `id`, `patient` (आईडी जो आप देखते हैं), `version`, `last_updated`, और बाहरी लेखन के लिए `external`, `source` |
| `consent.granted` | किसी व्यक्ति ने सहमति पृष्ठ से आपके ऐप को एक्सेस प्रदान किया है (या एक विश्वसनीय ऐप ने इसका रिकॉर्ड लिंक किया है) | `grant_id`, `patient`, `application_id`, `scopes`, `purpose`, `expires_at` |
| `consent.revoked` | व्यक्ति (या प्लेटफ़ॉर्म) ने अनुदान समाप्त कर दिया | उपरोक्त के समान प्लस `revoked_at`, `reason` |
| `document.finalized` | एक दस्तावेज़ अपलोड अंतिम रूप दिया गया और चेकसम किया गया | `id`, `patient`, `content_type`, `size`, `sha256` |
| `proposal.created` | एक एआई एजेंट ने आपके द्वारा देखे जा सकने वाले रिकॉर्ड में लिखने का प्रस्ताव दिया; यह व्यक्ति की मंजूरी की प्रतीक्षा करता है | `id`, `patient`, `action`, `resource_type` |
| `ping` | आपने परीक्षण वितरण का अनुरोध किया | `endpoint` |

एंडपॉइंट प्रति प्रोजेक्ट **और वातावरण** होते हैं: एक `sk_test_` कुंजी सैंडबॉक्स एंडपॉइंट का प्रबंधन करती है,
एक `sk_live_` कुंजी उत्पादन वाले। यूआरएल सार्वजनिक `https://` एंडपॉइंट होने चाहिए। पंजीकरण (और `url` में कोई भी बाद का परिवर्तन) स्थानीय, निजी, लिंक-स्थानीय, मेटाडेटा और अन्य आरक्षित पतों को अस्वीकार करता है — `localhost`, `127.0.0.1`, `::1`, `10.0.0.0/8`, `192.168.0.0/16`, `fd00::/8` और इसी तरह — और वे नाम जो उन्हें हल करते हैं, `400` `invalid` के साथ `url` फ़ील्ड पर; यह सैंडबॉक्स में भी लागू होता है। हर डिलीवरी पते को फिर से जांचती है और केवल उन आईपी पतों से जुड़ती है जिन्हें उसने अभी-अभी जांचा है, इसलिए एक नाम जो बाद में एक निजी नेटवर्क (डीएनएस रीबाइंडिंग) की ओर इशारा करता है, उसे कुछ भी नहीं मिलता है। विकास के दौरान अपने स्वयं के मशीन पर ईवेंट प्राप्त करने के लिए, इसे एक सार्वजनिक HTTPS टनल के माध्यम से उजागर करें और टनल के पते को पंजीकृत करें।
प्रति प्रोजेक्ट और वातावरण 10 एंडपॉइंट तक।

## डिलीवरी

```
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":"…"}}
```

10 सेकंड के भीतर कोई भी `2xx` के साथ प्रतिक्रिया दें। कुछ और (या टाइमआउट) विफलता है और डिलीवरी 24 घंटे (10 प्रयास) तक बैकऑफ़ के साथ पुनः प्रयास की जाती है, फिर `exhausted` के रूप में चिह्नित की जाती है। डिलीवरी कम से कम एक बार होती है और क्रम से बाहर आ सकती है: डी-डुप्लिकेट करने के लिए `Anpheros-Event-Id` और बासी अपडेट को अनदेखा करने के लिए `data.version` का उपयोग करें।

## हस्ताक्षर सत्यापित करें

`v1` आपके गुप्त कुंजी पर HMAC-SHA256 है `<t>.<raw body>` पर; यदि `t` 5 मिनट से पुराना है तो अस्वीकार करें।

```ts
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();
});
```

```dart
import 'package:anpheros_sdk/anpheros_sdk.dart';
final ok = verifyWebhookSignature(secret: secret, header: request.headers['anpheros-signature'], body: rawBodyBytes);
```

```python
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"])
```

## ऑपरेट करें

- `GET /v1/webhooks/{id}/deliveries?status=failed` — लॉग, सबसे नया पहले, स्टेटस कोड और एरर के साथ।
- `POST /v1/webhooks/{id}/deliveries/{delivery_id}/redeliver` — अभी एक को फिर से भेजें।
- `POST /v1/webhooks/{id}/ping` — एक टेस्ट इवेंट।
- `POST /v1/webhooks/{id}/rotate` — नया सीक्रेट (पुराना तुरंत बंद हो जाता है; यदि आप गैप का जोखिम नहीं उठा सकते हैं तो पहले अपना सर्वर अपडेट करें: दूसरा एंडपॉइंट रजिस्टर करें, फिर पुराना डिलीट करें)।
- `PATCH /v1/webhooks/{id}` के साथ `{"active": false}` डिलीवरी को रोकता है; जब आप एंडपॉइंट डिलीट करते हैं तो पेंडिंग वाले ड्रॉप हो जाते हैं।

दोनों SDKs इसे `webhooks` (`create`, `list`, `get`, `update`, `delete`, `rotateSecret`, `ping`, `deliveries`, `redeliver`) के तहत एक्सपोज़ करते हैं।
