API documentation
One GET, one carrier record
FMCSA publishes carrier data as three separate files with padded keys, duplicate rows and dollar amounts recorded in thousands. This API does that join for you and returns one JSON object per carrier, stamped with the date it was read.
Quickstart
No key, no signup, no SDK. Copy this line.
curl https://checkmycarrier.com/v1/carriers/264184
The path segment takes either form: a USDOT number (264184) or an
MC docket (MC-133655). Both return the same shape.
Response
{
"dot_number": "264184",
"mc_number": "MC133655",
"legal_name": "SCHNEIDER NATIONAL CARRIERS INC",
"dba_name": null,
"usdot_status": "ACTIVE",
"physical_location": "GREEN BAY, WI",
"power_units": 9866,
"fleet_headcount": 11245,
"mcs150_date": "2026-01-30",
"authority": {
"common": "ACTIVE",
"contract": "ACTIVE",
"broker": "ACTIVE",
"revocation_pending": false
},
"insurance": {
"bipd_on_file_usd": 1000000,
"bipd_required_usd": 1000000,
"cargo_on_file": true,
"bond_on_file": true,
"policies": [
{
"form": "BMC-34",
"insurer": "Old Republic Insurance Company",
"policy_no": "MWE 314560",
"max_coverage_usd": 5000,
"effective_date": "2019-03-01"
}
]
},
"source": "FMCSA",
"snapshot_date": "2026-08-20",
"disclaimer": "…"
} Fields
| Field | Type | Meaning |
|---|---|---|
| dot_number | string | USDOT number, unpadded. |
| mc_number | string | null | MC docket, e.g. "MC133655". Null when the company holds none. |
| legal_name | string | Legal name as filed with FMCSA. |
| dba_name | string | null | Doing-business-as name, when one is filed. |
| usdot_status | "ACTIVE" | "INACTIVE" | null | Status of the census record. |
| physical_location | string | null | City, state of the physical address on file. |
| power_units | number | null | Power units reported on the last MCS-150. |
| fleet_headcount | number | null | Headcount the company reported on the same filing — a company-level figure like power_units. Read the two together: a ratio that makes no sense for the work claimed is the classic thing to ask about. |
| mcs150_date | string (YYYY-MM-DD) | null | Date of that filing — how stale the fleet figure is. |
| authority.common | "ACTIVE" | "INACTIVE" | "NONE" | Common carrier authority. |
| authority.contract | "ACTIVE" | "INACTIVE" | "NONE" | Contract carrier authority. |
| authority.broker | "ACTIVE" | "INACTIVE" | "NONE" | Broker authority. |
| authority.revocation_pending | boolean | True when FMCSA has a revocation in progress on any authority. |
| insurance.bipd_on_file_usd | number | BIPD coverage on file, in dollars. |
| insurance.bipd_required_usd | number | BIPD coverage FMCSA requires, in dollars. |
| insurance.cargo_on_file | boolean | Cargo filing present. |
| insurance.bond_on_file | boolean | Surety bond filing present. |
| insurance.policies[] | array | Up to five most recent filings: form, insurer, policy_no, max_coverage_usd, effective_date. The amount is the coverage the form itself carries — a BMC-84 broker bond reads 75000, cargo forms read their own limits — not the BIPD figure above. |
| source | "FMCSA" | Always FMCSA. No other origin feeds this API. |
| snapshot_date | string (YYYY-MM-DD) | The date the record was read from FMCSA. |
| disclaimer | string | The use restriction that travels with the data. |
Limits and keys
Anonymous callers get 100 lookups per day, which is enough to evaluate the API properly. Past that, send a key and the cap lifts. A key is issued on the spot — ask for a trial and it appears on the page, no confirmation step and no sales conversation:
curl -H "Authorization: Bearer YOUR_KEY" \ https://checkmycarrier.com/v1/carriers/MC-133655
Responses are cached for a day, matching how often FMCSA republishes the underlying files; x-cache tells you which side you got. CORS is open, so the endpoint
works from a browser or an agent runtime without a proxy.
Monitoring
A lookup answers "what does the record say today". Monitoring answers the harder question — "what changed since I last looked" — which is the one that matters once a carrier is already in your book. Add carriers to a watch list and a daily pass reports authority, insurance, name and address changes.
# watch a carrier (USDOT or MC — the docket resolves to its DOT number)
curl -X POST https://checkmycarrier.com/v1/watch \
-H "Authorization: Bearer YOUR_KEY" \
-H "content-type: application/json" \
-d '{"carrier": "264184"}'
# where changes should be delivered (https only)
curl -X PUT https://checkmycarrier.com/v1/webhook \
-H "Authorization: Bearer YOUR_KEY" \
-H "content-type: application/json" \
-d '{"url": "https://your-app.example/hooks/carrier"}'
# or poll instead, with a cursor that can't skip or repeat an event
curl -H "Authorization: Bearer YOUR_KEY" \
"https://checkmycarrier.com/v1/events?since=0" | GET | /v1/carriers/{id} | One carrier record. The only endpoint that works without a key. |
| POST | /v1/watch | Add a carrier to the watch list and take its baseline. |
| GET | /v1/watch | What this key watches, and when each was last checked. |
| DELETE | /v1/watch/{dot} | Stop watching a carrier. |
| GET | /v1/events?since= | Change log for watched carriers, in id order. Returns next_since. |
| PUT | /v1/webhook | Set the https delivery URL, or clear it with {"url": null}. |
| GET | /v1/webhook | Current URL plus the last 50 delivery attempts. |
What arrives
{
"type": "carrier.changed",
"dot_number": "264184",
"legal_name": "SCHNEIDER NATIONAL CARRIERS INC",
"changes": [
{
"field": "insurance.bipd_on_file_usd",
"from": "1000000",
"to": "0",
"message": "BIPD insurance on file dropped to zero (was $1,000,000)."
}
],
"source": "FMCSA",
"snapshot_date": "2026-08-20",
"disclaimer": "…"
} Honest limits, so nothing here surprises you later. Adding a carrier records a baseline
immediately, so your first delivery is a real change rather than a dump of everything. The pass
runs once a day, shortly after FMCSA republishes — this is a daily record, not a live feed. A
webhook is attempted once per pass and the outcome is written down either way, so GET /v1/webhook shows you the delivery history rather than asking
you to trust ours. A carrier FMCSA can't answer for on a given day is skipped with its baseline
untouched, so a change during an outage is caught on the next pass instead of being lost. And
monitoring watches the fields that change meaning — authority, insurance filings, legal name,
physical address — not the fleet counters that drift for ordinary reasons.
MCP server
If you are building an agent rather than a service, the same data is exposed as an MCP server over Streamable HTTP. No install, no package — point a client at the endpoint:
{
"mcpServers": {
"checkmycarrier": {
"url": "https://checkmycarrier.com/mcp",
"headers": { "Authorization": "Bearer YOUR_KEY" }
}
}
} Three tools: lookup_carrier works without a key; watch_carrier and list_changes need
one. The tool descriptions carry the same rules the rest of this site does — records describe
companies, the snapshot date travels with every answer, and nothing here may be used for an
FCRA-regulated purpose.
Errors
| 404 | not_found | No FMCSA record matches the identifier. |
| 429 | rate_limited | Free daily allowance used up. Send a key. |
| 502 | upstream_unavailable | FMCSA’s data service did not answer. Retry. |
Terms of use
The data is FMCSA’s, republished as filed with no rating or score attached. Every response
carries a snapshot_date and a disclaimer; both must survive into whatever you build, because
the record is only meaningful with the date it was read. This is not a consumer report and may
not be used for any purpose regulated by the Fair Credit Reporting Act. Full terms.