# FMCSA Biennial Update (MCS-150) Due & Overdue Carrier Leads (`intenal_builds/fmcsa-biennial-update-due-leads`) Actor

Trucking and bus companies whose FMCSA biennial update (MCS-150) is due this month or next, or already overdue, worked out from the official USDOT filing schedule and FMCSA's daily census. One row per carrier with deadline, last MCS-150 date, phone, email, address, fleet and authority. No API key.

- **URL**: https://apify.com/intenal_builds/fmcsa-biennial-update-due-leads.md
- **Developed by:** [Jaydan Eaton](https://apify.com/intenal_builds) (community)
- **Categories:** Lead generation, Business
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.00 / 1,000 carrier leads

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 Biennial Update (MCS-150) Due & Overdue Carrier Leads

Get **trucking and bus companies whose FMCSA biennial update (MCS-150) is due now, due next, or already overdue**. The actor works out each carrier's deadline from the official USDOT filing schedule and checks it against the last MCS-150 date in FMCSA's daily Company Census File. Each row is one carrier (USDOT number) with **deadline, days left, last MCS-150 date, phone, email, address, fleet size, drivers, cargo, operating authority and safety rating**. No API key, no login, no proxies.

Other FMCSA tools on the Store look up one carrier at a time or list new registrations. This one answers a different question: **which active carriers have to file their biennial update this month (or missed it)?** That is a fixed, predictable deadline every carrier faces, and a missed one leads to USDOT deactivation.

### The rule it uses

From FMCSA's "Updating Your Registration" page (49 CFR 390.19): every USDOT holder must update its MCS-150 every 24 months, even if nothing changed. Failure to file leads to deactivation of the USDOT number and may bring civil penalties of up to $1,000 per day, not to exceed $10,000.

- The **last digit** of the USDOT number sets the month: 1 = January ... 9 = September, 0 = October (due by the last day of that month).
- The **next-to-last digit** sets the year: odd = odd-numbered years, even = even-numbered years.

**Due** = active carrier, deadline in the month(s) you pick, and no MCS-150 dated in that deadline's calendar year yet.
**Overdue** = active carrier whose most recent deadline has passed with no MCS-150 dated in that deadline's calendar year or later.

This is a schedule check on public data, not legal advice. FMCSA has the final word on any carrier's status; the SAFER snapshot link is in every row.

### How big is it

Counts from FMCSA's census on 2026-10-22 (active carriers with a phone on file, INDIVIDUAL business type excluded, before the business-name check):

- Deadline **October 2026**: 80,043 carriers with no MCS-150 dated in 2026 yet
- Deadline **January 2027**: 96,355 carriers
- Deadline **February 2027**: 96,653 carriers
- **Overdue** candidates whose last MCS-150 is 2 to 3 years old: 709,032 rows before the per-carrier deadline check

The census is republished every day (latest MCS-150 dates on file were 2026-10-20 in that check).

### What you get per carrier

- USDOT number, legal and DBA name, **segment** (due / overdue), **biennial deadline**, **days until deadline**, next deadline, filing schedule (e.g. "October of even-numbered years")
- **Last MCS-150 date**, months since it, mileage and mileage year reported
- **Phone, fax, email**, physical and mailing address
- Business type, interstate/intrastate, classification (Authorized For Hire, Private Property, ...), hazmat flag
- Power units, trucks, buses, drivers, CDL drivers, cargo carried
- Operating authority dockets (MC/FF/MX) with status, safety rating and date, date the USDOT number was added, D-U-N-S number
- Link to the carrier's FMCSA SAFER snapshot

### Who uses it

- **DOT compliance and registration services** (biennial update, UCR, IFTA, permits): a call list of carriers with a deadline this month, every month
- **Truck insurance agents and MGAs**: carriers at a renewal-like checkpoint, and overdue carriers at risk of losing their USDOT number
- **ELD, fleet software and factoring companies**: active carriers by state, fleet size, cargo and authority
- **Freight brokers and shippers**: check your own carriers (USDOT watch list) before their numbers get deactivated

### Filters

Segments (due / overdue), number of upcoming deadline months or exact months (YYYY-MM), overdue look-back (max months since last MCS-150), skip carriers updated within N months, states, interstate / intrastate, for-hire only, has MC/FF/MX authority, hazmat only, passenger carriers only, cargo types, min/max power units, min drivers, phone or email required, USDOT watch list, sort (largest fleets first, oldest MCS-150 first, USDOT number), max results.

### Organization-level data only

Rows FMCSA marks with business type INDIVIDUAL are skipped, and by default so are carriers whose legal name has no business word (INC, LLC, CORP, TRUCKING, TRANSPORT, LOGISTICS, FARMS, SERVICES and similar), so person-named sole proprietors are left out. Officer names and cell phones are never returned. Obvious data-entry junk (for example 500,001 power units with 2 drivers) is dropped.

### Example input

```json
{
  "segments": ["due"],
  "nextDeadlines": 2,
  "states": ["TX", "OK", "LA"],
  "forHireOnly": true,
  "requireOperatingAuthority": true,
  "minPowerUnits": 1,
  "maxPowerUnits": 10,
  "requireEmail": true,
  "maxResults": 1000
}
```

### Example output (trimmed, from a real run on 2026-10-22; contact fields left out here)

```json
{
  "usdotNumber": "775300",
  "legalName": "DAVIS OIL INC",
  "segment": "due",
  "biennialDeadline": "2026-10-31",
  "daysUntilDeadline": 9,
  "filingSchedule": "October of even-numbered years",
  "lastMcs150Date": "2024-10-13",
  "city": "TAHLEQUAH",
  "state": "OK",
  "carrierOperation": "Interstate",
  "classification": ["Authorized For Hire"],
  "powerUnits": 10,
  "operatingAuthority": [{"docket": "MC650576", "status": "Active"}]
}
```

### Pricing

Pay per result: **$3 per 1,000 carriers** (`carrier-lead` event) plus a tiny actor-start fee. The run stops at **Max results** or when your **maximum charge per run** is reached, whichever comes first. Platform usage is small: a 100-row run reads one census page.

### Data source and limits

- FMCSA Company Census File, data.transportation.gov dataset `az4n-8mr2` (official, keyless Socrata API). The actor sends about one request per second, backs off on 429/5xx (honoring Retry-After) and identifies itself with a User-Agent.
- The schedule rule and penalty text come from FMCSA's "Updating Your Registration" page.
- Census status and MCS-150 dates can lag FMCSA's internal systems by a day or more. Always confirm on SAFER before acting.
- Not affiliated with or endorsed by FMCSA or the US DOT.

# Actor input Schema

## `segments` (type: `array`):

due = biennial deadline in the chosen month(s) and no MCS-150 filed in that deadline's calendar year yet. overdue = most recent deadline has passed with no MCS-150 dated in that year or later (USDOT deactivation risk).

## `nextDeadlines` (type: `integer`):

For the due segment: how many upcoming deadline months to include, starting with the current month. Deadlines only fall January to October, so November and December are skipped. Ignored when Deadline months is set.

## `deadlineMonths` (type: `array`):

For the due segment: exact deadline months, e.g. 2027-01. January to October only.

## `overdueMaxMonthsSinceUpdate` (type: `integer`):

For the overdue segment: only carriers whose last MCS-150 is at most this many months old (recent lapses, more likely still operating). 0 = no limit.

## `skipUpdatedWithinMonths` (type: `integer`):

Extra filter: drop carriers whose last MCS-150 is newer than N months. 0 = off.

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

Two-letter physical-address states, e.g. TX, OK. Empty = all.

## `carrierOperation` (type: `array`):

A = interstate, B = intrastate hazmat, C = intrastate non-hazmat. Empty = all.

## `forHireOnly` (type: `boolean`):

Only carriers classified as Authorized For Hire.

## `requireOperatingAuthority` (type: `boolean`):

Only carriers with an operating authority docket number.

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

Only carriers flagged as hazmat carriers.

## `passengerCarriersOnly` (type: `boolean`):

Carriers with buses or that haul passengers.

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

Any of: General Freight, Household Goods, Fresh Produce, Refrigerated Food, Livestock, Chemicals, Intermodal Containers, Motor Vehicles, Machinery/Large Objects, Oilfield Equipment, Grain/Feed/Hay, Building Materials, Logs/Poles/Beams/Lumber, Liquids/Gases, Passengers, US Mail, Beverages, Paper Products, Commodities Dry Bulk, Garbage/Refuse, Coal/Coke, Meat, Metal/Sheets/Coils/Rolls, Mobile Homes, Drive/Tow Away, Utilities, Agricultural/Farm Supplies, Construction, Water Well. Empty = all.

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

Minimum power units (tractors/trucks/buses).

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

Maximum power units. Use 1-10 to target small fleets.

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

Minimum total drivers.

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

Only carriers with a valid 10-digit phone on file.

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

Only carriers with an email on file.

## `excludeIndividuals` (type: `boolean`):

Skip rows FMCSA marks with business type INDIVIDUAL (organization-level leads only).

## `businessNamesOnly` (type: `boolean`):

Keep only carriers whose legal name contains a business word (INC, LLC, CORP, TRUCKING, TRANSPORT, LOGISTICS, FARMS, SERVICES, ...). Drops person-named sole proprietors so every row is an organization.

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

Only check these USDOT numbers (e.g. your own customers or carriers you broker loads to).

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

Order of results within each segment.

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

Stop after this many carriers. The run also stops when your max charge per run is reached.

## Actor input object example

```json
{
  "segments": [
    "due"
  ],
  "nextDeadlines": 1,
  "overdueMaxMonthsSinceUpdate": 36,
  "skipUpdatedWithinMonths": 0,
  "forHireOnly": false,
  "requireOperatingAuthority": false,
  "hazmatOnly": false,
  "passengerCarriersOnly": false,
  "requirePhone": true,
  "requireEmail": false,
  "excludeIndividuals": true,
  "businessNamesOnly": true,
  "sortBy": "fleet_size_desc",
  "maxResults": 100
}
```

# Actor output Schema

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

One item per carrier (USDOT number).

# 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 = {};

// Run the Actor and wait for it to finish
const run = await client.actor("intenal_builds/fmcsa-biennial-update-due-leads").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 = {}

# Run the Actor and wait for it to finish
run = client.actor("intenal_builds/fmcsa-biennial-update-due-leads").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 '{}' |
apify call intenal_builds/fmcsa-biennial-update-due-leads --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,intenal_builds/fmcsa-biennial-update-due-leads"
        }
    }
}
```

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/9ufa8psfmoc2PDGe2/builds/IhngW8ncb6QkzQJKs/openapi.json
