Freight Data Watch
← Carrier Identity Graph

Identity Graph API & webhooks

Run link analysis inside your TMS or onboarding flow, keep a watchlist of the carriers you use, and get signed webhooks when their FMCSA details change.

Authentication

Every broker plan gets an access key (starts with fdw_) when the plan starts. Send it in the X-API-Key header. The same key signs you in on the identity page for full reports and the watchlist. Keep it server-side.

curl -H "X-API-Key: $FDW_KEY" "https://freightdatawatch.com/api/v1/identity/report?dot=53467"

Endpoints

Base URL https://freightdatawatch.com/api/v1/identity. All responses are JSON.

GET/report?dot=53467billable check

Full identity report: every linked carrier (active and inactive), unmasked identifiers, full change history, review level and items. Also accepts ?q= with an MC number, name, phone or email; several matches return 300 with a list.

GET/search?q=…

Find carriers by USDOT, MC, company or officer name, phone, email or @domain.

GET/watchlist

Carriers you watch, with alert counts.

POST/watchlist

Add carriers: {"dot": 53467} or {"dots": [53467, 1234567], "label": "Q4 onboarding"}. Up to 1,000 per call.

DELETE/watchlist?dot=53467

Stop watching a carrier.

GET/alerts?since=2026-10-01&limit=100

Change alerts on watched carriers, newest first. Use this to poll if you do not want webhooks.

PUT/webhook

Set {"url": "https://…"} and/or {"emailAlerts": false}. Sends a signed test event; returns the signing secret the first time (or with "rotateSecret": true).

GET/usage

Billable checks this month, quota, watchlist size and delivery settings.

Only report calls are billed. A billable check is one carrier per calendar day (UTC), so reopening the same report that day is free. Search, watchlist, alerts and usage calls are not billed.

Errors & limits

401Missing, wrong or disabled key.
402Monthly check quota or watchlist limit reached.
404No carrier for that USDOT.
429More than 120 requests per minute on one key.
502The FMCSA source did not answer in time; retry shortly.

Change alerts

Every night after the FMCSA sync, new changes on watched carriers become alerts: new registrations, phone/email, address, officer, name, fleet-size and USDOT status changes, authority actions, insurance cancellations and suspension notices. Only changes detected after you add a carrier are sent. Each key can receive them as an email digest, a webhook, or by polling /alerts.

POST https://your-server.example.com/fdw-webhook
X-FDW-Timestamp: 1792137600
X-FDW-Signature: sha256=5f2c…

{
  "event": "carrier.changes",
  "sentAt": "2026-10-17T07:42:10.000Z",
  "alerts": [{
    "id": "al…", "dot": 1234567, "docket": "MC987654", "carrier": "EXAMPLE FREIGHT LLC",
    "kind": "contact_change", "label": "Phone / email change", "field": "phone",
    "oldValue": "(312) 555-0100", "newValue": "(786) 555-0199",
    "eventDate": null, "detectedAt": "2026-10-17T07:41:55.000Z"
  }]
}

Verify the signature before trusting the payload: HMAC-SHA256 of `${timestamp}.${rawBody}` with your signing secret. Reply with any 2xx status; failed deliveries are retried on the next nightly run, up to 5 times.

import crypto from 'crypto'

function verify(rawBody, timestamp, signature, secret) {
  const expected = 'sha256=' + crypto.createHmac('sha256', secret).update(timestamp + '.' + rawBody).digest('hex')
  const fresh = Math.abs(Date.now() / 1000 - Number(timestamp)) < 600
  return fresh && crypto.timingSafeEqual(Buffer.from(expected), Buffer.from(signature))
}

Good to know

Data comes from FMCSA public records. Change history starts October 16, 2026. Links and alerts show shared or changed public-record details for review; they are not evidence of fraud or wrongdoing. Public records have no VINs, so equipment is not matched.

Need a key? Request broker access.