# FMCSA Carrier Vetting & Watchlist: Authority, Insurance, Flags (`infocomp/fmcsa-carrier-vetting`) Actor

Bulk-check USDOT numbers in FMCSA public data: authority status, age & revocations, insurance required vs on file, insurer & cancellations, OOS orders, safety rating, 24-month crashes, source-named flags. Watch mode: changes only. $3/1,000. Not affiliated with FMCSA, USDOT or the US government.

- **URL**: https://apify.com/infocomp/fmcsa-carrier-vetting.md
- **Developed by:** [InfoComp Data](https://apify.com/infocomp) (community)
- **Categories:** Business, Lead generation, Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$3.00 / 1,000 carrier records

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## FMCSA Carrier Vetting & Watchlist: Authority, Insurance, Flags

**Vet trucking carriers in bulk by USDOT number.** For each carrier you get one row with operating authority status and age, revocation and reinstatement history, insurance required vs. on file, current insurer and cancellations, out-of-service orders, safety rating and a 24-month crash count, plus **factual flags that each name the FMCSA dataset and field they come from**. **Watch mode** re-checks your carrier list on a schedule and returns only the carriers that changed.

- 🚚 **Bulk carrier checks:** paste hundreds or thousands of USDOT numbers and get one clean row per carrier.
- 🧾 **Source-named flags, not verdicts:** e.g. `bipd_on_file_usd 0 < bipd_required_usd 750000 (source: inys-ebih.bipd_file vs inys-ebih.min_cov_amount)`. You decide what matters.
- 🔔 **Carrier monitoring:** watch mode returns only changes (insurance, authority, OOS, rating, crashes, flags) with before/after values. Unchanged carriers are free.
- 💲 **$3.00 per 1,000 carrier rows** ($0.003 per row). No start fee, no run fee. Not-found and invalid USDOT numbers are free.

> **Data source:** U.S. Department of Transportation (USDOT) / Federal Motor Carrier Safety Administration (FMCSA) public data, which FMCSA publishes as open data on DOT's open data portal. Every row includes a `source` field crediting DOT/FMCSA.
>
> **Disclaimer:** Not affiliated with, endorsed by or sponsored by FMCSA, USDOT or the US government. Results are **not an official FMCSA determination**. Always confirm a carrier's status on FMCSA's own site (safer.fmcsa.dot.gov) before booking a load or making a decision.

### What does it do?

You give it a list of USDOT numbers. It fetches FMCSA's public records for all of them **in batches** (150 USDOT numbers per query, a few large requests per batch, never one request per carrier), combines 11 FMCSA datasets into one row per carrier, and adds factual flags.

In local tests on 2026-10-27, the default input (5 USDOT numbers) finished in **about 1 second of Actor time** (3.5 s including CLI start-up), and **1,000 USDOT numbers took 5.6 seconds** with 77 HTTP requests and about 75 MB of memory.

### Who is it for?

- **Freight brokers and 3PLs:** check new carriers at onboarding and re-check your active carrier list weekly.
- **Shippers and procurement teams:** vet the carriers your brokers use.
- **Insurance, factoring and fintech teams:** screen carrier portfolios and get alerted on authority or insurance changes.
- **Compliance and data teams:** feed a clean, structured carrier table into your TMS, CRM, spreadsheet or pipeline via the Apify API, webhooks, Zapier, Make or n8n.

### What's in each row?

| Area | Fields |
|---|---|
| Identity | `usdot_number`, `legal_name`, `dba_name`, city/state/country, `usdot_status`, `carrier_operation`, `entity_class`, `power_units`, `drivers`, `hazmat`, `mcs150_date`, `usdot_added_date` |
| Authority | `authority_status` (ACTIVE / PENDING / INACTIVE / NONE_ON_FILE), `authorities` (docket, type, status, `active_since`), `authority_current_since_date`, `authority_age_days`, `authority_first_granted_date`, `authority_latest_granted_date` |
| History | `authority_events` (up to 25 dated revocations, suspensions and reinstatements), `revocations_suspensions_24m`, `reinstatements_total`, `pending_suspension_effective_date` |
| Insurance | `bipd_required_usd` vs `bipd_on_file_usd`, cargo and bond required vs on file, `current_insurer`, `insurance_policies`, `latest_insurance_cancellation` |
| Safety | `safety_rating` and date, `oos_order_active`, `oos_orders`, `crash_records_24m` (+ fatal / injury / tow-away counts, `fatalities_24m`, `injuries_24m`) |
| Flags | `flags` (each names its source `dataset-id.field`), `flag_count` |
| Credit | `source`, `disclaimer`, `retrieved_at`; in watch mode also `watch_status` (NEW / CHANGED) and `changes` |

#### How authority age is calculated

`authority_age_days` is the age of the carrier's **current** active authority, not its first-ever grant. For each currently Active authority (docket + authority type), the start date is the latest FMCSA authority-history record that made it Active (Granted or Reinstated). The age uses the longest-held of those active authorities (`authority_current_since_date`). So a carrier that was revoked and recently reinstated shows a young authority age. The first grant ever is kept separately in `authority_first_granted_date`. Carriers with no FMCSA operating-authority record show `authority_status: NONE_ON_FILE` and an empty age. This is normal for private and intrastate carriers that don't need for-hire authority.

#### Flags (data points, not verdicts)

A flag is added only when a data point matches one of these factual conditions. Each one states the value and names the source field:

- USDOT status is not ACTIVE; no operating authority with status Active;
- current authority active for fewer than 180 days;
- BIPD insurance on file below the required amount; cargo or bond required but not on file;
- an insurance cancellation, or a suspension/revocation notice, effective today or later;
- revocation/suspension events in the last 24 months;
- an out-of-service order with status ACTIVE and no rescind date;
- safety rating Conditional or Unsatisfactory; prior revoke flag = Y;
- MCS-150 update more than 24 months old;
- crash records with fatalities in the last 24 months.

**Crash records are reported crashes, not findings of fault.** A crash count is not a safety rating.

### How to use it

1. Click **Try for free**.
2. Paste **USDOT numbers**, one per line or comma-separated. `125550`, `USDOT 125550`, `DOT#125550` and leading zeros all work.
3. Click **Start**, then download JSON, CSV or Excel, or use the API.
4. **For monitoring:** turn on **Watch mode**, give your list a **watchlist name**, and add a daily or weekly **Schedule**. The first run returns every carrier as `NEW` (baseline). Later runs return only carriers that changed, with before/after values. Unchanged carriers are skipped and not charged.

#### Input example

```json
{
  "dotNumbers": ["125550", "2245406", "80321", "2216464", "3519860"],
  "watchMode": false,
  "watchlistName": "default",
  "includeHistory": true
}
```

### Output example

A real row from a local test run on 2026-10-27 for USDOT 125550 (Atlas Van Lines). For length, the `authorities` list is trimmed to the 2 motor-carrier authorities (3 broker authorities omitted), `insurance_policies` to 2 of 6, `authority_events` to 2 of 3, and `census_dockets` is omitted.

```json
{
  "usdot_number": "125550",
  "legal_name": "ATLAS VAN LINES INC",
  "dba_name": null,
  "city": "EVANSVILLE",
  "state": "IN",
  "country": "US",
  "usdot_status": "ACTIVE",
  "carrier_operation": "Interstate",
  "entity_class": "AUTHORIZED FOR HIRE",
  "business_type": "CORPORATION",
  "power_units": 2731,
  "drivers": 2351,
  "hazmat": true,
  "mcs150_date": "2026-05-04",
  "usdot_added_date": "1974-06-01",
  "authority_status": "ACTIVE",
  "authorities": [
    {
      "docket": "MC79658",
      "type": "Motor Carrier of Property (Except Household Goods)",
      "status": "Active",
      "bipd_required_usd": 1000000,
      "bipd_on_file_usd": 1000000,
      "cargo_required": false,
      "cargo_on_file": false,
      "bond_required": false,
      "bond_on_file": false,
      "active_since": "1984-11-14"
    },
    {
      "docket": "MC79658",
      "type": "Motor Carrier of Household Goods",
      "status": "Active",
      "bipd_required_usd": 750000,
      "bipd_on_file_usd": 1000000,
      "cargo_required": true,
      "cargo_on_file": true,
      "bond_required": false,
      "bond_on_file": false,
      "active_since": "1987-04-13"
    }
  ],
  "authority_current_since_date": "1984-11-14",
  "authority_age_days": 15322,
  "authority_first_granted_date": "1967-11-03",
  "authority_latest_granted_date": "2014-05-23",
  "revocations_suspensions_24m": 0,
  "reinstatements_total": 1,
  "pending_suspension_effective_date": null,
  "authority_events": [
    {
      "date": "2014-05-23",
      "event": "REINSTATED",
      "docket": "MC130921",
      "authority_type": "Broker of Property (Except Household Goods)",
      "source": "yu5v-wbh6.reason"
    },
    {
      "date": "2013-12-04",
      "event": "REVOKED",
      "docket": "MC130921",
      "authority_type": "PROPERTY BROKER",
      "source": "9mw4-x3tu.disp_action_desc"
    }
  ],
  "bipd_required_usd": 1000000,
  "bipd_on_file_usd": 1000000,
  "cargo_required": true,
  "cargo_on_file": true,
  "bond_required": true,
  "bond_on_file": true,
  "current_insurer": "Arch Insurance Company",
  "insurance_policies": [
    {
      "docket": "MC79658",
      "type": "BIPD",
      "form": "BMC-91X",
      "insurer": "Arch Insurance Company",
      "max_coverage_usd": 1000000,
      "effective_date": "2025-04-26"
    },
    {
      "docket": "MC130921",
      "type": "BIPD",
      "form": "BMC-91X",
      "insurer": "Arch Insurance Company",
      "max_coverage_usd": 1000000,
      "effective_date": "2016-04-26"
    }
  ],
  "latest_insurance_cancellation": {
    "date": "2025-04-26",
    "insurer": "ARCH INSURANCE COMPANY",
    "type": "BIPD/Primary",
    "method": "TERM/REPL",
    "docket": "MC079658",
    "source": "6sqe-dvqs.cancl_effective_date"
  },
  "safety_rating": "Satisfactory",
  "safety_rating_date": "2024-11-13",
  "oos_order_active": false,
  "oos_orders": [],
  "crash_records_24m": 55,
  "crash_records_24m_fatal": 0,
  "crash_records_24m_injury": 10,
  "crash_records_24m_towaway": 52,
  "fatalities_24m": 0,
  "injuries_24m": 16,
  "flags": [],
  "flag_count": 0,
  "source": "U.S. DOT / FMCSA public data (Company Census, Motus licensing & insurance, revocation, out-of-service and crash files), published by FMCSA on DOT's open data portal.",
  "disclaimer": "Not an official FMCSA determination. Confirm carrier status on FMCSA's own site (safer.fmcsa.dot.gov) before booking a load. Not affiliated with or endorsed by FMCSA, USDOT or the US government. Source: FMCSA's public open-data API.",
  "retrieved_at": "2026-10-27T15:34:59Z"
}
```

A watch-mode `CHANGED` row adds two fields. This example is from a local test in which the stored snapshot was edited by hand to simulate an older insurer:

```json
"watch_status": "CHANGED",
"changes": [{"field": "current_insurer", "before": "Previous Insurer Co (simulated)", "after": "Arch Insurance Company"}]
```

A run summary (`RUN_SUMMARY` in the key-value store) lists rows saved, unchanged carriers skipped, not-found and invalid USDOT numbers, and the request count.

### Pricing

**$3.00 per 1,000 carrier rows** ($0.003 per row, pay per event `carrier-row`). No start fee, no run fee, no monthly rental. Apify platform usage is included.

- **Free:** USDOT numbers not found in FMCSA's Company Census File, invalid entries, and (in watch mode) unchanged carriers.
- **Max cost respected:** if you set a maximum cost per run, the Actor stops cleanly when it is reached (tested: a $0.015 cap saved exactly 5 rows).

### Data sources

All data comes from public datasets published by **FMCSA (USDOT)** and marked "Rights: public":

| Dataset | ID | Used for |
|---|---|---|
| Company Census File | az4n-8mr2 | identity, USDOT status, MCS-150, safety rating |
| Motus Carrier (current authority & insurance requirements) | inys-ebih | authorities, BIPD/cargo/bond required vs on file |
| Motus AuthHist | yu5v-wbh6 | grants, reinstatements, revocations, authority age |
| Motus RevokeSuspend | wb4f-neki | suspension/revocation notices |
| Motus Insur | c5y8-a4uz | current insurance filings |
| Motus InsHist | 3uet-3z4i | insurance cancellations |
| AuthHist, Revocation, InsHist (legacy archives) | 9mw4-x3tu, sa6p-acbp, 6sqe-dvqs | history before May 2026 |
| Out of Service Orders | p2mt-9ige | OOS orders |
| Crash File | aayw-vxb3 | 24-month crash counts (counts only) |

**Legacy archive note:** FMCSA says its older Licensing & Insurance files were last refreshed on 05/14/2026 and are no longer updated. Current authority and insurance data come from the newer Motus datasets; the legacy archives are used only for history before May 2026.

This tool is an independent product that reads FMCSA's open data. It is not a mirror of, a replacement for, or an interface to any government website. No agency logos are used.

### Limits and notes

- **MC/MX/FF docket lookup isn't supported in v1:** input is USDOT numbers only. (Docket numbers appear in the output.)
- Up to 10,000 USDOT numbers per run.
- Data is only as current as FMCSA's published datasets. Confirm on FMCSA's own site before acting.
- Crash data is returned as counts only: no report numbers, VINs, plates or locations. Email addresses that appear in FMCSA free-text fields are redacted.
- **API change risk:** the Actor uses FMCSA's open data through the public keyless API. If the platform ever requires an app token for this API, runs will stop with a clear message instead of returning partial or wrong data, and the Actor will be updated.

### More Business Leads tools from InfoComp

These tools work well together. Where present, they share common fields such as company name, state and a source link, so their outputs are easy to join.

- [SAM.gov Contract Opportunities](https://apify.com/infocomp/sam-gov-opportunities): US federal tenders and contract notices from the official SAM.gov API.
- [Form D Funding Leads](https://apify.com/infocomp/form-d-funding-leads): companies that just raised private funding, from SEC EDGAR Form D filings.
- [EU/UK Tenders](https://apify.com/infocomp/eu-uk-tenders): public procurement notices from official EU and UK sources.
- [ATS Jobs Feed](https://apify.com/infocomp/ats-jobs-feed): open job postings straight from company applicant tracking systems (hiring signals).

### FAQ

**Is this an official FMCSA check?** No. It's an independent tool built on FMCSA's public data. It is not affiliated with FMCSA or USDOT, and its output is not an official FMCSA determination.

**Does it tell me whether to use a carrier?** No. It reports data points and flags with their sources. The decision is yours.

**Is it legal to use this data?** The datasets are published by FMCSA as public open data. Use the results in line with your own legal and compliance obligations.

# Actor input Schema

## `dotNumbers` (type: `array`):

One USDOT number per line (or comma-separated). 'USDOT 125550' and leading zeros are accepted. Numbers not found in the FMCSA Company Census File, and invalid entries, are listed in the run summary and are not charged.

## `watchMode` (type: `boolean`):

Stores a snapshot per carrier in a named key-value store in your account. On later runs, only carriers whose authority, insurance, OOS, rating, crash count or flags changed are returned (with before/after values); unchanged carriers are skipped and not charged. The first run returns every carrier as NEW (baseline). Schedule it daily or weekly.

## `watchlistName` (type: `string`):

Separate snapshot per watchlist, e.g. 'active-carriers' or 'new-onboarding'.

## `includeHistory` (type: `boolean`):

Adds up to 25 dated revocation, suspension and reinstatement events per carrier (authority_events). Turn off for smaller rows.

## Actor input object example

```json
{
  "dotNumbers": [
    "125550",
    "2245406",
    "80321",
    "2216464",
    "3519860"
  ],
  "watchMode": false,
  "watchlistName": "default",
  "includeHistory": true
}
```

# Actor output Schema

## `results` (type: `string`):

No description

## `summary` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "dotNumbers": [
        "125550",
        "2245406",
        "80321",
        "2216464",
        "3519860"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("infocomp/fmcsa-carrier-vetting").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = { "dotNumbers": [
        "125550",
        "2245406",
        "80321",
        "2216464",
        "3519860",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("infocomp/fmcsa-carrier-vetting").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "dotNumbers": [
    "125550",
    "2245406",
    "80321",
    "2216464",
    "3519860"
  ]
}' |
apify call infocomp/fmcsa-carrier-vetting --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,infocomp/fmcsa-carrier-vetting"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/jRti4IfzhJylKdJo6/builds/veRd26GtVqZhmFSHg/openapi.json
