SimplyHired Jobs Scraper
Pricing
from $1.50 / 1,000 result (one job)s
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
Maintained by CommunityActor stats
0
Bookmarked
17
Total users
16
Monthly active users
a day ago
Last modified
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

✨ Why use this scraper?
- Structured salary on most rows —
min/max/unit/currencyparsed 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
| Who | What they do with it |
|---|---|
| Recruitment agencies | Monitor open roles by metro, title, and pay band across the US |
| HR / comp & ben teams | Benchmark real posted salary ranges by title and city |
| Job aggregators | Ingest deduplicated structured postings with stable job keys |
| Market researchers | Track hiring volume and wage trends over time (fdb recency filters built in) |
| Sales / lead-gen teams | Find companies actively hiring — with optional contact-email enrichment |
| Data scientists | Geo-coded, salary-labelled job records for modelling |
📥 Supported inputs
| Input | Example | What happens |
|---|---|---|
| Search URL | https://www.simplyhired.com/search?q=nurse&l=Chicago%2C+IL | Walks the full result set via cursor pagination |
| Search with filters | /search?q=driver&l=Dallas%2C+TX&t=fulltime&fdb=7&mip=50000 | All filter params pass through (job type, days back, min pay, sort) |
| Remote search | /search?q=developer&l=Remote | Location accepts "Remote" like the site does |
| Direct job URL | /job/{jobKey} | Scraped as a single job |
| Keyword + location fields | keyword: "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
- Bootstrap — one page fetch reads SimplyHired's
__NEXT_DATA__blob: the currentbuildId, locale, and page 1 of results come free. - Stream the search data route — 20 jobs per page, cursor-based pagination; details start processing while later pages are still being fetched.
- Fetch each job's detail JSON — description HTML, structured salary, coordinates, qualifications, employer rating, dates, flags.
- Skip expired listings and duplicates, apply the optional recency filter.
- Push one merged row per job — capped exactly at
maxItems. If the site deploys mid-run, thebuildIdis refreshed automatically.
⚙️ Input parameters
| Field | Type | Default | Description |
|---|---|---|---|
startUrls | array | ["https://www.simplyhired.com/search?q=accountant&l=New+York%2C+NY"] | Search and/or direct job URLs |
keyword | string | — | Keyword search; used when startUrls is empty |
location | string | — | Location (city/state, zip, or "Remote"); used when startUrls is empty |
postedWithinDays | integer | — | SimplyHired's own 1/3/7/14-day filter; used when startUrls is empty |
fetchJobDetails | boolean | true | Fetch full detail per job (description, salary, coordinates, rating) |
enrichEmails | boolean | false | Experimental employer contact-email discovery |
postedWithinHours | integer | — | Finer-grained recency filter on postedDate |
maxItems | integer | 1000 | Hard cap on jobs collected |
maxConcurrency | integer | 10 | Parallel detail requests |
proxy | object | none | Usually 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
| Group | Fields |
|---|---|
| Identity | jobId (stable job key), jobUrl, title, normalizedTitle |
| Employer | companyName, companyRating, companyProfileUrl, logoUrl |
| Location | location, addressLocality, addressRegion, coordinates.{latitude,longitude}, remote |
| Compensation | salary.{currency,min,max,unit,raw} (structured), salaryRaw |
| Classification | employmentTypes, workSettings, qualifications[], benefits[], requirements[] (search-card chips), skillTags[] |
| Dates | postedDate, dateOnIndeed, closingDate (ISO-8601) |
| Content | description (HTML), descriptionText (plain), snippet |
| Flags | expired, 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
- For issues or feature requests, please use the Issues tab on the actor's Apify Console page.
- Author's website: https://muhamed-didovic.github.io/
- Email: muhamed.didovic@gmail.com
🛠 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