Find Blue-Collar Jobs in the US with SimplyHired (2026)
Thirdwatch's SimplyHired Scraper returns US blue-collar job listings — drivers, warehouse, technicians, healthcare aides, retail — at $0.008 per record. Returns title, company, location, hourly or yearly salary, full description, and url per record. Built on the same Camoufox stealth-browser architecture as Monster and ZipRecruiter — purpose-built for US staffing agencies and blue-collar recruiters who need machine-readable hourly-rate-filterable candidate pools.
Why SimplyHired for US blue-collar hiring
US blue-collar labour markets are larger than the tech segment most job-board scrapers focus on. According to the Bureau of Labor Statistics' 2024 OEWS data, more than 60% of US employment is in occupations that pay primarily by the hour — truck drivers (3.5M), retail associates (4.6M), nursing assistants (1.4M), warehouse workers (1.7M), electricians (700K). For a staffing agency or US blue-collar recruiter, comprehensive coverage of these segments is the entire job-to-be-done. SimplyHired's mid-market and blue-collar bias makes it a stronger single source for these verticals than LinkedIn or product-tech boards.
The job-to-be-done is concrete. A regional staffing agency placing truck drivers in three southwestern states needs daily refreshed listings filtered to CDL-A roles paying $25/hr or more. A warehouse-temp staffing service wants every new fulfilment-centre opening within 50 miles of seven Texas metros. A nursing-staffing platform needs RN and LPN roles segmented by hospital chain. All of these reduce to the same data shape — search by keyword and metro, filter by hourly rate, route to Twilio or a CRM. The Thirdwatch actor handles the harder half (DataDome bypass + SPA rendering) and returns clean structured records.
How does this compare to the alternatives?
Three options for getting US blue-collar job data into a staffing pipeline:
| Approach | Cost per 1,000 jobs | Reliability | Setup time | Maintenance |
|---|---|---|---|---|
| Direct partnerships with each board | Free, but bilateral negotiation per board | High when configured | Months per board | You manage every relationship |
| Paid staffing-data feed (TextRecruit, Bullhorn job feed) | $5K–$50K/year flat | High | Days–weeks | Vendor lock-in |
| Thirdwatch SimplyHired Scraper | $8 ($0.008 × 1,000) | Production-tested, monopoly position on Apify | 5 minutes | Thirdwatch tracks SimplyHired changes |
Direct board partnerships are the gold standard for compliance-sensitive recruiters but take months per board. The SimplyHired Scraper actor page is the structured-data alternative for teams that want to start immediately and add direct relationships later.
How to find blue-collar US jobs in 4 steps
Step 1: How do I authenticate against Apify?
Sign in at apify.com (free tier, no credit card), open Settings → Integrations, and copy your personal API token. Every example below assumes the token is in APIFY_TOKEN:
export APIFY_TOKEN="apify_api_xxxxxxxxxxxxxxxx"
Step 2: How do I pull truck-driver and warehouse roles for a metro?
Pass blue-collar role queries and a target metro. Set maxResults to your daily refresh size.
import os, requests, pandas as pd
ACTOR = "thirdwatch~simplyhired-jobs-scraper"
TOKEN = os.environ["APIFY_TOKEN"]
resp = requests.post(
f"https://api.apify.com/v2/acts/{ACTOR}/run-sync-get-dataset-items",
params={"token": TOKEN},
json={
"queries": ["truck driver", "CDL-A driver", "delivery driver",
"warehouse associate", "forklift operator"],
"location": "Dallas, TX",
"maxResults": 300,
},
timeout=3600,
)
df = pd.DataFrame(resp.json())
print(f"{len(df)} listings across {df.company.nunique()} employers")
Five role keywords × 300 max results = up to 300 unique listings, costing $2.40 at FREE pricing.
Step 3: How do I filter by hourly rate and dedupe by URL?
For blue-collar staffing the salary_period filter is critical because hourly and yearly rates would otherwise be compared like-with-unlike.
HOURLY = df[
df.salary_min.notna()
& (df.salary_period == "hourly")
& (df.salary_min >= 22)
].drop_duplicates(subset=["url"]).sort_values("salary_max", ascending=False)
print(HOURLY[["title", "company", "location",
"salary_min", "salary_max", "url"]].head(25))
A $22/hour floor matches the median CDL-A rate in southern US metros as of early 2026. Tune per region — Texas runs lower than California for the same role.
Step 4: How do I route filtered candidates to a Twilio dialer?
Forward each new hourly-rate-qualified listing to a call-centre or auto-dialer for outreach.
import json, pathlib, requests as r
from twilio.rest import Client
snapshot = pathlib.Path("simplyhired-bluecollar-snapshot.json")
prev = set(json.loads(snapshot.read_text())) if snapshot.exists() else set()
current = set(HOURLY.url)
new_urls = current - prev
twilio = Client(os.environ["TWILIO_SID"], os.environ["TWILIO_TOKEN"])
for url in new_urls:
job = HOURLY[HOURLY.url == url].iloc[0]
print(f"NEW: {job.title} at {job.company} ({job.location}) — ${job.salary_min}/hr")
# Use Twilio Studio Flow to read the listing details to a recruiter on call
twilio.studio.v2.flows("FWxxx").executions.create(
to="+1XXXXXXXXXX",
from_="+1YYYYYYYYYY",
parameters={
"title": job.title, "company": job.company,
"location": job.location, "rate": str(job.salary_min),
"url": job.url,
},
)
snapshot.write_text(json.dumps(list(current)))
Wired to Apify's scheduler at 0 */6 * * *, this loop closes the staffing-pipeline gap from posting to outreach inside six hours.
Sample output
A single record from the dataset for one Dallas truck-driver role looks like this. Five rows weigh ~12 KB.
{
"title": "CDL-A Truck Driver",
"company": "J.B. Hunt Transport",
"location": "Dallas, TX",
"salary_text": "$24 - $32 an hour",
"salary_min": 24,
"salary_max": 32,
"salary_currency": "USD",
"salary_period": "hourly",
"description": "J.B. Hunt is hiring CDL-A drivers for regional routes in TX, OK, AR. Home daily, $1,500 sign-on bonus...",
"posted_date": "2026-04-22",
"source": "simplyhired",
"url": "https://www.simplyhired.com/job/abc456"
}
salary_period: "hourly" is the field that makes blue-collar workflows clean — yearly-vs-hourly mixing is the single most common bug in staffing pipelines and SimplyHired's explicit field eliminates it. posted_date is when SimplyHired indexed the listing; for staffing freshness, your downstream last_seen_at matters more than original posting date.
Common pitfalls
Three things go wrong in blue-collar staffing pipelines on SimplyHired data. Salary-period mixing — about 40% of SimplyHired blue-collar listings are hourly, the rest yearly or with no period set; aggregating without filtering produces nonsensical averages. Always filter on salary_period first. Sign-on-bonus inflation — many trucking and nursing listings advertise headline rates inclusive of bonus terms; the actor returns whatever the listing publishes, so cross-check against the description before treating the rate as base pay. Cross-board duplicates — SimplyHired re-publishes Indeed and Monster listings under SimplyHired URLs; for a staffing pipeline that already pulls those boards, dedupe by (title-norm, company-norm, location-norm, salary_min) before contacting candidates.
Thirdwatch's actor uses Camoufox + humanize for DataDome bypass — the same architecture proven 100% effective on Monster and ZipRecruiter. The 4096 MB max memory and 3,600-second timeout give comfortable headroom for 500-job runs. A fourth subtle issue worth flagging: many blue-collar listings include "no experience required" or training-program language that pulls in unqualified applicants when forwarded to a recruiter; build a downstream description-keyword filter (e.g. require "CDL-A" present in description for trucking roles) to keep the qualification gate intact. A fifth pattern unique to blue-collar SimplyHired data: roles posted by staffing agencies (rather than direct employers) often list the agency as company, which can mask which actual employer is hiring; treat agency-posted listings as a separate channel and consider deduping them out for direct-employer pipelines.
Related use cases
- Scrape SimplyHired jobs for an aggregator
- Track mid-market hiring via SimplyHired
- Build US jobs coverage with SimplyHired
- The complete guide to scraping job boards
- All Thirdwatch use-case guides
Frequently asked questions
Why is SimplyHired a strong source for blue-collar US jobs?
SimplyHired aggregates listings from employer career pages and partner boards across all US sectors, with deeper mid-market and blue-collar coverage than LinkedIn or product-focused boards. Truck driving, warehouse, technician, retail, and skilled-trade roles are over-represented relative to LinkedIn — exactly the segments staffing agencies and recruiters in those verticals need to cover.
How does hourly versus salaried compensation appear in the data?
salary_period distinguishes yearly, hourly, monthly. Blue-collar roles typically come back as hourly with salary_min and salary_max as integer hourly rates. To compare apples-to-apples with salaried roles, multiply hourly by 2,080 (40 hours × 52 weeks). Be aware that overtime norms vary by category — truck drivers and nurses often work 50+ hours, so straight 2,080 multiplier underestimates their realised earnings.
What blue-collar role families should I track?
Five role families cover most US blue-collar hiring: truck driver and CDL-A driver, warehouse associate and forklift operator, registered nurse and CNA, HVAC technician and electrician, retail associate and cashier. Each family has distinct geographic patterns and salary curves; track them separately rather than aggregating into one blue-collar bucket.
How fresh do blue-collar postings need to be?
Hourly cadence is overkill — blue-collar roles typically stay live 14-30 days. Daily refresh catches new postings within 24 hours, which is the standard for staffing pipelines. For the highest-velocity categories (truck driver, warehouse during peak season), six-hourly catches early-morning postings that rotate to fulfilment teams the same day.
Can I push hourly-rate filtered candidates straight to a phone-dialer?
Yes. The dataset returns title, company, location, salary fields, and url per record. Filter on salary_period == "hourly" and minimum hourly rate, then route to Twilio or your call-centre dialer. This is the canonical staffing-agency workflow for blue-collar placement, and the actor's structured output collapses the manual screening step from hours to seconds.
How do I dedupe SimplyHired blue-collar listings against direct employer postings?
Same approach as any cross-source dedupe: build a key from (title-normalised, company-normalised, location-normalised, hourly-rate). SimplyHired indexes both employer-direct listings and partner-board re-postings, so naive aggregation triples the count. The 4-tuple dedupe key catches 85-90% of duplicates and the rest are usually distinct legitimate listings.
Run the SimplyHired Scraper on Apify Store — pay-per-job, free to try, no credit card to test.