The FMCSA API that returns what FMCSA doesn’t.
One call returns everything FMCSA publishes about a carrier, plus the scoring it doesn’t: all 7 BASIC percentiles, a computed Inspection Selection System score, and 50+ named risk signals, for every FMCSA registrant. Free sandbox, no card.
Full intelligence, pay-as-you-goFree sandbox, no card required
One request. The complete carrier profile.
FMCSA's own developer API is QCMobile: free, authoritative, and limited to registration, authority and out-of-service data. CarrierOk's FMCSA API returns that consolidated record plus the scoring FMCSA does not publish, on every FMCSA registrant, in one call.
- The free option
- QCMobile is free with a webkey from an FMCSA developer account. It returns no BASIC percentiles, no ISS score and no history, and it answers only about now.
- The full record
- GET /v2/profile returns 300+ fields: all 7 BASIC percentiles, the ISS score with its recommendation, 50+ named risk signals, policy-level insurance history and VIN-decoded fleet.
- The mirror
- GET /v2/profile-fmcsa returns 236 fields of consolidated FMCSA data with none of CarrierOk's scoring, for teams that want the government record and their own model on top.
- Knowing what changed
- Monitoring watches the carriers you add and returns only what moved, the same day it is published, through the same schema your parser already handles.
- Getting started
- A free sandbox key is issued at signup with no card. Live access is $50, applied as $50 of credit, then pay-as-you-go at published per-endpoint rates.
One call returns the whole carrier record.
FMCSA keeps registration, safety, inspections, and insurance in separate systems, and scores none of it. The profile endpoint returns all of them joined into one object, with the fields CarrierOk computes marked.
Every field is defined in the data dictionary.
All 7 BASIC percentiles and the ISS score in every response.
FMCSA’s API returns no BASIC percentiles at all, and its public SMS site withholds two of the seven, Crash Indicator and Hazardous Materials. CarrierOk computes all seven from the underlying measure and violation data.
Each response also carries the Inspection Selection System score, the value FMCSA gives roadside inspectors to prioritize carriers, with its recommendation and the reason behind it. A BASIC with too little data to score comes back null, not zero, so your code never reads missing as clean.
See why a carrier is risky, not just that it is.
The risk score comes with the named flags behind it. Some catch the pattern behind chameleon carriers: a phone number, address, or EIN that also appears on other DOT numbers. Others catch a revocation in the last 36 months, a pending insurance cancellation, or BIPD below the requirement.
Each flag is its own boolean, so a rule can act on the one that matters to you. A shared EIN and a shared address call for different responses, and the record says which one you have.
Every insurance filing, with how and when each one ended.
Policies come back as insurers file them with FMCSA: insurer, policy number, form, limit, and effective date, for the active policy and every one before it.
Each ended policy says whether it was replaced or canceled, and on what date. A replaced policy is continuous coverage. A canceled one followed by a later effective date is a gap, and the two dates tell you how long it lasted.
Start with a free key, no card and no sales call.
Get a sandbox key
Issued immediately at developers.carrierok.com. No card required.
Get your sandbox key →Build against the docs
Every endpoint, field, error code, and limit is documented, with a typed OpenAPI spec for codegen.
Read the docs →Swap in a live key
Activate from the dashboard when you are ready: $50, applied as $50 of API credit. Nothing else in your integration changes.
Talk to an engineer →Ask what changed instead of re-pulling everything.
Put your carriers under watch once. After that, a nightly job asks one question and gets back only what moved: insurance, authority, safety, fleet, contact, risk. It arrives as the same record your parser already handles.
- Filter to the change types you act on
- Date-bounded, so syncs stay incremental
- Priced per carrier watched, not per call
POST /v2/monitoring/add · GET /v2/monitoring/list
Built into quoting, onboarding, dispatch, and funding.
The problem
Underwriters check several systems for BASIC scores, the ISS, and insurance filings, then retype what they found into the rating workflow.
How the API solves it
Pull the carrier's risk profile at quote time: the ISS score and its recommendation, all 7 BASICs, and policy-level insurance in one response, so your rules run on the source record.
Insurance & Underwriting use case →# Route a quote on the carrier's safety profile
carrier = get_carrier(dot_number)
if carrier["iss_recommendation"] == "INSPECT":
return {"route": "REFER", "reason": "ISS recommends inspection"}
alerts = [k for k, v in carrier.items() if k.startswith("basic_alert_") and v]
if alerts:
return {"route": "REFER", "reason": "BASIC alert", "basics": alerts}
return {"route": "QUOTE", "iss_value": carrier["iss_value"]}The problem
Onboarding a carrier with revoked authority or a chameleon flag can expose your platform to liability. Manual compliance checks don't scale.
How the API solves it
Add automated carrier validation to your onboarding flow. Block or flag carriers based on risk score, operating status, and chameleon signals before they move a load.
TMS & Logistics SaaS use case →// Block non-compliant carriers at onboarding
async function validateCarrier(dotNumber) {
const carrier = await getCarrier(dotNumber);
if (carrier.authority_common !== 'Active')
throw new Error('Common authority is not active');
if (carrier.risk_score === 'High')
throw new Error('Risk score exceeds threshold');
if (Number(carrier.insurance_bipd_on_file) < 750000)
throw new Error('BIPD below required limit');
return carrier; // safe to onboard
}The problem
Load boards surface high-risk carriers alongside compliant ones. There's no built-in check before you tender a load to a carrier with a poor safety record.
How the API solves it
Pre-tender validation in your dispatch workflow. Check authority status, risk score, and insurance in a single cURL call, and block the tender before the load is assigned.
Freight Brokers use case →# Pre-tender compliance check (cURL + jq)
DOT="1234567"
DATA=$(curl -s "https://api.carrierok.com/v2/profile?dot_number=$DOT" \
-H "Authorization: Bearer $API_KEY")
RISK=$(echo $DATA | jq -r '.items[0].risk_score')
AUTH=$(echo $DATA | jq -r '.items[0].authority_common')
INSURED=$(echo $DATA | jq -r '.items[0].insurance_bipd_on_file')
[ "$AUTH" = "Active" ] && \
[ "$RISK" != "High" ] && \
[ "$INSURED" -ge 750000 ] && echo "APPROVED"The problem
Insurance lapses and authority revocations happen daily. Re-pulling every carrier in your portfolio to find them isn't efficient or scalable.
How the API solves it
Load your carrier portfolio into a monitoring watchlist and poll /v2/monitoring/list for changes. Insurance lapses, authority changes, and new risk signals appear as FMCSA updates land throughout the day.
Factoring & Financial Services use case →# Add carriers to your monitored watchlist
curl -X POST "https://api.carrierok.com/v2/monitoring/add" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"profile_ids": ["568253-MC277621", "1234567-MC654321"]}'
# Ask what changed. Filter to insurance, authority, safety, fleet or risk
curl "https://api.carrierok.com/v2/monitoring/list?view_changes_insurance=true" \
-H "Authorization: Bearer YOUR_API_KEY"“A very easily searchable and flexible up-to-date database we can rely on more than even the DOT itself. The API enables us to use specific data fields to automate our internal back office and client facing processes.”
“All the data I need for underwriting decisions in one dashboard. The API integration into Salesforce was seamless — and CarrierOk's reputation as the superior data source is exactly why I switched from Carrier411.”
FMCSA API: Frequently Asked Questions
Try every endpoint before you spend a dollar.
A sandbox key is issued the moment you sign up. Ten evaluation carriers, every endpoint, all 300+ fields, no card.
Free sandbox · no card · pay-as-you-go when you go live