REST API v2

TrackFlow API Documentation

Integrate real-time shipment tracking into any application. Our REST API supports 700+ carriers globally, returns structured JSON, and delivers webhook events to keep your systems in sync.

Base URL https://api.trackflow.io/v2
Generate your API key from the TrackFlow Dashboard. Keep it secret — never expose it in client-side code.
# Pass your API key in the X-API-Key header
curl https://api.trackflow.io/v2/track/1Z204E380338943508 \
  -H "X-API-Key: tf_live_sk_xxxxxxxxxxxxxxxxxxxx" \
  -H "Accept: application/json"
const trackPackage = async (trackingNumber) => {
  const res = await fetch(
    `https://api.trackflow.io/v2/track/${trackingNumber}`,
    {
      headers: {
        'X-API-Key': 'tf_live_sk_xxxxxxxxxxxxxxxxxxxx',
        'Accept':    'application/json',
      },
    }
  );
  return res.json();
};
import requests

headers = {
    "X-API-Key": "tf_live_sk_xxxxxxxxxxxxxxxxxxxx",
    "Accept":    "application/json",
}
res = requests.get(
    "https://api.trackflow.io/v2/track/1Z204E380338943508",
    headers=headers,
)
data = res.json()
GET

Path Parameters

ParameterTypeRequiredDescription
trackingNumber string Required The carrier tracking number (e.g. 1Z204E380338943508)

Query Parameters

ParameterTypeRequiredDescription
carrier string Optional Carrier code (e.g. ups, fedex). Auto-detected if omitted.
lang string Optional Language for event descriptions. Default: en

Response — 200 OK

{
  "success": true,
  "tracking_number": "1Z204E380338943508",
  "carrier": {
    "code": "ups",
    "name": "UPS",
    "service": "UPS Ground"
  },
  "status": "in_transit",
  "status_description": "Package transferred to destination facility",
  "estimated_delivery": "2026-06-17T23:59:00Z",
  "origin": { "city": "Los Angeles", "country": "US" },
  "destination": { "city": "New York", "country": "US" },
  "events": [
    {
      "status": "Package transferred to destination facility",
      "location": "Louisville, KY",
      "timestamp": "2026-06-15T03:42:00Z",
      "type": "transit"
    }
  ],
  "last_updated": "2026-06-15T09:00:00Z"
}
POST
Batch requests are counted as individual tracking lookups against your rate limit quota.

Request Body

curl -X POST https://api.trackflow.io/v2/track/batch \
  -H "X-API-Key: tf_live_sk_xxxxxxxxxxxxxxxxxxxx" \
  -H "Content-Type: application/json" \
  -d '{
    "shipments": [
      { "tracking_number": "1Z204E380338943508", "carrier": "ups" },
      { "tracking_number": "449044304137821",    "carrier": "fedex" }
    ]
  }'
const res = await fetch('https://api.trackflow.io/v2/track/batch', {
  method: 'POST',
  headers: {
    'X-API-Key':     'tf_live_sk_xxxxxxxxxxxxxxxxxxxx',
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    shipments: [
      { tracking_number: '1Z204E380338943508', carrier: 'ups'   },
      { tracking_number: '449044304137821',    carrier: 'fedex' },
    ],
  }),
});
GET

Response — 200 OK

{
  "count": 724,
  "carriers": [
    {
      "code":    "ups",
      "name":    "UPS",
      "country": "US",
      "type":    "express",
      "tracking_format": "^1Z[A-Z0-9]{16}$"
    },
    {
      "code":    "indiapost",
      "name":    "India Post EMS",
      "country": "IN",
      "type":    "postal",
      "tracking_format": "^[A-Z]{2}[0-9]{9}[A-Z]{2}$"
    }
  ]
}
POST

Request Body Parameters

ParameterTypeRequiredDescription
tracking_number string Required The tracking number to subscribe to.
url string Required Your HTTPS endpoint to receive event payloads.
events string[] Optional Filter by event types: delivered, exception, all
Validate webhook payloads using the X-TrackFlow-Signature header (HMAC-SHA256 signed with your webhook secret).
DEL
ParameterTypeRequiredDescription
webhookId string Required The webhook ID returned when the subscription was created.
StatusCodeDescription
400invalid_tracking_numberThe tracking number format is invalid for the specified carrier.
401unauthorizedMissing or invalid API key.
404not_foundNo tracking data found for this number.
429rate_limit_exceededYou have exceeded your plan's request quota.
503carrier_unavailableThe carrier's tracking API is temporarily unavailable.
PlanRequests / minRequests / dayBatch size
Free105005
Starter6010,00020
Growth300100,00050
EnterpriseUnlimitedUnlimited50

Rate limit status is returned in response headers: X-RateLimit-Remaining and X-RateLimit-Reset.

📦
Node.js / TypeScript
npm install @trackflow/sdk
🐍
Python
pip install trackflow
Java
io.trackflow:sdk:2.0
💎
Ruby
gem install trackflow
Free
$0 / month
500 lookups / day
  • All carriers
  • JSON responses
  • Email support
Enterprise
Custom
Unlimited lookups
  • Everything in Growth
  • SLA guarantee
  • Dedicated support
  • Custom integrations