# FMCSA Trucking Scraper - Motor Carriers, Authority & Leads (`scrapesage/fmcsa-trucking-scraper`) Actor

Scrape US trucking companies from FMCSA open data: USDOT/MC carriers & brokers with phone, email, fleet size, operating authority, insurance & out-of-service status. Filter by state, operation & registration date for fresh new-carrier leads, plus monitoring. Keyless, no browser.

- **URL**: https://apify.com/scrapesage/fmcsa-trucking-scraper.md
- **Developed by:** [Scrape Sage](https://apify.com/scrapesage) (community)
- **Categories:** Lead generation, Automation, Other
- **Stats:** 27 total users, 7 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$5.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/platform/actors/running/actors-in-store#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 Trucking Scraper — US Motor Carriers, Operating Authority & Leads

Extract **US trucking companies and motor carriers** straight from the **[FMCSA](https://www.fmcsa.dot.gov/) open-data registry** — every USDOT carrier and MC-number broker with **phone, e-mail, physical & mailing address, fleet size, operating authority, insurance, and out-of-service status**. Filter by **state, operation type, fleet size, and registration date** to pull **fresh new-authority leads**, or look up a full safety-and-authority profile by **USDOT / MC number / company name**.

No login, no cookies, no browser, no API key — this actor reads the official **U.S. DOT Socrata open-data API**, which is **keyless, fast, and 100% reliable** (government infrastructure, zero anti-bot). Every carrier row is a ready-to-use **B2B lead**.

### Why this FMCSA / trucking scraper?

Most trucking scrapers return a single SAFER snapshot or a thin census row. This actor merges the **full Company Census** (4.45M carriers), the **SMS e-mail census**, the **operating-authority** dataset (MC numbers, broker/common/contract status), **insurance** on file, **out-of-service orders**, and **authority revocations** into one dense record — the **richest motor-carrier dataset in the category**.

| Data | Thin scrapers | This actor |
|---|---|---|
| Legal name, DBA, USDOT # | ✅ | ✅ |
| **MC / docket number** | partial | ✅ (operating-authority join) |
| **Phone** | ✅ | ✅ |
| **E-mail address** | ❌ | ✅ (FMCSA e-mail census) |
| Physical **and** mailing address | partial | ✅ both |
| Fleet: power units, trucks, buses, drivers, CDLs | partial | ✅ full |
| Operation type, hazmat, classification | partial | ✅ |
| **Operating authority** (common/contract/broker, authorized-for-hire) | ❌ | ✅ |
| **Insurance** requirements + policies on file | ❌ | ✅ |
| **Out-of-service** orders + revocations | ❌ | ✅ (lookup mode) |
| **Registration date** → fresh new-authority leads | ❌ | ✅ |
| Lead score (0–100) | ❌ | ✅ |
| Monitoring — only new carriers | ❌ | ✅ |

### Use cases

- **Freight & logistics lead generation** — build targeted carrier and broker lists by state, fleet size, and operation type, with phone + e-mail ready for your CRM or dialer.
- **New-authority / new-entrant marketing** — the highest-value slice: carriers registered in the last N days need **insurance, factoring, ELDs, fuel cards, dispatch, and compliance services** right now. Filter by `registeredAfter` (or run Monitoring mode daily) to reach them first.
- **Carrier vetting & compliance** — look up a carrier's operating authority, insurance on file, and out-of-service / revocation history before you book a load or onboard.
- **Insurance & factoring prospecting** — find active for-hire carriers by fleet size and state; see who is required to carry BIPD/cargo coverage and what's on file.
- **Market & competitive research** — analyze fleet sizes, operation radius, hazmat share, and registration trends across any state.

### How to use

1. [Sign up for Apify](https://console.apify.com/sign-up) — the free plan is enough to try this actor.
2. Open the **FMCSA Trucking Scraper**, keep **Mode = Carriers**, choose one or more **states** (or leave empty for nationwide), and optionally set **Registered after** for fresh leads.
3. Click **Start** and watch carriers stream into the dataset table.
4. **Export** as JSON, CSV, Excel, XML, or RSS — or pull results via the [Apify API](https://docs.apify.com/api/v2).

### Input

```json
{
    "mode": "carriers",
    "states": ["TX", "CA"],
    "carrierOperation": "Interstate",
    "registeredAfter": "2026-05-01",
    "minPowerUnits": 1,
    "maxPowerUnits": 25,
    "includeEmail": true,
    "enrichAuthority": true,
    "maxResults": 1000
}
```

- **mode** *(default `carriers`)* — `carriers` discovers/filters carriers from the census (lead generation); `lookup` returns a full profile for the USDOT / MC / company name you pass.
- **states** — physical-address state filter (2-letter codes or full names). Empty = nationwide, newest registrations first.
- **carrierOperation** — `Any`, `Interstate`, `Intrastate Hazmat`, or `Intrastate Non-Hazmat`.
- **registeredAfter / registeredBefore** *(YYYY-MM-DD)* — registration-date window. `registeredAfter` is the key to **fresh new-authority leads**.
- **hazmatOnly / activeOnly** — keep only hazmat carriers / only Active-status carriers (Active-only is on by default).
- **minPowerUnits / maxPowerUnits / minDrivers** — fleet-size targeting (e.g. set max 5 for owner-operators, min 50 for large fleets).
- **companyName** — filter (carriers) or resolve (lookup) by legal name.
- **dotNumbers / mcNumbers** — for Lookup mode (or to restrict Carriers mode to specific USDOT numbers).
- **includeEmail** *(default true)* — add the FMCSA e-mail address.
- **enrichAuthority** *(default true)* — add operating authority (MC#, common/contract/broker status, authorized-for-hire flags, insurance requirements) and insurance policies on file. Always on in Lookup mode.
- **maxResults / maxResultsPerState** — caps. **monitorMode** + **monitorStoreName** — only-new-carriers tracking. **proxyConfiguration / socrataAppToken / maxConcurrency** — run tuning.

#### Lookup mode

```json
{
    "mode": "lookup",
    "dotNumbers": ["76830", "244818"],
    "mcNumbers": ["012892"],
    "companyName": "SWIFT TRANSPORTATION"
}
```

Returns one full profile per carrier: census + contact + operating authority + insurance + out-of-service orders + revocations.

### Output

A carrier record (`type: "carrier"`):

```json
{
    "type": "carrier",
    "dotNumber": "8214454",
    "legalName": "Optimal Greatness Solutions LLC",
    "dbaName": null,
    "operationType": "Interstate",
    "operationCode": "A",
    "status": "Active",
    "isActive": true,
    "hazmat": false,
    "carrierClassification": "AUTHORIZED FOR HIRE",
    "phone": "(404) 520-0327",
    "email": "dispatch@example.com",
    "physicalAddress": { "street": "123 Main St", "city": "Houston", "state": "TX", "zip": "77001", "county": "201", "country": "US" },
    "mailingAddress": { "street": "PO Box 123", "city": "Houston", "state": "TX", "zip": "77001", "country": "US" },
    "powerUnits": 2,
    "truckUnits": 2,
    "totalDrivers": 4,
    "cdlDrivers": 2,
    "operationRadius": { "interstateBeyond100Miles": 2, "interstateWithin100Miles": 0, "intrastateBeyond100Miles": 0, "intrastateWithin100Miles": 0 },
    "registrationDate": "2026-06-13",
    "ageInDays": 2,
    "isNewEntrant": true,
    "mcs150Date": "2026-06-13",
    "mcNumber": "MC1234567",
    "operatingAuthority": {
        "authority": { "common": { "status": "Active", "applicationPending": false, "revocationPending": false }, "contract": null, "broker": null },
        "authorizedFor": { "property": true, "passenger": false, "householdGoods": false, "private": false, "enterprise": false },
        "insuranceRequirements": { "bipdRequiredThousands": 750, "cargoRequired": false, "bondRequired": false, "bipdOnFile": "750", "cargoOnFile": false, "bondOnFile": false }
    },
    "insurance": [ { "insurer": "Progressive", "type": "BIPD/Primary", "coverageThousands": 1000, "policyNumber": "ABC123", "effectiveDate": "06/01/2026" } ],
    "saferSnapshotUrl": "https://safer.fmcsa.dot.gov/query.asp?searchtype=ANY&query_type=queryCarrierSnapshot&query_param=USDOT&query_string=8214454",
    "leadScore": 84,
    "scrapedAt": "2026-06-15T12:00:00.000Z"
}
```

In **Lookup mode** the record also carries `outOfService` (orders + current OOS flag) and `revocations`. Every other census column FMCSA publishes is passed through under `additionalData`, so you always get the richest possible record.

#### What to expect (field coverage)

FMCSA fields are operator-reported, so some are populated only when the carrier filed them. Verified against the live registry:

| Field | Coverage |
|---|---|
| USDOT #, legal name, operation type, status, address | ✅ ~100% |
| Phone | ✅ very high (FMCSA requires a contact phone) |
| Fleet size (power units, drivers) | ✅ high |
| **E-mail** | present for carriers that filed one (FMCSA e-mail census subset) |
| **MC number / operating authority** | present for carriers/brokers with interstate for-hire authority (intrastate-only carriers have none) |
| **Insurance on file** | present for carriers required to carry it |
| Out-of-service / revocations | present only when such an event exists (most carriers: none) |

A blank field means FMCSA doesn't publish that value for that carrier — not that scraping failed. Nothing is dropped.

### Automate & schedule

- **[Apify API](https://docs.apify.com/api/v2)** — start runs, fetch datasets, manage schedules over REST.
- **[apify-client for JavaScript](https://docs.apify.com/api/client/js/)** and **[apify-client for Python](https://docs.apify.com/api/client/python/)** — official SDKs.
- **[Schedules](https://docs.apify.com/platform/schedules)** — run daily with **Monitoring mode** + `registeredAfter` to capture brand-new carriers the moment they get authority.
- **[Webhooks](https://docs.apify.com/platform/integrations/webhooks)** — trigger CRM import, a Slack alert, or an outreach sequence the moment a run finishes.

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

const client = new ApifyClient({ token: 'MY_APIFY_TOKEN' });

const run = await client.actor('scrapesage/fmcsa-trucking-scraper').call({
    mode: 'carriers',
    states: ['TX'],
    registeredAfter: '2026-05-01',
    monitorMode: true,
});

const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(`Got ${items.length} carrier leads`);
```

### Integrate with any app

Connect the dataset to 5,000+ apps — no code required:

- **[Make](https://docs.apify.com/platform/integrations/make)** — multi-step automation scenarios.
- **[Zapier](https://docs.apify.com/platform/integrations/zapier)** — push new carrier leads straight into your CRM or dialer.
- **[Slack](https://docs.apify.com/platform/integrations/slack)** — get pinged when new carriers register in your states.
- **[Google Drive / Sheets](https://docs.apify.com/platform/integrations/drive)** — auto-export every run to a spreadsheet.
- **[Airbyte](https://docs.apify.com/platform/integrations/airbyte)** — pipe results into your data warehouse.
- **[GitHub](https://docs.apify.com/platform/integrations/github)** — trigger runs from commits or releases.

### Use with AI assistants (MCP)

The output is clean, LLM-ready JSON. Call this actor from Claude, ChatGPT, or any agent framework through the **[Apify MCP server](https://docs.apify.com/platform/integrations/mcp)** — ask your assistant to "find Texas interstate carriers with 1–10 trucks registered this month, with phone and email" and let it run the scraper.

### Agent-ready: autonomous payments (x402 & Skyfire)

This actor is **agent-ready** — AI agents can discover it, run it, and **pay for it autonomously**, with no Apify account and no human in the loop. It uses [pay-per-event](https://docs.apify.com/platform/actors/publishing/monetize/pay-per-event) pricing and [limited permissions](https://docs.apify.com/platform/actors/development/permissions), so it qualifies for Apify's agentic-payment standards:

- **[x402](https://docs.apify.com/platform/integrations/x402)** — an open, HTTP-native payment protocol. Agents pay per run in USDC on the Base network directly through the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp) — no account, no API key.
- **[Skyfire](https://docs.apify.com/platform/integrations/skyfire)** — agent-to-service payments for fully autonomous AI-agent workflows.

Building an AI agent, MCP tool, or autonomous data pipeline? This scraper is ready to plug in and pay as it goes.

### More scrapers from scrapesage

Build a complete **B2B lead-gen & business-intelligence stack** with sibling actors:

- **[US Business Formation Scraper](https://apify.com/scrapesage/us-business-formation-scraper)** — newly registered US LLCs & companies (fresh business leads).
- **[SAM.gov Scraper](https://apify.com/scrapesage/sam-gov-scraper)** — federal contract opportunities & contacts.
- **[USASpending Scraper](https://apify.com/scrapesage/usaspending-scraper)** — federal awards, contractors & recipients.
- **[Insurance Agent Scraper](https://apify.com/scrapesage/insurance-agent-scraper)** — multi-carrier insurance agent leads.
- **[SEC EDGAR Scraper](https://apify.com/scrapesage/sec-edgar-scraper)** — filings, financials & company contacts.
- **[Companies House Scraper](https://apify.com/scrapesage/companies-house-scraper)** — UK companies, directors & PSCs.
- **[FEC Campaign Finance Scraper](https://apify.com/scrapesage/fec-campaign-finance-scraper)** — donors, committees & lobbying.
- **[Court Records Scraper](https://apify.com/scrapesage/court-records-scraper)** — dockets, opinions & litigation intelligence.

### Tips

- **Fresh leads**: set `registeredAfter` to ~30 days ago (or turn on **Monitoring mode** + a daily [Schedule](https://docs.apify.com/platform/schedules)) to capture new-authority carriers before competitors do.
- **Owner-operators vs fleets**: use `maxPowerUnits: 5` for small operators, or `minPowerUnits: 50` for large fleets.
- **Interstate for-hire**: set `carrierOperation: "Interstate"` and keep `enrichAuthority` on to get MC numbers and authority status — the carriers most likely to need brokers, insurance, and factoring.
- **Vetting a specific carrier**: switch to **Lookup mode** and pass the USDOT or MC number for a full authority + insurance + out-of-service profile.
- **No proxy needed**: FMCSA open data is a clean government API; the default Apify proxy is plenty.

### FAQ

**Where does the data come from?** The official FMCSA / U.S. DOT open-data datasets on `data.transportation.gov` (Company Census, SMS e-mail census, operating authority, insurance, out-of-service orders, revocations) — the same data behind SAFER and L\&I, served as a clean Socrata API.

**Do I need an API key or login?** No. The API is keyless. You can optionally add a free Socrata app token to raise the rate limit on very large runs.

**How fresh is the data?** FMCSA refreshes these datasets continuously — the census updates daily. New carriers typically appear within a day or two of getting their USDOT number.

**How do I get only NEW carriers each run?** Turn on **Monitoring mode** and create a [Schedule](https://docs.apify.com/platform/schedules). Each run emits only USDOT numbers not seen before. Pair it with `registeredAfter` for a pure new-authority feed.

**Why is email/MC number sometimes empty?** Not every carrier files an e-mail, and intrastate-only carriers don't hold an MC number / operating authority. Fields are blank only when FMCSA has no value — never because scraping failed.

**Can I export to Google Sheets, CSV, or Excel?** Yes — one click in the dataset view, or automatically every run via the [Google Drive integration](https://docs.apify.com/platform/integrations/drive).

**Is this legal?** This actor collects publicly available US government data. You are responsible for using it in compliance with applicable laws (e.g. TCPA/CAN-SPAM for outreach) and FMCSA's terms.

### Need help?

Open an issue on the actor's **Issues** tab, or visit the [Apify help center](https://help.apify.com/). Feature requests are welcome — this actor is actively maintained.

# Actor input Schema

## `mode` (type: `string`):

What to scrape. 'Carriers' discovers/filters motor carriers from the FMCSA census (the main lead-gen engine). 'Lookup' returns a full profile for specific carriers you pass via USDOT, MC number, or company name (census + operating authority + insurance + out-of-service + revocations).

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

Filter carriers by physical-address state. Use 2-letter codes (e.g. TX, CA) or full names. Leave empty to scrape all states (newest registrations first). Ignored in Lookup mode.

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

Filter by carrier operation. Interstate carriers cross state lines (most freight/broker leads); Intrastate Hazmat / Non-Hazmat operate within one state.

## `registeredAfter` (type: `string`):

Only return carriers registered with FMCSA on or after this date — the key to fresh, high-intent new-authority leads (insurance, factoring, ELD, fuel cards). Leave empty for all. Example: 2026-05-01.

## `registeredBefore` (type: `string`):

Only return carriers registered on or before this date. Combine with 'Registered after' for a date window. Leave empty for no upper bound.

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

Keep only carriers flagged as transporting hazardous materials.

## `activeOnly` (type: `boolean`):

Keep only carriers whose FMCSA status is Active (drops inactive/pending). Recommended for lead generation.

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

Only keep carriers with at least this many power units (trucks/tractors). Leave empty for no minimum. Great for targeting fleets of a given size.

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

Only keep carriers with at most this many power units. Leave empty for no maximum (e.g. set 1–5 to target small owner-operators).

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

Only keep carriers with at least this many drivers. Leave empty for no minimum.

## `companyName` (type: `string`):

Filter (carriers mode) or resolve (lookup mode) by legal name containing this text. Example: SWIFT TRANSPORTATION.

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

USDOT numbers to look up (Lookup mode) or restrict to (Carriers mode). Example: \["76830", "244818"].

## `mcNumbers` (type: `array`):

MC (docket) numbers to look up in Lookup mode — resolved to carriers via the operating-authority dataset. Digits only or with the MC prefix. Example: \["012892", "MC255345"].

## `includeEmail` (type: `boolean`):

Enrich each carrier with the e-mail address on file with FMCSA (from the SMS census). Adds a fast lookup per batch. Recommended for lead generation.

## `enrichAuthority` (type: `boolean`):

Enrich each carrier with its operating authority (MC number, common/contract/broker status, authorized-for-hire flags, insurance requirements) and insurance policies on file. Adds extra lookups per batch. Always on in Lookup mode.

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

Global cap on the total number of carrier records emitted in this run.

## `maxResultsPerState` (type: `integer`):

Optional cap per state (carriers mode, when multiple states are selected). 0 = split the global cap evenly across the selected states.

## `deduplicateResults` (type: `boolean`):

Emit each USDOT number only once per run.

## `monitorMode` (type: `boolean`):

Remember USDOT numbers already returned and emit ONLY carriers not seen in previous runs. Pair with 'Registered after' and Apify Schedules to capture brand-new motor-carrier leads daily.

## `monitorStoreName` (type: `string`):

Named key-value store holding the 'already seen' USDOT numbers for monitoring mode. Use a different name per tracked scope (lowercase letters, digits and hyphens only).

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

Optional Socrata app token to raise the FMCSA open-data API throttling limit on very large runs. Not required for normal use.

## `maxConcurrency` (type: `integer`):

Maximum parallel fetches (states / enrichment batches).

## `proxyConfiguration` (type: `object`):

Proxy settings. FMCSA open data is a clean US-gov API, so the default Apify proxy is plenty (a proxy is not strictly required).

## Actor input object example

```json
{
  "mode": "carriers",
  "states": [
    "TX"
  ],
  "carrierOperation": "Any",
  "hazmatOnly": false,
  "activeOnly": true,
  "includeEmail": true,
  "enrichAuthority": true,
  "maxResults": 1000,
  "maxResultsPerState": 0,
  "deduplicateResults": true,
  "monitorMode": false,
  "monitorStoreName": "fmcsa-trucking-monitor",
  "maxConcurrency": 4,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

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

All scraped motor-carrier records in the default dataset.

# 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"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("scrapesage/fmcsa-trucking-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"] }

# Run the Actor and wait for it to finish
run = client.actor("scrapesage/fmcsa-trucking-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).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"
  ]
}' |
apify call scrapesage/fmcsa-trucking-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=scrapesage/fmcsa-trucking-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/acts/CkehynQ8utcBcVcuQ/builds/4D6YDX7OWKLna0pHv/openapi.json
