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
Response format
Every response uses the same shape:
{
"success": true,
"data": { ... }
}
{
"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 -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.
X-RateLimit-Limit: 30
X-RateLimit-Remaining: 27
X-RateLimit-Reset: 1785460920
X-Quota-Limit: 1000
X-Quota-Remaining: 812
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 -H "X-API-Key: YOUR_API_KEY" \
"https://freightpulsehq.com/api/v1/fuel-prices"
{
"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"
}
}
}
}
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 -H "X-API-Key: YOUR_API_KEY" \
"https://freightpulsehq.com/api/v1/carriers?q=54283"
{
"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" }
}
]
}
}
{
"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"
}
]
}
}
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 -H "X-API-Key: YOUR_API_KEY" \
"https://freightpulsehq.com/api/v1/freight-rates?mode=trucking&origin_zip=10001&destination_zip=90210"
{
"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"
}
}
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 -H "X-API-Key: YOUR_API_KEY" \
"https://freightpulsehq.com/api/v1/port-congestion?port=USLAX"
{
"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."
}
}
}
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:<portid> |
| 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:<portid> 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 -H "X-API-Key: YOUR_API_KEY" \
"https://freightpulsehq.com/api/v1/historical?metric=fuel_price_diesel_national&period=30d"
{
"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 -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 |
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 -H "X-API-Key: YOUR_API_KEY" \
"https://freightpulsehq.com/api/v1/disruptions?port=USLAX&severity=high"
{
"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" }
}
}
}
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 -H "X-API-Key: YOUR_API_KEY" \
"https://freightpulsehq.com/api/v1/export"
{
"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 |