API documentation
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:
- An API key with prepaid credit. Send it on every call as
Authorization: Bearer fmk_...orX-API-Key: fmk_.... This is the route for teams without a crypto wallet. Request a free evaluation key ($5 of credit, reviewed by hand). - 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.
| Tool | What it answers | Arguments | Price |
|---|---|---|---|
find_carrier_by_mc | The USDOT number behind an MC, MX or FF docket, and the docket's status. | mc_number | Free |
screen_carrier_identity | Whether 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_number | Free |
get_catalog, get_sample, get_identity_sample | Every field and price, and free samples of real responses. | none | Free |
lookup_carrier | One carrier's current profile: status, authority, insurance-filing flags, out-of-service orders, safety rating and its date. | usdot_number | $0.01 |
search_carriers | Filtered search (state, safety tier and more). Up to 100 rows per call. | state, safety_tier, limit, more in the catalog | $0.02 |
get_safety_history | Dated snapshots and changelog entries for a carrier. | usdot_number | $0.015 |
get_inspection_crash_summary | Roadside inspection, violation and out-of-service counts and rates, and the trailing 24-month crash summary. | usdot_number | $0.02 |
check_broker_authority | Whether a broker holds active broker authority, with its dockets and bond-filing status. | mc_number or usdot_number | $0.05 |
check_carrier_identity | Identity-linkage detail for one carrier: flag, match score, cluster size, motive counts. Never names another carrier. | usdot_number | $0.05 |
check_address_consistency | How many distinct business addresses and phones a carrier reports across FMCSA's independent records. | usdot_number | $0.01 |
confirm_identity_link | Whether two carriers you already suspect share an identity cluster. | usdot_number_a, usdot_number_b | $0.08 |
check_applicant_against_roster | Whether 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_changes | Which 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_record | One 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
| Status | Meaning | Charged |
|---|---|---|
400 invalid_arguments | The body says what to fix: problems, expected_arguments and a working example. | No |
401 invalid_api_key | Unknown or revoked key. | No |
| 402 | Payment or enough credit needed. The response states the price and how to pay. | No |
404 not_found | No such carrier or docket. | No |
429 rate_limited | Over 60 requests a minute from one IP address. | No |
| 503 | The key store is unavailable. The call is never served free. | No |
504 query_timeout | The query timed out. | No |
The full list of error codes is on For agents.
What the data is, and is not
- Every response states the date its records are current as of (
record_as_of). Treat answers as of that date, never as live. - FMCSA stopped updating its legacy licensing and insurance archives on 2026-05-14. For about 72% of Active-authority carriers, authority and insurance-on-file fields describe that date. These carry the flag
authority_status_is_legacy_li_not_motus. Confirm current authority and insurance with FMCSA or the insurer before relying on them. - "Unrated" means FMCSA has assigned no safety rating. It is not a finding that a carrier is safe or unsafe. Crash counts are a floor, because some crash records carry no USDOT number.
- Identity-linkage fields are data patterns, not findings of fraud. The responses never name or point at another carrier.
- The data describes regulated motor carriers as business entities. It is not a consumer report and must not be used as one. See the Terms.
Questions, or want a key? Request a free evaluation key.