{"openapi":"3.1.0","info":{"title":"FMCSA Carrier Intelligence","version":"0.1.0+4a3b1e1d92f1","description":"Pay-per-call US motor carrier safety, authority, insurance and identity-linkage data from FMCSA public records, for AI agents. USDC on Solana via x402; charged only when a call returns records."},"servers":[{"url":"https://fmcsa-mcp-843680657471.us-central1.run.app"}],"externalDocs":{"url":"https://kmcto.github.io/fmcsa-carrier-intelligence/for-agents/"},"paths":{"/x402/get_catalog":{"post":{"operationId":"get_catalog","summary":"Free, unauthenticated dataset catalog.","description":"Free, unauthenticated dataset catalog.\n\nDescribes every table this service sells, its fields, current pricing,\nand freshness. Read this before paying for anything.\n\nGET with query parameters (lists comma-separated) also works.\n\nExample: POST /x402/get_catalog with {}, or GET /x402/get_catalog. Free: no payment needed.","requestBody":{"required":false,"content":{"application/json":{"schema":{"properties":{},"title":"get_catalogArguments","type":"object"},"example":{}}}},"responses":{"200":{"description":"The result, as JSON.","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"invalid_arguments (not charged). The body lists each problem, the expected arguments and a working example."},"404":{"description":"not_found: no such carrier (not charged)."},"504":{"description":"query_timeout (not charged)."}}}},"/x402/get_sample":{"post":{"operationId":"get_sample","summary":"Free, unauthenticated sample of carrier_profile rows.","description":"Free, unauthenticated sample of carrier_profile rows.\n\nLets a buying agent evaluate data quality before spending USDC on the\npaid tools.\n\nGET with query parameters (lists comma-separated) also works.\n\nExample: POST /x402/get_sample with {}, or GET /x402/get_sample. Free: no payment needed.","requestBody":{"required":false,"content":{"application/json":{"schema":{"properties":{},"title":"get_sampleArguments","type":"object"},"example":{}}}},"responses":{"200":{"description":"The result, as JSON.","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"invalid_arguments (not charged). The body lists each problem, the expected arguments and a working example."},"404":{"description":"not_found: no such carrier (not charged)."},"504":{"description":"query_timeout (not charged)."}}}},"/x402/lookup_carrier":{"post":{"operationId":"lookup_carrier","summary":"Look up a single carrier's current profile by USDOT number. Paid —","description":"Look up a single carrier's current profile by USDOT number. Paid —\nyou pay only when a call returns records; an exact-key miss is free.\n\nReturns every carrier_status (Active, Inactive, Pending) — check the\ncarrier_status field, don't assume Active.\n\ninsurance_cancel_pending is true when an insurance cancellation is on\nfile and not yet effective as of record_as_of (rare: dozens of carriers,\nnot thousands). Compare soonest_cancel_effective_date with today: the\ndata is a monthly snapshot, so the cancellation may already have taken\neffect. days_to_cancel_effective counts from record_as_of, not today.\n\nCarries no contact information (legal_name, dba_name, addresses,\nphone, email — removed 2026-09-19, see schemas.CarrierProfile). The one\nlegitimate use those fields served — confirming a carrier's claimed\nidentity against records, e.g. to catch a carrier-identity-theft\n(\"double brokering\") attempt — is available instead via claimed_name\n(matched against legal_name OR dba_name) and claimed_street/\nclaimed_city/claimed_state/claimed_zip (matched against\nphysical_address; supply any subset). Returns name_match/\nphysical_address_match as a boolean per claim actually supplied, `null`\nfor a claim not supplied — never the value on file itself.\n\nGET with query parameters (lists comma-separated) also works.\n\nExample: POST /x402/lookup_carrier with {\"usdot_number\": 1234567}, or GET /x402/lookup_carrier?usdot_number=1234567.","requestBody":{"required":false,"content":{"application/json":{"schema":{"properties":{"usdot_number":{"title":"Usdot Number","type":"integer"},"claimed_name":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Claimed Name"},"claimed_street":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Claimed Street"},"claimed_city":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Claimed City"},"claimed_state":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Claimed State"},"claimed_zip":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Claimed Zip"}},"required":["usdot_number"],"title":"lookup_carrierArguments","type":"object"},"example":{"usdot_number":1234567}}}},"responses":{"200":{"description":"The result, as JSON.","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"invalid_arguments (not charged). The body lists each problem, the expected arguments and a working example."},"404":{"description":"not_found: no such carrier (not charged)."},"504":{"description":"query_timeout (not charged)."},"402":{"description":"Payment required: x402 v2 challenge in the PAYMENT-REQUIRED header (also the body). Pay with PAYMENT-SIGNATURE. Charged only when records are returned."}},"x-payment-info":{"protocols":["x402"],"price":{"mode":"fixed","currency":"USD","amount":"0.01"}}}},"/x402/search_carriers":{"post":{"operationId":"search_carriers","summary":"Filtered carrier search. Paid — you pay only when a call returns","description":"Filtered carrier search. Paid — you pay only when a call returns\nrecords; a zero-row result is free, same as an exact-key miss.\n\nsafety_tier filters on safety_tier_derived: 1 = inspected with zero\nBASIC alerts, up to 6 = all five BASICs alerted. Carriers with no tier\n(never inspected, or not in SMS) never match a tier filter.\n\nDefaults to Active carriers only — pass include_inactive=true to also\nsee Inactive/Pending. Capped at 100 rows per response regardless of the\nrequested limit; never a full-table dump. Carries no contact\ninformation (legal_name, dba_name, addresses, phone, email — removed\n2026-09-19, see schemas.CarrierProfile) — a filterable, multi-result\nendpoint returning personal contact details for whoever matched a\nfilter was the sharpest version of that risk in this product; use\nlookup_carrier's claimed_name/claimed_street/etc. if you need to\nconfirm a specific carrier's claimed identity.\n\nGET with query parameters (lists comma-separated) also works.\n\nExample: POST /x402/search_carriers with {\"state\": \"TX\", \"safety_tier\": 1, \"limit\": 20}, or GET /x402/search_carriers?state=TX&safety_tier=1&limit=20.","requestBody":{"required":false,"content":{"application/json":{"schema":{"properties":{"state":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"State"},"safety_tier":{"anyOf":[{"type":"integer"},{"type":"null"}],"default":null,"title":"Safety Tier"},"authority_status":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Authority Status"},"cargo_type":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Cargo Type"},"include_inactive":{"default":false,"title":"Include Inactive","type":"boolean"},"limit":{"default":20,"title":"Limit","type":"integer"}},"title":"search_carriersArguments","type":"object"},"example":{"state":"TX","safety_tier":1,"limit":20}}}},"responses":{"200":{"description":"The result, as JSON.","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"invalid_arguments (not charged). The body lists each problem, the expected arguments and a working example."},"404":{"description":"not_found: no such carrier (not charged)."},"504":{"description":"query_timeout (not charged)."},"402":{"description":"Payment required: x402 v2 challenge in the PAYMENT-REQUIRED header (also the body). Pay with PAYMENT-SIGNATURE. Charged only when records are returned."}},"x-payment-info":{"protocols":["x402"],"price":{"mode":"fixed","currency":"USD","amount":"0.02"}}}},"/x402/get_safety_history":{"post":{"operationId":"get_safety_history","summary":"Historical snapshots and changelog entries for a carrier. Paid —","description":"Historical snapshots and changelog entries for a carrier. Paid —\nyou pay only when a call returns records; an exact-key miss is free.\n\nchangelog may legitimately be empty for a carrier without two\ndistinct-date snapshots yet — a diff needs both. authority_types,\noos_orders_active, insurance_bipd_on_file, insurance_cargo_on_file,\ninsurance_bond_on_file, has_been_revoked, and last_revocation_date are\nnull (not false/empty) on a history row recorded before 2026-09-02 —\ncarrier_history wasn't tracking those fields yet, so null there means\n\"not tracked on this date,\" not a negative answer. Likewise\nhas_been_suspended/last_suspension_date are null before 2026-09-06,\nand has_authority_reinstated/last_reinstatement_date/\nhas_insurance_identity_mismatch are null before 2026-09-12, and\ninsurance_cancel_pending/days_to_cancel_effective/\nsoonest_cancel_effective_date are null before 2026-10-04. changelog\nholds real changes only (change_kind \"value_changed\"): the row the\nwarehouse writes when a field first starts being tracked is never\nreturned. About 97% of authority_status changes are dated 2026-09-02,\nwhen FMCSA's licensing data switched systems; treat that date's\nauthority_status changes with some caution. Likewise most\nsafety_tier_derived changes dated 2026-10-10 come from a method change\n(a second SMS file added; never-inspected carriers moved from tier 1\nto null), not from the carrier. Carries no\ncontact information (legal_name, dba_name, addresses, phone, email —\nremoved 2026-09-19, see schemas.CarrierProfile); changelog excludes\nfield_name in {legal_name, dba_name, phone, email} for the same reason\n— a changed value is still the value.\n\nGET with query parameters (lists comma-separated) also works.\n\nExample: POST /x402/get_safety_history with {\"usdot_number\": 1234567}, or GET /x402/get_safety_history?usdot_number=1234567.","requestBody":{"required":false,"content":{"application/json":{"schema":{"properties":{"usdot_number":{"title":"Usdot Number","type":"integer"},"since_date":{"anyOf":[{"format":"date","type":"string"},{"type":"null"}],"default":null,"title":"Since Date"}},"required":["usdot_number"],"title":"get_safety_historyArguments","type":"object"},"example":{"usdot_number":1234567}}}},"responses":{"200":{"description":"The result, as JSON.","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"invalid_arguments (not charged). The body lists each problem, the expected arguments and a working example."},"404":{"description":"not_found: no such carrier (not charged)."},"504":{"description":"query_timeout (not charged)."},"402":{"description":"Payment required: x402 v2 challenge in the PAYMENT-REQUIRED header (also the body). Pay with PAYMENT-SIGNATURE. Charged only when records are returned."}},"x-payment-info":{"protocols":["x402"],"price":{"mode":"fixed","currency":"USD","amount":"0.015"}}}},"/x402/screen_carrier_identity":{"post":{"operationId":"screen_carrier_identity","summary":"Free triage screen for a carrier: whether it's flagged under FMCSA's","description":"Free triage screen for a carrier: whether it's flagged under FMCSA's\nown chameleon-carrier methodology, how big its identity cluster is,\nand how many linked carriers carry a motive — with no member detail.\nCall check_carrier_identity (paid) for that.\n\nThis is the entire discovery/sales motion in an agent-only channel,\nnot a discount tier — free by design (Identity-API-Revision-\n2026-09-06.md Section 1), so it never bills and never requires\npayment. By the same design, it withholds anything that identifies a\nlinked carrier: no member USDOT number, no legal name, no link type,\nno identifier hash. A caller learns THAT there is something to look\nat here, not WHAT.\n\nconfidence_caveat discloses the known ~6% artifact rate and that\nrecall is not measurable in FMCSA's public data — read it, don't just\ncheck the flagged boolean. match_score_practical_ceiling is computed\nper carrier from which ARCHI terms were actually available for it,\nnot a flat constant — most carriers cap out well below the\ntheoretical 8.5.\n\nAn unknown USDOT number returns a not_found error.\n\nGET with query parameters (lists comma-separated) also works.\n\nExample: POST /x402/screen_carrier_identity with {\"usdot_number\": 2122247}, or GET /x402/screen_carrier_identity?usdot_number=2122247. Free: no payment needed.","requestBody":{"required":false,"content":{"application/json":{"schema":{"properties":{"usdot_number":{"title":"Usdot Number","type":"integer"}},"required":["usdot_number"],"title":"screen_carrier_identityArguments","type":"object"},"example":{"usdot_number":2122247}}}},"responses":{"200":{"description":"The result, as JSON.","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"invalid_arguments (not charged). The body lists each problem, the expected arguments and a working example."},"404":{"description":"not_found: no such carrier (not charged)."},"504":{"description":"query_timeout (not charged)."}}}},"/x402/check_carrier_identity":{"post":{"operationId":"check_carrier_identity","summary":"Full identity-linkage detail for a carrier: why it's flagged and how","description":"Full identity-linkage detail for a carrier: why it's flagged and how\nconfident that is. Priced meaningfully above the free\nscreen_carrier_identity — call that first if you only need the flag\nand a count.\n\nNever names or points at another carrier (redesigned 2026-09-18 — see\nschemas.IdentityAssessment's docstring): no linked USDOT number, legal\nname, or shared-identifier hash. A linked carrier's own identity was\nnever this caller's to receive, and an unsalted hash of a low-entropy\nvalue like a phone number or address doesn't meaningfully withhold it\nfrom a determined party anyway (confirmed by reading Truckin's own\nhashing code). Every field here is either the subject carrier's own\ndata or a derivative signal — a score, a match-term-type label\n(which *kind* of identifier matched, never the value), a count, a\nboolean.\n\nSSN and EIN matches carry weight 2.0 each in FMCSA's ARCHI methodology\nand are not present in public data; D&B is nominally weight 2.0 too\nbut is only genuinely available for ~4% of carriers, and officer data\n(needed for the name x officer term) is missing for another ~15%. So\nscore_provenance.match_score_ceiling is computed per carrier, not a\nflat 4.5 — most responses cap out at 2.5 or lower. It also states\nplainly that recall against FMCSA's own declared-predecessor label\nset is not measurable. flagged applies FMCSA's own ARCHI flag rule\n(match_score >= 1.5 AND a linked motive >= 1); it is not a fraud\ndetermination and must not be presented as one. Note flagged and\nmatch_score >= 1.5 are NOT the same condition — clustering requires\n2+ independent identifier-type families to agree, so materially more\ncarriers clear the score threshold than are ever flagged.\n\nPaid. A carrier with no linked carriers is a complete answer and\nbills; an unknown USDOT number is a free not_found.\n\nGET with query parameters (lists comma-separated) also works.\n\nExample: POST /x402/check_carrier_identity with {\"usdot_number\": 1234567}, or GET /x402/check_carrier_identity?usdot_number=1234567.","requestBody":{"required":false,"content":{"application/json":{"schema":{"properties":{"usdot_number":{"title":"Usdot Number","type":"integer"}},"required":["usdot_number"],"title":"check_carrier_identityArguments","type":"object"},"example":{"usdot_number":1234567}}}},"responses":{"200":{"description":"The result, as JSON.","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"invalid_arguments (not charged). The body lists each problem, the expected arguments and a working example."},"404":{"description":"not_found: no such carrier (not charged)."},"504":{"description":"query_timeout (not charged)."},"402":{"description":"Payment required: x402 v2 challenge in the PAYMENT-REQUIRED header (also the body). Pay with PAYMENT-SIGNATURE. Charged only when records are returned."}},"x-payment-info":{"protocols":["x402"],"price":{"mode":"fixed","currency":"USD","amount":"0.05"}}}},"/x402/check_address_consistency":{"post":{"operationId":"check_address_consistency","summary":"How many distinct business addresses and phones this carrier","description":"How many distinct business addresses and phones this carrier\nreports across FMCSA's independent records of it (census\nregistration, licensing and insurance filings, and its own\nself-reported crash records). Mailing addresses are excluded —\ndiffering from the physical address there is normal.\n\nPaid. Cheaper than either identity tool; one row, no graph.\n\nGET with query parameters (lists comma-separated) also works.\n\nExample: POST /x402/check_address_consistency with {\"usdot_number\": 1234567}, or GET /x402/check_address_consistency?usdot_number=1234567.","requestBody":{"required":false,"content":{"application/json":{"schema":{"properties":{"usdot_number":{"title":"Usdot Number","type":"integer"}},"required":["usdot_number"],"title":"check_address_consistencyArguments","type":"object"},"example":{"usdot_number":1234567}}}},"responses":{"200":{"description":"The result, as JSON.","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"invalid_arguments (not charged). The body lists each problem, the expected arguments and a working example."},"404":{"description":"not_found: no such carrier (not charged)."},"504":{"description":"query_timeout (not charged)."},"402":{"description":"Payment required: x402 v2 challenge in the PAYMENT-REQUIRED header (also the body). Pay with PAYMENT-SIGNATURE. Charged only when records are returned."}},"x-payment-info":{"protocols":["x402"],"price":{"mode":"fixed","currency":"USD","amount":"0.01"}}}},"/x402/confirm_identity_link":{"post":{"operationId":"confirm_identity_link","summary":"Confirms or denies that two carriers YOU ALREADY SUSPECT are linked","description":"Confirms or denies that two carriers YOU ALREADY SUSPECT are linked\nin fact share an identity cluster — the lower-risk alternative to\ncheck_carrier_identity's removed linked_carriers field (see\nschemas.IdentityAssessment's docstring for why that was removed\n2026-09-18).\n\nThis never discloses a carrier's identity to a caller who didn't\nalready have it: both usdot_number_a and usdot_number_b are supplied\nby you. It only ever answers \"do these two specific carriers share a\ncluster?\", never \"who is linked to this carrier?\" — call\ncheck_carrier_identity for that, which stops at a score and a count\nfor exactly this reason. cluster_id is returned only when linked is\ntrue, and isn't new information even then — you could obtain the same\nvalue directly from either carrier's own check_carrier_identity or\nscreen_carrier_identity response.\n\nusdot_number_a and usdot_number_b must differ (invalid_arguments,\nfree — there is no comparison to make). Either number failing to\nresolve in carrier_identity_cluster is a free not_found, same as\ncheck_carrier_identity.\n\nPaid — pricier than check_carrier_identity, since it resolves two\ncarriers' clusters per call, not one. A \"not linked\" result is a\ncomplete, valuable answer and bills the same as \"linked\", same\nreasoning as check_carrier_identity's cluster_size == 1.\n\nGET with query parameters (lists comma-separated) also works.\n\nExample: POST /x402/confirm_identity_link with {\"usdot_number_a\": 1234567, \"usdot_number_b\": 2345678}, or GET /x402/confirm_identity_link?usdot_number_a=1234567&usdot_number_b=2345678.","requestBody":{"required":false,"content":{"application/json":{"schema":{"properties":{"usdot_number_a":{"title":"Usdot Number A","type":"integer"},"usdot_number_b":{"title":"Usdot Number B","type":"integer"}},"required":["usdot_number_a","usdot_number_b"],"title":"confirm_identity_linkArguments","type":"object"},"example":{"usdot_number_a":1234567,"usdot_number_b":2345678}}}},"responses":{"200":{"description":"The result, as JSON.","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"invalid_arguments (not charged). The body lists each problem, the expected arguments and a working example."},"404":{"description":"not_found: no such carrier (not charged)."},"504":{"description":"query_timeout (not charged)."},"402":{"description":"Payment required: x402 v2 challenge in the PAYMENT-REQUIRED header (also the body). Pay with PAYMENT-SIGNATURE. Charged only when records are returned."}},"x-payment-info":{"protocols":["x402"],"price":{"mode":"fixed","currency":"USD","amount":"0.08"}}}},"/x402/check_applicant_against_roster":{"post":{"operationId":"check_applicant_against_roster","summary":"Screens one applicant carrier against a roster of carriers you","description":"Screens one applicant carrier against a roster of carriers you\nalready do business with (or are vetting) — the batch generalization\nof confirm_identity_link, for the real-world case of catching a\ncarrier that was previously cut from your network (revoked,\nsuspended, or otherwise let go) trying to re-enter under a new USDOT\nnumber. usdot_number is the applicant; roster_usdot_numbers is your\nown list, supplied by you.\n\nReturns linked (true if the applicant shares an identity cluster with\nANY roster member) and matched_roster_usdot_numbers (which ones,\nalways a subset of what you supplied — never a carrier you didn't\nalready name). roster_not_found lists any roster entries that simply\ndon't resolve to a known carrier (still your own input, not a new\ndisclosure). usdot_number's own cluster_id is always included, same\nas check_carrier_identity's convention — it's the applicant's own\ndata, not something withheld pending a match.\n\nusdot_number must not also appear in roster_usdot_numbers, and\nroster_usdot_numbers must be a non-empty list of at most\nsettings.roster_screen_max_size distinct entries (currently 100) —\neither violation is a free invalid_arguments; split a larger roster\ninto multiple calls rather than expecting it to be truncated for you.\nAn unresolved usdot_number (the applicant itself) is a free not_found,\nsame as confirm_identity_link/check_carrier_identity.\n\nPaid, metered: price = price_check_applicant_against_roster_base +\nprice_check_applicant_against_roster_per_entry * (the deduped roster\nsize) — see get_catalog for current rates. A \"not linked to anything\non your roster\" result is a complete, valuable answer and bills the\nsame as a match, same reasoning as check_carrier_identity's\ncluster_size == 1.\n\nGET with query parameters (lists comma-separated) also works.\n\nExample: POST /x402/check_applicant_against_roster with {\"usdot_number\": 1234567, \"roster_usdot_numbers\": [2345678, 3456789]}, or GET /x402/check_applicant_against_roster?usdot_number=1234567&roster_usdot_numbers=2345678,3456789.","requestBody":{"required":false,"content":{"application/json":{"schema":{"properties":{"usdot_number":{"title":"Usdot Number","type":"integer"},"roster_usdot_numbers":{"items":{"type":"integer"},"title":"Roster Usdot Numbers","type":"array"}},"required":["usdot_number","roster_usdot_numbers"],"title":"check_applicant_against_rosterArguments","type":"object"},"example":{"usdot_number":1234567,"roster_usdot_numbers":[2345678,3456789]}}}},"responses":{"200":{"description":"The result, as JSON.","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"invalid_arguments (not charged). The body lists each problem, the expected arguments and a working example."},"404":{"description":"not_found: no such carrier (not charged)."},"504":{"description":"query_timeout (not charged)."},"402":{"description":"Payment required: x402 v2 challenge in the PAYMENT-REQUIRED header (also the body). Pay with PAYMENT-SIGNATURE. Charged only when records are returned."}},"x-payment-info":{"protocols":["x402"],"price":{"mode":"dynamic","currency":"USD","min":"0.09","max":"1.08"}}}},"/x402/get_identity_sample":{"post":{"operationId":"get_identity_sample","summary":"Free, unauthenticated sample of identity/fraud responses, covering","description":"Free, unauthenticated sample of identity/fraud responses, covering\nboth screen_carrier_identity's free IdentityScreen shape and\ncheck_carrier_identity's paid IdentityAssessment shape.\n\nLets a buying agent see the paid response shape and evaluate data\nquality before spending USDC on check_carrier_identity.\n\nGET with query parameters (lists comma-separated) also works.\n\nExample: POST /x402/get_identity_sample with {}, or GET /x402/get_identity_sample. Free: no payment needed.","requestBody":{"required":false,"content":{"application/json":{"schema":{"properties":{},"title":"get_identity_sampleArguments","type":"object"},"example":{}}}},"responses":{"200":{"description":"The result, as JSON.","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"invalid_arguments (not charged). The body lists each problem, the expected arguments and a working example."},"404":{"description":"not_found: no such carrier (not charged)."},"504":{"description":"query_timeout (not charged)."}}}},"/x402/find_carrier_by_mc":{"post":{"operationId":"find_carrier_by_mc","summary":"Free. Finds the USDOT number for an operating-authority docket number","description":"Free. Finds the USDOT number for an operating-authority docket number\n(MC, MX or FF), so a broker holding the MC number from a rate\nconfirmation can reach the other tools, which take a USDOT number.\n\nmc_number may be written \"MC123456\", \"MC-123456\", \"mc 123456\" or just\n\"123456\" (a bare number is taken as MC); zero-padding is ignored, because\nFMCSA's own files disagree on it. authority_holder_usdot_number is the\ncarrier FMCSA's authority records tie the docket to, and there is never\nmore than one. usdot_numbers lists every carrier that lists the docket\n(FMCSA's census lists about 26,000 dockets under a second carrier too, so\na docket can legitimately appear under two), the holder first. docket_status\nand status_source say how current that is: \"motus\" is live, \"legacy_li\" is\nFMCSA's archive as of 2026-05-14, \"census\" is the census file's code.\nReturns only identifiers and a status, no names or addresses. An unknown\ndocket is a not_found error; an unreadable one is invalid_arguments.\nNever billed.\n\nGET with query parameters (lists comma-separated) also works.\n\nExample: POST /x402/find_carrier_by_mc with {\"mc_number\": \"MC747317\"}, or GET /x402/find_carrier_by_mc?mc_number=MC747317. Free: no payment needed.","requestBody":{"required":false,"content":{"application/json":{"schema":{"properties":{"mc_number":{"title":"Mc Number","type":"string"}},"required":["mc_number"],"title":"find_carrier_by_mcArguments","type":"object"},"example":{"mc_number":"MC747317"}}}},"responses":{"200":{"description":"The result, as JSON.","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"invalid_arguments (not charged). The body lists each problem, the expected arguments and a working example."},"404":{"description":"not_found: no such carrier (not charged)."},"504":{"description":"query_timeout (not charged)."}}}},"/x402/check_roster_changes":{"post":{"operationId":"check_roster_changes","summary":"Which carriers on your roster changed on or after a date, and what","description":"Which carriers on your roster changed on or after a date, and what\nchanged: authority, insurance, out-of-service and the other tracked\nfields, each with its old and new value. Paid, metered: a base price plus\na per-roster-entry price, both shown in get_catalog.\n\nroster_usdot_numbers is your own list of USDOT numbers (non-empty, at\nmost settings.roster_screen_max_size distinct entries, currently 100:\nover the limit is a free invalid_arguments, never a truncation). since is\nan ISO date, YYYY-MM-DD. A roster entry that matches no carrier is\nlisted in roster_not_found but still counts toward the price. \"Nothing\nchanged\" is a complete answer and bills like any other; a roster where\nno entry resolves is a free not_found.\n\nHow fresh this is: changes appear only when the underlying data is\nrefreshed (roughly weekly lately, with no committed schedule), so a\nchange made at FMCSA today may not be here yet. provenance.record_as_of\nsays how current the data is. Only real changes are returned (the\nwarehouse's one-time \"field started being tracked\" rows are not). At\nmost settings.roster_changes_max_rows changes come back, newest first;\ntruncated says whether more existed. Carries no contact information, and\nno change to legal_name, dba_name, phone or email, same as\nget_safety_history.\n\nGET with query parameters (lists comma-separated) also works.\n\nExample: POST /x402/check_roster_changes with {\"roster_usdot_numbers\": [2122247, 1234567], \"since\": \"2026-09-01\"}, or GET /x402/check_roster_changes?roster_usdot_numbers=2122247,1234567&since=2026-09-01.","requestBody":{"required":false,"content":{"application/json":{"schema":{"properties":{"roster_usdot_numbers":{"items":{"type":"integer"},"title":"Roster Usdot Numbers","type":"array"},"since":{"title":"Since","type":"string"}},"required":["roster_usdot_numbers","since"],"title":"check_roster_changesArguments","type":"object"},"example":{"roster_usdot_numbers":[2122247,1234567],"since":"2026-09-01"}}}},"responses":{"200":{"description":"The result, as JSON.","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"invalid_arguments (not charged). The body lists each problem, the expected arguments and a working example."},"404":{"description":"not_found: no such carrier (not charged)."},"504":{"description":"query_timeout (not charged)."},"402":{"description":"Payment required: x402 v2 challenge in the PAYMENT-REQUIRED header (also the body). Pay with PAYMENT-SIGNATURE. Charged only when records are returned."}},"x-payment-info":{"protocols":["x402"],"price":{"mode":"dynamic","currency":"USD","min":"0.055","max":"0.550"}}}},"/x402/get_carrier_selection_record":{"post":{"operationId":"get_carrier_selection_record","summary":"One dated, hashed record of what public FMCSA data shows about a","description":"One dated, hashed record of what public FMCSA data shows about a\ncarrier, built for a broker's carrier-vetting file. Paid, flat price.\n\nIt gathers, in one response: the carrier's current profile (authority,\ninsurance flags, FMCSA safety rating and its date, out-of-service\norders, fleet and classifications, MCS-150 filing date, first authority\ngrant, revocation, suspension and reinstatement history), the SMS\ninspection and violation summary with out-of-service rates, the\ntrailing-24-month crash summary, the last year's changes, and the\nidentity-linkage triage screen, the insurance continuity history (gaps and\ncancellations, each with its data-through date) and the authority event\nhistory (grants, reinstatements, revocations, suspensions). review_factors lists each factor a\ndocumented review commonly considers and whether this record carries it.\n\nIt is a record, not a score. It never says a carrier is safe or unsafe,\n\"Unrated\" is reported as exactly that, and it is not legal advice or a\nstatement that choosing a carrier was reasonable. This project's own\nsafety_tier_derived is deliberately left out.\n\nIntegrity: record_hash is the SHA-256 of the record's canonical JSON (see\nhash_method) without record_hash and verify_url. Keep the record; later,\nGET verify_url (free) confirms that we issued exactly that hash, when, and\nfor which carrier, so an edited copy is detectable. If the hash cannot be\nregistered the call returns registry_unavailable and is not billed. An\nunknown USDOT number is a free not_found.\n\nGET with query parameters (lists comma-separated) also works.\n\nExample: POST /x402/get_carrier_selection_record with {\"usdot_number\": 1234567}, or GET /x402/get_carrier_selection_record?usdot_number=1234567.","requestBody":{"required":false,"content":{"application/json":{"schema":{"properties":{"usdot_number":{"title":"Usdot Number","type":"integer"}},"required":["usdot_number"],"title":"get_carrier_selection_recordArguments","type":"object"},"example":{"usdot_number":1234567}}}},"responses":{"200":{"description":"The result, as JSON.","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"invalid_arguments (not charged). The body lists each problem, the expected arguments and a working example."},"404":{"description":"not_found: no such carrier (not charged)."},"504":{"description":"query_timeout (not charged)."},"402":{"description":"Payment required: x402 v2 challenge in the PAYMENT-REQUIRED header (also the body). Pay with PAYMENT-SIGNATURE. Charged only when records are returned."}},"x-payment-info":{"protocols":["x402"],"price":{"mode":"fixed","currency":"USD","amount":"0.10"}}}},"/x402/get_inspection_crash_summary":{"post":{"operationId":"get_inspection_crash_summary","summary":"A carrier's roadside inspection, violation and crash summary on its","description":"A carrier's roadside inspection, violation and crash summary on its\nown. Paid, flat price; billed whenever the USDOT number resolves, even if\nthe carrier had no inspections (that is the finding). An unknown number is\na free not_found.\n\ninspections (SMS data, a 24-month window that ends weeks before today:\nread window_end): inspection counts by driver and vehicle, out-of-service\ncounts and rates (FMCSA's own method; no national average is carried, so\ncite FMCSA's), violation counts in total and by BASIC, last inspection\ndate. When there were no inspections the measures are null, never zero,\nand data_quality_flags says why: inspection_summary_no_inspections (in\nSMS, none in the window) or inspection_summary_unavailable (in neither\nSMS file, so SMS says nothing either way). A carrier inspected only after\nwindow_end reads as having none.\n\ncrashes (federally recordable crashes, trailing 730 days ending at the\nbuild date): counts by fatal, injury, tow-away and hazmat release, plus\nfatalities and injuries and the last crash date. A floor, not a total:\nabout 19% of crash records carry no USDOT number and cannot be attributed\nto any carrier.\n\nCounts, not a rating: this does not say a carrier is safe or unsafe, and\nit carries no contact information.\n\nGET with query parameters (lists comma-separated) also works.\n\nExample: POST /x402/get_inspection_crash_summary with {\"usdot_number\": 1234567}, or GET /x402/get_inspection_crash_summary?usdot_number=1234567.","requestBody":{"required":false,"content":{"application/json":{"schema":{"properties":{"usdot_number":{"title":"Usdot Number","type":"integer"}},"required":["usdot_number"],"title":"get_inspection_crash_summaryArguments","type":"object"},"example":{"usdot_number":1234567}}}},"responses":{"200":{"description":"The result, as JSON.","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"invalid_arguments (not charged). The body lists each problem, the expected arguments and a working example."},"404":{"description":"not_found: no such carrier (not charged)."},"504":{"description":"query_timeout (not charged)."},"402":{"description":"Payment required: x402 v2 challenge in the PAYMENT-REQUIRED header (also the body). Pay with PAYMENT-SIGNATURE. Charged only when records are returned."}},"x-payment-info":{"protocols":["x402"],"price":{"mode":"fixed","currency":"USD","amount":"0.02"}}}},"/x402/check_broker_authority":{"post":{"operationId":"check_broker_authority","summary":"Does this broker hold active broker authority, and what does FMCSA's","description":"Does this broker hold active broker authority, and what does FMCSA's\nrecord say around it? Give exactly one of mc_number (the broker's MC\ndocket, written MC123456, MC-123456 or 123456) or usdot_number. Paid, flat\nprice; billed whenever the carrier resolves, including when it holds no\nbroker authority (that is the answer). An unknown docket or USDOT number\nis a free not_found; giving neither or both, or a docket FMCSA lists under\nseveral carriers without naming a holder, is a free error.\n\nReturns holds_active_broker_authority and the broker dockets (docket\nnumber, status, how current that status is, active types, first grant and\nlast event dates); the bond (BMC-84/85) on-file flag with its continuity\n(coverage unbroken since, current gap, closed lapses in 24 and 60 months,\nlongest gap, data-through date); the authority event history (grants,\nreinstatements, revocations, suspensions, in total and over 24 and 60\nmonths); revocation, suspension and reinstatement flags; and the identity\nlinkage screen. A record, not a recommendation or a rating.\n\nHow far to trust \"holds active broker authority\": it is as complete as the\ntwo FMCSA sources behind it. FMCSA froze its legacy licensing archive on\n2026-05-14, so a docket known only from it (status_source legacy_li)\ndescribes that date, and a docket whose status changed afterwards and is\nnot yet on FMCSA's live MOTUS roster is not seen. There is no independent\ncount of real brokers to check against. Confirm the broker's current\nauthority and bond with FMCSA before relying on it.\n\nGET with query parameters (lists comma-separated) also works.\n\nExample: POST /x402/check_broker_authority with {\"mc_number\": \"MC147039\"}, or GET /x402/check_broker_authority?mc_number=MC147039.","requestBody":{"required":false,"content":{"application/json":{"schema":{"properties":{"mc_number":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Mc Number"},"usdot_number":{"anyOf":[{"type":"integer"},{"type":"null"}],"default":null,"title":"Usdot Number"}},"title":"check_broker_authorityArguments","type":"object"},"example":{"mc_number":"MC147039"}}}},"responses":{"200":{"description":"The result, as JSON.","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"invalid_arguments (not charged). The body lists each problem, the expected arguments and a working example."},"404":{"description":"not_found: no such carrier (not charged)."},"504":{"description":"query_timeout (not charged)."},"402":{"description":"Payment required: x402 v2 challenge in the PAYMENT-REQUIRED header (also the body). Pay with PAYMENT-SIGNATURE. Charged only when records are returned."}},"x-payment-info":{"protocols":["x402"],"price":{"mode":"fixed","currency":"USD","amount":"0.05"}}}}}}