Developer reference

FreightPulse API documentation

Logistics intelligence as structured JSON: live EIA fuel prices, Warp FTL quotes, IMF PortWatch port activity, FMCSA carriers, and GDACS/USGS/NWS disruptions. CSV export is marked SOON.

Introduction

Logistics intelligence as structured JSON, delivered over REST. One key, one base URL.

Base URL

https://freightpulsehq.com/api/v1

Response format

Every response uses the same shape:

JSON — success
{
  "success": true,
  "data": { ... }
}
JSON — error
{
  "success": false,
  "error": "Invalid API key"
}

Authentication

Pass your API key in the X-API-Key header on every request. Without a key, guest access is limited to 100 requests/day per IP.

Get a free API key at signup.

Replace YOUR_API_KEY in the examples.

cURL
curl -H "X-API-Key: YOUR_API_KEY" \
  "https://freightpulsehq.com/api/v1/fuel-prices"

Rate limits & plans

Each plan has a monthly quota and a per-minute request limit. Without an API key, guest access is limited to 100 requests/day per IP.

Plan Monthly quota Requests/minute
Guest (no key) 100 / day per IP
Free 100 / month 5
Basic 1,000 / month 30
Pro 10,000 / month 60
Business 25,000 / month 120
Enterprise 100,000 / month 300

Authenticated responses include headers so you can track usage without calling another endpoint. Guest requests (no API key) do not include these headers.

  • X-RateLimit-Limit — per-minute request limit for your plan.
  • X-RateLimit-Remaining — how many remain in the current minute.
  • X-RateLimit-Reset — unix timestamp when the minute resets.
  • X-Quota-Limit — monthly quota for your plan.
  • X-Quota-Remaining — requests left this month.

The per-minute limit is per account, not per API key: creating extra keys does not multiply your real limit.

Response headers
X-RateLimit-Limit: 30
X-RateLimit-Remaining: 27
X-RateLimit-Reset: 1785460920
X-Quota-Limit: 1000
X-Quota-Remaining: 812
GET /v1/fuel-prices Run in Postman

Diesel and gasoline prices (national + PADD regions) from live EIA data, plus weekly change and historical averages. Bunker fuel is marked unavailable (no free source).

Parameters

No required parameters.

cURL
curl -H "X-API-Key: YOUR_API_KEY" \
  "https://freightpulsehq.com/api/v1/fuel-prices"
JSON Response
{
  "success": true,
  "data": {
    "timestamp": "2026-07-30T12:00:00Z",
    "source": "EIA (U.S. Energy Information Administration)",
    "currency": "USD",
    "unit": "gallon",
    "data": {
      "diesel": {
        "national_average": 3.847,
        "change_week": -0.023,
        "change_percent": -0.6,
        "updated_at": "2026-07-27",
        "regions": {
          "east_coast": 3.912,
          "midwest": 3.756,
          "gulf_coast": 3.623,
          "rocky_mountain": 3.891,
          "west_coast": 4.456,
          "california": 4.892
        },
        "historical": { "30d_avg": 3.82, "90d_avg": 3.75, "yoy_change_percent": -8.2 }
      },
      "gasoline": {
        "national_average": 3.156,
        "regular": 3.156,
        "historical": { "30d_avg": 3.1, "90d_avg": 3.05, "yoy_change_percent": 1.1 }
      },
      "bunker_fuel": {
        "available": false,
        "note": "No known free source — requires a paid provider"
      }
    }
  }
}
GET /v1/carriers Run in Postman

Look up US trucking carriers by DOT number or name (live FMCSA SAFER data), or ocean NVOCC/OTI carriers by organization number or name (live FMC licensed-carrier directory). Air has no free source and returns available: false.

Ocean results are thinner than trucking (the FMC directory doesn't publish safety ratings or fleet size) - just organization number, legal name, trade name, and tariff location.

Parameters

Parameter Type Required Description
q string required (trucking, ocean) DOT/organization number or carrier name
type string optional trucking (default) | ocean | air
cURL — trucking
curl -H "X-API-Key: YOUR_API_KEY" \
  "https://freightpulsehq.com/api/v1/carriers?q=54283"
JSON Response — trucking
{
  "success": true,
  "data": {
    "type": "trucking",
    "query": "54283",
    "results": [
      {
        "dot_number": 54283,
        "legal_name": "SWIFT TRANSPORTATION COMPANY OF ARIZONA LLC",
        "dba_name": null,
        "entity_type": "Interstate",
        "status": "active",
        "safety_rating": "S",
        "power_units": null,
        "drivers": 12883,
        "address": { "city": "Phoenix", "state": "AZ", "country": "US" }
      }
    ]
  }
}
JSON Response — ocean
{
  "success": true,
  "data": {
    "type": "ocean",
    "query": "maersk",
    "results": [
      {
        "org_no": "021234",
        "legal_name": "MAERSK LOGISTICS (USA) INC.",
        "trade_name": null,
        "tariff_location": "https://www.maersk.com"
      }
    ]
  }
}
GET /v1/freight-rates Run in Postman

Live US FTL trucking quotes via Warp. Ocean and air cover a limited set of Asian origins to a US ZIP; lanes Warp cannot price return available: false instead of an empty stub.

Default mode is trucking. Missing required parameters return 422; available: false is only for a valid request Warp genuinely can't price (unsupported lane, no live quote).

Parameters

Parameter Type Required Description
mode string optional trucking (default) | ocean | air
origin_zip string required (trucking) US origin ZIP
destination_zip string required (trucking) US destination ZIP
pickup_date string optional YYYY-MM-DD (defaults to two weekdays from now)
origin_country string required (ocean/air) China | Vietnam | India | Taiwan | South Korea
dest_zip string required (ocean/air) US destination ZIP
origin_city string optional City in origin_country
qty integer optional Quantity (default 1)
total_weight_lb number optional Total weight in pounds
container_size string optional Ocean only (default 40'DV)
cURL — trucking
curl -H "X-API-Key: YOUR_API_KEY" \
  "https://freightpulsehq.com/api/v1/freight-rates?mode=trucking&origin_zip=10001&destination_zip=90210"
JSON Response
{
  "success": true,
  "data": {
    "mode": "trucking",
    "service": "FTL (53' dry van)",
    "source": "Warp",
    "price_usd": 7207.92,
    "transit_days": 4,
    "pickup_date": "2026-08-24",
    "delivery_date": "2026-08-28",
    "valid_until": "2026-08-23T20:34:49.419Z"
  }
}
GET /v1/port-congestion Run in Postman

Port activity from IMF PortWatch (AIS / UN Global Platform). At least one of port, country, or region is required. Country and region queries return at most 25 ports.

Not vessel wait time: congestion is an approximation (last 7 days’ average port calls vs a 90-day baseline for the same port). The dataset lags about 6–7 days. UN/LOCODE is accepted with or without a space (USLAX or US LAX).

Parameters

Parameter Type Required Description
port string cond. Port name or LOCODE
country string cond. Country name or ISO3
region string cond. Continent (e.g. Asia)
congestion string optional low | moderate | high
cURL
curl -H "X-API-Key: YOUR_API_KEY" \
  "https://freightpulsehq.com/api/v1/port-congestion?port=USLAX"
JSON Response
{
  "success": true,
  "data": {
    "results": [
      {
        "port": "Los Angeles-Long Beach",
        "locode": "US LAX",
        "country": "United States",
        "congestion": "moderate",
        "as_of": "2026-08-14",
        "metrics": {
          "recent_avg_portcalls_per_day": 8.7,
          "baseline_avg_portcalls_per_day": 10.2,
          "ratio_vs_baseline": 0.85
        }
      }
    ],
    "meta": {
      "source": "IMF PortWatch (portwatch.imf.org) - UN Global Platform AIS data",
      "data_lag_days": "~6-7 (daily updates, not real-time)",
      "methodology": "congestion level is an approximation: last 7 days' avg port calls vs 90-day baseline for the same port. Does not measure vessel wait/anchorage time."
    }
  }
}
GET /v1/historical Run in Postman

Weekly national fuel-price series from EIA, plus daily port-congestion series for a curated list of ~20 major container ports (same criterion used by industry benchmarks like FBX/WCI/UNCTAD - a short fixed list, not the full port universe). Per-lane freight rates are not snapshotted yet.

Port-congestion series use metric=port_congestion:<portid>, where portid is one of the curated ports below. Value is the same ratio_vs_baseline returned by /v1/port-congestion (a continuous number, better for charting a trend than the low/moderate/high bucket).

Parameters

Parameter Type Required Description
metric string required fuel_price_diesel_national | fuel_price_gasoline_national | fuel_price_{diesel|gasoline}_{east_coast|midwest|gulf_coast|rocky_mountain|west_coast|california} | port_congestion:&lt;portid&gt;
period string optional 30d (default) | 90d | 1y - ignored if from/to are set
from date optional YYYY-MM-DD. fuel_price_* (national and regional) series go back to 1990-1995 depending on region/product; port_congestion:&lt;portid&gt; goes back to 2019 for the ~9 curated ports covered by the source, or since its daily snapshot started for the rest.
to date optional YYYY-MM-DD, must be on/after from
cURL
curl -H "X-API-Key: YOUR_API_KEY" \
  "https://freightpulsehq.com/api/v1/historical?metric=fuel_price_diesel_national&period=30d"
JSON Response
{
  "success": true,
  "data": {
    "metric": "fuel_price_diesel_national",
    "period": "30d",
    "from": null,
    "to": null,
    "series": [
      { "date": "2026-07-27", "value": 5.257 },
      { "date": "2026-08-03", "value": 5.343 },
      { "date": "2026-08-10", "value": 5.454 }
    ]
  }
}
cURL (explicit range)
curl -H "X-API-Key: YOUR_API_KEY" \
  "https://freightpulsehq.com/api/v1/historical?metric=fuel_price_diesel_national&from=2010-01-01&to=2010-12-31"

Curated ports (metric=port_congestion:<portid>)

Port Country portid
Shanghai China port_congestion:port1188
Singapore Singapore port_congestion:port1201
Ningbo China port_congestion:port824
Shekou (Shenzhen) China port_congestion:port1189
Guangzhou (Nansha) China port_congestion:port425
Qingdao Port China port_congestion:port1069
Busan Korea port_congestion:port1065
Tianjin Xin Gang China port_congestion:port1297
Hong Kong Hong Kong SAR port_congestion:port474
Jebel Ali United Arab Emirates port_congestion:port744
Rotterdam The Netherlands port_congestion:port1114
Antwerp Belgium port_congestion:port57
Hamburg Germany port_congestion:port446
Los Angeles-Long Beach United States port_congestion:port664
New York-New Jersey United States port_congestion:port815
Savannah United States port_congestion:port1170
Kaohsiung Taiwan port_congestion:port541
Port Klang Malaysia port_congestion:port960
Laem Chabang Thailand port_congestion:port1197
Colombo Sri Lanka port_congestion:port254
GET /v1/disruptions Run in Postman

Active natural-hazard disruptions merged from three free sources: GDACS (global disasters), USGS (significant earthquakes), and NOAA/NWS (US severe weather). Each source degrades independently — see meta.source_status.

Does not cover geopolitical events, strikes, port closures, or canal disruptions — no free structured source exists for those yet (see meta.coverage). Pass port to filter events within a radius of a port (300km, 100km for US severe weather); events without a resolvable location are excluded and counted in meta.port_filter.excluded_no_location. For earthquakes, severity reflects USGS's estimated human impact (PAGER), not raw size — a large quake in a remote area can legitimately show low. Use the separate magnitude field to filter/sort by size directly.

Parameters

Parameter Type Required Description
type string optional cyclone | earthquake | flood | volcano | drought | wildfire | severe_weather
severity string optional low | moderate | high
country string optional Country name or ISO3
port string optional Port name or LOCODE - filters by distance
cURL
curl -H "X-API-Key: YOUR_API_KEY" \
  "https://freightpulsehq.com/api/v1/disruptions?port=USLAX&severity=high"
JSON Response
{
  "success": true,
  "data": {
    "results": [
      {
        "id": "gdacs:TC:1001305",
        "type": "cyclone",
        "severity": "moderate",
        "title": "Tropical Cyclone SAUDEL-26",
        "country": "Japan",
        "affected_countries": ["JPN"],
        "location": { "lat": 17.1, "lon": 147.3 },
        "starts_at": "2026-08-18T12:00:00+00:00",
        "source": "GDACS",
        "url": "https://www.gdacs.org/report.aspx?eventid=1001305"
      },
      {
        "id": "usgs:6000tm81",
        "type": "earthquake",
        "severity": "low",
        "magnitude": 6.7,
        "title": "M 6.7 - 31 km NW of Aniso, Peru",
        "location": { "lat": -14.64, "lon": -73.52 },
        "starts_at": "2026-08-20T18:00:18+00:00",
        "source": "USGS",
        "url": "https://earthquake.usgs.gov/earthquakes/eventpage/us6000tm81"
      }
    ],
    "meta": {
      "sources": ["GDACS (EU JRC) - global natural hazards", "USGS Earthquake Hazards Program - global significant earthquakes", "NOAA/NWS - US-only severe weather alerts"],
      "coverage": "Natural hazards only. Does not cover geopolitical events, strikes, port closures, or canal disruptions.",
      "source_status": { "gdacs": "ok", "usgs": "ok", "nws": "ok" }
    }
  }
}
GET /v1/export SOON Run in Postman

No live data yet

Formats the output of the endpoints above. The endpoint already returns 200 with data: [] until the source is ready.

Export data from the endpoints above as CSV/JSON.

Parameters (planned)

Parameter Type Required Description
type string required Which dataset to export
format string optional csv | json (default: json)
cURL
curl -H "X-API-Key: YOUR_API_KEY" \
  "https://freightpulsehq.com/api/v1/export"
JSON Response (today)
{
  "success": true,
  "data": [],
  "meta": {
    "endpoint": "export",
    "note": "awaiting a real data source"
  }
}

Error codes

HTTP success Typical message Cause
200 true OK Successful request
401 false Invalid API key Missing X-API-Key header or invalid key
403 false No active subscription Subscription is not active and not on trial
422 false Missing required parameter: ... A required endpoint parameter is missing (e.g. q on /carriers)
429 false Monthly quota exceeded / Rate limit exceeded Monthly quota or per-minute limit exceeded