In short
- Eka sends results that do not come back on your request to your webhook endpoint as events.
- Your endpoint is a public HTTPS URL that accepts
POSTrequests. - Every event has the same envelope; the fields inside
datadiffer per event. - Verify
Eka-Webhook-Signaturewith HMAC-SHA256 when you gave a signing key. - Reply
200within 5 seconds, then do the work.
Delivery, signature and acknowledgement
Registering your endpoint
Your endpoint is a public HTTPS URL that acceptsPOST requests. See Getting started with webhooks and Register a webhook.
The PHR webhooks guide says there is no self-service API to register an ABDM webhook URL, and that you share your endpoint with Eka (console or support) before sandbox testing.
If your network restricts inbound traffic, allowlist Eka’s production and staging IP addresses listed on Register a webhook.
What every request carries
Every event is aPOST with two headers:
Content-Type:application/jsonEka-Webhook-Signature: present when you gave a signing key at registration
service, event (the event name), event_time, transaction_id, timestamp, business_id, client_id, and data. The fields inside data differ per event; see each event’s page.
Verifying the signature
Eka signs the payload when you provide a signing key while registering the webhook. Without a key, Eka still sends the event, unsigned. You can use one key for all webhooks or a unique key per webhook. The ABDM Connect spec marksEka-Webhook-Signature as required on every event, so whether Eka ever delivers an unsigned event is not yet confirmed.
The header has the form t=TIMESTAMP,v1=SIGNATURE. To verify it:
- Read
tandv1fromEka-Webhook-Signature. - Compute an HMAC-SHA256 over
TIMESTAMP.PAYLOADwith your signing key. - Compare your result with
v1. If they match, the event came from Eka and was not changed.
t is older than your tolerance, for example 3 minutes. Webhook signature has example code.
Acknowledging
Reply200 within 5 seconds. Eka retries on any other status. Reply first, then do the work: decrypting records, building FHIR bundles or calling back Eka.
ABHA
abha.created
Fires when an ABHA address is created. Provision the patient in your database from this event, not only from the API response.
- Payload: ABHA Address Created
- Consumed by: Create an ABHA with Aadhaar OTP, Create an ABHA address with mobile OTP, Create an ABHA with face authentication
Health Information Provider (HIP)
abha.link_care_context
Fires after you call the Care Context Link API, with the result. data.status is LINKED when the care context is registered with ABDM, or ERRORED with the reason in data.error.
- Payload: Care Context Linking Status
- Consumed by: Link a care context as a HIP
abha.care_context_discover
Fires when a patient asks your facility, from a PHR app, for records not yet linked to their ABHA. Search your system with the details in data and answer with On Discover.
- Payload: Discovery Request Received
- Consumed by: Answer discovery and link old records
abha.care_context_discover_link_init
Fires when the patient chooses which discovered records to link. Generate an OTP, send it to the patient, and call On Link Init.
- Payload: Link Initiation - Generate OTP
- Consumed by: Answer discovery and link old records
abha.context_discover_link_confirm
Fires when the patient submits the OTP. Check it against the OTP you sent, then call On Link Confirm with the care contexts to link.
- Payload: Link Confirmation - Verify OTP
- Consumed by: Answer discovery and link old records
abha.hip_data_fetch
Fires when a Health Information User (HIU) requests data for care contexts you linked. You receive it only if you do not store the health data on Eka. Encrypt the FHIR bundles with the key_information in the payload and push them with Care Context Data On-Fetch.
- Payload: Health Data Requested by HIU
- Consumed by: Serve records on a fetch request
abha.hip_profile_share
Fires when a patient scans your facility’s QR code with a PHR app and shares their ABHA profile for an OPD token. data.hip_code is the counter id.
- Payload: Scan and Share Token Received
- Consumed by: Receive a scanned profile as a HIP
Health Information User (HIU) and consent
abha.consent_update
Fires whenever a consent changes, with the updated details. Expect it more than once for the same consent request; treat the latest status as current.
- Payload: Consent Update
- Consumed by: Request a patient’s consent as a HIU, Approve, deny or revoke a consent in a PHR app
abha.hiu_data_push
Fires when a HIP pushes encrypted health data for a consent you raised. You receive it only if you manage the data on your side.
- Payload: Health Data Received from HIP
- Consumed by: Receive and decrypt records as a HIU
Health locker
abha.locker_created
Fires when a health locker is set up. Store data.auto_approval_id and data.subscription_id.
- Payload: Locker Created
- Consumed by: Set up the patient’s health locker
abha.subscription_notify
Fires when a HIP links a new care context to an ABHA address you hold an active subscription for.
- Payload: New Care Context Linked (Subscription)
- Consumed by: Set up the patient’s health locker
abha.subscription_modified
Fires whenever a subscription is updated.
- Payload: Subscription Updated
- Consumed by: Set up the patient’s health locker
Unified Health Interface (UHI) bookings
Each UHI call starts a request and returns at once. The result arrives on one of these events. You can also read it with the matchingGET.
doctor.search.results
Fires with the results of Search Doctors.
- Payload: Search Doctors
- Consumed by: Book a physical consultation over UHI
doctor.slot.search.results
Fires with the results of a doctor’s consultation slot search, Search Slots.
- Payload: Search Slots
- Consumed by: Book a physical consultation over UHI
booking.init
Fires with the result of Init: the quote, terms and payment details.
- Payload: Booking Init
- Consumed by: Book a physical consultation over UHI
booking.confirm
Fires with the result of Confirm: the booking confirmation and its details.
- Payload: Booking Confirm
- Consumed by: Book a physical consultation over UHI
booking.status
Fires with the result of Order Status: the booking’s status and details.
- Payload: Booking Status
- Consumed by: Book a physical consultation over UHI
booking.cancel
Fires when a booking cancellation requested through Cancel completes. data.status carries the result.
- Payload: Booking Cancel
- Consumed by: Book a physical consultation over UHI

