Fmcsa Usdot Trucking Fleet Scraper
Pricing
from $3.00 / 1,000 carrier enricheds
Fmcsa Usdot Trucking Fleet Scraper
Enrich USDOT numbers and ranges with public FMCSA SAFER and SMS records. Extract truck and driver counts, operating status, cargo types and published registration contacts. Filter fleets and export data for logistics research and prospecting.
Pricing
from $3.00 / 1,000 carrier enricheds
Rating
0.0
(0)
Developer
Arezdev
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
a day ago
Last modified
Categories
Share
Turn USDOT numbers into official fleet profiles with truck counts, registration contacts, cargo types, and source links.
Enrich trucking companies and freight brokers using the FMCSA SAFER Company Snapshot and public SMS Carrier Registration pages. Supply a list, scan an inclusive USDOT range, or combine both. Matching fleets go directly into an exportable Apify Dataset.
Best for fleet segmentation and USDOT record enrichment. Each successful row is a carrier or broker. Set the minimum power units to zero to include brokers; emails depend on the public registration page and may be unavailable.
How to use
- Enter your USDOT numbers or provide both range endpoints.
- Set the minimum fleet size. Use
minPowerUnits: 0to include brokers and companies without reported power units. - Enable Only active carriers when you need active USDOT registrations.
- Run the Actor and download the Dataset as JSON, CSV, Excel, or through the Apify API.
The input form includes one carrier number that returned a public record during review. These are live federal records: some may be inactive or excluded by the default fleet-size filter. Source availability and sample completion within five seconds cannot be guaranteed. Use your own known carrier numbers for a representative enrichment run.
{"usdotNumbers": ["3000005"],"minPowerUnits": 0,"onlyActiveCarriers": false,"maxConcurrency": 15,"timeoutSecs": 15,"proxyConfiguration": { "useApifyProxy": false }}
For discovery, use an inclusive range. It is generated incrementally without allocating an array for the range:
{"scanRangeStart": 3000000,"scanRangeEnd": 3000100,"minPowerUnits": 5,"onlyActiveCarriers": true}
Duplicate numbers, including overlaps between the list and range, are processed once. USDOT numbers must be positive strings of 1 to 10 digits; leading zeros are normalized. A supplied range must contain both endpoints.
What data can you extract?
| Fields | Source and meaning |
|---|---|
usdotNumber, saferUrl, scrapedAt | Normalized USDOT identifier, official snapshot link, UTC extraction timestamp |
legalName, dbaName, entityType | Official legal name, trading name, and carrier or broker entity type |
mcNumber | Reported MC, MX, or FF docket identifiers, kept together in one string |
operatingStatus | USDOT registration status when present; legacy operating status or authority status otherwise |
powerUnitsCount, driversCount, fleetSizeTier | Reported fleet and driver counts, plus a fleet-size category |
phone, physicalAddress, city, state, zipCode, mailingAddress | Public SAFER contact and address fields |
email, cellPhone, fax, companyOfficers | Public SMS registration contact information, when exposed |
mcs150Date, mcs150Mileage | MCS-150 filing date in YYYY-MM-DD format and reported mileage, excluding the mileage year |
cargoTypes | Cargo categories marked as carried in SAFER |
status, errorMessage | SUCCESS or ERROR, with a safe error message for failed snapshots |
Missing scalar values are null; missing cargo and officer lists are empty arrays. Fax is included as an additional flat field. Fleet counts of zero remain zero. Contacts are extracted from registration fields; emails are never guessed or taken from FMCSA help links.
| Fleet size | fleetSizeTier |
|---|---|
| Not reported | UNKNOWN |
| 0 power units | NO_POWER_UNITS |
| 1 power unit | OWNER_OPERATOR |
| 2-10 power units | SMALL |
| 11-50 power units | MEDIUM |
| 51-500 power units | LARGE |
| 501 or more power units | ENTERPRISE |
Input settings
| Setting | Default | Behavior |
|---|---|---|
usdotNumbers | One-number form prefill | Specific positive USDOT identifiers |
scanRangeStart | Optional | First number, inclusive, from 1 to 9,999,999,999 |
scanRangeEnd | Optional | Last number, inclusive; must be at least the start |
minPowerUnits | 1 | Successful rows must meet this fleet threshold; 0 includes zero or unreported fleets |
onlyActiveCarriers | false | Excludes successful records with inactive, out-of-service, or unknown status |
maxConcurrency | 15 | Upper bound of 1-50 simultaneous carriers; reduced when needed for memory limits |
timeoutSecs | 15 | Total deadline of 3-60 seconds per source, including DNS, redirects, and fallback attempts |
proxyConfiguration | Automatic direct-first mode | Optional explicit direct, Apify Proxy, or custom proxy settings |
Each carrier starts two parallel source requests. At the default 256 MB allocation, concurrency is capped at 16 carriers for memory headroom; the requested default remains 15. Higher allocations can use all 50 requested workers.
Automatic proxy behavior starts with a direct connection. HTTP 403, 429, or 503 can trigger an Apify datacenter attempt using SHADER, followed by the default datacenter pool when needed. A configured final pool, including residential proxies, is attempted only when you explicitly set useApifyProxy: true. Selecting residential does not replace the initial direct and datacenter attempts.
useApifyProxy: false forces direct connections. Custom proxyUrls are used exclusively and must point to public HTTP or HTTPS proxies. Proxy connections use pinned destination IPs through CONNECT, preserve the source hostname for TLS and HTTP, and use HTTP/1.1. Proxy traffic can incur separate Apify or provider charges.
Output example
This is an illustrative record with fictional company and contact values, rather than a claim about the current owner of this USDOT number.
{"usdotNumber": "3000005","status": "SUCCESS","mcNumber": "MC-123456","legalName": "EXAMPLE CARRIER LLC","dbaName": "EXAMPLE FREIGHT","entityType": "CARRIER","operatingStatus": "ACTIVE","powerUnitsCount": 12,"driversCount": 14,"fleetSizeTier": "MEDIUM","phone": "+1 (817) 555-0100","cellPhone": "+1 (817) 555-0101","email": "dispatch@example.com","fax": "(817) 555-0102","companyOfficers": ["JANE EXAMPLE"],"physicalAddress": "123 EXAMPLE ROAD, FORT WORTH, TX 76101","city": "FORT WORTH","state": "TX","zipCode": "76101","mailingAddress": "PO BOX 100 FORT WORTH, TX 76101","mcs150Date": "2026-09-20","mcs150Mileage": 1234567,"cargoTypes": ["General Freight", "Refrigerated Food"],"saferUrl": "https://safer.fmcsa.dot.gov/query.asp?searchtype=ANY&query_type=queryCarrierSnapshot&query_param=USDOT&query_string=3000005","scrapedAt": "2026-10-19T12:00:00.000Z","errorMessage": null}
Use the results in Clay, n8n, Make, or your API
- Clay: Import the Dataset CSV, match companies by USDOT number, and map fleet size, state, phone, and registration email to enrichment columns.
- n8n: Start an Actor run with the Apify node, wait for completion, read the default Dataset, and route
SUCCESSandERRORrecords separately. - Make: Use an Apify run-completed trigger, fetch Dataset items, and map matching fleets into your CRM or spreadsheet.
- API: Use an authenticated Apify API client to start the Actor and retrieve its default Dataset. Select successful rows before sending contacts to downstream workflows.
The Apify Dataset API supports structured exports. Store API authentication in your integration's secure connection settings.
Pricing and limits
The custom pay-per-event name is carrier-enriched. One saved SUCCESS record consumes one event when that event is configured in Apify pricing. Fleet filters run before Dataset insertion and charging.
ERROR rows cost $0 in carrier-enriched event fees. They remain visible in the Dataset and are saved without a custom charge event. Filtered-out successful fleets consume no event fees and are not saved. A successful SAFER snapshot can still be chargeable when SMS is unavailable and email or other registration fields are null.
For a concrete example, at an illustrative event price of $0.002 per matching carrier, 1,000 saved successful carriers cost $2.00 in event fees; 100 additional ERROR rows add $0.00 in event fees. This example does not establish a published price. Check the Actor's current Store pricing; platform compute, storage, and proxy charges may apply separately.
On Apify, non-paying users can save 25 total rows per run, counting both successful and failed records. Paid plans and local runs do not have this Actor-specific row cap. The configured event charge limit still applies. When either cap is reached, new work stops, buffered rows are flushed, and the Actor exits cleanly.
The Actor uses 256 MB by default, with a default run timeout of 3,600 seconds. Repeated source errors do not crash the run. Invalid input fails validation before target requests and exits with code 1. A storage failure stops extraction safely and is reported in the final status; inspect the Dataset before retrying to avoid duplicate records.
FAQ and troubleshooting
Why are there no matching rows?
The default minimum is one power unit. Brokers often report zero trucks. Set minPowerUnits: 0 to inspect these records, or provide USDOT numbers for known motor carriers. A missing power-unit count does not satisfy a positive fleet threshold.
Why is the email missing?
The Actor returns public SMS registration fields only when the page exposes them. A timeout, access restriction, blank field, or unrecognized contact layout leaves the corresponding value null. A valid SAFER snapshot is retained. Warnings include the source domain, USDOT identifier, and safe failure code. No sign-in bypass is attempted.
What does active mean?
The filter primarily follows the snapshot's USDOT registration status. It does not independently verify operating authority, insurance, or safety fitness. Review the official source before making a carrier eligibility decision.
How are inactive or missing snapshots handled?
A SAFER inactive-record page, a missing record, an identifier mismatch, an access page, or a failed SAFER request produces an ERROR row without a custom event fee. Errors remain visible even when fleet filters are enabled.
What happens after a source block or timeout?
Direct requests are bounded by the source timeout. The proxy cascade can help with HTTP 403, 429, and 503. Lower concurrency if the source throttles requests. When the platform supplies no Apify proxy password, automatic datacenter fallback is unavailable; direct mode and custom proxies continue to work.
Can a partial HTML response be used?
HTML is streamed and capped at 4 MB after decompression. A larger response is truncated. A timed-out or reset 2xx response can be salvaged after at least 16 KiB has arrived. A row becomes successful only if a matching carrier identity was actually parsed. Partial responses are reported in run warnings; missing fields remain null.
Are exports safe to open in a spreadsheet?
Strings have null bytes removed and spreadsheet formula prefixes escaped. Valid phone fields keep their international + prefix. Counts remain numeric, and source HTML is never executed.
Development and deployment
Requires Node.js 22 or newer. This repository uses TypeScript strict mode, the Apify SDK, got-scraping, and a streaming htmlparser2 parser. All target requests use direct HTTP clients.
npm cinpm run buildnpm testnpm run smokenpm start
npm test compiles the tests and runs Node's built-in test runner. Tests are offline and cover SSRF, DNS pinning, redirect checks, HTTP protocol fallback, proxy selection, partial-stream salvage, parser layouts, filters, concurrent batching, event budgets, and the free-plan cap. npm run smoke performs live direct requests for three representative USDOT numbers, including unavailable records and reports source availability and peak process memory. Build before running the smoke check. Source blocks can make a live smoke check fail even when the offline suite passes.
For a local Actor run, place the input JSON at storage/key_value_stores/default/INPUT.json before npm start. Local output is stored under storage/datasets/default. The start, test, and smoke runners set UV_THREADPOOL_SIZE=64, NODE_ENV=production, and certificate verification before spawning their Node process. No environment file is required.
The Dockerfile uses a Node 22 Alpine multi-stage build, a locked production dependency tree, and the non-root node user. Build from this repository root:
docker build -t fmcsa-usdot-trucking-fleet-scraper .
Deploy with Apify CLI or connect this directory as the Actor source. The manifest includes default memory and run timeout metadata; verify those defaults in Console for your chosen deployment method. Select Limited permissions in the Actor settings. The Actor uses the platform's paying-user flag and run charging manager; it never retrieves the user account profile. Proxy initialization requires a platform-supplied proxy password or explicit custom proxies and skips account/status probes.
Configure the carrier-enriched event and its price in Apify Console before publishing a paid Actor. Keep the automatic apify-default-dataset-item event free: the Actor refuses a positive automatic dataset-item fee so failed rows cannot be charged implicitly. Pricing activation and platform permission settings are deployment operations, rather than effects of building the local repository.
Official source references: SAFER, FMCSA SMS, and Apify charging manager.
Repository initialized by Arezgit.