FreightTrackAPI

Examples

Practical code samples to get you integrated fast. Replace YOUR_API_KEY with the key from your dashboard.

Track a booking with curl

curl https://api.freighttrackapi.com/track/2751234567 \
  -H "x-api-key: YOUR_API_KEY"

List available carriers

curl https://api.freighttrackapi.com/carriers \
  -H "x-api-key: YOUR_API_KEY"

Node.js / TypeScript

import fetch from "node-fetch"; // or use built-in fetch in Node 18+

const API_KEY = process.env.FREIGHTTRACK_API_KEY!;
const BASE_URL = "https://api.freighttrackapi.com";

async function track(bookingNumber: string) {
  const res = await fetch(`${BASE_URL}/track/${bookingNumber}`, {
    headers: { "x-api-key": API_KEY },
  });

  if (!res.ok) {
    const error = await res.json();
    throw new Error(`Tracking failed: ${error.message}`);
  }

  return res.json();
}

// Usage
const data = await track("2751234567");
console.log(`Carrier: ${data.carrier}`);
console.log(`Steps: ${data.steps.length}`);
data.steps.forEach((step: { stepIndex: number; portOfLoadingName?: string; portOfDischargeName?: string; eta?: string | null }) => {
  console.log(
    `  [${step.stepIndex}] ${step.portOfLoadingName} -> ${step.portOfDischargeName}`,
    `  ETA: ${step.eta ?? "unknown"}`
  );
});

Python

import os
import requests

API_KEY = os.environ["FREIGHTTRACK_API_KEY"]
BASE_URL = "https://api.freighttrackapi.com"

def track(booking_number: str) -> dict:
    response = requests.get(
        f"{BASE_URL}/track/{booking_number}",
        headers={"x-api-key": API_KEY},
    )
    response.raise_for_status()
    return response.json()

# Usage
data = track("2751234567")
print(f"Carrier: {data['carrier']}")
print(f"Steps: {len(data['steps'])}")
for step in data["steps"]:
    print(
        f"  [{step['stepIndex']}] {step.get('portOfLoadingName')} -> {step.get('portOfDischargeName')}"
        f"  ETA: {step.get('eta', 'unknown')}"
    )

Error handling

const res = await fetch("https://api.freighttrackapi.com/track/UNKNOWN123", {
  headers: { "x-api-key": "YOUR_API_KEY" },
});

if (!res.ok) {
  const body = await res.json().catch(() => ({}));
  switch (res.status) {
    case 400:
      // Unknown, ambiguous, or disabled carrier
      console.error("Bad request:", body.message);
      break;
    case 401:
      // Missing or invalid API key
      console.error("Unauthorized — check your x-api-key header");
      break;
    case 429:
      // Rate limit exceeded
      console.error("Rate limit hit — back off and retry");
      break;
    default:
      console.error(`Unexpected error ${res.status}:`, body.message);
  }
}