Playground

Ask it yourself. Real lookups, in the browser.

Pick a carrier, type a tracking number, send. The request your code would make is on the left and the answer is on the right. 10 lookups a day without a key.

Request

POST /v1/track
carrier
One number per line. With a key: 35 for USPS, 1 for the others. Without a key: 1 per request.
Optional. Without a key you get 10 lookups a day from your IP address. With your key it is your own 1,000 a month. The key stays in this browser tab. Get a free key
One request is one lookup. Errors do not count, except “not found”.
curl https://api.shipmenttrackingapi.com/v1/track \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"carrier":"ups","trackingNumbers":["YOUR_TRACKING_NUMBER"]}'
The request your code sends. It needs a key; this page’s keyless trial goes through its own endpoint.

Response

200 OKExample shipment. Type a tracking number and send to see a real one.
{
"success": true,
"data": {
"carrier": "ups",
"results": [
{
"trackingNumber": "YOUR_TRACKING_NUMBER",
"status": "delivered",
"events": [
{
"timestamp": "2026-11-03T16:12:00-05:00",
"status": "pending",
"description": "Shipper created a label, UPS has not received the package yet.",
"location": "Louisville, KY, US"
},
{
"timestamp": "2026-11-04T19:41:00-05:00",
"status": "in_transit",
"description": "Departed from Facility",
"location": "Louisville, KY, US"
},
{
"timestamp": "2026-11-05T03:27:00-06:00",
"status": "in_transit",
"description": "Arrived at Facility",
"location": "Hodgkins, IL, US"
},
{
"timestamp": "2026-11-05T08:52:00-06:00",
"status": "out_for_delivery",
"description": "Out For Delivery Today",
"location": "Chicago, IL, US"
},
{
"timestamp": "2026-11-05T13:36:00-06:00",
"status": "delivered",
"description": "DELIVERED",
"location": "Chicago, IL, US"
}
]
}
]
}
}
ErrorsSame shape every time

When it says no, it says why.

Every error carries a code your program can switch on and a sentence a person can read. Only one of them, a clear “not found”, counts as a lookup.

CodeHTTPWhen
INVALID_CARRIER400The carrier is not one of usps, ups, fedex, dhl.
INVALID_TRACKING_NUMBER400A number is malformed, repeated, or not valid for that carrier. trackingNumbers is always an array.
TOO_MANY_TRACKING_NUMBERS400More numbers than the carrier takes in one request: 35 for USPS, 1 for the others. The keyless trial takes 1.
AUTH_MISSING_API_KEY401There is no Authorization header.
AUTH_INVALID_API_KEY401The key does not exist.
KEY_INACTIVE403The key was turned off.
DEMO_ORIGIN_NOT_ALLOWED403The keyless trial was called from somewhere other than this page.
NOT_FOUND404There is no such endpoint. Check the path and the method.
TRACKING_NOT_FOUND200The carrier has no record of that number. It comes inside results, for that number only. This is the one that counts.
RATE_LIMIT_EXCEEDED429More than 30 requests in a minute with a key or 6 on the keyless trial, or the trial is busy. Retry-After says when to come back.
MONTHLY_QUOTA_EXCEEDED429The account has used its 1,000 lookups for the month.
IP_QUOTA_EXCEEDED429The IP address has used its 1,000 lookups for the month, across every key.
DEMO_LIMIT_REACHED429The keyless trial is used up for the day: 10 lookups per IP address, or the daily total shared by all visitors.
INTERNAL_ERROR500Something unexpected on our side. Try again.
CARRIER_ERROR200The carrier did not answer for that number. It comes inside results, for that number only. Try again.
SERVICE_UNAVAILABLE503Something on our side. Try again.

One exception: a body that is not valid JSON is refused before it reaches the API, with a plain 400 and no JSON.

StartAbout a minute

Ten a day is for trying. A key gets you 1,000 a month.