# CheckMyCarrier API

One GET returns one carrier record. FMCSA publishes its carrier data as three
separate files with padded keys, duplicate rows and dollar amounts recorded in
thousands; this API does that join and returns a single JSON object, stamped
with the date it was read.

Base URL: `https://checkmycarrier.com`

## Quickstart

```
curl https://checkmycarrier.com/v1/carriers/264184
```

The path segment takes either form — a USDOT number (`264184`) or an MC docket
(`MC-133655`, `MC133655`). Both return the same shape.

## Response

```json
{
  "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 that form carries — a BMC-84 broker bond reads `75000` — 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. Past that, send a key. Keys are
self-serve — one POST and it is yours, no confirmation step:

```
curl -X POST https://checkmycarrier.com/v1/keys/trial \
  -H "content-type: application/json" \
  -d '{"email": "you@company.com"}'
```

A trial runs 14 days with unmetered lookups and monitoring for 25 carriers.
Plans and prices: https://checkmycarrier.com/pricing/

Using a key:

```
curl -H "Authorization: Bearer YOUR_KEY" \
  https://checkmycarrier.com/v1/carriers/MC-133655
```

Responses are cached for 24 hours, matching how often FMCSA republishes the
underlying files; the `x-cache` header 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 "what
changed since I last looked" — the question that matters once a carrier is
already in your book. Requires a key.

| Method | Path | What it does |
| --- | --- | --- |
| `POST` | `/v1/watch` | Add a carrier (USDOT or MC) and record 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 in id order; response carries `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. |

```
curl -X POST https://checkmycarrier.com/v1/watch \
  -H "Authorization: Bearer YOUR_KEY" \
  -H "content-type: application/json" \
  -d '{"carrier": "264184"}'
```

Delivered payload:

```json
{
  "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": "…"
}
```

Watched fields: `usdot_status`, `authority.common`, `authority.contract`,
`authority.broker`, `authority.revocation_pending`,
`insurance.bipd_on_file_usd`, `insurance.cargo_on_file`,
`insurance.bond_on_file`, `legal_name`, `physical_location`. Fleet counters are
deliberately not watched — they drift for ordinary reasons and a monitor that
cries wolf gets muted.

Limits, stated up front: adding a carrier records a baseline immediately, so
your first delivery is a real change and not a dump of everything. The pass
runs once a day, shortly after FMCSA republishes — a daily record, not a live
feed. A webhook is attempted once per pass and the outcome is written down
either way. A carrier FMCSA cannot answer for that day is skipped with its
baseline untouched, so a change during an outage is caught on the next pass
rather than lost. A key may watch up to 500 carriers.

## MCP server

The same data as an MCP server over Streamable HTTP — no install, no package.

```json
{
  "mcpServers": {
    "checkmycarrier": {
      "url": "https://checkmycarrier.com/mcp",
      "headers": { "Authorization": "Bearer YOUR_KEY" }
    }
  }
}
```

Tools: `lookup_carrier` (no key needed), `watch_carrier` and `list_changes`
(key required). Protocol version `2025-06-18`; POST only, no server-initiated
stream.

## Errors

| Status | Code | Meaning |
| --- | --- | --- |
| 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

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. Company records only — nothing about individuals is read, stored or
served. This is not a consumer report and may not be used for any purpose
regulated by the Fair Credit Reporting Act.

Full terms: https://checkmycarrier.com/terms/
