Delhivery Courier App data API: waybills, coins, KYC
Delhivery: Courier App is the consumer Android client of Delhivery Limited, the Gurugram-listed logistics company that runs India's largest independent parcel network across surface, air, same-city Local and part-truck-load (PTL) freight. After a phone OTP sign-in, a user books a Direct (nationwide C2C) pickup, a Local same-city trip or a PTL load, chooses package size and declared value, optionally adds Delhivery Protect cover, and pays prepaid or COD through Razorpay; consignees on the inbound side follow the waybill, leave delivery instructions and raise support tickets. Business shippers complete GST and Aadhaar DigiLocker KYC in the same session, spend Delhivery Coins at checkout, and apply student or referral codes. Published for India with app links on delhivery.com, it is used by households sending personal parcels, small sellers dispatching orders, and consignees waiting on e-commerce inbound, and it sits next to Blue Dart, DTDC, Shadowfax, Porter and India Post on the same lanes.
Waybill keys wbn and awb_number plus a promised_delivery_date stamp are the spine of the shipment record the app hydrates after sign-in — each row also carries tracking_status, a scans timeline and origin/drop pincodes. Loyalty sits in a parallel ledger of coins, expiring_coins and coins_redeemed; checkout adds charged_weight_g, hl_freight estimates and a Razorpay hash with razorpay_order_id.
Aadhaar DigiLocker and GST flags (aadhar_kyc_verified, gstin) gate business bookings that need an ewaybill. OMS and returns tools can poll tracking, finance teams can reconcile COD against coins redemptions, and checkout widgets can pre-check is_serviceable before a seller promises a lane. openData Studio turns those private calls into callable open data.
Screenshots
API surface
The endpoints and request/response examples below are reconstructed from the app's interface — illustrative, not a live capture.
Request login OTP
POST
/v1/courier/auth/otpopendataSends the SMS OTP that opens the onboarding/login screen for a +91 mobile.
Auth: Unauthenticated. Phone OTP starts the session; later calls send Authorization: Bearer access_token plus X-API-USER-INFO.
- phone_number
- country_code
- device_id
- otp_attempts
- success
- message
POST /v1/courier/auth/otp HTTP/1.1 Content-Type: application/json X-API-REQID: 9f3a1c2e { "phone_number": "9876543210", "country_code": "+91", "device_id": "android-3f8c" }{ "success": true, "message": "OTP sent", "data": { "otp_attempts": 0, "phone_number": "9876543210", "country_code": "+91" } }Exchange OTP for customer access
POST
/v1/courier/auth/sessionopendataVerifies the OTP and returns the customer session (access_token, refresh_token, ucid) used on every later data call.
Auth: OTP just issued at POST /v1/courier/auth/otp. Response mints access_token, refresh_token, session_token and ucid.
- phone_number
- otp
- device_id
- install_src
- access_token
- refresh_token
- session_token
- ucid
- user_id
- name
POST /v1/courier/auth/session HTTP/1.1 Content-Type: application/json { "phone_number": "9876543210", "otp": "482913", "device_id": "android-3f8c", "install_src": "play" }{ "success": true, "data": { "access_token": "<access_token>", "refresh_token": "<refresh_token>", "session_token": "<session_token>", "ucid": "U1234567890", "user_id": "9876543210", "name": "Anita Sharma" } }Refresh session token
POST
/v1/auth/refreshopendataRotates the Bearer access_token when the home session reports JWT_TOKEN_EXPIRED / session_expired.
Auth: refresh_token from POST /v1/courier/auth/session. Response rotates access_token.
- refresh_token
- ucid
- access_token
- session_token
POST /v1/auth/refresh HTTP/1.1 Authorization: Bearer <access_token> Content-Type: application/json X-API-USER-INFO: U1234567890 { "refresh_token": "<refresh_token>", "ucid": "U1234567890" }{ "success": true, "data": { "access_token": "<access_token>", "refresh_token": "<refresh_token>", "session_token": "<session_token>" } }Unified waybill tracking
GET
/v1/shipments/{wbn}/trackopendataHydrates the track-package screen: waybill identity, current tracking_status, promised_delivery_date and the scans timeline.
Auth: Bearer access_token plus X-API-USER-INFO. Public AWB lookup still works with a wbn query.
- wbn
- waybill
- awb_number
- order_id
- tracking_status
- order_status
- promised_delivery_date
- location
- origin_city
- destination_city
- o_pincode
- d_pincode
- scans
- status
GET /v1/shipments/{wbn}/track?wbn=1234567890123 HTTP/1.1 Authorization: Bearer <access_token> X-API-USER-INFO: U1234567890 Accept: application/json{ "success": true, "data": { "wbn": "1234567890123", "waybill": "1234567890123", "awb_number": "1234567890123", "order_id": "DLV-90821", "tracking_status": "OUT_FOR_DELIVERY", "order_status": "IN_TRANSIT", "promised_delivery_date": "2026-10-11", "location": "Gurugram DC", "origin_city": "Mumbai", "destination_city": "Gurugram", "o_pincode": "400001", "d_pincode": "122001", "scans": [{ "status": "Picked up", "location": "Bhiwandi hub", "code": "UD" }] } }List booked packages
GET
/v1/shipmentsopendataPages the My Orders / home package list (wbn, order_status, pincodes, COD vs prepaid) for the signed-in customer.
Auth: Bearer access_token plus X-API-USER-INFO for the signed-in ucid.
- packages
- wbn
- order_id
- order_status
- payment_mode
- cod_amount
- pickup_pincode
- drop_pincode
- package_value
- package_weight
- seller_name
- count
- page_no
GET /v1/shipments?page_no=1 HTTP/1.1 Authorization: Bearer <access_token> X-API-USER-INFO: U1234567890 Accept: application/json{ "success": true, "data": { "packages": [{ "wbn": "1234567890123", "order_id": "DLV-90821", "order_status": "IN_TRANSIT", "payment_mode": "prepaid", "cod_amount": 0, "pickup_pincode": "400001", "drop_pincode": "122001", "package_value": 2500, "package_weight": 1.2, "seller_name": "Home shop" }], "count": 1, "page_no": 1 } }Read Delhivery Coins balance
GET
/v1/loyalty/balanceopenfinanceReturns the Delhivery Coins wallet snapshot shown on the coins hub (balance, enrolment, expiry).
Auth: Bearer access_token plus X-API-USER-INFO.
- coins
- balance
- coins_enrolled
- coins_redeemed
- expiring_coins
- expiry_date
- coins_unlocked
GET /v1/loyalty/balance HTTP/1.1 Authorization: Bearer <access_token> X-API-USER-INFO: U1234567890 Accept: application/json{ "success": true, "data": { "coins": 420, "balance": 420, "coins_enrolled": true, "coins_redeemed": 80, "expiring_coins": 50, "expiry_date": "2026-10-10", "coins_unlocked": true } }Page Coins transactions
GET
/v1/loyalty/ledgeropenfinancePages the coins ledger (earn/redeem rows, milestone, expiry_date) behind the transaction-history screen.
Auth: Bearer access_token plus X-API-USER-INFO.
- transactions
- amount
- coins
- milestone
- amount_per_milestone
- expiry_date
- order_id
- count
GET /v1/loyalty/ledger HTTP/1.1 Authorization: Bearer <access_token> X-API-USER-INFO: U1234567890 Accept: application/json{ "success": true, "data": { "transactions": [{ "amount": 40, "coins": 40, "milestone": "first_booking", "amount_per_milestone": 40, "expiry_date": "2026-12-31", "order_id": "DLV-90821" }], "count": 1 } }Create Razorpay payment hash
POST
/v1/checkout/orderopenfinanceMints the Razorpay order hash used on the pay screen; the SDK later returns razorpay_payment_id and razorpay_signature.
Auth: Bearer access_token plus X-API-USER-INFO. Checkout then posts razorpay_payment_id back on the pay-confirm screen.
- order_id
- amount
- currency
- payment_mode
- wbn
- hash
- razorpay_order_id
- payment_status
POST /v1/checkout/order HTTP/1.1 Authorization: Bearer <access_token> X-API-USER-INFO: U1234567890 Content-Type: application/json { "order_id": "DLV-90821", "amount": 24900, "currency": "INR", "payment_mode": "prepaid", "wbn": "1234567890123" }{ "success": true, "data": { "hash": "a1b2c3d4e5", "razorpay_order_id": "order_N9abc", "amount": 24900, "currency": "INR", "payment_status": "created" } }Check pincode serviceability
GET
/v1/lanes/coverageopendataTells the booking flow whether a pickup/drop pincode pair is serviceable for Direct, Local or PTL.
Auth: Bearer access_token plus X-API-USER-INFO. Anonymous pincode checks are used on the booking first step.
- origin_pincode
- drop_pincode
- o_pincode
- d_pincode
- serviceable
- is_serviceable
- origin_city
- destination_city
- service_type
- order_type
GET /v1/lanes/coverage?origin_pincode=400001&drop_pincode=122001&order_type=direct HTTP/1.1 Authorization: Bearer <access_token> X-API-USER-INFO: U1234567890 Accept: application/json{ "success": true, "data": { "origin_pincode": "400001", "drop_pincode": "122001", "o_pincode": "400001", "d_pincode": "122001", "serviceable": true, "is_serviceable": true, "origin_city": "Mumbai", "destination_city": "Gurugram", "service_type": "direct" } }Hyperlocal fare estimate
GET
/v1/local/quoteopendataQuotes a same-city Local trip (hl_freight, eta, polyline, vehicle_type) after pickup and drop pins are set.
Auth: Bearer access_token plus X-API-USER-INFO.
- estimate
- hl_freight
- eta
- distance
- duration
- vehicle_type
- polyline
- currency
GET /v1/local/quote?distance=12.4 HTTP/1.1 Authorization: Bearer <access_token> X-API-USER-INFO: U1234567890 Accept: application/json{ "success": true, "data": { "estimate": 349, "hl_freight": 349, "eta": 42, "distance": 12.4, "duration": 42, "vehicle_type": "2w", "polyline": "enc:polyline", "currency": "INR" } }PTL freight estimate
POST
/v1/freight/quoteopendataPrices a part-truck-load booking from weight, box_count and ewaybill, returning freight, GST and pickup slots.
Auth: Bearer access_token plus X-API-USER-INFO. Business bookings also send gstin after KYC.
- origin_city
- destination_city
- origin_pincode
- drop_pincode
- weight
- volumetric_weight
- box_count
- pickup_slot
- ewaybill
- freight
- charged_weight
- charged_weight_g
- gst
- igst
- slots
- ptl_master_waybill
POST /v1/freight/quote HTTP/1.1 Authorization: Bearer <access_token> X-API-USER-INFO: U1234567890 Content-Type: application/json { "origin_city": "Mumbai", "destination_city": "Pune", "origin_pincode": "400001", "drop_pincode": "411001", "weight": 250, "volumetric_weight": 280, "box_count": 4, "pickup_slot": "2026-10-10T10:00:00+05:30", "ewaybill": "341012345678" }{ "success": true, "data": { "freight": 8420, "charged_weight": 280, "charged_weight_g": 280000, "gst": 1515.6, "igst": 1515.6, "currency": "INR", "slots": ["10:00-13:00", "14:00-18:00"], "ptl_master_waybill": null } }Quote charged weight
GET
/v1/pricing/billable-weightopendataConverts dead weight and box dimensions into the charged_weight_g used on the Direct price screen.
Auth: Bearer access_token plus X-API-USER-INFO.
- weight_g
- charged_weight_g
- charged_weight
- volumetric_weight
- length_cm
- width_cm
- height_cm
- package_value
GET /v1/pricing/billable-weight?weight_g=1200&length_cm=30&width_cm=20&height_cm=15 HTTP/1.1 Authorization: Bearer <access_token> X-API-USER-INFO: U1234567890 Accept: application/json{ "success": true, "data": { "weight_g": 1200, "charged_weight_g": 1800, "charged_weight": 1.8, "volumetric_weight": 1.8, "length_cm": 30, "width_cm": 20, "height_cm": 15, "package_value": 2500 } }Initiate Aadhaar DigiLocker KYC
POST
/v1/kyc/aadhaar/startosintStarts the Aadhaar DigiLocker KYC used on the business-shipper screen; status is polled until aadhar_kyc_verified flips.
Auth: Bearer access_token plus X-API-USER-INFO. GST KYC is a sibling flow on the business-shipper screen.
- aadhaarNumber
- kyc_type
- ucid
- aadhar_kyc_verified
- gst_kyc_verified
- gstin
- authorization_url
POST /v1/kyc/aadhaar/start HTTP/1.1 Authorization: Bearer <access_token> X-API-USER-INFO: U1234567890 Content-Type: application/json { "aadhaarNumber": "XXXX-XXXX-1234", "kyc_type": "aadhaar", "ucid": "U1234567890" }{ "success": true, "data": { "kyc_type": "aadhaar", "aadhar_kyc_verified": false, "gst_kyc_verified": false, "gstin": "", "authorization_url": "https://kyc.example/aadhaar/callback" } }Update delivery instructions
POST
/v1/shipments/{wbn}/instructionsopendataWrites the consignee delivery-instruction card (safe-drop neighbour, landmark) attached to a waybill.
Auth: Bearer access_token plus X-API-USER-INFO. Consignee must own the wbn.
- wbn
- instructions
- neighbor
- landmark
- address_id
POST /v1/shipments/{wbn}/instructions HTTP/1.1 Authorization: Bearer <access_token> X-API-USER-INFO: U1234567890 Content-Type: application/json { "wbn": "1234567890123", "instructions": "Leave with neighbour in 12-B", "neighbor": "Ravi", "landmark": "Blue gate", "address_id": "addr_88" }{ "success": true, "data": { "wbn": "1234567890123", "instructions": "Leave with neighbour in 12-B", "neighbor": "Ravi", "landmark": "Blue gate", "address_id": "addr_88" } }List support tickets
GET
/v1/help/ticketsopendataLists the customer's support tickets (ticket_id, wbn, status) shown in the help inbox.
Auth: Bearer access_token plus X-API-USER-INFO.
- tickets
- ticket_id
- public_ticket_id
- wbn
- status
- comment
- attachment
- count
GET /v1/help/tickets HTTP/1.1 Authorization: Bearer <access_token> X-API-USER-INFO: U1234567890 Accept: application/json{ "success": true, "data": { "tickets": [{ "ticket_id": "TCK-4412", "public_ticket_id": "DLV-TCK-4412", "wbn": "1234567890123", "status": "open", "comment": "Package delayed past promised_delivery_date", "attachment": null }], "count": 1 } }
Data categories
- tracking
- shipments
- payments
- loyalty
- kyc
- serviceability
- support
Where teams use this data
OMS waybill reconciliation
A seller OMS polls unified tracking by wbn and merges tracking_status, scans and promised_delivery_date into the order row so support stops scraping the public track page.
Checkout lane pre-check
A storefront calls serviceability with origin_pincode and drop_pincode before promising Direct or Local delivery, and uses charged_weight_g plus hl_freight to show a landed price.
COD and Coins ledger
Finance joins payment_mode / cod_amount / razorpay_order_id with the coins ledger (balance, coins_redeemed, expiry_date) to reconcile prepaid checkout against loyalty redemptions.
Shipper KYC gate
A B2B onboarding flow reads aadhar_kyc_verified and gstin after DigiLocker / GST OTP so only verified ucid values can create PTL bookings that need an ewaybill.
Frequently asked questions
What tracking fields does the Delhivery courier app expose?
Unified tracking returns wbn / waybill / awb_number, tracking_status, order_status, promised_delivery_date, origin and drop pincodes, and a scans timeline. The home package list pages the same identifiers with payment_mode and cod_amount.
How does sign-in work on this API?
A phone OTP is requested, then exchanged at customer access for access_token, refresh_token, session_token and ucid. Later calls send Authorization: Bearer plus an X-API-USER-INFO header; a dedicated refresh path rotates the access token.
Is there a wallet or loyalty balance?
Yes. Delhivery Coins expose coins / balance, enrolment, coins_redeemed, expiring_coins and expiry_date, with a separate transactions list keyed by milestone and order_id. Prepaid checkout is a Razorpay hash, not a stored-value wallet.
Can I check whether a pincode is serviceable before booking?
The serviceability call takes origin_pincode and drop_pincode (also o_pincode / d_pincode) and returns serviceable / is_serviceable plus origin_city and destination_city for Direct, Local and PTL lanes.
Apps similar to Delhivery: Courier App
- Blue Dart — Blue Dart Express is an Indian courier and logistics company (DHL majority-owned) that offers express parcels, freight forwarding and cash-on-delivery, a nationwide alternative to Delhivery for consumer and e-commerce shipments.
- DTDC — DTDC Express is a Bengaluru courier that books door-to-door express parcels with real-time tracking, plus cargo and 2–4 hour Raftaar deliveries through the MyDTDC app.
- Porter - Logistics Service App — Porter is a Bengaluru on-demand logistics app that books mini trucks, tempos and two-wheelers for intra-city moves and also offers intercity courier, a lane Delhivery Direct was launched to compete on.
- Shadowfax Courier — Shadowfax’s courier app offers on-demand pick-up and drop-off within the city for individuals and small businesses, alongside express parcel coverage across Indian PIN codes.
- India Post Speed Post — India Post Speed Post is the national postal courier for time-bound letters and parcels, and the department also delivers prepaid and cash-on-delivery e-commerce consignments.
- Xpressbees — Xpressbees is a Pune logistics company, spun out of FirstCry in 2015, that provides parcel delivery, reverse logistics, warehousing and cross-border shipping.
- Borzo: Courier Delivery App — Borzo is an on-demand intra-city courier listed among the rivals Delhivery Direct set out to compete with for two-wheeler parcel pickup and drop.
Topics
- Delhivery API
- Delhivery tracking API
- waybill wbn
- Delhivery Coins
- pincode serviceability
- Aadhaar DigiLocker KYC
- PTL freight estimate
- Delhivery Local estimate
- consignee delivery instructions
Need this app's data API integrated?
We deliver scoped integrations for any named app — from USD 500 with source-code handoff, or hosted access billed per call. Tell us the data you need.
- NDA + SOW on every engagement
- Delivery in 3–7 days
- Payment only after acceptance
- Work scoped to authorized use