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. UsedateFromanddateTofor an exact range. -
states: two-letter codes such as["TX", "FL"]. -
entityType:all,for-hire,private,exempt,with-mc(has an MC docket) orhazmat. -
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
nullwhen the carrier didn't report them. -
authorityis oftennullfor 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.
- In Apify Console, open Schedules and click Create new.
- Set the cron expression. For example,
0 7 * * *runs it every morning at 7:00. - Add the Actor (FMCSA New Trucking Companies) and paste the same input JSON you used above.
- 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.
