# FMCSA SAFER Carrier Scraper (`automation-lab/fmcsa-safer-carrier-scraper`) Actor

Look up official FMCSA carrier records by USDOT number or company name, including operating authority, fleet, safety rating, inspection, and crash summaries.

- **URL**: https://apify.com/automation-lab/fmcsa-safer-carrier-scraper.md
- **Developed by:** [Stas Persiianenko](https://apify.com/automation-lab) (community)
- **Categories:** Business
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per event

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

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 SAFER Carrier Scraper

Look up official FMCSA carrier records by USDOT number or company name. This safer data Actor returns carrier identity, operating status, fleet size, visible operating authority, safety rating, and bounded inspection and crash summaries as typed JSON.

It is built for carrier qualification, compliance reviews, insurance workflows, freight operations, and recurring portfolio monitoring. No FMCSA API key is required.

### What does FMCSA SAFER Carrier Scraper do?

The Actor joins four official public FMCSA datasets into one carrier snapshot:

1. Company Census identity and registration data.
2. Motus operating-authority and visible insurance filing data.
3. Inspection, violation, and out-of-service aggregates.
4. Crash, injury, and fatality aggregates.

Search by one or many USDOT numbers, or discover matching entities from a legal-name or DBA fragment. Optional state and active-status filters narrow the result set.

### Who is it for?

- **Freight brokers** qualifying a carrier before tendering a load.
- **Insurance teams** reviewing fleet, authority, and public safety indicators.
- **Compliance teams** building scheduled carrier-monitoring jobs.
- **Shippers and procurement teams** checking an approved carrier list.
- **Data teams** enriching a CRM, spreadsheet, warehouse, or internal carrier API.

The Actor exports source facts. It does not make a hiring, insurance, contracting, or legal decision for you.

### Why use this safer scraper?

- Uses official `data.transportation.gov` FMCSA records.
- Accepts exact USDOT lookup and company-name discovery in one input.
- Produces one normalized carrier object instead of several raw source rows.
- Includes configurable 1–60 month safety aggregates.
- Works anonymously, with an optional Socrata app token for higher quota.
- Returns direct source and SAFER Snapshot links for review.
- Stops at the requested `maxItems` limit.

### What FMCSA carrier data can I extract?

| Group | Example fields |
| --- | --- |
| Identity | USDOT number, legal name, DBA, entity type |
| Registration | operating status, operation class, MCS-150 date and mileage |
| Contact | public phone, email, physical and mailing addresses |
| Fleet | power units and drivers |
| Review | safety rating, rating date, review date and type |
| Authority | docket, authority type/status, minimum coverage, visible filings |
| Inspection summary | inspections, violations, out-of-service, driver and vehicle totals |
| Crash summary | crashes, fatalities, injuries |
| Provenance | SAFER Snapshot URL, open-data URL, extraction timestamp |

A field can be `null` when FMCSA does not publish it for that carrier. `authorities` can be empty, and `safetySummary` is `null` when enrichment is disabled.

### How to run your first carrier lookup

1. Open the Actor input page.
2. Enter one or more values in **USDOT numbers** or **Company names**.
3. Keep authority and safety enrichment enabled for a qualification snapshot.
4. Choose a safety lookback, normally 24 months.
5. Set the maximum number of carriers.
6. Click **Start**.
7. Open the default dataset to export JSON, CSV, Excel, XML, or RSS.

A reliable first input is:

```json
{
  "usdotNumbers": ["21800"],
  "includeAuthority": true,
  "includeSafetySummary": true,
  "safetyLookbackMonths": 24,
  "maxItems": 1
}
```

### Input parameters

| Field | Type | Default | Meaning |
| --- | --- | --- | --- |
| `usdotNumbers` | array | — | Exact USDOT identifiers, as numbers or numeric strings |
| `companyNames` | array | — | Case-insensitive legal-name or DBA fragments |
| `states` | array | — | Optional two-letter physical-address state codes |
| `activeOnly` | boolean | `false` | Keep only active census records |
| `includeAuthority` | boolean | `true` | Join visible Motus authority records |
| `includeSafetySummary` | boolean | `true` | Aggregate inspection and crash facts |
| `safetyLookbackMonths` | integer | `24` | Safety period from 1 to 60 months |
| `maxItems` | integer | `10` | Maximum carrier rows, from 1 to 100 |
| `appToken` | string | — | Optional secret Socrata app token |

At least one USDOT number or company name is required. State filters do not form a standalone discovery query.

### Search FMCSA carriers by company name

Use a real business-name fragment when the USDOT number is unknown:

```json
{
  "companyNames": ["United Parcel Service"],
  "includeAuthority": true,
  "includeSafetySummary": true,
  "maxItems": 5
}
```

Company search can match several legal names or DBAs. Use `states`, `activeOnly`, and a conservative `maxItems` to narrow broad names.

### Monitor a qualified carrier list

A scheduled Task can refresh multiple known carriers:

```json
{
  "usdotNumbers": ["21800", "86876"],
  "activeOnly": true,
  "includeAuthority": true,
  "includeSafetySummary": true,
  "safetyLookbackMonths": 36,
  "maxItems": 2
}
```

Schedule the Task daily, weekly, or monthly. Store snapshots in your own database or automation destination to detect changes. The Actor returns the current source view; it does not maintain change history or send alerts by itself.

### Output example

This shortened record reflects the Actor's current output shape. Public contact details are omitted from the documentation sample.

```json
{
  "usdotNumber": "21800",
  "legalName": "UNITED PARCEL SERVICE INC",
  "dbaName": "UPS",
  "operatingStatus": "Active",
  "carrierOperation": "Interstate",
  "entityType": "CORPORATION",
  "phone": null,
  "email": null,
  "physicalAddress": {
    "street": null,
    "city": "ATLANTA",
    "state": "GA",
    "zip": "30328",
    "country": "US"
  },
  "powerUnits": 112321,
  "drivers": 128806,
  "safetyRating": "Satisfactory",
  "authorities": [
    {
      "docketNumber": "MC115495",
      "authorityType": "Motor Carrier of Property (Except Household Goods)",
      "status": "Active",
      "minimumCoverageUsd": 750000,
      "bipdCoverageUsd": 1000000,
      "cargoInsuranceFiled": false,
      "bondFiled": false
    }
  ],
  "safetySummary": {
    "periodStart": "2024-08-06",
    "periodEnd": "2026-08-06",
    "inspections": 18748,
    "violations": 12100,
    "outOfService": 1925,
    "crashes": 778,
    "fatalities": 18,
    "injuries": 355
  },
  "saferSnapshotUrl": "https://safer.fmcsa.dot.gov/query.asp?...",
  "scrapedAt": "2026-08-06T14:10:00.000Z"
}
```

Counts depend on the selected period and source refresh, so later runs can differ.

### How much does it cost to look up FMCSA carrier records?

The Actor uses pay-per-event pricing: one `start` event per run and one `item` event for each carrier saved. The Apify Console shows the exact active tier for your account before you run it.

On the FREE plan, the run fee is **$0.005** and each carrier is **$0.0051888**. Paid plans receive the active tier discount shown in Apify Console.

| Saved carriers | FREE-tier calculation |
| ---: | ---: |
| 1 | 0.005 + (1 × 0.0051888) = 0.0101888 USD |
| 10 | 0.005 + (10 × 0.0051888) = 0.056888 USD |
| 100 | 0.005 + (100 × 0.0051888) = 0.52388 USD |

Empty searches pay only the start event. Authority entries and safety aggregates inside a carrier record are not separately charged. Apify compute is included in PPE pricing.

### Export and integration workflows

After a run, use the dataset UI or API to:

- download CSV or Excel for a compliance review;
- append records to Google Sheets;
- send a carrier snapshot to Slack or email through an automation;
- upsert by `usdotNumber` into a CRM or warehouse;
- compare scheduled snapshots in Make, Zapier, n8n, or your own code;
- feed reviewed source facts into a carrier onboarding checklist.

Use USDOT number as the stable join key. Company names can change and are not unique.

### Run through the Apify API with cURL

```bash
curl -X POST \
  "https://api.apify.com/v2/acts/automation-lab~fmcsa-safer-carrier-scraper/runs?token=$APIFY_TOKEN&waitForFinish=300" \
  -H "Content-Type: application/json" \
  -d '{
    "usdotNumbers": ["21800"],
    "includeAuthority": true,
    "includeSafetySummary": true,
    "maxItems": 1
  }'
```

Read results from the returned run's `defaultDatasetId`, or use the synchronous dataset-items endpoint for small jobs.

### Run with JavaScript

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

const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('automation-lab/fmcsa-safer-carrier-scraper').call({
  companyNames: ['FedEx'],
  states: ['TN'],
  activeOnly: true,
  includeAuthority: true,
  includeSafetySummary: true,
  maxItems: 10,
});

const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);
```

### Run with Python

```python
import os
from apify_client import ApifyClient

client = ApifyClient(os.environ['APIFY_TOKEN'])
run = client.actor('automation-lab/fmcsa-safer-carrier-scraper').call(run_input={
    'usdotNumbers': ['21800', '86876'],
    'includeAuthority': True,
    'includeSafetySummary': True,
    'safetyLookbackMonths': 24,
    'maxItems': 2,
})
items = client.dataset(run['defaultDatasetId']).list_items().items
print(items)
```

### Use the Actor through MCP

Add this Actor to Claude Code:

```bash
claude mcp add --transport http apify \
  "https://mcp.apify.com?tools=automation-lab/fmcsa-safer-carrier-scraper"
```

**Claude Desktop**, **Cursor**, and **VS Code** can use the same remote MCP server configuration. Add it to the client's MCP settings:

```json
{
  "mcpServers": {
    "apify": {
      "url": "https://mcp.apify.com?tools=automation-lab/fmcsa-safer-carrier-scraper"
    }
  }
}
```

Example prompts:

- “Look up USDOT 21800 and summarize its operating authority and last 24 months of safety counts.”
- “Find active FedEx carrier entities in Tennessee and return their USDOT numbers.”
- “Refresh these USDOT records and format a carrier qualification table.”

### Data freshness and source limitations

The Actor queries official FMCSA open-data datasets, whose refresh schedules differ. A successful extraction means the source answered; it does not guarantee that a carrier has filed every field recently.

Safety totals are aggregates of public inspection and crash records over the requested period. They are not a reproduction of every visual SAFER rate or national-average comparison. The Actor does not return private driver details, SMS BASIC percentiles, enforcement advice, insurance verification, or a risk score.

The SAFER website link may apply its own access controls when opened manually. Extraction uses the official structured FMCSA datasets rather than scraping that protected HTML page.

### Reliability and troubleshooting

Requests use a 30-second timeout, bounded concurrency, and exponential retry for network failures, HTTP 429, and temporary server errors. Malformed input and deterministic API errors fail the run instead of silently producing misleading empty data.

**Why did my run return zero records?**

Check the USDOT digits and try a shorter company-name fragment. Remove `states` or disable `activeOnly` if those filters exclude the record.

**Why is `authorities` empty?**

Not every census entity has a matching visible Motus authority row. It can also mean authority enrichment was disabled.

**Why is a safety count zero?**

No matching public event may exist inside the selected lookback. Zero is different from `safetySummary: null`, which means enrichment was disabled.

### Responsible use and legality

FMCSA publishes these records for public safety and registration access. Use them responsibly, follow applicable laws and contractual duties, and verify consequential decisions against the linked official record. Do not use public contact information for harassment, unlawful discrimination, or unsolicited messaging that violates applicable rules.

This Actor is an independent automation tool and is not affiliated with or endorsed by FMCSA or the U.S. Department of Transportation.

### Related automation-lab Actors

For event-level analysis rather than one carrier snapshot, use [FMCSA Inspections, Violations & Crashes Scraper](https://apify.com/automation-lab/fmcsa-inspections-violations-crashes-scraper). It exports individual inspection, violation, citation, and crash records and complements this carrier-level qualification Actor.

### FAQ

**Can I search by MC number?**

Not in this release. Search by USDOT number or company name, then inspect the returned authority docket numbers.

**Can I submit 100 carriers at once?**

Yes. Set `maxItems` up to 100. Split larger portfolios across Tasks so retries and monitoring remain easy to audit.

**Does this Actor send change alerts?**

No. Schedule recurring runs and connect the dataset to your preferred database or automation to compare snapshots.

**Do I need a proxy or FMCSA key?**

No. The selected official structured data route works anonymously. An optional Socrata app token can raise source quota.

**Are the safety totals a compliance verdict?**

No. They are source counts for the selected period. Review the underlying official record and apply your organization's own qualified decision process.

# Actor input Schema

## `usdotNumbers` (type: `array`):

Exact USDOT numbers to look up. Numbers and numeric strings are accepted.

## `companyNames` (type: `array`):

Case-insensitive legal-name or DBA fragments, such as a carrier name used for qualification.

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

Optional two-letter US state filters applied to both exact and company-name lookups.

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

Return only carriers whose FMCSA census status is active.

## `includeAuthority` (type: `boolean`):

Join current FMCSA Motus authority status and visible insurance filing fields for each carrier.

## `includeSafetySummary` (type: `boolean`):

Aggregate official inspection, violation, out-of-service, crash, injury, and fatality counts for each carrier.

## `safetyLookbackMonths` (type: `integer`):

Number of calendar months included in inspection and crash aggregates.

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

Maximum number of carrier records saved to the default dataset.

## `appToken` (type: `string`):

Optional data.transportation.gov app token for higher API quota. The Actor works anonymously by default.

## Actor input object example

```json
{
  "usdotNumbers": [
    "21800"
  ],
  "companyNames": [],
  "states": [],
  "activeOnly": false,
  "includeAuthority": true,
  "includeSafetySummary": true,
  "safetyLookbackMonths": 24,
  "maxItems": 10
}
```

# Actor output Schema

## `overview` (type: `string`):

Default dataset containing carrier identity, status, fleet, authority, safety, and source fields.

# 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 = {
    "usdotNumbers": [
        "21800"
    ],
    "companyNames": [],
    "states": [],
    "activeOnly": false,
    "includeAuthority": true,
    "includeSafetySummary": true,
    "safetyLookbackMonths": 24,
    "maxItems": 10
};

// Run the Actor and wait for it to finish
const run = await client.actor("automation-lab/fmcsa-safer-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 = {
    "usdotNumbers": ["21800"],
    "companyNames": [],
    "states": [],
    "activeOnly": False,
    "includeAuthority": True,
    "includeSafetySummary": True,
    "safetyLookbackMonths": 24,
    "maxItems": 10,
}

# Run the Actor and wait for it to finish
run = client.actor("automation-lab/fmcsa-safer-carrier-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 '{
  "usdotNumbers": [
    "21800"
  ],
  "companyNames": [],
  "states": [],
  "activeOnly": false,
  "includeAuthority": true,
  "includeSafetySummary": true,
  "safetyLookbackMonths": 24,
  "maxItems": 10
}' |
apify call automation-lab/fmcsa-safer-carrier-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/1VStCzzcIt2beHHxf/builds/rmcFwGW7aclxhtPpb/openapi.json
