Career Site Job Scraper - Greenhouse, Lever, Ashby + 6 More ATS
Pricing
from $4.00 / 1,000 job scrapeds
Career Site Job Scraper - Greenhouse, Lever, Ashby + 6 More ATS
Scrape job listings straight from company career pages across 9 applicant tracking systems.
Pricing
from $4.00 / 1,000 job scrapeds
Rating
0.0
(0)
Developer
Boztek LTD
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
3 days ago
Last modified
Categories
Share
Career Site Job Scraper — Greenhouse, Lever, Ashby + 6 More ATS
Scrape job listings straight from company career pages across nine applicant tracking systems. Give it a domain and it works out which ATS the company uses on its own. Every job comes back in one normalized schema, no matter which platform it came from.
Jobs appear on a company's own career page before they are syndicated to LinkedIn or Indeed — and unlike those sites, every source here is a public API that needs no proxies, no cookies and no login.
Supported ATS platforms
| ATS | Board token example | Description | Salary | Employment type | Posted date |
|---|---|---|---|---|---|
| Greenhouse | greenhouse:vercel | ✅ included | — | — | ✅ |
| Lever | lever:leverdemo | ✅ included | ✅ when set | ✅ | ✅ |
| Ashby | ashby:ramp | ✅ included | ✅ structured | ✅ | ✅ |
| Workable | workable:blueground | ✅ included | — | ✅ | ✅ |
| SmartRecruiters | smartrecruiters:Visa | ➕ extra request | — | ✅ | ✅ |
| Recruitee | recruitee:hygraph | ✅ included | ✅ structured | ✅ | ✅ |
| Personio | personio:personio | ✅ included | — | ✅ | ✅ |
| Breezy HR | breezy:breezy | ❌ not public | ✅ free text | ✅ | ✅ |
| Rippling | rippling:rippling | ➕ extra request | — | ➕ extra request | ➕ extra request |
✅ comes with the listing · ➕ needs one extra request per job (charged separately, and only when you ask for descriptions) · — the platform does not expose it · ❌ not available at all
How you name a company
Put any of these in the companies list — you can mix them freely:
| Form | Example | Cost |
|---|---|---|
| Domain | stripe.com | ATS detection charged once |
| Career page URL | https://ramp.com/careers | ATS detection charged once |
| Job board URL | https://jobs.ashbyhq.com/ramp | free — read directly from the URL |
Explicit ats:token | greenhouse:vercel | free — no detection needed |
ATS detection fetches the company's career page and looks for a job board link. It is the convenient path; ats:token is the cheap one.
What does it cost?
Pay-per-event. You are charged for jobs that survive your filters, so narrowing by keyword or location genuinely lowers the bill.
| Event | Price | When |
|---|---|---|
| Job scraped | $0.004 | Per job in the dataset |
| ATS detected | $0.01 | Per company resolved from a bare domain |
| Description fetched | $0.001 | Only for SmartRecruiters and Rippling, only with descriptions on |
| Actor start | $0.00005 | Once per run |
| Scenario | Cost |
|---|---|
One company, 100 jobs, explicit ats:token | ~$0.40 |
| 50 companies by domain, 2,000 jobs | ~$8.50 |
| Daily watch on 20 companies, ~30 new jobs/day | ~$0.12/day |
Filters and the incremental mode are the levers: a daily run with onlyNewJobs costs a fraction of a full re-scrape.
Only the new jobs
Turn on onlyNewJobs and the Actor remembers every job ID it has already returned, in a named key-value store. Later runs emit only postings it has never seen.
That turns this into a job alert feed: schedule it hourly, point a webhook at the dataset, and you get new roles within the hour — usually before they reach the big job boards. Use different stateStoreName values to keep separate schedules independent.
Output
One flat item per job — it exports cleanly to CSV and Excel:
{"jobId": "ashby:ramp:34413f8d-26bf-4bbc-8ade-eb309a0e2245","ats": "ashby","atsBoardToken": "ramp","companyName": "Ramp","companyDomain": "ramp.com","title": "Security Engineer, Cloud","department": "Engineering","team": "Backend","employmentType": "Full-time","seniority": "Senior","locationRaw": "New York, NY (HQ)","city": "New York","region": "NY","country": null,"isRemote": true,"workplaceType": "Hybrid","locations": ["New York, NY (HQ)", "San Francisco, CA", "Remote (US)"],"salaryMin": 211400,"salaryMax": 290600,"salaryCurrency": "USD","salaryPeriod": "year","postedAt": "2026-04-07T17:12:35.753Z","applyUrl": "https://jobs.ashbyhq.com/ramp/34413f8d-.../application","jobUrl": "https://jobs.ashbyhq.com/ramp/34413f8d-...","description": "# About Ramp\n\nRamp is building the smart infrastructure...","descriptionFormat": "markdown","scrapedAt": "2026-08-11T19:36:05.412Z","sourceUrl": "https://api.ashbyhq.com/posting-api/job-board/ramp?includeCompensation=true"}
Fields the Actor derives for you
seniority— read from the title (Intern,Junior,Mid,Senior,Staff,Principal,Lead,Director,VP,C-level). Most specific wins, so Senior Staff Engineer resolves toStaff.employmentType— one shared vocabulary. Ashby'sFullTime, Recruitee'sfulltime_permanent, Rippling'sSALARIED_FTand SmartRecruiters'Regular full time salaryall becomeFull-time.isRemote— the ATS flag when there is one, otherwise inferred from the location wording.salaryPeriod— canonicalhour/day/week/month/year, so Ashby's1 YEARand Recruitee'smonthline up.city/region/country— split out of the free-text location.description— Markdown by default (best for LLM pipelines), or plain text or the original HTML.
Input options
| Option | Type | Default | Description |
|---|---|---|---|
companies | array | required | Domains, career page URLs, job board URLs or ats:token entries |
keywords | array | [] | Keep jobs whose title contains any of these |
excludeKeywords | array | [] | Drop jobs whose title contains any of these |
locations | array | [] | Keep jobs matching any of these locations |
departments | array | [] | Keep jobs in these departments or teams |
remoteOnly | boolean | false | Remote jobs only |
postedWithinDays | integer | 0 | Keep jobs published in the last N days (0 = off) |
onlyNewJobs | boolean | false | Emit only jobs not seen in previous runs |
includeDescription | boolean | true | Include the full job description |
descriptionFormat | string | markdown | markdown / text / html |
maxJobsPerCompany | integer | 0 | Cap per company (0 = no limit) |
maxTotalJobs | integer | 0 | Cap across all companies (0 = no limit) |
stateStoreName | string | career-site-job-scraper-state | Key-value store backing onlyNewJobs |
maxConcurrency | integer | 8 | Parallel requests against the ATS APIs |
proxyConfiguration | object | off | Optional — not needed for any supported ATS |
Use cases
- Job alert products — schedule with
onlyNewJobsand push new roles to Slack, email or a webhook within the hour. - Recruiting and sourcing — track which teams a list of competitors is hiring for, and where.
- Sales and VC signals — hiring is a growth signal. Watch a portfolio or an ICP list and see who is scaling which function.
- Job boards and aggregators — build a niche board on first-party data instead of re-scraping LinkedIn.
- Feeding AI agents — Markdown descriptions drop straight into RAG pipelines and LLM matching.
Why not just scrape LinkedIn or Indeed?
| LinkedIn / Indeed scrapers | Career Site Job Scraper | |
|---|---|---|
| Data source | Aggregator, re-posted | Employer's own board |
| Freshness | After syndication | At publication |
| Blocking | Residential proxies, cookies | None — public APIs |
| Reliability | Breaks on layout changes | Versioned JSON APIs |
| Description | Often truncated | Full text |
| Salary | Rarely present | Structured where published |
Limitations
- Breezy HR descriptions are not available. Its public feed carries metadata only, and the posting page is a JavaScript app with no JSON or JSON-LD to read. Everything else — title, location, department, employment type, salary, dates — is returned.
- Greenhouse does not expose employment type through its job board API, so that field stays empty for Greenhouse boards.
- Rippling's listing endpoint is sparse. Posting date and employment type only arrive with the description, so leaving
includeDescriptionoff means those fields stay empty for Rippling. postedWithinDayskeeps jobs whose date is unknown. SmartRecruiters and Rippling only reveal dates on the detail endpoint; dropping every undated job would be worse than including a few. Dates that arrive during enrichment are re-checked against the filter.- ATS detection needs a public link. If a career page renders its job board purely client-side with no ATS URL in the HTML, detection fails — pass an explicit
ats:tokenentry instead. - Only public postings. Internal, draft and unlisted roles are excluded, as they are from the ATS APIs themselves.
Which companies can I scrape?
Any company on one of the nine supported platforms — collectively tens of thousands of employers, heavily weighted toward tech, startups and scale-ups. If you are not sure which ATS a company uses, just pass its domain and let the Actor find out.