Shipment tracking API · 43+ live carriers · one JSON shape
Build Your Tracking — Free for 3 Months
†Ping us.usps 9400 1118 9956 2537 8663 61
Stop paying for tracking infrastructure during your launch. USPS · UPS · FedEx · DHL & 43+ carriers — 10,000 lookups/month × 3 months free for subscribers who write one short post about WhereParcel.
- CarriersUSPS · UPS · FedEx · DHL · 43+ carriers worldwide
- The postAny language · any platform · any length
†Ambassador program — for customers who have paid for at least one month and keep an active subscription. There is no free tier. See what to write →
curl -X POST https://api.whereparcel.com/v2/track \
-H "Content-Type: application/json" \
-H "Authorization: Bearer YOUR_API_KEY:YOUR_SECRET_KEY" \
-d '{"trackingItems":[{"carrier":"us.usps","trackingNumber":"9400111899562537866361"}]}' {
"success": true,
"data": [{
"carrier": "us.usps",
"trackingNumber": "9400111899562537866361",
"status": "success",
"data": {
"deliveryStatus": "in_transit",
"estimatedDelivery": "2026-10-02T00:00:00.000Z",
"events": [ {…}, {…}, {…}, {…}, {
"timestamp": "2026-09-29T10:12:00.000Z",
"status": "in_transit",
"location": "ATLANTA GA NETWORK DISTRIBUTION CENTER",
"rawStatus": "Arrived at USPS Regional Facility",
"rawDescription": "Arrived at USPS Regional Facility"
}]
},
"billable": true,
"cached": false
}],
"results": […],
"summary": {
"total": 1, "success": 1, "failed": 0,
"usageIncremented": 1
},
"requestLimit": {…}, "trackingQuota": {…}
} - Per item:
successorerror— one bad number doesn't fail the batch. -
deliveryStatusis one of nine normalized values (FIG. 2). - = Thu, Oct 1, 8:00 pm ET
- Oldest first; the last one is the newest scan.
- = Tue, Sep 29, 6:12 am ET
- USPS's own wording stays in
rawStatusandrawDescription. - Cache hits come back with
billable: false. - Deprecated alias of
data. - = items with billable: true
Don't know the carrier? Use our free Tracking Number Validator — paste any number, we'll detect the carrier from the format. No signup.
Try API Now →Follow one parcel
The parcel from FIG. 1, label to doorstep. Four stops, four deliveryStatus values, one response shape the whole way.
-
SEP 26 18:42
Shipping Label Created, USPS Awaiting Item
BROOKLYN, NY 11201
-
SEP 27 16:05
Accepted at USPS Origin Facility
BROOKLYN, NY 11256
-
SEP 27 21:37
Departed USPS Facility
BROOKLYN NY DISTRIBUTION CENTER
-
SEP 28 --:--
In Transit to Next Facility
timeUnknown: truedate only, noon filled in -
SEP 29 06:12
Arrived at USPS Regional Facility
ATLANTA GA NETWORK DISTRIBUTION CENTER
-
OCT 1 by 20:00
Expected Thu, Oct 1 · by 8:00 pm
estimatedDelivery
Why pay more?
UPS, USPS, FedEx, DHL and other major carriers already work reliably. Missing a carrier? Just request it.
There's no reason to pay more for AfterShip or Ship24.
Submit a request and we'll add it fast — and you can cancel anytime.
Most carrier requests are added within days.
Carrier guides: USPS Tracking API · UPS · FedEx · DHL
us.amazon isn't live yet. Ask, and it goes on the list. Why Developers Choose Our Tracking API
One request shape, one response shape, one status model. The carrier-specific mess stays on our side of the API.
One Status Model for Every Carrier
Every carrier's scans map to the same nine deliveryStatus values (FIG. 2). The carrier's own wording is kept alongside in rawStatus and rawDescription.
pending · in_transit · out_for_delivery · delivered · failed · returned · cancelled · lost · unknown
FIG. 2Three carriers, three dialects, two answers. Ping reads the dialects so your code only has to know nine words.
Real-time Webhook Notifications
Get instant delivery updates via webhooks. No polling needed — we push status changes to your endpoint automatically.
POST https://yourapp.com/webhooks/tracking X-WhereParcel-Event: tracking.updated X-WhereParcel-Timestamp: 2026-09-29T10:20:41.000Z X-WhereParcel-Signature: 9f2c41…e07b
HMAC-SHA256 of the JSON body, hex, keyed with your endpoint's secret.
Enterprise-Grade Security
API key + secret authentication, HMAC-SHA256 signed webhooks, rate limiting, and TLS encryption. Your data is encrypted and protected.
Authorization: Bearer KEY:SECRET Developer-First Documentation
OpenAPI 3.0 spec, code examples in 5 languages, interactive playground. Ship your integration in under an hour.
POST /v2/track GET /v2/carriers POST /v2/detect GET /v2/countries
Flat Monthly Pricing
One monthly request quota for USPS, UPS, FedEx, DHL and more — no per-shipment fees, no hidden fees, no long-term contracts. Cancel anytime.
Starter $49/mo · 10K requests/monthSee all plans →
Integrate in Minutes, Any Language
Start tracking packages with just a few lines of code. Choose your language and copy the example.
us.usps = from the form // npm install whereparcel
import { WhereParcel } from 'whereparcel';
const wp = new WhereParcel('YOUR_API_KEY', 'YOUR_SECRET_KEY');
const res = await wp.track([
{ carrier: 'us.usps', trackingNumber: '9400111899562537866361' },
]);
const item = res.data[0];
if (item.status === 'success') {
console.log(item.data.deliveryStatus);
console.log(item.data.events);
}curl -X POST https://api.whereparcel.com/v2/track \
-H "Authorization: Bearer YOUR_API_KEY:YOUR_SECRET_KEY" \
-H "Content-Type: application/json" \
-d '{"trackingItems":[{"carrier":"us.usps","trackingNumber":"9400111899562537866361"}]}'const res = await fetch('https://api.whereparcel.com/v2/track', {
method: 'POST',
headers: {
'Authorization': 'Bearer YOUR_API_KEY:YOUR_SECRET_KEY',
'Content-Type': 'application/json',
},
body: JSON.stringify({
trackingItems: [{ carrier: 'us.usps', trackingNumber: '9400111899562537866361' }],
}),
});
const { data } = await res.json();
console.log(data[0].data.deliveryStatus);import requests
res = requests.post(
"https://api.whereparcel.com/v2/track",
headers={"Authorization": "Bearer YOUR_API_KEY:YOUR_SECRET_KEY"},
json={"trackingItems": [{"carrier": "us.usps", "trackingNumber": "9400111899562537866361"}]},
)
print(res.json()["data"][0]["data"]["deliveryStatus"])$ch = curl_init('https://api.whereparcel.com/v2/track');
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
'Authorization: Bearer YOUR_API_KEY:YOUR_SECRET_KEY',
'Content-Type: application/json',
],
CURLOPT_POSTFIELDS => json_encode(['trackingItems' => [
['carrier' => 'us.usps', 'trackingNumber' => '9400111899562537866361'],
]]),
]);
$res = json_decode(curl_exec($ch), true);
echo $res['data'][0]['data']['deliveryStatus'];body := strings.NewReader(`{"trackingItems":[{"carrier":"us.usps","trackingNumber":"9400111899562537866361"}]}`)
req, _ := http.NewRequest("POST", "https://api.whereparcel.com/v2/track", body)
req.Header.Set("Authorization", "Bearer YOUR_API_KEY:YOUR_SECRET_KEY")
req.Header.Set("Content-Type", "application/json")
res, err := http.DefaultClient.Do(req) - One package, typed responses.
-
track()takes an array and returns one result per item. - Each item is
successorerror— one bad number doesn't fail the batch. - Always one of the nine normalized statuses.
No response yet
Open it in the Playground to send this exact request with a demo key. It comes back shaped like FIG. 1.
Ping, waiting on your first request.
Get Started
Pick a plan and get started — cancel anytime. Get your API key instantly from the dashboard.
Make Your First API Call
Use our code examples to send a tracking request. Get real-time delivery status in a single JSON response.
Go Live with Webhooks
Set up webhook endpoints to receive automatic delivery updates. No polling needed — we push changes to you.
Why WhereParcel Over DIY Integration?
Stop wasting months on carrier-by-carrier integration. Ship faster with a unified API.
Simple, Transparent Pricing
Choose the plan that fits your needs. No hidden fees, cancel anytime.
No obligation if you check this — you won't be penalized for not writing. Publish a short post about WhereParcel and we'll add 3 or more months of your plan for free, depending on the post.
| Plan | USD / month | Requests / month | Requests / minute | API keys | Support | Uptime SLA | Subscribe |
|---|---|---|---|---|---|---|---|
| StarterFor side projects and small apps | $49 | 10K | 30 | 3 | — | Get Started Subscribe & Join the Event | |
| ProBest DealFor growing businesses | $99 | 30K≈ 1,000 / day | 60 | 10 | Priority | — | Get Started Subscribe & Join the Event |
| GrowthFor scaling teams | $250 | 100K | 100 | 20 | Priority | — | Get Started Subscribe & Join the Event |
| ScaleFor high-volume operations | $450 | 200K | 150 | 50 | Dedicated | — | Get Started Subscribe & Join the Event |
| BusinessFor enterprise — dedicated support and 99.95% SLA | $650 | 300K | 200 | Unlimited | Dedicated | 99.95% | Get Started Subscribe & Join the Event |
Webhook notifications · Included · Cancel anytime
Cancel AnytimeCancel anytime from your dashboard — you keep access until the end of your billing period. No long-term contracts.Cancel anytime from your dashboard — you keep access until the end of your billing period. And if you publish a post about us, we'll add 3+ months of your plan for free.
‡Ambassador rewards go to customers who have paid for at least one month and keep an active subscription. The standard reward is 3 months of Starter; longer rewards are decided per post.
Frequently Asked Questions
View All Frequently Asked Questions →What is a shipment tracking API?
How many carriers does WhereParcel support?
Can I try WhereParcel for free?
How do I integrate WhereParcel into my application?
Which countries and carriers does WhereParcel cover?
How does webhook tracking work?
What is the average API response time?
Can I track international and cross-border shipments?
How does WhereParcel compare to AfterShip, 17TRACK, Tracktry, and Parcellab?
Is WhereParcel suitable for e-commerce platforms?
Do you support OnTrac, Amazon Logistics, and other US regional carriers?
What is the UPU S10 tracking number format?
How do I tell which carrier a tracking number belongs to?
Talk to Us — We Actually Reply
Have a question? Need a carrier added? Just want to say hi? We're a small team that reads every message. No question is too small — drop by our Discord and let's chat.