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:
- Data fragmentation: fuel indices from one source, quotes from another, congestion from a third, carrier compliance from a fourth, and hazard alerts from yet another. Integrations multiply and drift.
- Inconsistent semantics: different schemas, units, timestamps, and naming conventions. Velocity and reliability vary by source.
- Operational latency: even when feeds exist, they’re hard to wire into live validations at booking, dispatch, and billing time.
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:
- One API, standard schema across endpoints: Fuel indices, live US FTL quotes, port congestion, carrier verification, and hazard alerts arrive in the same JSON envelope (success/data/error). You can plug responses into common utilities—parsers, logging, retries—without endpoint-specific glue code. This reduces parsing bugs and shortens your path to production-grade checks at booking and settlement.
- Cross-signal correlation without additional vendors: Use national and regional EIA fuel levels to contextualize a lane quote. Validate “port bottleneck” claims with PortWatch-based congestion ratios. Confirm a “weather delay” using cyclone, earthquake, or severe weather feeds filtered by port. No separate AIS feed, no parallel FMCSA scraper, no bespoke alert aggregator.
- Developer ergonomics for real-time validations: RESTful endpoints, filterable queries (e.g., port radius for hazard proximity), and a consistent shape for errors make it straightforward to build a single validator function that orchestrates checks. Simple cURL tests and polyglot-friendly payloads let you prototype quickly in terminal or Postman, then port into backend runtimes.
- Historical series built in: Anomaly detection depends on baselines. FreightPulse exposes historical diesel/gasoline trends and daily congestion series for curated ports so you can compute rolling means, z-scores, and control limits with no extra ETL. When a quote deviates materially from a historical band and there’s no matching structural signal, flag it for review.
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:
- timestamp: Normalize to your system time; use for cache staleness checks and audit logs.
- data.diesel.national_average: Use as a primary driver for diesel-linked surcharge models and quote reasonableness bands.
- data.diesel.regions.*: When a lane sits within a PADD region, use the appropriate regional average for finer-grained validation.
- data.diesel.historical.30d_avg / 90d_avg: Establish baseline corridors; for anomaly detection, compute deviations between lane quotes and normative fuel levels.
- gasoline fields: Useful for mixed fleets or benchmarking non-diesel contexts; can also spot misclassified surcharges.
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:
- diesel.national_average: Anchor for national programs when lane-specific detail isn’t available.
- diesel.change_week, diesel.change_percent: Build guardrails like “surcharge change should be within X of the weekly change.”
- regions: If your lane is NY to FL, consider the east_coast value for localized norms.
- historical: Construct moving thresholds or feed ML features (rolling mean, slope).
Fraud/Anomaly checks to implement:
- Surcharge sanity: If a carrier applies a 15% increase week-over-week while diesel change_percent is -0.6, flag for manual review.
- Region mismatch: For a Midwest lane using West Coast diesel as justification, flag discrepancy.
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:
- mode: trucking (default), ocean, or air
- trucking: origin_zip (required), destination_zip (required), pickup_date (optional), qty, total_weight_lb
- ocean/air: origin_country + dest_zip (limited to Asian origins into US for ocean/air)
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:
- price_usd: The headline signal; build reasonableness checks against historical lane quotes plus macro drivers.
- transit_days, pickup_date, delivery_date: Validate schedule plausibility; correlate delays with disruptions endpoint if delivery drifts.
- mode/service/source: Carry forward to your audit logs; can help differentiate expected variability by equipment or provider.
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:
- port: Name or LOCODE (e.g., USLAX)
- country: Name or ISO3
- region: Continent
- congestion: Filter by low | moderate | high
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:
- congestion: Categorical traffic-light for quick rules. Combine with ratio_vs_baseline to calibrate thresholds.
- ratio_vs_baseline: If < 1.0, activity is below the 90-day baseline—depending on the port and commodity, that could reflect seasonal lulls or disruptions. Track multi-week trends for better inference.
- Lag note: Because this series lags ~6–7 days, do not treat it as “live queue time.” Use it for risk scoring and justification audits rather than same-day dispatch decisions.
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:
- q: Required search term (DOT number or name for trucking; org number or name for ocean)
- type: trucking (default) | ocean | air (air returns available:false)
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:
- status: Expect “active” for operational carriers. Anything else merits escalation before dispatch or tender acceptance.
- safety_rating: Use to gate high-risk moves or require additional approvals for sensitive cargo.
- drivers: Sanity-check scale. If a carrier claiming nationwide capacity shows single-digit drivers, verify the arrangement.
- legal_name and address: Validate against documents to catch mismatches indicative of double-brokering or impersonation.
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:
- type: cyclone | earthquake | flood | volcano | drought | wildfire | severe_weather
- severity: low | moderate | high
- country: ISO or name
- port: Filter by proximity to a port (300km; 100km for US weather)
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:
- Match reason codes: If a claim cites cyclone impact, validate that an overlapping hazard exists and aligns in time and geography.
- Severity scaling: Apply different SLA relaxations or approval paths by severity; absence of matching hazards reduces confidence in the claim.
- Port filters: Use port=LOCODE to scope; for inland US weather, consider 100km rules specific to NOAA/NWS.
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:
- metric: fuel_price_diesel_national | fuel_price_gasoline_national | port_congestion:<portid>
- period: 30d (default) | 90d | 1y
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:
- For rate anomaly detection on US lanes, combine recent series windows (e.g., last 30–90 days) to form expected price corridors.
- For port risk context, fetch port_congestion:USLAX over 90d to quantify variance and identify regime shifts; these features help explain quote volatility.
- Normalize periods across lanes to compare apples-to-apples; store the series in your data warehouse for offline training.
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:
- Request routing: For lane quote checks, call /freight-rates first, then augment with /fuel-prices and /port-congestion (if port-relevant) and finally enrich with /disruptions when claims cite weather. Cache low-volatility data (diesel weekly, congestion daily) for short TTLs to reduce latency.
- Fallback chains: If /freight-rates is unavailable or returns available:false, fail open to rules based on historical averages and fuel deltas, but record lower confidence. If /port-congestion has no results, rely on historical baselines from /historical.
- Retries/backoff: Implement idempotent GET retries with exponential backoff and jitter for transient network errors or HTTP 5xx. Cap retries to maintain SLA with your calling systems.
- Circuit breakers: If upstream calls degrade, trip a circuit and use cached snapshots while alerting SREs. Maintain an explicit “data freshness” SLA and annotate every risk decision with the data age.
- Observability: Log the success flag, endpoint latency, and normalized decision inputs (e.g., diesel_national, price_usd, ratio_vs_baseline) for audit trails. Store the raw JSON payloads alongside derived features so analysts can reproduce decisions.
- Governance controls: Issue per-app credentials and roles in your platform. Log who/what invoked validations on which shipment. Maintain audit logs of all risk decisions and the underlying FreightPulse responses.
- Performance: Use regional routing from your infrastructure to minimize round trip latency. Coalesce calls (e.g., request /fuel-prices once per process window and share across validations) and parallelize independent lookups.
- Data locality: If you replicate data for analytics, tag datasets with geographic constraints and retention policies; mask or tokenize shipment or client identifiers in logs.
Feature engineering tips:
- Fuel-adjusted rate index: For each lane, compute price_usd / diesel_national to remove a common macro driver; anomalies in the de-fueled index are more indicative of fraud or quoting errors.
- Congestion-adjusted uplift: Multiply a lane’s baseline by a factor derived from port congestion ratio to estimate “expected uplift.” If realized price exceeds this by a configurable margin without supporting disruptions, flag.
- Claim-to-signal concordance: When a delay or surcharge cites “weather,” require at least one disruption event with overlapping time and geography. Assign a probability score by hazard type and severity.
- Carrier trust score: Combine status=active, safety_rating, and drivers with historical on-time performance in your system; require higher trust for high-value cargo and sensitive lanes.
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.