Multi-carrier tracking,
one API.
Real-time status for 45 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 us with 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 CourierShree MarutiShree Anjani CourierOM Logistics13-digit numeric docketVRL Logistics10-digit LR numberTCI Express6–10 digit docket numberSafexpress12-digit waybill number| 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 |
| 429 | QUOTA_EXCEEDED | this key has used its monthly call allowance — resets at the start of the next month |
| 429 | UPSTREAM_RATE_LIMITED | the carrier is throttling requests — honor Retry-After before trying again |
| 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 |
Two ceilings apply, both set by your plan: a per-minute rate limit and a monthly call allowance. Exceeding either returns 429 with a Retry-After header — RATE_LIMITED for the per-minute one, QUOTA_EXCEEDED for the monthly one.
| Plan | Per minute | Calls per month |
|---|---|---|
| Trial | 10 | 250 |
| Starter | 30 | 3,000 |
| Growth | 60 | 15,000 |
| Scale | 120 | 75,000 |
| Enterprise | 300 | Unmetered |
Every response carries X-Quota-Limit, X-Quota-Used and X-Quota-Reset, so you can watch your own budget rather than discover the ceiling by hitting it. The allowance resets at the start of each calendar month, UTC. Need a higher one? Ask us.
/api/v1/usageCheck your plan, limits, and usage without placing a tracking call. Same x-api-key header as /api/v1/track, and it never counts against your monthly allowance.
curl "https://www.trackparcel.in/api/v1/usage" \
-H "x-api-key: YOUR_API_KEY"Response:
{
"success": true,
"plan": "growth",
"rateLimitPerMinute": 60,
"monthlyCallQuota": 15000,
"used": 4213,
"remaining": 10787,
"resetsAt": "2026-09-01T00:00:00.000Z",
"totalRequests": 88210,
"lastUsedAt": "2026-08-19T03:41:00.000Z"
}remaining and monthlyCallQuota are null on an unmetered plan. This endpoint has its own, more generous rate limit and stays reachable even if your key has been paused, so you can always see why.