SimplyHired Jobs Scraper avatar

SimplyHired Jobs Scraper

Pricing

from $1.50 / 1,000 result (one job)s

Go to Apify Store
SimplyHired Jobs Scraper

SimplyHired Jobs Scraper

Turn SimplyHired into structured US hiring data. Structured salaries, real map coordinates, employer ratings, and full descriptions from any search URL — job type, min-pay, and recency filters included. Expired listings skipped automatically. JSON or CSV out, billed per result.

Pricing

from $1.50 / 1,000 result (one job)s

Rating

0.0

(0)

Developer

Muhamed Didovic

Muhamed Didovic

Maintained by Community

Actor stats

0

Bookmarked

17

Total users

16

Monthly active users

a day ago

Last modified

Categories

Share

Turn SimplyHired into structured US hiring data — with salary numbers and map coordinates on every row. Scrape every job from any SimplyHired search URL — title, employer (with star rating and logo), location with real lat/lng, structured salary (min/max/unit/currency), qualifications, benefits, job types, posted date, and the full HTML description — pulled from SimplyHired's own JSON data routes. JSON or CSV out, billed per result.

How it works

How SimplyHired Jobs Scraper works

✨ Why use this scraper?

  • Structured salary on most rowsmin/max/unit/currency parsed by SimplyHired itself, not regexed from text.
  • Real map coordinates — latitude/longitude on every located job, ready for radius filters and mapping.
  • Employer ratings — each job carries the company's SimplyHired star rating, logo, and company-page URL.
  • JSON data routes, not HTML scraping — fields come from the site's own framework payloads, so they don't break when the layout changes.
  • No proxy cost — the scraper's TLS fingerprinting passes SimplyHired's Cloudflare gate without residential proxies (a fallback is built in).
  • Expired listings skipped automatically — you're never billed for dead jobs; stale search results are detected at the detail step and dropped.

🎯 Use cases

WhoWhat they do with it
Recruitment agenciesMonitor open roles by metro, title, and pay band across the US
HR / comp & ben teamsBenchmark real posted salary ranges by title and city
Job aggregatorsIngest deduplicated structured postings with stable job keys
Market researchersTrack hiring volume and wage trends over time (fdb recency filters built in)
Sales / lead-gen teamsFind companies actively hiring — with optional contact-email enrichment
Data scientistsGeo-coded, salary-labelled job records for modelling

📥 Supported inputs

InputExampleWhat happens
Search URLhttps://www.simplyhired.com/search?q=nurse&l=Chicago%2C+ILWalks the full result set via cursor pagination
Search with filters/search?q=driver&l=Dallas%2C+TX&t=fulltime&fdb=7&mip=50000All filter params pass through (job type, days back, min pay, sort)
Remote search/search?q=developer&l=RemoteLocation accepts "Remote" like the site does
Direct job URL/job/{jobKey}Scraped as a single job
Keyword + location fieldskeyword: "accountant", location: "New York, NY"Used when Start URLs is empty

Not supported: company browse pages (/browse-jobs/companies/…) as start URLs, and features behind a SimplyHired/Indeed login.

🔄 How it works

  1. Bootstrap — one page fetch reads SimplyHired's __NEXT_DATA__ blob: the current buildId, locale, and page 1 of results come free.
  2. Stream the search data route — 20 jobs per page, cursor-based pagination; details start processing while later pages are still being fetched.
  3. Fetch each job's detail JSON — description HTML, structured salary, coordinates, qualifications, employer rating, dates, flags.
  4. Skip expired listings and duplicates, apply the optional recency filter.
  5. Push one merged row per job — capped exactly at maxItems. If the site deploys mid-run, the buildId is refreshed automatically.

⚙️ Input parameters

FieldTypeDefaultDescription
startUrlsarray["https://www.simplyhired.com/search?q=accountant&l=New+York%2C+NY"]Search and/or direct job URLs
keywordstringKeyword search; used when startUrls is empty
locationstringLocation (city/state, zip, or "Remote"); used when startUrls is empty
postedWithinDaysintegerSimplyHired's own 1/3/7/14-day filter; used when startUrls is empty
fetchJobDetailsbooleantrueFetch full detail per job (description, salary, coordinates, rating)
enrichEmailsbooleanfalseExperimental employer contact-email discovery
postedWithinHoursintegerFiner-grained recency filter on postedDate
maxItemsinteger1000Hard cap on jobs collected
maxConcurrencyinteger10Parallel detail requests
proxyobjectnoneUsually not needed — honoured as an explicit override only

📊 Output overview

Each dataset row is one job with everything merged inline: stable jobId (SimplyHired's job key), employer block (name, rating, logo, company-page URL), location with coordinates, structured + raw salary, qualifications and benefits chips, both description formats, ISO dates, and status flags (expired, sponsored, isIndeedApply). Fields the source doesn't provide are null — columns never disappear between rows.

📦 Output sample

{
"type": "job",
"source": "simplyhired",
"jobId": "DTze1mPz7QetYNmEDpKkcJUoFj3d69Qc-VA52lz7sK8h7076bnWzKQ",
"jobUrl": "https://www.simplyhired.com/job/DTze1mPz7QetYNmEDpKkcJUoFj3d69Qc-VA52lz7sK8h7076bnWzKQ",
"title": "Accountant-Hybrid Schedule",
"companyName": "Columbia University",
"companyRating": 4.1,
"companyProfileUrl": "https://www.simplyhired.com/browse-jobs/companies/Columbia-University",
"location": "Manhattanville, NY",
"addressLocality": "Manhattanville",
"addressRegion": "NY",
"coordinates": { "latitude": 40.81694, "longitude": -73.95583 },
"remote": false,
"salary": { "currency": "USD", "min": 72000, "max": 82000, "unit": "YEAR", "raw": "$72,000 - $82,000 a year" },
"salaryRaw": "$72,000 - $82,000 a year",
"employmentTypes": ["Full-time"],
"qualifications": ["Microsoft Excel", "Customer service", "Word embeddings", "Productivity software"],
"postedDate": "2026-04-30T05:00:00.000Z",
"description": "<div>…full HTML description…</div>",
"descriptionText": "Bachelor's degree in accounting, business or related field…",
"expired": false,
"sponsored": false,
"isIndeedApply": false,
"applyType": "internal",
"applyUrl": "https://www.simplyhired.com/job/DTze1mPz7QetYNmEDpKkcJUoFj3d69Qc-VA52lz7sK8h7076bnWzKQ",
"scrapedAt": "2026-07-12T03:48:55.180Z"
}

🗂 Key output fields

GroupFields
IdentityjobId (stable job key), jobUrl, title, normalizedTitle
EmployercompanyName, companyRating, companyProfileUrl, logoUrl
Locationlocation, addressLocality, addressRegion, coordinates.{latitude,longitude}, remote
Compensationsalary.{currency,min,max,unit,raw} (structured), salaryRaw
ClassificationemploymentTypes, workSettings, qualifications[], benefits[], requirements[] (search-card chips), skillTags[]
DatespostedDate, dateOnIndeed, closingDate (ISO-8601)
Contentdescription (HTML), descriptionText (plain), snippet
Flagsexpired, sponsored, isIndeedApply

❓ FAQ

Do I need a proxy? Usually not. The scraper's browser-grade TLS fingerprinting passes SimplyHired's Cloudflare check directly, and a residential fallback engages automatically on retries. A user-supplied proxy is honoured as an override.

Does it return the employer's direct apply link? No — SimplyHired routes applications through a session-bound redirect that can't be reliably resolved server-side. applyUrl is the canonical SimplyHired job page (one click from the real form), and isIndeedApply tells you when the job uses Indeed's apply flow. If a resolved ATS URL matters to you, check the eFinancialCareers actor pattern or email for a custom build.

Why did I get slightly fewer rows than maxItems? Search results can include listings that expired minutes ago. Those are detected at the detail step and skipped (logged as skipped in the run stats) rather than pushed as junk rows.

Can I filter by job type, minimum pay, or recency? Yes — either put the site's own params on your start URL (t=fulltime, mip=50000, fdb=7) or use the postedWithinDays / postedWithinHours inputs.

What happens when SimplyHired deploys a new site version mid-run? The data routes briefly 404; the scraper detects this, re-reads the new buildId, and continues — you'll see buildIdRefreshes in the stats.

💬 Support

🛠 Additional services

  • Custom output shape, additional fields, or one-off datasets: muhamed.didovic@gmail.com
  • Need a similar scraper for other job boards (eFinancialCareers, TotalJobs, CharityJob, s1jobs, etc.)? Drop an email.
  • For API access (no Apify fee, just a usage fee for the API): muhamed.didovic@gmail.com

🔎 Explore more scrapers

If this SimplyHired Scraper was useful, see other scrapers and actors at memo23's Apify profile — covering job boards, real estate, social media, and more.


⚠️ Disclaimer

This Actor is an independent tool and is not affiliated with, endorsed by, or sponsored by SimplyHired, Indeed, Recruit Holdings, or any of their subsidiaries or affiliates. All trademarks mentioned are the property of their respective owners.

The scraper accesses only publicly available job listings and the public JSON payloads that power the SimplyHired website — no authenticated endpoints, candidate data, or content behind a SimplyHired or Indeed login. Users are responsible for ensuring their use complies with SimplyHired's Terms of Service, applicable data-protection law (GDPR, CCPA, etc.), and any contractual obligations of their own organisation.


SEO Keywords

simplyhired scraper, scrape simplyhired, simplyhired api, simplyhired jobs scraper, Apify simplyhired, us jobs scraper, job postings api, job listings scraper, salary data scraper, posted salary benchmark, jobs with coordinates api, geo-coded jobs data, employer rating data, us hiring trends, recruitment data scraper, job market research data, indeed alternative scraper, ziprecruiter alternative scraper, glassdoor alternative scraper, job board scraper, job aggregator data feed