One-call pickup check
/v1/check returns good or bad with the reasons: authority, insurance and flags plus the truck match. Add strict=true to treat any warning as a failure.
Live · API / 01 · Transportation
Vet a US trucking carrier and verify the truck at pickup, in one call. Send a USDOT number, MC docket, company name, license plate or VIN and get clean JSON built from FMCSA public data: operating authority, insurance on file vs. required, roadside inspection history and explainable risk flags.
01 Overview
Most carrier lookups stop at the company. Double brokering and carrier identity theft happen at the dock: a legitimate MC number on the paperwork and a different company's truck at pickup.
/v1/check returns good or bad with the reasons: authority, insurance and flags plus the truck match. Add strict=true to treat any warning as a failure.
See every carrier a truck has been inspected under, with dates. Almost no carrier API offers this.
A morning sweep of every carrier picking up today is one request, not a hundred.
BI&PD, cargo and bond on file vs. the federal minimum, with insurer, policy number and effective date.
Reads FMCSA's new Motus system first, updated daily, with data_as_of on every response.
No black-box score. Each flag names the rule that triggered it, so you can show it, log it or build on it.
Built for freight brokers and 3PLs, load boards, TMS and dispatch software, factoring companies, insurance agents and underwriters, and shipper compliance teams.
02 Quick start
You booked DMP Trucking, USDOT 1398624. A truck pulls in with Pennsylvania plate AF60214. Is the carrier still authorized and insured, and does this truck belong to it?
01 Subscribe on a marketplace and copy your API key. The examples below use RapidAPI's headers; each marketplace shows its own key header on the listing. To try every request without writing code, fork the collection:
02 Call the pickup check:
curl --request GET \
--url 'https://carrier-check-api.p.rapidapi.com/v1/check?usdot=1398624&plate=AF60214&state=PA' \
--header 'X-RapidAPI-Key: YOUR_KEY' \
--header 'X-RapidAPI-Host: carrier-check-api.p.rapidapi.com'const params = new URLSearchParams({ usdot: "1398624", plate: "AF60214", state: "PA" });
const res = await fetch(`https://carrier-check-api.p.rapidapi.com/v1/check?${params}`, {
headers: {
"X-RapidAPI-Key": "YOUR_KEY",
"X-RapidAPI-Host": "carrier-check-api.p.rapidapi.com",
},
});
const data = await res.json();
console.log(data.verdict === "good" ? "OK to load" : `Stop: ${data.reasons.join(", ")}`);03 Read the verdict (response abridged):
{
"verdict": "good",
"usdot": "1398624",
"legal_name": "DMP TRUCKING INC",
"summary": "Good: authority active, insurance OK, truck matches (4 inspections, last seen 2025-12-23). 1 warning.",
"reasons": [],
"warnings": ["authority_data_from_frozen_legacy_files"],
"checks": [
{ "check": "authority", "status": "pass" },
{ "check": "insurance", "status": "pass" },
{ "check": "data_source", "status": "warn" },
{ "check": "truck", "status": "pass" }
],
"carrier": { "authority_active": true, "insurance_ok": true },
"truck": { "result": "match", "verified": true, "last_seen": "2025-12-23", "inspections": 4 }
}verdict is only ever good or bad. summary is the same result in one plain-English line, ready to show a dispatcher.reasons lists every check that made it bad. warnings are worth knowing but don't fail the check unless you send strict=true.checks shows each thing that was looked at as pass, warn, fail or unchecked. truck.verified is true only when the truck matched your carrier.vin instead of plate and state, or leave both out to check the carrier only. An unknown USDOT returns verdict: "bad" with carrier_not_found.03 Endpoints
Plain JSON with consistent field names. A batch of 100 carriers is a single request.
| Endpoint | What it does |
|---|---|
GET /v1/check | One call, good or bad: carrier authority, insurance and flags plus the truck match, with reasons and warnings. Params: usdot, plate + state or vin, optional strict. |
GET /v1/carriers/{usdot} | Full carrier profile by USDOT number. |
GET /v1/carriers/mc/{mc} | The same profile by MC, MX or FF docket. Accepts MC-138328, MC138328 or 138328. |
GET /v1/carriers/search | Search by legal or DBA name with an optional state filter, up to 50 results. |
POST /v1/carriers/batch | Up to 100 carrier profiles in one request, in the order you sent them. Body: {"usdot": ["53467", "1398624"]}. |
GET /v1/vehicles | Which carriers a truck or trailer has been inspected under, by plate + state or by vin. |
GET /v1/verify | Does this truck belong to the carrier you booked? Returns match, seen_under_carrier, different_carrier or not_found, with inspection dates as evidence. |
data_as_of for each source.| Status | Meaning |
|---|---|
400 bad_request | Invalid input, such as a USDOT that isn't 1 to 8 digits, or a plate without a state. |
404 not_found | No FMCSA record for that USDOT or docket. |
503 upstream_unavailable | The FMCSA data source is briefly down. Retry shortly. |
04 Flags reference
An empty flags array means nothing was triggered. In /v1/check, stop-sign flags make the verdict bad; the rest are warnings.
| Flag | Triggered when | In /v1/check |
|---|---|---|
authority_not_active | Authority records exist, but none is Active. | Bad |
revocation_pending | An authority has a revocation pending. | Bad |
no_operating_authority_on_record | Marked for-hire, but no MC/MX/FF authority. | Bad |
bipd_insurance_below_required | BI&PD liability on file is below the FMCSA minimum. | Bad |
cargo_insurance_missing | Cargo insurance is required but none is on file. | Bad |
bond_missing | A surety bond or trust fund is required but none is on file. | Bad |
not_in_census | Authority records exist, but no FMCSA census entry. | Bad |
registered_under_90_days | The USDOT was added less than 90 days ago. | Warning |
mcs150_outdated | Last MCS-150 update is over 24 months old. | Warning |
high_out_of_service_rate | 30% or more of inspections in 24 months had an out-of-service violation. | Warning |
authority_data_from_frozen_legacy_files | Carrier isn't in Motus yet, so authority and insurance come from the legacy files frozen on 2026-05-14. | Warning |
/v1/check adds truck results: truck_different_carrier and carrier_not_found make it bad; truck_seen_under_carrier and truck_not_found are warnings.
05 Where to get it
Same data and endpoints on each. Pick the one that fits how you work; plans and billing are handled by that marketplace.
The largest API marketplace. Subscribe, get one key and call every endpoint from your own code, with usage and billing in your RapidAPI account.
Open on RapidAPI NO-CODE ACTORNo code needed. Paste a list of USDOTs, dockets, names or trucks, run it, and export the results to CSV, JSON or Excel. Schedule runs or connect them to your other tools.
Open on Apify API MARKETPLACEA separate API hub with its own catalog. Subscribe, get a Zyla key and call the same endpoints, with usage and support in your Zyla dashboard.
Open on Zyla PUBLIC COLLECTIONA public workspace with every request and an example response. Run it in Postman, paste your RapidAPI key and send.
Open on PostmanNeed higher volume, or something the API doesn't cover yet? Email [email protected].
06 Data and disclaimer
sources field says which was used.not_found isn't proof of anything. Try the VIN if a plate isn't found.Data is provided for information only. It is not a legal, safety or compliance determination. Verify with FMCSA before dispatch. Not affiliated with or endorsed by FMCSA or the US DOT.
Questions about the FMCSA Carrier Check API?
Integration questions, bug reports, higher volumes or a field you need. I read every email.
[email protected]