# FMCSA Carrier Census Scraper (USDOT) (`scrapyx/fmcsa-carriers-scraper`) Actor

US trucking and bus companies from FMCSA's official Company Census: USDOT and MC numbers, legal name, phone, email, address, power units, drivers, cargo, hazmat, safety rating. Filter new carriers by state, date, fleet size and cargo, or look up USDOT numbers.

- **URL**: https://apify.com/scrapyx/fmcsa-carriers-scraper.md
- **Developed by:** [Ibnu Adzim](https://apify.com/scrapyx) (community)
- **Categories:** Lead generation, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.84 / 1,000 results

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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 Census Scraper (USDOT)

US trucking, bus and freight companies from **FMCSA's official Company
Census** — the registry behind every USDOT number, updated daily. For each
carrier: USDOT and MC numbers, legal and DBA name, phone, email, company
officers, physical and mailing address, power units, trucks, drivers, cargo
types, hazmat flag, operation type, safety rating and a link to its SAFER
snapshot.

Find **newly registered carriers** in a state, filter by fleet size, cargo,
hazmat or operation type, or look up a list of USDOT numbers. Official open
data from data.transportation.gov: no key, no login, no proxy.

### What it is for

- **Lead lists of new trucking companies** — insurance, factoring, ELDs,
  fuel cards, dispatch and compliance services all sell to carriers in
  their first months.
- **Carrier vetting** — look up USDOT numbers and see status, authority,
  fleet and safety rating.
- **Market sizing** — how many active interstate carriers with 10+ trucks
  haul refrigerated food in Texas.

### Input

| field | what it does |
| --- | --- |
| `states` | Physical-address states, 2-letter codes. |
| `addedFrom` / `addedTo` | When the USDOT number was registered (`YYYY-MM-DD`). |
| `status` | `active` (default for searches), `inactive`, `pending`, `any` (default for lookups). |
| `carrierOperation` | `interstate`, `intrastate_hazmat`, `intrastate_non_hazmat`. |
| `minPowerUnits` / `maxPowerUnits` | Fleet size (`maxPowerUnits: 1` = owner-operators). |
| `minDrivers` / `maxDrivers` | Driver count. |
| `cargoTypes` | e.g. `general_freight`, `refrigerated_food`, `building_materials` — all must match. |
| `hazmatOnly`, `requireEmail`, `requirePhone`, `requireMcNumber` | Yes/no filters. |
| `nameContains` | Part of the legal or DBA name. |
| `dotNumbers` | Look up specific carriers (combines with the filters). |
| `sortBy` | Newest or oldest registration, largest fleet, most drivers. |
| `maxItems` | Default 200; `0` = every match. |

### Things about this data worth knowing

#### 1. New carriers almost never have an MC number

Of carriers registered in the last month, next to none have an MC docket:
operating authority is a separate application that comes weeks later
(10 of 476 new Texas carriers with 2+ trucks had one). `requireMcNumber`
therefore removes nearly every new carrier — leave it off for new-carrier
leads.

#### 2. Fleet sizes are compared as numbers

The census stores every number as text, so a naive "more than 5 trucks"
query compares strings and returns 50, 500 and 5,000 while skipping 6 to 49.
This Actor converts before comparing.

#### 3. "Added" is the registration date, not the first day of trading

`addedDate` is when the USDOT number was issued. `mcs150Date` is the carrier's
latest MCS-150 filing (the biennial update), when there is one.

#### 4. Contact details are as filed

Phone, email and officer names are what the carrier filed with FMCSA. Many
carriers are owner-operators, so the company name, phone and email can be a
person's own. Use them the way you would any public business registration,
within the laws that apply to your outreach (TCPA, CAN-SPAM).

### Output

One `CARRIER` row per USDOT number, and one `SEARCH_SUMMARY` with the
matching total and the exact query sent. Every row also carries `census`: the
original record, all fields as FMCSA publishes them.

```json
{
  "recordType": "CARRIER",
  "dotNumber": "294808",
  "legalName": "G M M INC",
  "status": "INACTIVE",
  "carrierOperation": "INTERSTATE",
  "entityTypes": ["CARRIER"],
  "classifications": ["PRIVATE PASSENGER, BUSINESS", "PRIVATE PASSENGER, NON-BUSINESS"],
  "addedDate": "1987-06-08",
  "phone": "4072396966",
  "physicalStreet": "9388 SIDNEY HAYES RD",
  "physicalCity": "ORLANDO",
  "physicalState": "FL",
  "physicalZip": "32824-8105",
  "powerUnits": 6,
  "busUnits": 6,
  "totalDrivers": 7,
  "cargoTypes": ["passengers"],
  "mcNumber": "MC-246361",
  "safetyRating": "SATISFACTORY",
  "safetyRatingDate": "1992-01-10",
  "saferSnapshotUrl": "https://safer.fmcsa.dot.gov/query.asp?searchtype=ANY&query_type=queryCarrierSnapshot&query_param=USDOT&query_string=294808"
}
```

### Speed

1,000 carriers per request, one request per second (the site's robots.txt
crawl delay). 2,300 carriers took 7 seconds. A query the data portal hasn't
seen recently can take up to a minute to answer the first time.

### Limits

- Census data only: inspections, crashes and insurance filings are separate
  FMCSA datasets and are not included.
- The fleet-size letter code is passed through as `fleetSizeCode`; use
  `powerUnits` for the number.

# Actor input Schema

## `states` (type: `array`):

2-letter codes, e.g. 'TX', 'CA'. Empty = all states.

## `addedFrom` (type: `string`):

YYYY-MM-DD. The date the USDOT number was registered -- use it to find NEW carriers.

## `addedTo` (type: `string`):

YYYY-MM-DD.

## `status` (type: `string`):

Default: active for searches, any for USDOT lookups.

## `carrierOperation` (type: `string`):

FMCSA's carrier operation code.

## `minPowerUnits` (type: `integer`):

Trucks, tractors, buses the carrier operates (compared as numbers).

## `maxPowerUnits` (type: `integer`):

e.g. 1 for owner-operators.

## `minDrivers` (type: `integer`):

Total drivers.

## `maxDrivers` (type: `integer`):

Total drivers.

## `cargoTypes` (type: `array`):

Any of: beverages, building\_materials, chemicals, coal\_coke, construction, driveaway\_towaway, dry\_bulk, farm\_supplies, fresh\_produce, garbage\_refuse, general\_freight, grain\_feed\_hay, household\_goods, intermodal\_containers, liquids\_gases, livestock, logs\_poles\_lumber, machinery\_large\_objects, meat, metal\_sheets\_coils\_rolls, mobile\_homes, motor\_vehicles, oilfield\_equipment, other, paper\_products, passengers, refrigerated\_food, us\_mail, utilities, water\_well.

## `hazmatOnly` (type: `boolean`):

FMCSA's hazardous-materials indicator is Y.

## `nameContains` (type: `string`):

Matched against legal and DBA name, any case.

## `requireEmail` (type: `boolean`):

Skip carriers that filed no email address.

## `requirePhone` (type: `boolean`):

Skip carriers that filed no phone.

## `requireMcNumber` (type: `boolean`):

Note: almost no NEW carrier has one yet -- operating authority is filed later.

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

Look up specific carriers. Combines with the filters above (status defaults to any).

## `sortBy` (type: `string`):

Ties are broken by USDOT number so paging is stable.

## `maxItems` (type: `integer`):

0 = every match (can be hundreds of thousands).

## `minRequestInterval` (type: `number`):

Never below 1 (data.transportation.gov robots.txt Crawl-delay). 1,000 carriers per request.

## Actor input object example

```json
{
  "states": [
    "TX"
  ],
  "addedFrom": "2026-09-01",
  "carrierOperation": "any",
  "hazmatOnly": false,
  "requireEmail": false,
  "requirePhone": false,
  "requireMcNumber": false,
  "sortBy": "newest",
  "maxItems": 200,
  "minRequestInterval": 1
}
```

# Actor output Schema

## `items` (type: `string`):

One row per scraped record. See the dataset's default view for field definitions.

# 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 = {
    "states": [
        "TX"
    ],
    "addedFrom": "2026-09-01"
};

// Run the Actor and wait for it to finish
const run = await client.actor("scrapyx/fmcsa-carriers-scraper").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 = {
    "states": ["TX"],
    "addedFrom": "2026-09-01",
}

# Run the Actor and wait for it to finish
run = client.actor("scrapyx/fmcsa-carriers-scraper").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 '{
  "states": [
    "TX"
  ],
  "addedFrom": "2026-09-01"
}' |
apify call scrapyx/fmcsa-carriers-scraper --silent --output-dataset

```

## MCP server setup

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

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/h2KF8idbLdlOWTXPg/builds/j4rPUFMVdYPix7zni/openapi.json
