# FMCSA Motor Carrier Scraper — DOT Lookup & Carrier Leads (`cblu/fmcsa-motor-carrier-scraper`) Actor

Extract motor carrier records from FMCSA's official census — DOT number, phone, email, company officers, fleet size, cargo types, safety rating. Filter by state, fleet size, cargo, hazmat, and registration date. Pay per carrier record.

- **URL**: https://apify.com/cblu/fmcsa-motor-carrier-scraper.md
- **Developed by:** [Steven Carleton](https://apify.com/cblu) (community)
- **Categories:** Lead generation
- **Stats:** 6 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.00 / 1,000 carrier records

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.

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

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## FMCSA Motor Carrier Scraper — DOT Trucking Company Database with Phone, Email & Fleet Data

**Get every trucking company that registered with FMCSA in your states yesterday — with phone, email, the owner's name, and fleet size — before your competitors call them.** A brand-new carrier has to buy insurance, find factoring, and pick an ELD in its first weeks. This is that list, straight from the federal registration file.

Data comes from the official FMCSA Company Census File on the US DOT open-data portal. No SAFER page scraping, no per-DOT-number lookups, no captchas, no rate-limit walls.

### See real carriers for 8 cents before you commit

Set `maxResults` to `25` and run it once. You are charged **$0.003 per carrier record** — so a 25-record look costs **$0.075**, and a run that matches nothing costs only Apify's fraction-of-a-cent start event. Confirm the contact data is really there for your filter, then schedule it daily.

### What one record actually looks like

Real output from a live run — a new Texas carrier, trimmed to the fields a sales team uses:

```json
{
    "dotNumber": "9856306",
    "legalName": "CARBO INVESTMENTS LLC",
    "dbaName": "CARBO CARE SERVICES MEDICAL COURIER",
    "status": "ACTIVE",
    "classification": "AUTHORIZED FOR HIRE",
    "phone": "6822519477",
    "email": "OPERATIONSTT@CARBOCARESERVICES.ORG",
    "companyOfficers": ["TRACIE THOMAS"],
    "physicalAddress": { "street": "629 MEDINAH RD", "city": "RED OAK", "state": "TX", "zip": "75154-2750" },
    "powerUnits": 5,
    "totalDrivers": 4,
    "addedDate": "2026-07-30"
}
```

Phone, email, the officer's name, and fleet size in one row — that is the whole pitch. The full record also carries cell phone, fax, mailing address, cargo types, hazmat flag, safety rating, MCS-150 date, and a direct SAFER link.

### What a real job costs

Pricing is **$3.00 per 1,000 carrier records** ($0.003 each), charged only on records actually returned:

| What you pull | Records | Cost |
|---|---|---|
| A look at the output before buying | 25 | **$0.08** |
| A daily new-authority feed | ~200 | **$0.60** |
| A capped state prospecting list | 1,000 | **$3.00 maximum** |

A daily 200-carrier new-authority feed costs about **$18 a month**. There is no subscription — just the per-record price plus Apify's fraction-of-a-cent platform events (an Actor start event and $0.00001 per result, about 0.3% on top).

> **On very large pulls:** Apify caps each run with a maximum-charge limit. If a run reaches it, the run stops early and returns fewer records than your `maxResults` — the run's status message will tell you when this happens. For big pulls, raise the maximum-charge setting on the run (or your plan limit) before starting it.

### What data do you get?

One result per carrier:

| Field | Example |
|---|---|
| `dotNumber` / `docketNumber` / `saferUrl` | `9382970` / `MC-197756` / direct SAFER snapshot link |
| `legalName` / `dbaName` | `ABP TRUCKING EXPRESS` |
| `status` / `carrierOperation` | `ACTIVE` / `Interstate` |
| `phone` / `cellPhone` / `email` | Direct contact data as filed with FMCSA |
| `companyOfficers` | `["DORA ACOSTA"]` |
| `physicalAddress` / `mailingAddress` | Street, city, state, ZIP |
| `powerUnits` / `trucks` / `totalDrivers` / `cdlDrivers` | Fleet size for qualification |
| `cargoTypes` | `["General Freight", "Building Materials"]` |
| `hazmat` / `safetyRating` / `safetyRatingDate` | `false` / `Satisfactory` |
| `mcs150Date` / `addedDate` | Last biennial update; date first registered |

Recently registered carriers almost always carry both phone and email. In a sample of 50 carriers registered between 2026-07-15 and 2026-07-30, **all 50 had both a phone number and an email address on file**. Older records can have gaps — use `requireEmail` / `requirePhone` to return only guaranteed-contactable leads.

### Use cases

- **Trucking insurance leads** — new-authority carriers must buy insurance immediately. Schedule a daily run with `addedAfter` set to yesterday and wake up to every new carrier in your states, with phone and email.
- **Freight factoring & fuel-card sales** — filter small fleets (`minPowerUnits: 1`, `maxPowerUnits: 10`) registered in the last 90 days: the exact segment that needs cash-flow products.
- **ELD, dashcam, and fleet-software sales** — target fleet-size bands by state and cargo type; the census gives you the decision maker's name (company officer) plus direct contacts.
- **Freight brokers & shippers** — find carriers by cargo classification (`refrigerated-food`, `motor-vehicles`, `oilfield-equipment`...) and state, and verify status and fleet size before tendering.
- **Compliance & due diligence** — check any carrier's status, safety rating, hazmat flag, and MCS-150 currency in bulk.
- **AI agents / MCP** — a clean, filterable feed of the entire US trucking registry for agent-driven carrier vetting.

### How to use it

Fresh carrier leads — active Texas fleets with 5+ trucks, registered since June, email on file:

```json
{
    "states": ["TX"],
    "statuses": ["active"],
    "minPowerUnits": 5,
    "addedAfter": "2026-06-01",
    "requireEmail": true,
    "maxResults": 500
}
```

New interstate carriers across the Southeast, phone required:

```json
{
    "states": ["FL", "GA", "NC"],
    "carrierOperations": ["interstate"],
    "addedAfter": "2026-07-01",
    "requirePhone": true,
    "maxResults": 1000
}
```

Established refrigerated-food fleets nationwide:

```json
{
    "cargoTypes": ["refrigerated-food"],
    "minPowerUnits": 10,
    "requirePhone": true,
    "maxResults": 2000
}
```

One data-source quirk to know: FMCSA fills in the cargo-classification flags with a **~2-month lag** after a carrier first registers, so don't combine `cargoTypes` with an `addedAfter` date in the last two months (the Actor warns you if you do).

Results are sorted **newest registration first**, so a small `maxResults` always returns the freshest carriers. Set `statuses` to `["active", "inactive"]` for historical/compliance research. Set `includeRawData` to `true` to attach all 140+ raw census columns (vehicle ownership breakdowns, mileage history, docket details). **You are only charged for records actually returned.**

### Data source & freshness

Records come from FMCSA's official **Company Census File** on `data.transportation.gov`, the US DOT's open-data portal — all ~4.5 million registered carriers, ~2.2 million active. It is the registration dataset behind SAFER: every entity registered with FMCSA (carriers subject to FMCSR/HMR plus intrastate non-hazmat carriers). Because the Actor queries the official API instead of scraping SAFER pages, it cannot be blocked, captcha'd, or rate-limited into failure.

### Pricing

Pay per result: **$0.003 per carrier record** ($3.00 per 1,000). You are charged per record actually returned, plus Apify's small platform events: a fraction-of-a-cent Actor start event and $0.00001 per dataset item — about 0.3% on top of the per-record price. No subscription; a run that finds nothing costs only the fraction-of-a-cent start event.

### FAQ

**Is this the same data as SAFER?** Yes — SAFER's company snapshots are rendered from this census. The Actor gives you the whole thing, filterable and in bulk, instead of one DOT number at a time.

**How fresh are "new carrier" leads?** `addedDate` is the date FMCSA added the carrier to the census. FMCSA refreshes the portal dataset regularly; a daily run with `addedAfter` set a few days back reliably captures every new registration.

**Do all carriers have email and phone?** Recently registered carriers almost always do — in a sample of 50 carriers registered in the second half of July 2026, all 50 had both. Older records can have gaps — use `requireEmail` / `requirePhone` to filter guaranteed-contactable leads.

**Does it include inspection/crash counts?** The census carries the registration profile plus safety rating. If you need per-carrier inspection and crash history (SMS/BASIC scores), open an issue — it comes from a sibling FMCSA dataset and can be added on request.

**Can I look up one specific carrier?** Yes — set `nameContains` to the carrier name, or filter to its state and use the SAFER link in the results. A dedicated DOT-number lookup input can be added on request.

# Actor input Schema

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

Optional. Two-letter US state codes of the carrier's physical address, e.g. <code>TX</code>, <code>FL</code>. Leave empty for all states.

## `statuses` (type: `array`):

Which registration statuses to include: <code>active</code>, <code>inactive</code>, <code>pending</code>. Defaults to active carriers only.

## `carrierOperations` (type: `array`):

Optional. Operation types: <code>interstate</code>, <code>intrastate-hazmat</code>, <code>intrastate-non-hazmat</code>. Leave empty for all.

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

Optional. Case-insensitive substring match against the carrier's legal name and DBA name, e.g. <code>logistics</code>.

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

Optional. Only carriers with at least this many power units (trucks/tractors). Use it to target real fleets instead of owner-operators.

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

Optional. Only carriers with at most this many power units. Combine with the minimum to target a fleet-size band, e.g. 5-50.

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

Optional. Only carriers reporting at least this many total drivers.

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

Only return carriers with the hazardous-materials indicator set.

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

Optional. Only carriers hauling ALL of the given cargo classifications. Supported keys include <code>general-freight</code>, <code>household-goods</code>, <code>motor-vehicles</code>, <code>building-materials</code>, <code>machinery-large-objects</code>, <code>fresh-produce</code>, <code>liquids-gases</code>, <code>intermodal-containers</code>, <code>passengers</code>, <code>oilfield-equipment</code>, <code>livestock</code>, <code>grain-feed-hay</code>, <code>refrigerated-food</code>, <code>beverages</code>, <code>construction</code>, <code>garbage-refuse-trash</code>, <code>chemicals</code>, <code>us-mail</code>, <code>logs-poles-beams-lumber</code>, <code>metal-sheets-coils-rolls</code>, <code>mobile-homes</code>, <code>drive-tow-away</code>, <code>commodities-dry-bulk</code>, <code>paper-products</code>, <code>utility</code>, <code>farm-supplies</code>, <code>coal-coke</code>, <code>meat</code>, <code>water-well-drilling</code>, <code>other</code>.

## `safetyRatings` (type: `array`):

Optional. Only carriers with one of the given FMCSA safety ratings: <code>satisfactory</code>, <code>conditional</code>, <code>unsatisfactory</code>. Most carriers are unrated - setting this restricts results to rated carriers only.

## `addedAfter` (type: `string`):

Optional. Only carriers added to the FMCSA census on/after this date (format <code>YYYY-MM-DD</code>). Set it to last week for a fresh new-carrier lead feed.

## `addedBefore` (type: `string`):

Optional. Only carriers added to the FMCSA census on/before this date (format <code>YYYY-MM-DD</code>).

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

Only return carriers with an email address on file.

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

Only return carriers with a phone number on file.

## `includeRawData` (type: `boolean`):

Attach the complete raw census row (140+ columns: vehicle ownership breakdowns, mileage, docket details) to every record under <code>raw</code>.

## `socrataAppToken` (type: `string`):

Optional. Your own free Socrata app token (from data.transportation.gov) for higher API rate limits. Not required.

## `maxResults` (type: `integer`):

Maximum number of carrier records to return. You are only charged for records actually returned.

## Actor input object example

```json
{
  "states": [
    "TX"
  ],
  "statuses": [
    "active"
  ],
  "carrierOperations": [],
  "hazmatOnly": false,
  "cargoTypes": [],
  "safetyRatings": [],
  "requireEmail": false,
  "requirePhone": false,
  "includeRawData": false,
  "maxResults": 500
}
```

# 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"
    ],
    "maxResults": 500
};

// Run the Actor and wait for it to finish
const run = await client.actor("cblu/fmcsa-motor-carrier-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"],
    "maxResults": 500,
}

# Run the Actor and wait for it to finish
run = client.actor("cblu/fmcsa-motor-carrier-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"
  ],
  "maxResults": 500
}' |
apify call cblu/fmcsa-motor-carrier-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,cblu/fmcsa-motor-carrier-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/kMyaVk5ebXIZMf59O/builds/s3RwgRJ9egvvHkIKb/openapi.json
