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

FieldTypeMeaning
dot_numberstringUSDOT number, unpadded.
mc_numberstring | nullMC docket, e.g. "MC133655". Null when the company holds none.
legal_namestringLegal name as filed with FMCSA.
dba_namestring | nullDoing-business-as name, when one is filed.
usdot_status"ACTIVE" | "INACTIVE" | nullStatus of the census record.
physical_locationstring | nullCity, state of the physical address on file.
power_unitsnumber | nullPower units reported on the last MCS-150.
fleet_headcountnumber | nullHeadcount 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_datestring (YYYY-MM-DD) | nullDate 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_pendingbooleanTrue when FMCSA has a revocation in progress on any authority.
insurance.bipd_on_file_usdnumberBIPD coverage on file, in dollars.
insurance.bipd_required_usdnumberBIPD coverage FMCSA requires, in dollars.
insurance.cargo_on_filebooleanCargo filing present.
insurance.bond_on_filebooleanSurety bond filing present.
insurance.policies[]arrayUp 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_datestring (YYYY-MM-DD)The date the record was read from FMCSA.
disclaimerstringThe 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/watchAdd a carrier to the watch list and take its baseline.
GET/v1/watchWhat 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/webhookSet the https delivery URL, or clear it with {"url": null}.
GET/v1/webhookCurrent 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

404not_foundNo FMCSA record matches the identifier.
429rate_limitedFree daily allowance used up. Send a key.
502upstream_unavailableFMCSA’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.