Disclosure: I'm Ben, and I built the Apify Actor mentioned later in this post. I charge per result for it. The tutorial part uses only free public data.
Freight insurance agents, factoring companies, ELD and fuel-card sellers, and brokers looking for capacity all need the same thing: a list of trucking companies with a phone number and fleet size. People pay for those lists, but the source behind most of them is free. Every US interstate carrier files an MCS-150 with FMCSA, and US DOT publishes the result as open data, refreshed daily.
Here's how to query it yourself, and what tripped me up.
The datasets
All on data.transportation.gov (Socrata), no key needed for light use:
-
Company Census File (
az4n-8mr2): one row per USDOT number, with legal name, address, phone, email (if filed), power units, drivers, cargo, operation type and status. -
L&I "Carrier – All With History" (
6eyk-hxee): MC dockets, authority and insurance. -
L&I "AuthHist – All With History" (
9mw4-x3tu): authority grants, revocations and reinstatements.
Step 1: A SoQL query
Small Dallas carriers (5–50 power units), active, with an email on file:
curl -s -G "https://data.transportation.gov/resource/az4n-8mr2.json" \
--data-urlencode "\$select=dot_number,legal_name,phone,email_address,power_units,total_drivers" \
--data-urlencode "\$where=phy_state='TX' AND phy_city='DALLAS' AND status_code='A' AND power_units ::number BETWEEN 5 AND 50 AND email_address IS NOT NULL" \
--data-urlencode "\$order=dot_number" \
--data-urlencode "\$limit=5"
Run on 25 Oct 2026 (emails left out here):
| dot_number | legal_name | phone | power_units | total_drivers |
|---|---|---|---|---|
| 58702 | ECOBAT LOGISTICS US INC | 2145830296 | 46 | 20 |
| 59903 | BISHOP INTERNATIONAL INC | 2144266449 | 10 | 6 |
| 60111 | DAVIS-HAWN LUMBER COMPANY | 2149460734 | 8 | 5 |
| 109485 | TEXAS INSTRUMENTS INCORPORATED | 2145674884 | 11 | 4 |
| 164404 | WALNUT HILL WRECKER SERVICEINC | 9726202160 | 17 | 14 |
Step 2: The pitfalls
Numbers are stored as text. My first version used power_units BETWEEN 5 AND 50 and Socrata rejected it with a type mismatch. You need the ::number cast. Without a cast, a comparison like > on a text column runs as a string comparison, so "9" > "50" is true.
Cities are free text, uppercase. phy_city='DALLAS' works, but a filer who typed a suburb or a typo won't match. For full coverage, filter by ZIP prefix (phy_zip like '752%') as well as city.
"Active" isn't one thing. status_code='A' is the USDOT status. Whether a company can legally haul freight for hire is a separate question, the operating authority (MC number), and that lives in the L&I datasets. The census also has private fleets: Texas Instruments and a lumber company are in my list because they run their own trucks. If you're selling to for-hire carriers, filter on the classification and join authority status.
The join is the slow part. Authority history is per docket, with multiple grant, revocation and reinstatement rows. You have to fetch the dockets for your candidate USDOT numbers and work out the current state. My Actor's test run (below) used the same city and fleet filters plus "active authority", and it left out Bishop International and Davis-Hawn Lumber, which my raw query includes. So the census alone and census + authority give different lists.
Formatting. Phones come back as raw digits, and names like SERVICEINC are as filed. Email exists only when the company put one on its MCS-150.
Step 3: Or use the packaged version
I packaged this as an Apify Actor, FMCSA Carrier Leads – Trucking Companies & Freight Brokers List. It builds the SoQL for you, joins the census with both L&I datasets, and returns one clean row per company.
Run-ready link: open it in Apify Console with an example input already filled in ({"states": ["TX"], "cities": ["Dallas, TX"], "maxItems": 25}). Click Start, or change the input first.
{"states":["TX"],"cities":["Dallas, TX"],"entityType":"carrier","minPowerUnits":5,"maxPowerUnits":50,"authorityStatus":"active","requireEmail":true,"maxItems":10}
Filters: states, cities, ZIP prefixes, USDOT or MC numbers, name contains, entity type (carrier, broker, both, freight forwarder, shipper), operation type, classification (for-hire, private…), USDOT status, authority status, power units and driver ranges, cargo types, hazmat, safety rating, USDOT add date, and "only with email".
That input ran on Apify on 22 Oct 2026 and returned 10 carriers. A few rows (emails omitted):
| USDOT | MC | Legal name | Phone | Power units | Safety rating | First authority |
|---|---|---|---|---|---|---|
| 58702 | MC1250042 | ECOBAT LOGISTICS US INC | (214) 583-0296 | 46 | Satisfactory | 2021-06-10 |
| 164404 | MC142549 | WALNUT HILL WRECKER SERVICEINC | (972) 620-2160 | 17 | Satisfactory | 1978-01-25 |
| 275346 | MC193564 | JACK KEY AUTO TRANSPORT INC | (972) 557-8210 | 15 | Satisfactory | 1990-12-21 |
Each record has formatted phones, the full address, company officers, fleet and driver counts, MCS-150 mileage, cargo types, safety rating and review dates, common/contract/broker authority, pending and revocation flags, BIPD insurance on file vs required, and the authority history. For Ecobat, the history shows the authority revoked on 2022-12-19 and reinstated on 2022-12-23, the kind of detail that matters if you're vetting. Every record also links to the SAFER snapshot. A SUMMARY record shows records scanned, API calls and the exact SoQL filter used, so you can reproduce it.
Recipes
- New carriers for insurance/factoring: USDOT added in the last 90 days, for-hire, 1–10 power units, your states, with email. Schedule it weekly.
- Capacity sourcing: cargo type "Refrigerated Food", 5–50 power units, Satisfactory rating, active authority.
- Broker list: entity type broker, active broker authority, by state.
Limits, honestly
-
It's only as good as the MCS-150. Small carriers often file infrequently, so phones, emails and fleet sizes can be stale. Each record has
mcs150Dateso you can judge. - Email is often missing. "Only with email" shrinks lists a lot.
- The authority filter is slow because it runs after the census query. Narrow by state, city or fleet size for big searches.
- No inspection or crash detail (SMS/CSA scores). Only the safety rating and review dates from the census.
- Compliance is on you. It's public government data, but TCPA and CAN-SPAM still apply when you call or email.
What it costs
$0.002 per company saved ($2 per 1,000). No start fee, and the run stops cleanly at your maximum charge. The 10-row test cost 2 cents. For a one-off pull of one city, the curl above is free.
If you work in freight: what do you actually filter on when you build a carrier list? Fleet size, cargo, authority age? I'd like to know which filters matter in practice, so tell me in the comments.
Top comments (0)