FMCSA Carrier Intelligence

API documentation

Last updated: October 17, 2026.

One HTTP route per tool, JSON in and out. Look up a carrier by USDOT number, check broker authority, pull an inspection and crash summary, screen for identity linkage, or issue a dated carrier selection record. Built from FMCSA's public records.

Base URL

https://fmcsa-mcp-843680657471.us-central1.run.app/x402/<tool>

Send the tool's arguments as a JSON object in a POST body, or as query parameters on a GET (lists comma-separated). A machine-readable description of every route is at /openapi.json.

Try one now, with no account

Turn an MC number from a rate confirmation into a USDOT number. This tool is free.

curl "https://fmcsa-mcp-843680657471.us-central1.run.app/x402/find_carrier_by_mc?mc_number=MC12892"

Or use the free lookup page in your browser. With an API key and no code, run a check in your browser.

Authentication

Free tools need nothing. A paid tool accepts either of two ways to pay:

  1. An API key with prepaid credit. Send it on every call as Authorization: Bearer fmk_... or X-API-Key: fmk_.... This is the route for teams without a crypto wallet. Request a free evaluation key ($5 of credit, reviewed by hand).
  2. x402, USDC on Solana, Base or Polygon, paid per call with no account. A paid call without a key or payment gets an HTTP 402 stating its price. The payment flow is on For agents.

A call is charged only when it returns records. A USDOT number that does not exist, a search with zero results, or a service error costs nothing. With a key, each response carries x-credit-remaining-atomic, your balance in millionths of a dollar. An unknown or revoked key gets 401. A key with too little credit gets the normal 402, so that call can still be paid with x402.

A paid call with an API key

curl -X POST "https://fmcsa-mcp-843680657471.us-central1.run.app/x402/lookup_carrier" \
  -H "Authorization: Bearer fmk_YOUR_KEY" \
  -H "Content-Type: application/json" \
  -d '{"usdot_number": 2122247}'

Use a key from an MCP client

claude mcp add --transport http fmcsa-carrier https://fmcsa-mcp-843680657471.us-central1.run.app/mcp \
  --header "Authorization: Bearer fmk_YOUR_KEY"

In Cursor or another client that reads a JSON config:

{"mcpServers": {"fmcsa-carrier": {
  "url": "https://fmcsa-mcp-843680657471.us-central1.run.app/mcp",
  "headers": {"Authorization": "Bearer fmk_YOUR_KEY"}}}}

Endpoints

Every route is /x402/<tool>. Prices are per call in USD; see Pricing for the full table.

ToolWhat it answersArgumentsPrice
find_carrier_by_mcThe USDOT number behind an MC, MX or FF docket, and the docket's status.mc_numberFree
screen_carrier_identityWhether a carrier is flagged under FMCSA's chameleon-carrier methodology, its cluster size, and a count of linked carriers with a motive signal. No member detail.usdot_numberFree
get_catalog, get_sample, get_identity_sampleEvery field and price, and free samples of real responses.noneFree
lookup_carrierOne carrier's current profile: status, authority, insurance-filing flags, out-of-service orders, safety rating and its date.usdot_number$0.01
search_carriersFiltered search (state, safety tier and more). Up to 100 rows per call.state, safety_tier, limit, more in the catalog$0.02
get_safety_historyDated snapshots and changelog entries for a carrier.usdot_number$0.015
get_inspection_crash_summaryRoadside inspection, violation and out-of-service counts and rates, and the trailing 24-month crash summary.usdot_number$0.02
check_broker_authorityWhether a broker holds active broker authority, with its dockets and bond-filing status.mc_number or usdot_number$0.05
check_carrier_identityIdentity-linkage detail for one carrier: flag, match score, cluster size, motive counts. Never names another carrier.usdot_number$0.05
check_address_consistencyHow many distinct business addresses and phones a carrier reports across FMCSA's independent records.usdot_number$0.01
confirm_identity_linkWhether two carriers you already suspect share an identity cluster.usdot_number_a, usdot_number_b$0.08
check_applicant_against_rosterWhether an applicant shares an identity cluster with anyone on your own roster.usdot_number, roster_usdot_numbers$0.08 + $0.01 per roster entry
check_roster_changesWhich carriers on your roster changed on or after a date, and what changed.roster_usdot_numbers, since$0.05 + $0.005 per roster entry
get_carrier_selection_recordOne dated, SHA-256-hashed record of the public factors a broker's carrier-vetting file may cite. Not a score.usdot_number$0.10

Examples

Broker authority

curl -X POST ".../x402/check_broker_authority" -H "Authorization: Bearer fmk_YOUR_KEY" \
  -H "Content-Type: application/json" -d '{"mc_number": "MC147039"}'

Inspection and crash summary

curl -X POST ".../x402/get_inspection_crash_summary" -H "Authorization: Bearer fmk_YOUR_KEY" \
  -H "Content-Type: application/json" -d '{"usdot_number": 2122247}'

Carrier selection record

curl -X POST ".../x402/get_carrier_selection_record" -H "Authorization: Bearer fmk_YOUR_KEY" \
  -H "Content-Type: application/json" -d '{"usdot_number": 2122247}'

The record carries a SHA-256 hash of its own contents. A free link, GET /verify/<hash>, confirms that we issued exactly that record, when, and for which carrier. We store only the hash and four small facts, never the record. Read what a carrier-selection file should show.

Roster changes

curl -X POST ".../x402/check_roster_changes" -H "Authorization: Bearer fmk_YOUR_KEY" \
  -H "Content-Type: application/json" \
  -d '{"roster_usdot_numbers": [2122247, 1234567], "since": "2026-09-01"}'

Rosters take 1 to 100 distinct USDOT numbers. Over the limit is a free error, never a silent truncation.

Errors

StatusMeaningCharged
400 invalid_argumentsThe body says what to fix: problems, expected_arguments and a working example.No
401 invalid_api_keyUnknown or revoked key.No
402Payment or enough credit needed. The response states the price and how to pay.No
404 not_foundNo such carrier or docket.No
429 rate_limitedOver 60 requests a minute from one IP address.No
503The key store is unavailable. The call is never served free.No
504 query_timeoutThe query timed out.No

The full list of error codes is on For agents.

What the data is, and is not

Questions, or want a key? Request a free evaluation key.