Gov APIindiapost.gov.in ↗
Track India Post consignments, money orders, and complaints via 4 endpoints. Get booking details, delivery status, and event timelines by article number or reference.
What is the Gov API?
The India Post API provides 4 endpoints to query tracking data from indiapost.gov.in, covering consignments, money orders, booking references, and complaints. The track_consignment endpoint returns a full event timeline alongside booking metadata including origin office, destination, weight, and tariff. Responses always include the structural envelope, so null-checking on individual fields is necessary when an item has not yet entered the tracking system.
curl -X GET 'https://api.parse.bot/scraper/8de3ccc8-6d51-44d6-b6cf-a6eb5a9ce092/track_consignment?consignment_number=EE123456789IN' \ -H 'X-API-Key: $PARSE_API_KEY'
Typed, relational, agent-ready
A generated client with real types, enums, and the links between objects — the structure a flat JSON response can't carry. Autocompletes in your editor and reads cleanly to coding agents.
- Fully typed · autocompletes
- Objects link to objects
- Typed errors & pagination
Typed Python client. Set up the SDK in your uv project, then pull this API’s typed client:
uv add parse-sdk uv run parse init uv run parse add --marketplace indiapost-gov-in-api
uv run parse add --marketplace pulls a pinned snapshot of this canonical API — it won’t change underneath you. To customize it, subscribe and swap to your own copy.
"""Walkthrough: India Post Tracking — track consignments, money orders, and references."""
from parse_apis.india_post_tracking_api import IndiaPost, Consignment, MoneyOrder, ConsignmentNotFound
client = IndiaPost()
# Track a consignment by its article number
consignment = client.consignments.get(consignment_number="EE123456789IN")
print(consignment.consignment_number, consignment.delivery_status.del_status)
# Access booking details
booking = consignment.booking_details
print(booking.tariff, booking.destination_city, booking.source_country)
# Track a money order by its number
mo = client.moneyorders.get(money_order_number="1234567890")
print(mo.money_order_number, mo.tracking_data.booking_details.payment_location)
# Iterate tracking events on the money order
for event in mo.tracking_data.tracking_details:
print(event.date, event.office, event.event)
# Track consignments by a booking reference
ref = client.referenceresults.get(reference_number="REF202401001")
print(ref.reference_number, ref.articles)
# Typed error handling for a not-found consignment
try:
detail = client.consignments.get(consignment_number="XX000000000XX")
print(detail.consignment_number)
except ConsignmentNotFound as exc:
print(f"not found: {exc.consignment_number}")
print("exercised: consignments.get / moneyorders.get / referenceresults.get / tracking_details iteration")
Track a consignment/article by its tracking number. Returns booking details (origin, destination, weight, tariff), delivery status, and a timeline of tracking events from India Post's system. Accepts standard India Post article numbers in XX123456789XX format. The response always contains the structural envelope; fields within booking_details may be null for numbers not yet in the system.
| Param | Type | Description |
|---|---|---|
| consignment_numberrequired | string | India Post consignment/article number in format XX123456789XX (2 uppercase letters + 9 digits + 2 uppercase letters, e.g. EE123456789IN) |
{
"type": "object",
"fields": {
"booking_details": "object containing article_number, article_type, booking_date, booking_office_name, booking_pin, destination_office_name, destination_pincode, destination_city, weight_value, tariff, cod_amount, source_country, destination_country, delivery_confirmed_on",
"delivery_status": "object containing del_status field indicating current delivery state",
"tracking_details": "array of tracking event objects or null if no events available",
"consignment_number": "string, the tracked consignment number"
},
"sample": {
"data": {
"booking_details": {
"tariff": "0",
"cod_amount": "0",
"booking_pin": null,
"article_type": null,
"booking_date": null,
"weight_value": null,
"article_number": null,
"source_country": null,
"destination_city": null,
"booking_office_name": null,
"destination_country": null,
"destination_pincode": null,
"delivery_confirmed_on": null,
"destination_office_name": null
},
"delivery_status": {
"del_status": "auto"
},
"tracking_details": null,
"consignment_number": "EE123456789IN"
},
"status": "success"
}
}About the Gov API
Consignment and Reference Tracking
The track_consignment endpoint accepts a single consignment_number in the standard India Post format — two uppercase letters, nine digits, two uppercase letters (e.g., EE123456789IN). It returns three top-level objects: booking_details (article type, booking date, booking office name and PIN, destination office name and PIN), delivery_status (a del_status string reflecting the current state), and tracking_details (an array of timestamped transit events, or null if the article has not yet generated events). The track_by_reference endpoint accepts an alphanumeric reference number up to 23 characters, including / and -, and returns an articles array listing all article identifiers linked to that reference — useful when a single dispatch contains multiple items.
Money Order and Complaint Tracking
The track_money_order endpoint accepts a money_order_number of exactly 10 or 18 digits. Its response wraps a tracking_data object containing booking_details (fields: pnr_no, booked_at, booked_on, payment_location, payment_confirmed_on) and a tracking_details array covering the money order's transit stages. Like consignment tracking, the envelope is always present even when fields are null for numbers not yet registered in the system. The track_complaint endpoint takes a complaint_id string and returns the associated complaint_data object from India Post's complaint system, enabling programmatic status checks on filed service complaints.
Data Freshness and Null Handling
All four endpoints return a consistent outer envelope regardless of whether the queried item exists or has events. Callers should defensively handle null values in tracking_details arrays and nested booking fields. The del_status field in delivery_status is the canonical field to check for current delivery state on consignments. Event timestamps and office names within the tracking arrays reflect whatever India Post's system has recorded at query time — there is no separate field for expected delivery date.
The Gov API is a managed, monitored endpoint for indiapost.gov.in — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when indiapost.gov.in changes and a check fails, the API is automatically queued for repair and re-verified. It is built to keep working as the site underneath it changes.
This isn't an official indiapost.gov.in API — it's an independent, maintained REST wrapper over public data. Where the source has no official API (or only a limited one), Parse gives you a stable contract over a source that never promised one, and keeps it current. Need a new endpoint or field? You can revise it yourself in plain English and the agent rebuilds it against the live site in minutes — contributing the change back to the shared API is free.
Will this API break when the source site changes?+
Is this an official API from the source site?+
Can I fix or extend this API myself if I need a new endpoint or field?+
What happens if I call an endpoint that has an issue?+
- Poll
track_consignmentto send automated delivery notifications whendel_statuschanges - Build a bulk tracking dashboard by iterating a list of article numbers through
track_consignment - Resolve a booking reference to all its constituent articles using
track_by_referencebefore tracking each individually - Monitor money order payment confirmation by checking
payment_confirmed_onviatrack_money_order - Automate complaint status checks for customer support queues using
track_complaintwith stored complaint IDs - Log the full transit event timeline from
tracking_detailsfor SLA analysis on domestic postal routes
| Tier | Price | Credits/month | Rate limit |
|---|---|---|---|
| Free | $0/mo | 100 | 5 req/min |
| Hobby | $30/mo | 1,000 | 20 req/min |
| Developer | $100/mo | 5,000 | 100 req/min |
One credit = one API call regardless of which marketplace API you call. Exceeding the rate limit returns a 429 response. Authenticate with the X-API-Key header.
Does India Post have an official public developer API?+
What does `track_consignment` return when a consignment number exists but has no transit events yet?+
booking_details and delivery_status. The tracking_details field will be null rather than an empty array when no transit scan events have been recorded yet. del_status inside delivery_status will still reflect whatever state India Post has assigned at booking time.Can I retrieve the expected delivery date or estimated arrival for a consignment?+
booking_details, delivery_status, and timestamped tracking_details events, but no estimated delivery date field is exposed. You can fork this API on Parse and revise it to add an endpoint targeting whichever India Post page surfaces delivery estimates.Does the API support tracking international inbound articles sent to India?+
track_consignment endpoint accepts standard India Post article numbers, which include international articles arriving in India (format XX123456789IN). However, event coverage for international items depends entirely on what India Post's system has recorded after customs handover — outbound international tracking from the destination country's postal system is not covered. You can fork this API on Parse and revise it to chain calls to a destination country's tracking API.Is there a way to track multiple consignments in a single API call?+
track_consignment endpoint accepts one consignment number per request. Bulk tracking requires iterating over a list of article numbers and making individual calls. The track_by_reference endpoint can retrieve all article numbers under one booking reference, but each article still needs a separate track_consignment call for its event timeline. You can fork this API on Parse and revise it to add a batch endpoint that fans out and aggregates results.