Multi-carrier tracking,
one API.
Query one of 145 registered courier integrations per request using the same tracking pipeline that powers trackparcel.in. Status freshness and carrier availability vary.
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; one that matches no key returns 401 INVALID_API_KEY. A paused or expired key returns 403 API_KEY_PAUSED or 403 API_KEY_EXPIRED. If verification itself is briefly unavailable you get 503 AUTH_UNAVAILABLE with a Retry-After header - retry; nothing has happened to your 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. It is looked up the way the website looks it up: upper-cased, with hyphens and underscores removed unless the carrier's format needs them (DPD UK, Better Trucks), so ek-123456789-in is tracked as EK123456789IN. |
| carrier | Yes | Carrier name from the supported carriers list below, or the carrier ID that responses return as courier (e.g. dtdc). Letter case is ignored. |
Pass one of these names as carrier, or the carrier ID a response returned in courier. Letter case is ignored.
India PostEE123456789INDelhivery1234567890123 (13 digits)Bluedart77123456789 (11 digits)DTDCV3501635425 (letter + 8–10 digits)Xpressbees123456789012 (12–15 digits)ShadowfaxSF123456789Tirupati CourierNumeric tracking numberEkart / FlipkartFMPP123456789Allcargo Gati123456789 (9 digits)Trackon100460071020 (12-digit numeric example)ValmoVL0079830856386 or VLR082366337922ST Courier12345678901 (11 digits)Shree Maruti26038100038386 (14-digit numeric example)Shree Anjani Courier1569745741 (typically 10 digits)OM Logistics8574261000643 (13 digits)VRL Logistics9026500516 (10-digit LR number)TCI Express478049353 (6–10 digit docket)Safexpress100007550525 (12-digit waybill)Shree Nandan Courier3018262007293 (13-digit consignment number)Shree Mahavir Express122010060616 (12-digit LR number)Atlantic International Express9221288863 (8-12 digit AWB)Saudi Post (SPL)EBUXSL1577121526 (alphanumeric, 13-18 chars)Vagex (Vagmini Express)HTN6208242 (alphanumeric waybill)Pushpak Courier1484144029 (numeric consignment number)EMS PostEG050318595KR (2-letter country prefix + 8 digits + 2-letter suffix)Sky Express8001073801 (numeric AWB)Naqel Express409456087 (numeric waybill)SPX Express SingaporeSPXSG064872753398 (SPXSG + 12 digits)SPX Express MalaysiaMY062298159165 (MY + 12 digits)SPX Express ThailandTH068974877738 (TH + 12 digits)SPX Express VietnamSPXVN05338454932C (SPX Vietnam waybill)SPX Express IndonesiaSPXID069390816209 (SPX Indonesia waybill)SPX Express PhilippinesSPEPH05708467575C (SPX Philippines waybill)SPX Express BrazilBR262183465237X (SPX Brazil waybill)OnTrac1LSCXM123456789 (OnTrac tracking number)DHLinkAUSQH5087643214YQ (alphanumeric)Aramex AustraliaMP0081370730 (2 letters + 10 digits)ArcBest800123115 (9-digit PRO number)APC Postal LogisticsUJ159661236US (13-character UPU format)Jetline Couriers905841381 (9-digit AWB number)Bombino Express72517782667 (11-digit AWB number)Garuda Vega23330285000 (11-digit AWB number)Gokulam Speed & SafeM900321531 (letter + 9 digits)AICS700608221 (9-digit AWB number)Cainiao GlobalLP00142520904802 (LP + 12–16 digits)Japan PostEN123456789JP (2 letters + 9 digits + JP) or 11–12 digit Yu-PackKorea Post6812345678901 (13-digit domestic barcode)ELTA CourierRR123456789GR (S10) or 10–12 digit domestic voucherShiprocket4867524799385 (10–15 digit Shiprocket AWB)V-Xpress4000037731 (10-digit docket)iThink LogisticsILSP3000745074 (ILSP + digits)PikndelPA3849873 (PA + digits)Mark Express378760761 (9-digit)GAP Akis ExpressC910002421 (C + digits)CTT Express0079350082809761033648 (22 digits)La PosteCH827600380DE (UPU S10 format)Poczta PolskaCP306260639PL (UPU S10 format)OSM Worldwide9261290278831109228141 (22 digits)YDH ExpressYDH1013038374AZ (YDH + digits + letters)SunYou36YPJ335727401000935108 (YPJ series)DAI Post00393580940164697354 (20 digits)YunExpressYT2623100700785323 (YT + 16 digits)Nova Poshta59500007312060 (14 digits)Austrian PostCD109861478AT (UPU S10 format)KazPostRR079548215KZ (UPU S10 format)Thailand PostLA003860879TH (UPU S10 format)Cyprus PostRB027302194CY (UPU S10 format)GO! Express & Logistics158940012345 (12 digits)ICL Express1234567 (7-digit consignment number)Oxford Express123456789 (Oxford Express AWB)BlitzGS1234567890 (GS + 10 digits)Fastway Express1234567 (numeric consignment number)Franch Express12345678901 (11-digit AWB)Madhur Couriers1234567890 (10-digit C-Note number)Velocity ExpressVE123456789 (VE + 9 digits)QuickShift12345678901 (AWB or order number)OBN Express123456 (numeric docket number)Air India Cargo098-12345678 (098 + 8-digit serial)NimbusPost12345678901234 (the delivering courier's AWB)ShipClues12345678901234 (the delivering courier's AWB)Skynet India1234567890 (10-digit AWB)RapidShyp12345678901234 (the delivering courier's AWB)TNT Express123456789 (9-digit consignment number)Kuehne+Nagel1234567890 (10-digit tracking or house bill number)Dachser01234567890 (11-digit consignment number)Landmark GlobalLTN12345678 (LTN + 8 digits)Interlogistica1234567 (numeric waybill number)InPost123456789012345678901234 (24 digits)A1 PostM1234567890 (letter M + 10 digits)ParcelpointABCD1234 (letters and digits from the collection message)CJ Logistics123456789012 (10 or 12 digits)Econt1234567890123 (13-digit shipment number)4PX4PX1234567890123CN (4PX + 13 digits + CN)Palletways60012345678 (11-digit tracking ID)Geniki Taxydromiki1234567890 (10-digit voucher number)Paquetexpress123456789012 (12-digit tracking number)PBT Express Freight12345678 (consignment or ticket number)Fargo Courier1234567 (numeric waybill number)JanioJN1234567890 (tracking number from the seller)MailAmericasMLAR012345678EX (letters, digits and a two-letter suffix)ORLEN Paczka2345678901234 (13 digits starting with 2 or 3)Cargowale123456789 (numeric tracking number)V-Trans1234567890 (numeric docket number)ShipGlobal USFFUSA1234568 (FFUSA + digits)ePost GlobalEPG123456789012 (EPG + digits)Stallion ExpressU000123456789012 (U + digits)CouriersPleaseCPCQAOS0039362 (CPC + letters/digits)Hrvatska pošta (Croatia Post)RA123456789HR (UPU S10 format)Pos MalaysiaENE123456789MY (Pos Laju format)Singapore PostRC123456789SG (SingPost UPU format)Correos EspañaPQ123456789ES (Correos España format)Oman PostRR123456789OM (Oman Post UPU format)PostNord1234567890 (PostNord shipment ID)Posta Shqiptare (Albania Post)RR123456789AL (Albania Post UPU format)Allied Express (Australia)1234567890 (Allied Express consignment number)GoBoltGBL123456789 (GoBolt tracking number)Better Trucks (US)BTS_01234567890 (Better Trucks tracking number)GSI Express6300123456 (GSI Express invoice/tracking number)GOFO ExpressGFUS01045078676609 (GOFO Express waybill)SMSA Express (Saudi Arabia)123456789012 (SMSA Express AWB)ElasticRunMX1A2B3CCC45YD or VT1234567890123456DC (ElasticRun AWB)CIRRO Global20251234567890 or YT1234567890123456 (CIRRO Global waybill)GEODIS1GABC5X1YZ78 or 1ABC234DEF56 (GEODIS shipment number)BTX Global LogisticsBDR1234567 (BTX airbill number)Quiqup (Middle East)12345678 (Quiqup order reference)AIT Worldwide Logistics12345678 (AIT FasTrak shipper/order number)DPD China12345678901234 (DPD China shipment number)DPD UK15508330934428-21378 (DPD parcel number plus five-digit delivery postcode)Qwintry LogisticsCJ019123456RU or QR21977950 (Qwintry tracking number)Marken1234567 (Marken tracking ID / job number)Nippon ExpressNEU12345678 (Nippon Express e-NX tracking number)SEKO Logistics123456789 (SEKO tracking number)IndiGo CarGo312-12358905 (3-digit airline prefix + 8-digit AWB)Schneider123456789 (Schneider bill of lading / PRO reference)Southeastern Freight Lines123456789 (SEFL PRO number)R+L Carriers123456789 (R+L PRO number)Daylight Transport154565451 (Daylight Transport probill / PRO number)FAN CourierF75600258 (FAN Courier AWB)FedEx International Connect142166360 (FedEx International Connect reference)South African Post OfficeLA966796261GB (UPU S10 format)Averitt Express0038060450 (Averitt PRO number)Dayton Freight825307061 (Dayton Freight PRO number)Hanjin Transportation462836448432 (Hanjin waybill)PacketaZ1234567890 (Z + 10 digits; Packeta / Zásilkovna)FleetOpticsFEPO260700001249080 or FONSP20001249307 (letters and digits)| Field | Description |
|---|---|
| success | Whether the request succeeded. Always check this before reading data, then check stale: a successful answer can be the last known status rather than a live one. |
| courier | Carrier ID (e.g. "dtdc"). It is accepted back as the carrier param. |
| 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. On a stale answer, when the status was last read from the carrier. |
| cacheExpiresIn | Seconds until this result would be re-scraped on the next request. 0 on a stale answer: the copy is already past its freshness window. |
| stale | Only present, as true, when the carrier could not be reached and this is the last status we read for the number. Show it as last known, not current. |
| staleReason | Why a stale answer was served. Currently always "CARRIER_UNAVAILABLE". |
| dataAgeSeconds | On a stale answer, how many seconds old the data is. |
| fallbackSource | Only present when the status came from a secondary tracking source instead of the carrier's own system - currently "parcelsapp", for some DTDC lookups. |
| 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. |
Stale answers. When a carrier can't be reached, the API may answer with the last status it read for that number, up to 24 hours past its freshness window, instead of an error. That answer still has success: true, but carries stale: true, staleReason and dataAgeSeconds, and its cacheExpiresIn is 0. Show it as the last known status with its age, not as the current one, and wait a few minutes before asking again: every call is charged, and a carrier that was unreachable a moment ago usually still is.
Responses are private to your key: every one is sent with Cache-Control: private, no-store, so don't put a shared cache in front of these calls.
Errors share this shape:
{
"success": false,
"error": "NOT_FOUND",
"message": "No tracking data found for V3501635425"
}A few add fields. NOT_FOUND can carry suggestedCarrier (a carrier ID you can send straight back as carrier) and suggestedCarrierName when the number looks like another carrier's. API_KEY_EXPIRED carries expiresAt, and UPSTREAM_RATE_LIMITED carries retryAfterSeconds.
| 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 name or carrier ID |
| 401 | MISSING_API_KEY | x-api-key header not sent |
| 401 | INVALID_API_KEY | x-api-key value doesn't match any key - mistyped, or the key was revoked |
| 403 | API_KEY_PAUSED | this key has been paused - contact us to resume it; /api/v1/usage still answers |
| 403 | API_KEY_EXPIRED | this key is past its expiry date (expiresAt in the body) - contact us to renew it; /api/v1/usage still answers |
| 404 | NOT_FOUND | the carrier has no tracking data for this AWB - wrong/expired/mistyped number, or another carrier's (see suggestedCarrier below) |
| 422 | CARRIER_RESTRICTED | the carrier has restricted online tracking for this number - the booking branch has to be asked instead |
| 429 | RATE_LIMITED | too many requests from this key in a short window, or too many requests with an unknown, paused or expired key from your address - back off and retry after Retry-After |
| 429 | QUOTA_EXCEEDED | this key has used its monthly call allowance - resets on the key's monthly creation-date anniversary |
| 429 | UPSTREAM_RATE_LIMITED | the carrier is throttling requests - honor Retry-After before trying again |
| 503 | AUTH_UNAVAILABLE | key verification is temporarily unavailable - your key has not changed; retry after Retry-After. The lookup was not admitted or charged |
| 503 | QUOTA_UNAVAILABLE | quota verification is temporarily unavailable - retry shortly; the lookup was not admitted or charged |
| 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 - the lookup is not charged |
| 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. Separately, each client address may send up to 60 requests a minute with an unknown, paused or expired key; past that, requests from that address get 429 RATE_LIMITED until the minute is up, whichever key they carry.
| Plan | Per minute | Calls per month |
|---|---|---|
| Trial | 10 | 250 |
| Starter | 30 | 3,000 |
| Growth | 60 | 15,000 |
| Scale | 120 | 75,000 |
| Enterprise | 300 | Unmetered |
Responses to admitted tracking lookups carry 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. Quota headers are not present on every response: early validation and authentication failures, rate-limited requests, and other error responses returned before the quota check may omit them. Each key renews monthly on its own creation-date anniversary, at the same UTC time it was issued. 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",
"paused": false,
"expired": false,
"expiresAt": "2027-01-15T18:29:59.999Z",
"rateLimitPerMinute": 60,
"monthlyCallQuota": 15000,
"extraCalls": 0,
"used": 4213,
"remaining": 10787,
"resetsAt": "2026-09-15T08:30:00.000Z",
"totalRequests": 88210,
"lastUsedAt": "2026-08-19T03:41:00.000Z"
}remaining and monthlyCallQuota are null on an unmetered plan. extraCalls is any allowance added to your key on top of the plan quota for the current billing period: it is already counted in remaining and in the X-Quota-Limit header, and it ends at resetsAt.
This endpoint has its own limit of 30 requests per minute per key, whatever your plan, separate from the /api/v1/track limit. It stays reachable even if your key has been paused or has expired, so you can always see why tracking calls are refused: paused and expired say which applies, and expiresAt is when the key stops working (null if it doesn't expire).