Normalized tracking data
Convert fragmented carrier updates into consistent statuses, locations, timestamps, and customer-ready event copy.
One REST API to track any package: carrier auto-detection, clean statuses, and webhook-ready delivery events from 80+ carriers.
curl https://api.traceapi.dev/v1/track \
-H "Authorization: Bearer trc_live_xxx" \
-H "Content-Type: application/json" \
-d '{"tracking_number":"YT2412345678"}'
{
"tracking_number": "YT2412345678",
"carrier": {
"code": "yunexpress",
"name": "YunExpress",
"type": "dropshipping"
},
"status": "in_transit",
"events": [
{
"status": "in_transit",
"description": "Package departed sorting facility",
"location": "Shenzhen, China",
"timestamp": "2026-07-01T14:30:00Z"
}
],
"cached": false,
"request_id": "req_abc123"
}Trace turns fragmented logistics signals into a single, developer-friendly API response.
Convert fragmented carrier updates into consistent statuses, locations, timestamps, and customer-ready event copy.
Auto-detect common domestic, premium, and dropshipping carriers from tracking number patterns.
Multiple tracking sources are checked behind the scenes to improve coverage when carrier pages are incomplete.
Fresh lookups are cached for 30 minutes so repeated status checks stay fast and cost-aware.
The happy path is deliberate: read docs, create an account, copy a key, test tracking, then verify your webhook.
curl https://api.traceapi.dev/v1/track \
-H "Authorization: Bearer $TRACE_API_KEY" \
-H "Content-Type: application/json" \
-d '{"tracking_number":"YT2412345678"}'
# Returns carrier, status, events, cache state and request id.const tracking = await fetch("https://api.traceapi.dev/v1/track", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.TRACE_API_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({ tracking_number: order.trackingNumber })
}).then((res) => res.json());
console.log(tracking.status, tracking.events.at(-1));{
"event_type": "tracking.delivered",
"tracking": {
"tracking_number": "YT2412345678",
"status": "delivered",
"carrier": { "code": "yunexpress", "name": "YunExpress" },
"last_event": "Delivered"
}
}import os, requests
tracking = requests.post(
"https://api.traceapi.dev/v1/track",
headers={"Authorization": f"Bearer {os.environ['TRACE_API_KEY']}"},
json={"tracking_number": "YT2412345678"},
).json()A simple, elegant API so you can start tracking packages in minutes. It fits right into your code with snippets for your favorite programming languages.
import os, requests
tracking = requests.post(
"https://api.traceapi.dev/v1/track",
headers={"Authorization": f"Bearer {os.environ['TRACE_API_KEY']}"},
json={"tracking_number": "YT2412345678"},
).json()
print(tracking["status"], tracking["events"][-1]["description"])For prototypes and occasional tracking lookups.
$0
10 requests per minute
500 monthly lookups
Carrier auto-detection
JSON responses and webhooks
For growing stores and lightweight support workflows.
$29/mo
60 requests per minute
10,000 monthly lookups
Carrier auto-detection
JSON responses and webhooks
For high-volume tracking pages and post-purchase products.
$99/mo
120 requests per minute
50,000 monthly lookups
Carrier auto-detection
JSON responses and webhooks
For platforms needing priority support, SLAs, and private routing.
$499/mo
300 requests per minute
Unlimited monthly lookups
Carrier auto-detection
JSON responses and webhooks
Ready in 30 seconds