Home → Blog

You need a fast, reliable way to look up supply chain disruptions for a specific port and show your team exactly what is impacting operations. By the end of this guide, you will be able to authenticate with FreightPulse, call the Supply Chain Disruptions lookup for a port like USLAX, handle the response envelope safely, and embed this data in your application without guessing fields or inventing events.

What this lookup covers and what it does not

The FreightPulse Supply Chain Disruptions lookup focuses on natural hazards sourced from GDACS, USGS and NOAA. It does not cover labor actions, strikes, canal transits, or invented events. For port congestion, FreightPulse references IMF PortWatch with a lag of about six to seven days, presented as a seven-day average versus a 90-day baseline. This is not a live AIS wait-time feed.

Illustration: Look Up Supply Chain Disruptions

Do not quote a freight-rates USD fare as today’s price based on this endpoint. The disruptions lookup is for situational awareness, not spot-rate pricing. Keep data use narrow and tied to hazard awareness around a given port.

Authentication and request limits

Send your key in the request header X-API-Key with the literal value YOUR_API_KEY in examples. Guests without a key are allowed up to 100 requests per day per IP. The disruptions endpoint returns a consistent envelope with success and data keys that you should always check before consuming the payload.

Quickstart: cURL for Supply Chain Disruptions at USLAX

Copy, paste and run this request. Replace YOUR_API_KEY with your key in your implementation.

curl -H "X-API-Key: YOUR_API_KEY" "https://freightpulsehq.com/api/v1/disruptions?port=USLAX"

This call targets the Supply Chain Disruptions lookup and filters by port code USLAX. The response will follow the standard FreightPulse envelope. Always check success before reading the data object.

Official JSON sample: envelope and field-reading pattern

The official response sample below shows the FreightPulse envelope structure you should code against. Field names, casing, and the meta.request_id pattern are representative of the API. Copy the parsing approach, not the domain-specific keys. Always read success, then data, and preserve timestamps and units as returned.

{
    "success": true,
    "data": {
        "timestamp": "2026-11-09T00:00:59+00:00",
        "source": "EIA (U.S. Energy Information Administration)",
        "currency": "USD",
        "unit": "gallon",
        "data": {
            "diesel": {
                "national_average": 6.292,
                "change_week": -0.06,
                "change_percent": -0.94,
                "updated_at": "2026-11-02",
                "regions": {
                    "east_coast": 6.025,
                    "midwest": 6.402,
                    "gulf_coast": 5.912,
                    "rocky_mountain": 6.445,
                    "west_coast": 7.272,
                    "california": 8.076
                }
            },
            "gasoline": {
                "national_average": 4.153,
                "change_week": -0.116,
                "change_percent": -2.72,
                "updated_at": "2026-11-02",
                "grades": {
                    "regular": 4.153,
                    "midgrade": 4.757,
                    "premium": 5.158
                }
            },
            "bunker_fuel": {
                "available": false,
                "note": "No known free source (Rotterdam/Singapore/Houston) — requires a paid provider (e.g. Ship & Bunker, Argus)."
            }
        },
        "historical": {
            "diesel_30d_avg": 6.275,
            "diesel_90d_avg": 6.033,
            "diesel_yoy_change": 67.7,
            "gasoline_30d_avg": 4.259,
            "gasoline_90d_avg": 4.232,
            "gasoline_yoy_change": 37.6
        }
    },
    "meta": {
        "request_id": "ec645f23-7ac4-4abd-afb0-bf6a2f999e05"
    }
}

What you will actually use from the envelope:

JavaScript example: querying and safely parsing disruptions

This Node.js sample calls the disruptions endpoint for USLAX, validates the envelope, and shows a safe pattern to explore the payload without assuming undocumented fields. You can adapt it to your framework or runtime.

import fetch from "node-fetch";

async function getDisruptions(portCode) {
const url = `https://freightpulsehq.com/api/v1/disruptions?port=${encodeURIComponent(portCode)}`;
const res = await fetch(url, {
headers: {
"X-API-Key": "YOUR_API_KEY"
},
// Consider adding a short timeout via AbortController in production
});

if (!res.ok) {
throw new Error(`HTTP ${res.status} while fetching disruptions for ${portCode}`);
}

const json = await res.json();

// Envelope check
if (!json || json.success !== true || typeof json.data === "undefined") {
throw new Error("Unexpected API envelope: missing success or data");
}

const { data, meta } = json;

// Example logging for observability
const requestId = meta && meta.request_id ? meta.request_id : "unknown";
console.log(`request_id=${requestId} port=${portCode}`);

// Because the schema is not enumerated here, show a few robust introspection steps:
// 1) Keep the raw payload for auditing
const raw = JSON.stringify(data);
console.log(`payload_size_bytes=${Buffer.byteLength(raw, "utf8")}`);

// 2) If the payload contains a top-level timestamp or source, preserve them
const timestamp = data.timestamp || data.updated_at || null;
const source = data.source || null;

console.log({ timestamp, source });

// 3) If there is an events or hazards array, iterate defensively
// (Check existence before accessing to avoid runtime errors)
if (Array.isArray(data.events)) {
for (const evt of data.events) {
// Safely read a few likely attributes if present
const type = evt.type || evt.category || "unknown";
const severity = evt.severity || evt.level || "unknown";
const startsAt = evt.start || evt.started_at || null;
const endsAt = evt.end || evt.ended_at || null;
const affected = evt.affected || evt.impact || null;

console.log({ type, severity, startsAt, endsAt, affected });
}
} else {
console.log("No events array found; inspect the payload shape above.");
}

return data;
}

// Example usage
getDisruptions("USLAX").catch(err => {
console.error(err);
process.exit(1);
});

Notes:

Python example: minimal client with envelope checks

This Python snippet demonstrates the same pattern using requests. It is copy-pasteable into a CLI script or service worker.

import os
import sys
import json
import requests

API_KEY = "YOUR_API_KEY"
BASE_URL = "https://freightpulsehq.com/api/v1/disruptions"

def get_disruptions(port):
url = f"{BASE_URL}?port={port}"
headers = {"X-API-Key": API_KEY}
r = requests.get(url, headers=headers, timeout=20)
r.raise_for_status()

payload = r.json()

# Validate envelope
if not isinstance(payload, dict) or payload.get("success") is not True:
raise RuntimeError("API call unsuccessful or unexpected envelope")

data = payload.get("data")
if data is None:
raise RuntimeError("Missing data field in response")

meta = payload.get("meta", {})
request_id = meta.get("request_id")
if request_id:
print(f"request_id={request_id}")

# Defensive parsing
ts = data.get("timestamp") or data.get("updated_at")
if ts:
print(f"timestamp={ts}")

# If events exist, iterate defensively without assuming a fixed schema
events = data.get("events")
if isinstance(events, list):
for i, evt in enumerate(events, start=1):
etype = evt.get("type") or evt.get("category") or "unknown"
severity = evt.get("severity") or evt.get("level") or "unknown"
print(f"event_{i}: type={etype} severity={severity}")
else:
print("No events array in payload; inspect keys:", list(data.keys()))

return data

if __name__ == "__main__":
port = sys.argv[1] if len(sys.argv) > 1 else "USLAX"
data = get_disruptions(port)
# Persist raw for auditing or caching
print(json.dumps(data)[:1000])

Implementation tips:

Query parameters and port focus

Stay focused on the port in your title or screen. For this guide, the example port is USLAX. The disruptions endpoint as shown accepts port codes via the port query parameter. Only request ports your workflow actually needs, to stay within limits and reduce noise.

Time, units and currency considerations

Disruptions data emphasizes event timing and impact narratives rather than prices. When timestamps are included, they are ISO 8601 with a timezone offset. Treat +00:00 as UTC and convert once, at the edge of your system. If you join disruptions to other FreightPulse resources that mention currency or units, do not assume those apply to hazard data; only display what is explicitly returned by the disruptions endpoint.

For congestion indicators derived from IMF PortWatch, remember the six to seven day lag and that the reported values are seven-day averages compared to a 90-day baseline. These are not live AIS queues or minute-by-minute operational feeds.

Error handling, quotas and observability

Build envelope validation into your client and surface meaningful errors. Record meta.request_id on every call for reproducibility and faster support. Guests without a key are limited to 100 requests per day per IP. If you expect higher volume or need reliability guarantees, add your API key and consolidate your polling intervals with a small cache window on your side.

End-to-end integration checklist

Troubleshooting common issues

If you see HTTP 401 or 403, confirm you are sending X-API-Key with YOUR_API_KEY or switch from guest usage if you have exceeded the 100 requests per day per IP allowance. If the payload shape varies between calls, ensure your parser is field-tolerant and gates on success and data. For congestion values that appear stale, remember IMF PortWatch is lagged by about one week and represents a seven-day average versus a 90-day baseline.

FAQ

Q: Can I fetch live vessel wait times for USLAX?
A: No. FreightPulse port congestion is lagged by about six to seven days from IMF PortWatch and reported as seven-day averages versus a 90-day baseline. It is not a live AIS wait-time feed.

Q: Do I need an API key to start?
A: You can call the endpoint without a key as a guest with up to 100 requests per day per IP. For higher throughput and stability, use X-API-Key with YOUR_API_KEY.

Q: What hazards are included?
A: Natural hazards only, sourced from GDACS, USGS and NOAA. The lookup does not cover strikes, canal issues or non-natural disruptions.

Q: Can I quote a USD freight rate based on this lookup?
A: No. Do not quote a freight-rates USD fare as today’s price from disruptions data. Use it strictly for hazard awareness and operational context.

Q: How should I cache the results?
A: Use a short client-side TTL aligned to your UI needs. Since congestion metrics are lagged by design, aggressive polling offers limited benefit; prefer modest intervals and envelope validation on every read.

Get your key and start integrating the Supply Chain Disruptions lookup now. Create your account on the FreightPulse portal: Register. For parameter details and additional endpoints, see the Documentation.