Delhivery: Courier App icon

Delhivery Courier App data API: waybills, coins, KYC

Delhivery Limited · Transport

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

  • Delhivery: Courier App screenshot 1
  • Delhivery: Courier App screenshot 2
  • Delhivery: Courier App screenshot 3
  • Delhivery: Courier App screenshot 4
  • Delhivery: Courier App screenshot 5
  • Delhivery: Courier App screenshot 6

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/otp opendata

    Sends 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/session opendata

    Verifies 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/refresh opendata

    Rotates 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}/track opendata

    Hydrates 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/shipments opendata

    Pages 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/balance openfinance

    Returns 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/ledger openfinance

    Pages 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/order openfinance

    Mints 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/coverage opendata

    Tells 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/quote opendata

    Quotes 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/quote opendata

    Prices 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-weight opendata

    Converts 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/start osint

    Starts 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}/instructions opendata

    Writes 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/tickets opendata

    Lists 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

Get a quote