Home → Blog

Modern freight networks depend on signals that don’t live in a single system: fuel indices to set surcharges, lane-by-lane truckload quotes to benchmark procurement, port congestion to forecast dwell and buffer inventory, carrier safety and authority data to mitigate compliance risk, and disruption alerts to route around cyclones or earthquakes. When these inputs drift or suddenly spike, fraud and data quality issues creep in—fake quotes, stale indices, mismatched carrier identities, or invented “disruptions” blamed for accessorials. If you can’t stitch these signals together programmatically, you can’t spot what doesn’t add up.

This post shows how to build an anti-fraud and anomaly detection layer on top of consolidated logistics intelligence using FreightPulse. We’ll combine FTL rate quotes, EIA fuel price series, IMF PortWatch congestion metrics, FMCSA/FMC carrier lookups, and natural-hazard alerts—behind one REST API—to detect outliers, validate claims, and trigger investigations before losses hit your margin. We’ll cover endpoint-by-endpoint data you can use, practical field meanings, error handling, and implementation patterns for robust, real-time checks in freight-forwarding, 3PL operations, supply chain SaaS, and market analysis workflows.

By the end, you’ll have a blueprint to operationalize cross-signal validation—e.g., verifying a lane quote is in the right ballpark for recent diesel levels and congestion, ensuring the carrier on the BOL is an active FMCSA entity, and correlating “weather delay” claims with actual severe weather near the port. All from a single API, no juggling five different feeds or maintaining a costly AIS pipeline just to sanity-check a congestion story.

Introduction

Fraud in logistics rarely looks like a heist—it looks like a small overcharge, a plausible surcharge justification, or a carrier identity that’s “close enough.” Anomalies also hide in plain sight: a sudden 25% spike in a lane quote with no macro reason, a disruption claim that has no matching weather alert, or a stale EIA fuel index used to justify this week’s surcharge. Without canonical, machine-readable signals and a consistent data model, each team builds ad hoc rules in spreadsheets and inboxes, making it easy for inconsistencies to slip through.

Freight forwarders and 3PLs face three recurring problems:

With FreightPulse, you can route these signals into a single anti-fraud layer: a small service that fetches cross-domain facts just in time. Think of it as “trust infrastructure” for freight operations—fast enough to prompt a human-in-the-loop decision, standardized enough to power automated rules, and flexible enough to train statistical or ML detectors over historical series.

Why FreightPulse

When you’re building a fraud defense or anomaly detection layer, the “single source” advantage is not simply convenience—it’s correctness, consistency, and speed-to-production. Here’s what makes FreightPulse practical for engineering and operations teams:

The net effect: fewer custom integrations to maintain, more consistent semantics across operational checks, and a cleaner handoff from engineering to analysts and finance. You get to focus on detection logic—not on data plumbing.

Quick Start

Base URL:

https://freightpulsehq.com/api/v1

Your first request: pull nationwide EIA-sourced fuel prices to bootstrap a surcharge baseline and feed anomaly rules. You can start by issuing a simple unauthenticated request to explore the shape and fields.

curl "https://freightpulsehq.com/api/v1/fuel-prices"

Sample 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,
"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,
"historical": {
"30d_avg": 3.1,
"90d_avg": 3.05,
"yoy_change_percent": 1.1
}
}
}
}
}

Key fields and why they matter:

Core Endpoints

Fuel Prices — GET /fuel-prices

Purpose: Power surcharge models, normalize quotes, and provide macro justification for rate movements. For anomaly detection, diesel’s weekly delta and 30d/90d averages set expectations for how quickly prices should move; outlier surcharges disconnected from these trends warrant review.

Key parameters: No required parameters.

cURL:

curl "https://freightpulsehq.com/api/v1/fuel-prices"

Response (complete example shown earlier). Practical fields:

Fraud/Anomaly checks to implement:

Freight Rates — GET /freight-rates

Purpose: Benchmark a proposed FTL quote against live US truckload market context, then adjust checks by fuel and congestion conditions. You can program rules like “if price_usd exceeds 2 standard deviations over the last 7 baseline quotes for a lane and no congestion or fuel uptrend exists, escalate.”

Key parameters:

cURL (trucking):

curl "https://freightpulsehq.com/api/v1/freight-rates?mode=trucking&origin_zip=10001&destination_zip=90210"

Sample JSON:

{
"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"
}
}

Field meanings:

Error behavior: If required params are missing, the endpoint returns HTTP 200 with available:false semantics rather than a “hard” error—design your client to check for “data available” before using price_usd in scoring.

Port Congestion — GET /port-congestion

Purpose: Contextualize ocean and intermodal claims with data approximated from IMF PortWatch (AIS-derived) over a curated set of major global ports. It represents a 7-day average of portcalls versus a 90-day baseline and typically lags by ~6–7 days. Use it to judge whether “port is clogged” stories align with recent signal and to feed macro features into your rate and dwell-time anomaly rules.

Key parameters:

cURL:

curl "https://freightpulsehq.com/api/v1/port-congestion?port=USLAX"

Sample JSON:

{
"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
}
}
]
}
}

Interpretation for fraud/anomaly detection:

Carrier Lookups — GET /carriers

Purpose: Positive verification of carrier identity, authority, and safety context is the easiest high-yield fraud prevention step. Confirm the DOT number and legal name match the paperwork, ensure status is active, and—if relevant—check rough scale via driver count to spot impersonation risks.

Key parameters:

cURL (trucking by DOT number):

curl "https://freightpulsehq.com/api/v1/carriers?q=54283"

Sample JSON:

{
"success": true,
"data": {
"type": "trucking",
"query": "54283",
"results": [
{
"dot_number": 54283,
"legal_name": "SWIFT TRANSPORTATION COMPANY OF ARIZONA LLC",
"status": "active",
"safety_rating": "S",
"drivers": 12883,
"address": {
"city": "Phoenix",
"state": "AZ",
"country": "US"
}
}
]
}
}

Field meanings:

Disruptions — GET /disruptions

Purpose: Validate claims of weather or natural hazard delays. Consolidated from GDACS, USGS, and NOAA/NWS, and filterable by port radius, this feed lets you correlate active hazards with shipments. It intentionally covers natural hazards only—no strikes or geopolitical events—so classify reasons accordingly.

Key parameters:

cURL (severe port-level filter):

curl "https://freightpulsehq.com/api/v1/disruptions?port=USLAX&severity=high"

Sample JSON:

{
"success": true,
"data": {
"results": [
{
"id": "gdacs:TC:1001305",
"type": "cyclone",
"severity": "moderate",
"title": "Tropical Cyclone SAUDEL-26",
"country": "Japan",
"starts_at": "2026-08-18T12:00:00+00:00",
"source": "GDACS"
}
]
}
}

How to use it:

Historical Series — GET /historical

Purpose: Build baselines and trend features without maintaining your own time-series ETL. Request weekly national fuel series or daily port congestion for curated ports. For anomaly detection, compute rolling averages, volatility, and seasonality directly from this endpoint.

Key parameters:

cURL (diesel 30d):

curl "https://freightpulsehq.com/api/v1/historical?metric=fuel_price_diesel_national&period=30d"

Sample JSON:

{
"success": true,
"data": {
"metric": "fuel_price_diesel_national",
"period": "30d",
"series": [
{ "date": "2026-07-27", "value": 5.257 },
{ "date": "2026-08-03", "value": 5.343 }
]
}
}

Practical guidance:

Architecture and Best Practices for an Anti-Fraud Layer

The fastest path to production is a small, stateless “decision service” that orchestrates FreightPulse calls and returns a compact risk object to your TMS, rating engine, or billing system. Here’s a practical blueprint:

Feature engineering tips:

Reference Implementations: cURL, Python, JavaScript

Start with quick terminal tests, then drop into your backend language. The following snippets show end-to-end enrichment for risk scoring. Adjust for your runtime and security patterns.

cURL — multi-endpoint orchestration:

# 1) Get lane quote (NYC 10001 to Beverly Hills 90210)
curl "https://freightpulsehq.com/api/v1/freight-rates?mode=trucking&origin_zip=10001&destination_zip=90210"

# 2) Get national and regional diesel context
curl "https://freightpulsehq.com/api/v1/fuel-prices"

# 3) Fetch congestion for Los Angeles-Long Beach (intermodal impact)
curl "https://freightpulsehq.com/api/v1/port-congestion?port=USLAX"

# 4) Validate any weather claim near USLAX
curl "https://freightpulsehq.com/api/v1/disruptions?port=USLAX&severity=high"

Python — a simple risk scorer:

import json
import time
import urllib.parse
import urllib.request

BASE = "https://freightpulsehq.com/api/v1"

def get(path, params=None):
url = f"{BASE}{path}"
if params:
url += "?" + urllib.parse.urlencode(params)
req = urllib.request.Request(url, method="GET")
with urllib.request.urlopen(req, timeout=10) as resp:
return json.loads(resp.read().decode("utf-8"))

def score_lane(origin_zip, destination_zip, port_locode=None):
# 1) Live rate
rate = get("/freight-rates", {
"mode": "trucking",
"origin_zip": origin_zip,
"destination_zip": destination_zip
})
if not rate.get("success"):
return {"success": False, "error": "Rate fetch failed"}

data = rate.get("data", {})
if not data or "price_usd" not in data:
return {"success": True, "risk": {"level": "unknown", "reason": "no-quote"}}

price = data["price_usd"]

# 2) Fuel
fuel = get("/fuel-prices")
diesel = fuel["data"]["data"]["diesel"]["national_average"]

# 3) Congestion (optional)
congestion_ratio = None
if port_locode:
pc = get("/port-congestion", {"port": port_locode})
results = pc["data"].get("results", [])
if results:
congestion_ratio = results[0]["metrics"]["ratio_vs_baseline"]

# 4) Heuristic scoring
de_fueled = price / max(diesel, 0.0001)
expected = 2000 / max(diesel, 0.0001) # toy baseline; replace with your historical stats
uplift = (de_fueled - expected) / max(expected, 0.0001)

reasons = []
level = "low"

if uplift > 0.35:
level = "medium"
reasons.append("lane price significantly above expected fuel-adjusted baseline")
if congestion_ratio is not None and congestion_ratio < 0.9 and uplift > 0.2:
level = "high"
reasons.append("congestion not supportive of uplift")

return {
"success": True,
"risk": {
"level": level,
"price_usd": price,
"diesel": diesel,
"congestion_ratio": congestion_ratio,
"de_fueled_index": round(de_fueled, 2),
"reasons": reasons
}
}

print(json.dumps(score_lane("10001", "90210", "USLAX"), indent=2))

JavaScript — disruptions corroboration:

async function fpGet(path, params = {}) {
const url = new URL(`https://freightpulsehq.com/api/v1${path}`);
Object.entries(params).forEach(([k, v]) => url.searchParams.set(k, v));
const res = await fetch(url.toString(), { method: "GET" });
return await res.json();
}

async function corroborateWeatherClaim(port, claimType) {
const out = await fpGet("/disruptions", { port, type: claimType });
if (!out.success) return { ok: false, reason: "fetch-failed" };
const events = (out.data && out.data.results) || [];
if (events.length === 0) {
return { ok: false, reason: "no-matching-events" };
}
// Simple match logic; strengthen by date windows and severity rules
return { ok: true, events };
}

corroborateWeatherClaim("USLAX", "severe_weather").then(console.log);

Real-World Use Cases

Fuel-surcharge validator for a national forwarder:

Pull /fuel-prices weekly and store the national and PADD-region averages with their 30d/90d baselines. At rating and invoicing time, compare proposed surcharges to week-over-week diesel changes, and ensure the correct regional benchmark is used for each lane. Large deviations or region mismatches trigger a second-operator approval. Endpoints used: /fuel-prices, /historical.

Port-congestion dashboard for procurement and exception management:

Display the latest congestion category and ratio_vs_baseline for ~20 curated ports, with a trend chart built from /historical port_congestion:<portid> series. Blend in live /freight-rates for intermodal lanes to check whether quote uplifts correspond to congestion regimes. Operators can quickly reject unjustified surcharges citing “port delays” when the data shows normal traffic. Endpoints used: /port-congestion, /historical, /freight-rates.

Carrier vetting tool for a 3PL fraud desk:

Build a one-click “verify” button that queries /carriers by DOT number, compares legal_name and status to the tender, and enriches shipments with a carrier trust score. If the status isn’t active or the name doesn’t match paperwork, prevent dispatch and alert the fraud desk. Endpoints used: /carriers.

Disruption-aware shipment tracker for ocean imports:

Attach route-level monitors that poll /disruptions with port filters matching origin/destination ports. If severe events occur within the configured radius, raise proactive delays and recommend diversions or holds. Blend this signal with /port-congestion to contextualize potential dwell escalations. Endpoints used: /disruptions, /port-congestion.

Market analyst’s lane index with anomaly alerts:

On a daily cadence, fetch /freight-rates for representative lanes and normalize by diesel from /fuel-prices. Track the de-fueled index over time; when z-scores exceed 2–3 without corresponding congestion moves or new disruptions, open an investigation ticket. Endpoints used: /freight-rates, /fuel-prices, /port-congestion, /disruptions, /historical.

FAQ

How often do FreightPulse fuel prices update?

Fuel prices are sourced from EIA and provided with timestamped updates suitable for surcharge modeling and weekly trend analysis. Use the timestamp field for cache invalidation and ensure your surcharge logic reflects week-over-week changes rather than intraday volatility.

Can I look up ocean carriers as well as trucking carriers?

Yes. The /carriers endpoint supports trucking lookups (FMCSA SAFER) and ocean NVOCC/OTI lookups (FMC directory) via the type parameter. Air returns available:false, so design your UI to offer trucking and ocean searches and gracefully handle unsupported modes.

Does the port congestion data reflect real-time vessel wait times?

No. Port congestion is an approximation derived from IMF PortWatch AIS data, modeled as a 7-day average versus a 90-day baseline with a ~6–7 day lag. Treat it as a macro signal for risk scoring and analytics rather than minute-by-minute queue monitoring.

What kinds of disruptions are included, and can I filter by proximity to a port?

Disruptions include natural hazards—cyclones, earthquakes, floods, volcanoes, droughts, wildfires, and severe weather—consolidated from GDACS, USGS, and NOAA/NWS. You can filter by port to capture events within a defined radius (300km, or 100km for US weather), aligning alerts with shipments touching specific ports.

How should I handle errors and partial data when scoring risk?

Check the success flag and be prepared for graceful degradation. If a live quote isn’t available for a lane, rely on historical series and fuel baselines with lower confidence. For transient errors, implement retries with backoff and circuit breakers, and always annotate decisions with data freshness and missing-signal notes for audits.

Conclusion + CTA

Fraud and anomalies in freight are rarely spectacular—they’re incremental and easy to miss when your signals are scattered. By consolidating diesel indices, live FTL quotes, port congestion context, carrier verification, and hazard alerts in one place, you can build a compact decision service that validates every tender, schedule, and invoice against reality. The result: fewer bad charges, fewer impersonation incidents, and faster, more confident operations.

The patterns in this guide are designed to be implemented in days, not months: a few GET calls, a shared response schema, simple statistical baselines, and clear operator workflows. Whether you’re a forwarder tightening controls, a 3PL building a fraud desk, a SaaS platform adding risk scoring, or an analyst publishing lane indices, FreightPulse is the fastest path from idea to production.

Start validating your shipments and quotes today. Explore the endpoints in your terminal, wire them into your rating or TMS service, and put cross-signal checks in front of every decision. Try FreightPulse for free.