If you sell to trucking companies, timing is everything. A carrier that just got its USDOT number needs insurance, a factoring partner, an ELD, fuel cards, a dispatcher and compliance help, and it usually picks vendors in its first few weeks. The companies that reach new carriers first tend to get the business.

This guide shows how to get a fresh list of new FMCSA registrations every day using the FMCSA New Trucking Companies Actor on Apify.

The problem

FMCSA publishes everything you need as public data, but it's spread across several datasets:

  • The Company Census lists each USDOT registration with its add date, contact details, address and fleet size.
  • Operating authority data (MC, FF and MX dockets, status and insurance on file) lives in separate datasets.

To build one useful lead list you have to filter by date, join the datasets on the USDOT number, and clean up the fields.

The manual way (and why it hurts)

You can look carriers up one at a time on FMCSA's SAFER site, but that only works if you already know the DOT number. You can also download the open datasets from data.transportation.gov, but they're large, the column names are cryptic, and joining census data with authority history in a spreadsheet is tedious. Then you'd have to do it again tomorrow, because new carriers register every day.

Step 1: Configure the Actor

Open the Actor page and click Try for free. The defaults return results with one click:

{ "daysBack": 7, "entityType": "all", "onlyWithEmail": false, "onlyActive": true, "includeAuthority": true, "maxItems": 100 } 

Useful options:

  • daysBack: carriers added in the last N days. Use dateFrom and dateTo for an exact range.
  • states: two-letter codes such as ["TX", "FL"].
  • entityType: all, for-hire, private, exempt, with-mc (has an MC docket) or hazmat.
  • onlyWithEmail: keep only carriers that listed an email on their MCS-150 filing.
  • onlyActive: only active USDOT status.
  • includeAuthority: add authority status, insurance and history.

Step 2: Read the output

Here are a few columns from a real run:

dotNumber mcNumber legalName state entityType powerUnits dateAdded
4803982 MC60564415 OYAMO HOLDINGS LLC CA AUTHORIZED FOR HIRE 2 2026-10-27
5120409 MC58565412 TTWFO LLC TX AUTHORIZED FOR HIRE 1 2026-10-27
5201529 MC94631113 HIGHLAND CREST TRANSPORT CORP CA AUTHORIZED FOR HIRE 1 2026-10-27

Full records also include phone, email, officer names, physical and mailing address, trucks, drivers, cargo types, operation type, an FMCSA snapshot link, and an authority list showing docket status, minimum coverage and whether BIPD, cargo insurance or a bond is on file.

Some things to keep in mind:

  • Results are sorted newest first, and the most recent add date is usually yesterday.
  • Fields are null when the carrier didn't report them.
  • authority is often null for brand-new or intrastate-only carriers that haven't applied for operating authority.

A carrier with authority status Pending and no insurance on file is usually a good fit for insurance agents.

Step 3: Schedule it

A one-off export is useful, but the real value is getting new records on a timetable without thinking about it.

  1. In Apify Console, open Schedules and click Create new.
  2. Set the cron expression. For example, 0 7 * * * runs it every morning at 7:00.
  3. Add the Actor (FMCSA New Trucking Companies) and paste the same input JSON you used above.
  4. Optional: under the Actor's Integrations tab, connect Google Sheets, Slack, Zapier, Make or a webhook so each finished run lands where your team already works.

For a daily feed, set daysBack to 1 or 2 so each run only returns the newest carriers. Then send the results to a Google Sheet or your CRM.

Step 4: Run it from Python with apify-client

If you'd rather pull the data into your own scripts or CRM, use the official apify-client package (pip install apify-client). Grab your API token from Settings > API & Integrations in Apify Console and keep it in an environment variable rather than in code.

import os from apify_client import ApifyClient client = ApifyClient(os.environ["APIFY_TOKEN"]) run_input = { "daysBack": 1, "entityType": "all", "onlyWithEmail": True, "onlyActive": True, "includeAuthority": True, "maxItems": 100, "states": [ "TX", "FL" ] } run = client.actor("perskekits/fmcsa-new-carriers").call(run_input=run_input) for item in client.dataset(run["defaultDatasetId"]).iterate_items(): print(item.get("dotNumber"), item.get("legalName"), item.get("state"), item.get("entityType")) 

Each item is a plain dictionary, so you can de-duplicate on dotNumber and upsert straight into your CRM.

What it costs

The Actor uses Apify's pay-per-event pricing, so you pay for results, not for server time:

  • $0.005 per run start
  • $0.004 per carrier returned

For example, 100 carriers cost about $0.405, and 1,000 carriers cost about $4.00. Apify's free plan includes a small amount of monthly platform credit, which is enough to try small runs. Check the Actor's pricing tab for the current rates before you run anything large.

FAQ

How fresh is the data?
FMCSA refreshes the source datasets daily. The newest add date is usually the previous day.

Does it include email addresses?
Yes, when the carrier listed one on its MCS-150 filing. Use onlyWithEmail to keep only those.

Can I filter by state or carrier type?
Yes. Use states and entityType.

Where does the data come from?
Official FMCSA open data on data.transportation.gov: the Company Census plus the Motus carrier and authority history datasets.

Is it legal to use for outreach?
The data is public, but you're responsible for following CAN-SPAM, TCPA and any other rules that apply to how you contact people, including do-not-call rules for phone outreach.

Wrapping up

New carriers are an easy market to reach, as long as you hear about them first. Set up a daily schedule once and you'll have a list waiting every morning. Get started with the FMCSA New Carriers Actor.