Multi-carrier tracking,
one API.
Real-time status for 15+ Indian couriers in a single request — the same tracking pipeline that powers trackparcel.in itself.
Request an API key
There's no self-serve signup yet — keys are issued manually. Contact uswith your expected usage and we'll set you up with a key and a plan that fits.
Make a request
Send a GET request to /api/v1/track with your tracking number, the carrier, and your key in the x-api-key header.
curl "https://www.trackparcel.in/api/v1/track?awb=V3501635425&carrier=DTDC" \
-H "x-api-key: YOUR_API_KEY"Read the response
You get back the current status, a full event timeline, and cache metadata — the same data shown on the tracking result page on the site itself.
{
"success": true,
"courier": "dtdc",
"detectedCarrier": "DTDC",
"fromCache": true,
"cachedAt": 1783356689223,
"cacheExpiresIn": 1829662,
"data": {
"booking_details": {
"tracking_number": "V3501635425",
"status": "Delivered",
"origin": "GUWAHATI, 781006",
"destination": "BANGALORE, 562157",
"actual_delivery": "5 Jun 2026",
"recipient": "ARINA GOGOI"
},
"tracking_details": [
{
"date": "5 Jun 2026",
"time": "16:16:30",
"location": "BANGALORE - Vidyanagar Cross",
"activity": "Delivered",
"remarks": "Successfully Delivered To [ARINA GOGOI]..."
},
{
"date": "5 Jun 2026",
"time": "11:53:52",
"location": "BANGALORE - Vidyanagar Cross",
"activity": "Out for Delivery",
"remarks": "..."
}
]
}
}Every request must include your API key in the x-api-key header. There is no query-param or Bearer-token alternative.
x-api-key: tp_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxA missing key returns 401 MISSING_API_KEY; an invalid one returns 401 INVALID_API_KEY. Keys are issued and revoked on request — if yours stops working unexpectedly, contact us before assuming it's a bug.
/api/v1/track| Param | Required | Description |
|---|---|---|
| awb | Yes | Tracking number. Letters, digits, hyphen, underscore only — max 50 characters. |
| carrier | Yes | Exact carrier name — see the supported carriers list below. |
Pass one of these exact strings as carrier. Values are case-sensitive.
India Postalso accepts "Speed Post"DelhiveryBluedartDTDCXpressbeesEkart / Flipkartalso accepts "Ekart"Tirupati CourierShadowfaxAllcargo Gatialso accepts "Gati"TrackonValmoST CourierFedEx Indiaalso accepts "FedEx"Shree MarutiShree Anjani Courier| Field | Description |
|---|---|
| success | Whether the request succeeded. Always check this before reading data. |
| courier | Internal carrier ID (e.g. "dtdc"). |
| detectedCarrier | Human-readable carrier name. |
| fromCache | True if this result came from cache rather than a live scrape. |
| cachedAt | Unix ms timestamp the cached result was stored, or null if freshly scraped. |
| cacheExpiresIn | Seconds until this result would be re-scraped on the next request. |
| data.booking_details | Current status, origin, destination, and delivery dates. |
| data.tracking_details | Full event timeline — date, time, location, activity, remarks — oldest or newest first depending on carrier. |
Errors always return the same shape:
{
"success": false,
"error": "NOT_FOUND",
"message": "No tracking data found for V3501635425"
}| Status | error | When |
|---|---|---|
| 400 | INVALID_AWB | awb is missing, over 50 characters, or contains characters other than letters/digits/hyphen/underscore |
| 400 | CARRIER_REQUIRED | carrier param is missing |
| 400 | UNKNOWN_COURIER | carrier value doesn't match any supported carrier |
| 401 | MISSING_API_KEY | x-api-key header not sent |
| 401 | INVALID_API_KEY | x-api-key value isn't a recognised, active key |
| 404 | NOT_FOUND | the carrier has no tracking data for this AWB — wrong/expired/mistyped number |
| 429 | RATE_LIMITED | too many requests from this key in a short window — back off and retry |
| 500 | SCRAPER_ERROR | the carrier's own system errored or the scrape otherwise failed unexpectedly |
| 503 | CARRIER_DISABLED | this carrier is temporarily disabled on our side |
| 503 | CARRIER_UNAVAILABLE | the carrier is failing consistently right now — try again shortly |
| 504 | TIMEOUT | the carrier's system took too long to respond |
Each API key is limited to 20 requests per rolling 60-second window. Exceeding it returns 429 RATE_LIMITED with a Retry-After header. This is a backstop against runaway polling loops, not a billing gate — if your integration genuinely needs a higher ceiling, ask us.
Need a key, a higher rate limit, or a carrier we don't support yet? Reach out and we'll sort it out.
Contact us →