Skip to main content

Ambulance booking

Ambulance booking on UHI lets a patient or a caregiver find ambulances near them across every registered provider, see arrival windows and indicative charges, and start a booking with the one they pick. After this page you will know the four calls that are live today, their fields, and what NHA tests your app for.

Read UHI services first, for the context block, the acknowledgement model, signing and the two transports.

What is live, and what is not

This service is released in two phases.

PhaseCallsStatus
Firstsearch, on_search, init, on_initCurrent
Secondconfirm, on_confirm, status, on_status, cancel, on_cancel, on_updateUpcoming

Today the flow ends at a quote. The patient discovers ambulances, picks one, sends their details with init, and receives a quote with terms in on_init. There is no confirm. The outcome is the patient requesting a callback from the provider they chose.

Two limits follow from that.

  • The agent block must not appear in any current-phase payload. Driver name, vehicle number and driver phone are post-confirmation data. Their absence is tested in on_search and on_init, and tests that your EUA shows no driver or vehicle UI at any point before confirmation.
  • Live tracking and dispatch updates are not available. They arrive with the second phase.

Out of scope right now

  • The NON_EMERGENCY flow, which is future scope. Build EMERGENCY first.
  • Booking confirmation and order creation from the EUA.
  • State-operated ambulance networks. 108, 102 and 112 services are not on UHI today.
  • Patient transport ambulances. An HSPA may return a PTA category in its catalog. Ignore it.

Service identity

FieldValue
context.domainnic2008:86909
context.core_version0.7.1
message.intent.item.descriptor.codeAMBULANCE
message.intent.fulfillment.typeEMERGENCY or NON_EMERGENCY

Who is involved

RoleWhat it does here
EUAThe patient or caregiver app. Sends the search, shows options, sends init, shows the quote and terms
HSPAThe ambulance operator's platform. Answers searches with live availability, answers init with a quote
GatewayThe routing layer. Broadcasts the search. Not involved from init onwards

The four calls

#CallDirectionWhat happens
1searchEUA to gateway to HSPAsThe patient searches by case type, ambulance class and pickup location
2on_searchHSPA to gateway to EUAEach HSPA with availability returns a catalog with arrival windows and indicative pricing
3initEUA to HSPA, directThe EUA sends patient details, billing and the chosen fulfilment
4on_initHSPA to EUA, directThe HSPA returns a quote, payment terms and a cancellation policy

Every one returns an acknowledgement synchronously. The real answer arrives later at the callback URL.

Silence is not an error. An HSPA answers only for areas it covers, so no response from a given HSPA tells you nothing about network health.

Search filters

Case typeAmbulance class codesLocation fields required
EMERGENCYALS, BLS, ALLSOURCE only: pickup GPS and address
NON_EMERGENCYALS, BLS, ALLSOURCE and DESTINATION, both GPS and address

ALS is advanced life support, BLS is basic life support. For an emergency search, set the class to ALL so nothing available is filtered out.

context is the standard UHI block. The service-specific parts live in message.intent.

FieldTypeRequiredWhat it is
category.descriptor.codestringOptionalAmbulance class: ALS, BLS, or ALL for every class
fulfillment.typestringMandatoryEMERGENCY or NON_EMERGENCY
fulfillment.start.time.timestampISO 8601MandatoryRequested pickup time. Use the current time for an emergency
fulfillment.end.time.timestampISO 8601OptionalEnd of the acceptable window. Used for non-emergency only
fulfillment.tags.additional_servicesstringOptionalComma-separated extras, for example an oxygen cylinder
locations[SOURCE].gpsstringMandatoryPickup coordinates as latitude,longitude
locations[SOURCE].addressstringMandatoryPickup address text
locations[DESTINATION].gpsstringConditionalDrop-off coordinates. Non-emergency only
locations[DESTINATION].addressstringConditionalDrop-off address. Non-emergency only
item.descriptor.codestringMandatoryAMBULANCE

Sample, emergency

With your identifiers substituted.

{
"context": {
"domain": "nic2008:86909",
"country": "IND",
"city": "std:011",
"action": "search",
"core_version": "0.7.1",
"consumer_id": "<YOUR_EUA_ID_FROM_NHA_ONBOARDING>",
"consumer_uri": "<YOUR_HTTPS_CALLBACK_URL>",
"message_id": "e9a19230-f951-11ec-b135-53aea776f66b",
"timestamp": "2026-03-23T15:24:35",
"transaction_id": "e9a19230-f951-11ec-b135-53aea776f66b"
},
"message": {
"intent": {
"category": {
"descriptor": { "code": "ALS", "name": "ALS" }
},
"fulfillment": {
"type": "EMERGENCY",
"start": { "time": { "timestamp": "2026-01-05T15:24:35" } },
"end": { "time": { "timestamp": "2026-01-05T23:59:59" } },
"tags": { "additional_services": "oxygen cylinder, etc" }
},
"locations": [
{
"descriptor": { "code": "SOURCE", "name": "SOURCE" },
"gps": "12.423423,77.325647",
"address": "SHIVAJI MARG, PUNE"
}
],
"item": {
"descriptor": { "code": "AMBULANCE", "name": "AMBULANCE" }
}
}
}
}
FieldTypeRequiredWhat it is
context.provider_idstringMandatoryHSPA identifier. You need this for init
context.provider_uristringMandatoryHSPA callback URL. You need this for init
context.transaction_idstringMandatoryMatches your search
catalog.descriptor.namestringMandatoryHSPA name
catalog.descriptor.imagesstringOptionalHSPA logo, preferably base64
catalog.descriptor.flagbooleanMandatoryfalse means the service is active, true means paused
providers[].idstringMandatoryProvider identifier
providers[].categories[].codestringMandatoryAmbulance class: ALS or BLS
providers[].fulfillments[].idstringMandatoryFulfilment ID, for example ML-ALS-01
providers[].fulfillments[].typestringMandatoryCase type. Must match the search
providers[].fulfillments[].trackingbooleanMandatoryWhether live tracking is supported for this option
providers[].fulfillments[].start.time.timestampISO 8601MandatoryEarliest estimated arrival
providers[].fulfillments[].end.time.timestampISO 8601MandatoryLatest estimated arrival
providers[].fulfillments[].tags.additional_servicesstringOptionalExtras available on this option
providers[].fulfillments[].tags.deeplink_urlstringOptionalDeep link into the HSPA app
providers[].items[].idstringMandatoryItem identifier
providers[].items[].descriptor.flagbooleanMandatorytrue means payment is required
providers[].items[].price.valuestringMandatoryBase indicative price in INR
providers[].items[].price.estimated_ValuestringOptionalEstimated total charge
providers[].items[].price.minimum_ValuestringOptionalMinimum or advance charge
providers[].items[].price.maximum_ValuestringOptionalMaximum expected charge
providers[].items[].fulfillment_idstringMandatoryLinks this price to a fulfilment

Each fulfilment ID appears twice: once where the fulfilment is declared, and once as items[].fulfillment_id. The item also carries category_id. The chain is category, then fulfilment, then item, joined through the item object. Walk it to show "ALS ambulance, arriving 12:30 to 12:35, around 500 rupees".

Sample, trimmed

{
"context": {
"domain": "nic2008:86909",
"action": "on_search",
"core_version": "0.7.1",
"consumer_id": "<YOUR_EUA_ID_FROM_NHA_ONBOARDING>",
"consumer_uri": "<YOUR_HTTPS_CALLBACK_URL>",
"provider_id": "<HSPA_ID_FROM_THIS_RESPONSE>",
"provider_uri": "<HSPA_CALLBACK_URL_FROM_THIS_RESPONSE>",
"transaction_id": "e9a19230-f951-11ec-b135-53aea776f66b",
"message_id": "e9a19230-f951-11ec-b135-53aea776f66b"
},
"message": {
"catalog": {
"descriptor": {
"name": "Medulance HSPA",
"flag": false,
"short_desc": "Medulance: Ambulance Provider HSPA"
},
"providers": [
{
"id": "1",
"descriptor": { "name": "Medulance", "flag": false },
"categories": [
{ "id": "1", "descriptor": { "name": "Advanced Life Support (ALS)", "code": "ALS", "flag": false } },
{ "id": "2", "descriptor": { "name": "Basic Life Support (BLS)", "code": "BLS", "flag": false } }
],
"fulfillments": [
{
"id": "ML-ALS-01",
"type": "EMERGENCY",
"tracking": true,
"start": { "time": { "timestamp": "2026-01-05T12:30:00" } },
"end": { "time": { "timestamp": "2026-01-05T12:35:00" } },
"tags": {
"additional_services": "oxygen cylinder, etc",
"deeplink_url": "https://deeplinkurl.com"
}
}
],
"items": [
{
"id": "1",
"descriptor": { "name": "Charges", "flag": true },
"price": {
"currency": "INR",
"value": "500",
"estimated_Value": "500",
"minimum_Value": "200",
"maximum_Value": "1500"
},
"category_id": "1",
"fulfillment_id": "ML-ALS-01"
}
]
}
]
}
}
}

init

Direct to the HSPA, at the provider_uri you took from on_search.

FieldTypeRequiredWhat it is
context.provider_idstringMandatoryCarried from on_search
context.provider_uristringMandatoryCarried from on_search
order.provider.idstringMandatoryThe provider the user picked
order.item.idstringMandatoryThe item the user picked
order.item.fulfillment_idstringMandatoryThe fulfilment the user picked
order.fulfillment.idstringMandatoryMatches item.fulfillment_id
order.fulfillment.typestringMandatoryEMERGENCY or NON_EMERGENCY
order.fulfillment.trackingbooleanMandatoryCarried from on_search
order.fulfillment.tags.additional_servicesstringOptionalExtras the patient asked for
order.fulfillment.tags.deeplink_urlstringOptionalCarried from on_search if present
order.billing.namestringMandatoryPatient or responsible person
order.billing.addressobjectMandatoryPickup address: locality, state, country, area_code
order.billing.phonestringMandatoryContact number
order.customer.idstringMandatoryPatient ABHA address, for example 91XXXXXXXXXX@sbx
order.customer.person.dobstringOptionalYYYY-MM-DD
order.customer.person.genderstringOptionalM, F or O
order.locations[SOURCE]objectMandatoryPickup GPS and address
order.locations[DESTINATION]objectConditionalRequired for non-emergency, optional for emergency

on_init

The HSPA answers with the order ID, a quote and the terms.

FieldTypeRequiredWhat it is
order.idstringMandatoryThe HSPA's order ID. Carry it into every call in the second phase
order.fulfillment.tags.terms_referencestring (URL)MandatoryLink to the HSPA's versioned terms document
order.quote.price.valuestringMandatoryTotal confirmed price in INR
order.quote.breakup[].titlestringMandatoryLine item name, for example Ambulance Base Charge
order.quote.breakup[].price.valuestringMandatoryLine item amount
order.payment.typestringMandatoryON-ORDER at booking, or PRE-ORDER in advance
order.payment.statusstringMandatoryFor example NOT_PAID
order.terms[].typestringMandatoryCommercial, Settlement, Cancellation, Refund or Payment
order.terms[].termsStatestringMandatoryINITIATED, awaiting EUA review
order.locations[SOURCE]objectMandatoryEchoed from init
order.locations[DESTINATION]objectConditionalEchoed from init for non-emergency

Three terms apply in the current phase: Commercial, Cancellation and Payment, each at INITIATED.

{
"quote": {
"price": { "currency": "INR", "value": "500.0" },
"breakup": [
{ "title": "Ambulance Base Charge", "price": { "currency": "INR", "value": "400.0" } },
{ "title": "Consumable Charges", "price": { "currency": "INR", "value": "100.0" } }
]
},
"payment": { "type": "ON-ORDER", "status": "NOT_PAID" }
}

Most of on_init exists for the second phase. You may receive these fields now without showing all of them to the user yet.

What your EUA has to show

IDRequirement
AMB-E-01Show the HSPA name and logo from catalog.descriptor in the listing, whenever they arrive in the response
AMB-E-02Show the estimated arrival window from fulfillment.start and fulfillment.end for each option
AMB-E-03Show the indicative price from item.price.value before the user selects
AMB-E-04Show the full on_init cancellation and payment terms before enabling any confirm action
AMB-E-05Show no driver or vehicle detail anywhere before confirmation

Edge cases to handle

CaseWhat your system does
No HSPA answers within your windowShow the user a clear empty result. Do not present it as a failure
An HSPA returns an empty providers arrayHandle it without a crash or a display error
A duplicate search with the same transaction_idExpect the gateway or the HSPA to deduplicate
on_init with payment.type: PRE-ORDER and a non-zero minimum_ValueShow the advance payment requirement to the user

Prerequisites

For an EUA:

  • ABDM M2 with HIE-CM completed. This is the hard prerequisite for production access.
  • A publicly reachable HTTPS consumer_uri for on_search and on_init.
  • Ed25519 signing with BLAKE-512 body hashing.
  • Asynchronous handling. Do not block on a synchronous reply to search or init.
  • EMERGENCY support at minimum. NON_EMERGENCY is recommended, not required.

For an HSPA:

  • A publicly reachable HTTPS callback URL for search from the gateway and init from EUAs.
  • Ed25519 signing on every outbound response.
  • Real-time or near real-time availability data. Integrations relying only on manually maintained records are not approved for production.
  • An on_init that carries a confirmed quote, payment terms and a cancellation policy.
  • No agent block in any current-phase payload.

What is missing here

  • The calls in the second phase have no field reference yet.
  • A Postman collection for this service is available from your onboarding contact.
  • Error codes for this service are not enumerated in the source document.

Next