Every working day FMCSA grants operating authority to a couple of hundred new carriers and brokers. Each one needs insurance on file before the authority goes active, and most need factoring, an ELD, fuel cards and a dispatcher in their first weeks. On the other side of the market, brokers need to check before every load that a carrier's authority is active, that insurance is on file and that there is no out-of-service order.
All of that is public, but it is spread across FMCSA's company census, operating-authority history and out-of-service orders, and since FMCSA moved registrations to its new Motus system the authority data sits in different datasets than older guides describe. The FMCSA API joins them into one record per carrier, updated daily. This post builds a new-authority lead feed and a carrier check in Python.
Disclosure: I'm Aurelix, and I built the FMCSA API tool. It's a paid tool (prices below).
What each record holds
-
dot_number,legal_name,dba_name,docket_numbers(MC/MX/FF),status,entity_types(carrier, broker, shipper...),carrier_operation. - Contacts as FMCSA publishes them:
physical_address,mailing_address,phone,cell_phone,email,company_officer_1and_2. - Fleet:
power_units, trucks, tractors and trailers owned or leased,total_drivers,cdl_drivers,cargo_types,hazmat. -
authorities: each docket's authority type and status, with BIPD insurance required and on file, and cargo insurance and bond required and on file. -
out_of_servicewith date and reason,safety_rating,mcs150_date, andsafer_urlfor the SAFER snapshot. - In the authority feed:
event(granted, applied, suspended, reinstated...),event_dateand FMCSA'sevent_reason.
Carriers whose authority was granted yesterday
pip install apify-client
import csv
import os
from apify_client import ApifyClient
client = ApifyClient(os.environ["APIFY_TOKEN"])
run = client.actor("aurelix/fmcsa-carrier-api").call(
run_input={
"feed": "authority_events",
"authorityEvents": ["granted"],
"authorityTypes": ["property"],
"states": ["TX", "OK", "LA"],
"daysBack": 2,
"incremental": True,
"stateKey": "south-granted",
}
)
rows = list(client.dataset(run["defaultDatasetId"]).iterate_items())
with open("new_authority.csv", "w", newline="", encoding="utf-8") as f:
w = csv.writer(f)
w.writerow(["event_date", "dot", "name", "phone", "email", "city", "state", "power_units", "bipd_on_file"])
for r in rows:
bipd = max((a["bipd_insurance_on_file_usd"] or 0 for a in r["authorities"]), default=0)
w.writerow([r["event_date"], r["dot_number"], r["legal_name"], r["phone"], r["email"],
r["physical_city"], r["physical_state"], r["power_units"], bipd])
print(len(rows), "new authorities")
With incremental on, the first run returns every grant in the window (up to maxResults, 200 by default). Each later run with the same stateKey skips grants it has already returned, so a daily schedule pays only for new ones. bipd_on_file shows who already has liability cover on file, which is the first thing an insurance agent wants to know.
Other events are worth watching too:
-
Applied (
"authorityEvents": ["applied"]): carriers whose application is pending, before the grant. Very new applicants may not be in FMCSA's census yet; their record then takes the name, address and phone from the authority file (in_censusis false). - Suspended and reinstated: carriers whose insurance lapsed or came back, for compliance teams and load boards.
-
New USDOT registrations (
"feed": "new_registrations"): everyone who got a USDOT number, including private fleets and shippers, with filters for cargo, power units and drivers.
Vetting a carrier before you book
run = client.actor("aurelix/fmcsa-carrier-api").call(
run_input={"dotNumbers": ["53467"], "mcNumbers": ["MC-133655"]}
)
for r in client.dataset(run["defaultDatasetId"]).iterate_items():
active = [a for a in r["authorities"] if a["status"] == "Active"]
print(r["legal_name"], "| active authorities:", len(active),
"| BIPD on file:", max((a["bipd_insurance_on_file_usd"] or 0) for a in active) if active else 0,
"| out of service:", r["out_of_service"], "| rating:", r["safety_rating"])
USDOT numbers can carry a USDOT prefix, leading zeros or come as SAFER links, and MC numbers can be written as MC-138328 or just 138328. A number FMCSA doesn't know is named in the run's status and not charged.
One detail if you compare with SAFER: power_units is the census figure FMCSA publishes in its open data, while SAFER's snapshot shows trucks plus buses (truck_units + bus_units here). On small fleets the two can differ by one or two.
Why this tool
- Authority events by the day they happened: grants, applications, suspensions, reinstatements and more.
- Insurance amounts required and on file per authority.
- New registrations by date, plus USDOT, MC and name lookup.
- Cargo and entity-type filters, and an only-new mode.
- $1.00 per 1,000 records ($0.80 on paid plans).
- What it doesn't cover: insurer names, policy numbers and a lead score.
If you sell to companies outside trucking that just started, Companies House Scraper does the same for new UK companies.
Limits
- US FMCSA data only. No inspection, crash or CSA scores, and no insurer or policy number.
- New applicants lag. Their census fields (fleet, cargo, email) can fill in a day or two later.
- Motus era only for authority events. Older authority history isn't in the feed.
- Contact details are as FMCSA publishes them. Many small carriers are owner-operators; follow telemarketing and email rules when you reach out.
Cost
You pay per record returned plus a small start fee. Records outside your filters, unknown numbers and records an earlier run already returned are free. The current prices are on the Store page; Apify's free plan includes $5 of credit a month, about 4,900 records.
Top comments (0)