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

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.