ATS Job Board Scraper: Greenhouse, Lever, Ashby & More
Pricing
from $2.50 / 1,000 job scrapeds
ATS Job Board Scraper: Greenhouse, Lever, Ashby & More
Scrape public Greenhouse, Lever, Ashby, SmartRecruiters, and Workable job boards. Get normalized jobs, hiring signals, change alerts, webhooks, and optional AI briefs.
Pricing
from $2.50 / 1,000 job scrapeds
Rating
0.0
(0)
Developer
Nick
Maintained by CommunityActor stats
0
Bookmarked
1
Total users
0
Monthly active users
3 days ago
Last modified
Categories
Share
Scrape public Greenhouse, Lever, Ashby, SmartRecruiters, and Workable job boards for sales, recruiting, market intelligence, and RevOps workflows. The actor returns normalized job rows, company-level hiring snapshots, baseline-based job comparisons, webhook-ready summaries, diagnostics, and an optional AI hiring brief.
Use it when a hiring page is more useful as structured data than as a tab in a browser. The actor is built for account prioritization, competitor monitoring, recruiting market maps, partner intelligence, and scheduled alerts from public ATS boards. Direct board URLs are the best input, while company domains and names are supported as best-effort discovery helpers.
Best First Run
Start with one direct public ATS board and a small job limit. This validates the output shape, pricing, and any downstream webhook before you monitor a larger account list.
{"atsBoardUrls": ["https://boards.greenhouse.io/stripe"],"companyNames": ["Stripe"],"companyDomains": ["stripe.com"],"maxCompanies": 1,"maxJobsPerCompany": 3,"includeDescriptions": false,"watchMode": false,"enableAiAnalysis": false}
For a second run, pass the dataset ID from the first run of this Actor as previousJobsDatasetId and set watchMode to true. The actor compares observed rows as new, existing, or changed. It marks missing jobs closed only when the current board snapshot is complete and below the job cap. A capped or incomplete comparison emits closure_detection_skipped instead of claiming closures. Company summaries can be sent to your HTTP webhook endpoint.
Ready-to-Run Tasks
- Scrape Greenhouse, Lever & Ashby jobs provides a small multi-board export with the
jobsdataset view. - Monitor company hiring signals creates a capped SmartRecruiters and Workable snapshot with the
summariesview. SetpreviousJobsDatasetIdto a prior run's dataset from this Actor for comparisons; scheduling the starter unchanged does not create a rolling baseline.
Both tasks can be copied, edited, scheduled, called through the Apify API, or discovered by AI agents. AI analysis stays off by default, and no ATS credentials are required.
Multi-ATS Jobs Scraper Data You Get
The dataset contains four row types.
job: one normalized public job posting withurl,source_url,source_ats,company,company_domain,ats_slug,job_id,title,department,team,location,remote_status,country,employment_type,seniority, salary fields,currency, optionaldescription_text, detected skills, detected functions, posting timestamps,first_seen,last_seen,content_hash, andchange_type.hiring_summary: one company-level rollup of the observed sample with sources scanned, open jobs, new jobs, changed jobs, closed jobs, department counts, top locations, remote roles, AI-role count, engineering and sales counts, a count-based activity label, and a short deterministic recommendation.diagnostic: a user-actionable row for unsupported inputs, missing ATS links, fetch failures, previous dataset issues, invalid webhook URLs, or AI analysis warnings.ai_hiring_brief: an optional narrative brief with provider and model metadata whenenableAiAnalysisis true and a provider is configured.
Typical users join job rows to CRM accounts, use hiring_summary rows for prioritization, route diagnostic rows into QA queues, and save ai_hiring_brief rows for weekly account notes.
total_open_jobs counts returned open rows, not all openings on a capped board. The legacy hiring_velocity_label field is a bucket based on that count, not a measured growth rate or a time-based trend. Without a baseline, new means first observed in this run, not newly posted since a previous run.
Agent Workflows
Hiring activity is a strong buying and timing signal. This actor turns public ATS boards into structured events that are easy to route into account-based workflows.
- Sales teams can inspect target accounts for sales, solutions, security, data, and engineering openings.
- Recruiting teams can map which competitors are expanding in specific locations or functions.
- Market intelligence teams can compare observed job mixes across companies, keeping the board and sample limits consistent.
- Customer success teams can spot expansion, implementation, support, or operations hiring at existing accounts.
- Workflow automations can post summaries to Slack, create CRM tasks, update account fields, or trigger research tasks when new roles appear.
The actor does not need login credentials or cookies. It uses the vendors' documented public job feeds and reads public company pages only for best-effort board discovery. It does not use browser automation, private endpoints, or anti-bot bypasses.
Inputs
| Input | Type | Default | Notes |
|---|---|---|---|
companyNames | string list | empty | Optional display labels and discovery hints. |
companyDomains | string list | empty | Optional domains for best-effort public ATS discovery. |
atsBoardUrls | string list | empty | Recommended input. Supports public Greenhouse, Lever, Ashby, SmartRecruiters, and Workable URLs. |
atsSlugs | string list | empty | Use greenhouse:stripe, lever:mistral, ashby:openai, smartrecruiters:boschgroup, workable:huggingface, or a raw slug. |
maxCompanies | integer | 25 | Limits company or board targets scanned. Minimum 1, maximum 500. |
maxJobsPerCompany | integer | 100 | Limits jobs returned per company. Minimum 1, maximum 1000. |
includeDescriptions | boolean | true | Include cleaned job descriptions when available. Turn off for smaller output. |
watchMode | boolean | false | Enables previous-dataset comparison when previousJobsDatasetId is set. |
previousJobsDatasetId | string | empty | Dataset from a prior run of this Actor, accessible with its limited permissions. Arbitrary dataset access is not granted. |
alertWebhookUrl | string | empty | Optional HTTP endpoint for hiring signal summaries. |
enableAiAnalysis | boolean | false | Generates an optional AI hiring brief. |
llmProvider | select | openrouter | One of openrouter, anthropic, google, openai, or ollama. |
llmModel | string | provider default | Optional model override. |
openrouterApiKey | secret string | empty | Optional input key, or use OPENROUTER_API_KEY. |
anthropicApiKey | secret string | empty | Optional input key, or use ANTHROPIC_API_KEY. |
googleApiKey | secret string | empty | Optional input key, or use GOOGLE_API_KEY. |
openaiApiKey | secret string | empty | Optional input key, or use OPENAI_API_KEY. |
ollamaBaseUrl | string | http://localhost:11434 | Self-hosted Ollama endpoint. |
proxyConfiguration | object | Apify Proxy off | Optional network routing; most public ATS boards do not require it. |
Hidden aliases are available for CLI and agent callers: urls for atsBoardUrls, domains for companyDomains, companies for companyNames, maxItems for maxJobsPerCompany, and query for one company, domain, ATS URL, or source slug.
Supported public source formats:
| ATS | Direct URL example | Documented public feed |
|---|---|---|
| Greenhouse | https://boards.greenhouse.io/stripe | Greenhouse Job Board API |
| Lever | https://jobs.lever.co/mistral | Lever Postings API |
| Ashby | https://jobs.ashbyhq.com/openai | Ashby public job posting API |
| SmartRecruiters | https://jobs.smartrecruiters.com/boschgroup | SmartRecruiters Posting API |
| Workable | https://apply.workable.com/huggingface/ | Workable public account jobs endpoint |
SmartRecruiters list responses are paginated automatically up to maxJobsPerCompany. When includeDescriptions is enabled, the actor reads each selected posting's documented detail endpoint to obtain job-ad sections. Workable descriptions come from the public account endpoint with details=true.
Output Examples
Job row:
{"record_type": "job","url": "https://boards.greenhouse.io/example/jobs/123456","source_url": "https://boards.greenhouse.io/example","source_ats": "greenhouse","company": "Example","company_domain": "example.com","ats_slug": "example","job_id": "123456","title": "Senior Platform Engineer","department": "Engineering","team": "Infrastructure","location": "Remote - United States","remote_status": "remote","country": "US","employment_type": "Full-time","seniority": "senior","salary_min": 140000,"salary_max": 180000,"currency": "USD","detected_skills": ["Python", "Kubernetes"],"detected_functions": ["engineering"],"change_type": "new"}
Hiring summary row:
{"record_type": "hiring_summary","company": "Example","company_domain": "example.com","sources_scanned": ["greenhouse"],"total_open_jobs": 42,"new_jobs": 7,"changed_jobs": 3,"closed_jobs": 2,"remote_count": 12,"ai_roles_count": 4,"engineering_roles_count": 18,"sales_roles_count": 9,"hiring_velocity_label": "expanding","agent_recommendation": "Prioritize outreach this week."}
Diagnostic row:
{"record_type": "diagnostic","diagnostic": "ats_not_found","input": "example.com","source_ats": "","status": "skipped","error": "No supported ATS link found.","next_step": "Provide a supported public ATS jobs URL."}
Pricing Examples
Pay-per-event pricing keeps small monitoring runs inexpensive and makes large runs predictable.
| Event | Price | When charged |
|---|---|---|
company-scanned | $0.01 | A supported public ATS source is checked. |
job-scraped | $0.0025 | A normalized public job row is pushed. |
hiring-summary-generated | $0.03 | A company summary is generated. |
ai-analysis-completed | $0.05 | Optional AI hiring brief succeeds. |
skyfire-bundle-500-companies | $5.00 | Bundle event for up to 500 company scans in one invocation. |
Example: scanning 5 companies with 100 total jobs and 5 summaries costs about $0.45 before optional AI analysis: $0.05 for company scans, $0.25 for job rows, and $0.15 for summaries.
Example: scanning 25 companies with 1,000 total jobs and 25 summaries costs about $3.50 before optional AI analysis: $0.25 for company scans, $2.50 for job rows, and $0.75 for summaries.
Diagnostic rows are not job rows. AI analysis is off by default and only charged when a non-empty brief is pushed.
Scheduling and Webhooks
For monitoring, schedule the actor daily or weekly with the same target list. Keep the first run of this Actor as your baseline, then pass that dataset ID into the next run as previousJobsDatasetId with watchMode: true. For successive-run comparisons, your workflow must update that ID after each successful, suitable snapshot from this Actor. The actor does not advance the baseline or create a schedule automatically. Reusing one fixed dataset always compares against that fixed baseline. Its limited permissions do not grant arbitrary dataset access; use an accessible prior-run dataset from this Actor without broadening permissions.
Set alertWebhookUrl when you want push alerts instead of polling a dataset. The webhook payload summarizes company count, open jobs, new jobs, changed jobs, closed jobs, and company-level velocity labels. Webhook failures are reported as diagnostics so you can fix the endpoint without losing the scraped dataset.
Common schedules:
- Daily for high-value target accounts and active competitors.
- Weekly for broader market maps.
- Monthly for account enrichment fields that do not need immediate alerts.
MCP/AI Agent Quickstart
When using Apify through an MCP server or another agent runner, pass the same JSON you would use in the Apify Console. The lowest-friction agent input is a direct ATS board URL plus a small job cap:
{"atsBoardUrls": ["https://jobs.lever.co/mistral"],"companyNames": ["Mistral AI"],"companyDomains": ["mistral.ai"],"maxCompanies": 1,"maxJobsPerCompany": 50,"watchMode": true,"previousJobsDatasetId": "PRIOR_RUN_DATASET_FROM_THIS_ACTOR","alertWebhookUrl": "https://hooks.slack.com/services/...","enableAiAnalysis": true,"llmProvider": "openrouter"}
For AI briefs, provide the selected provider key as an actor input or environment variable. Ollama users can point ollamaBaseUrl at a reachable self-hosted endpoint.
Limitations
This actor monitors documented public Greenhouse, Lever, Ashby, SmartRecruiters, and Workable feeds only. It does not log in, use cookies, bypass private portals, or extract applicant data. Workday and iCIMS are deliberately outside the supported set because this version does not depend on protected or undocumented interfaces.
Company-domain discovery is best effort. Some companies use custom careers pages, regional subdomains, agency boards, or ATS vendors outside the supported set. For the highest hit rate, provide direct atsBoardUrls or explicit atsSlugs.
Public boards can change field names, remove descriptions, hide compensation, or use different location formats. The actor normalizes what is available and emits diagnostics when an input cannot be resolved or a source cannot be read.
Delta classification depends on an accessible dataset from a previous run of this Actor. Without previousJobsDatasetId, current jobs are treated as new for the run and closed jobs cannot be detected. With capped samples, a newly observed row may have existed outside the previous sample. Keep targets, limits, and description settings consistent. Capped or incomplete current snapshots suppress closure detection, including a snapshot exactly at the cap. Retain a suitable earlier baseline from this Actor when a partial run cannot establish absence; jobs omitted from both samples cannot be tracked.
Closure checks require native source job IDs, nonempty titles, and matching useful normalized rows. Rows that rely only on generated fallback IDs cannot prove a complete snapshot. Workable's supported repeated-ID collapse is allowed when all unique identities survive normalization. Duplicate SmartRecruiters pages, inconsistent totals or offsets, malformed records, and unexplained normalization loss suppress closure detection. Raising the job cap only addresses truncation, not these source-integrity problems.
Optional AI analysis summarizes the data returned by the run. It should be reviewed before using it for high-stakes hiring, investment, or compliance decisions.
Legal and Compliance
You are responsible for making sure your use of this actor complies with the target websites' terms, applicable laws, and your internal data policies.
The actor is intended for public job postings and company-level hiring signals. Do not use the output to infer sensitive personal data, make unlawful employment decisions, or contact individuals in ways that violate privacy, anti-spam, or data protection rules.
If you process the data in the EU, UK, California, or another regulated jurisdiction, evaluate your lawful basis, retention policy, access controls, and deletion process. Store only what you need, keep it current, and remove data when it is no longer necessary for your stated purpose.
Webhooks send data to the endpoint you provide. Make sure that endpoint is controlled by you or your organization and that any downstream tools are approved for the type of job-market data you route there.
FAQ
Which ATS platforms are supported? Greenhouse, Lever, Ashby, SmartRecruiters, and Workable public job feeds are supported in this version.
Can I provide company domains instead of board URLs? Yes, but direct board URLs are more reliable. Domain discovery is best effort and may miss custom careers pages.
Does it detect closed jobs? Only when watchMode is true, previousJobsDatasetId is an accessible prior-run dataset from this Actor containing jobs from the same targets, and the current snapshot is complete and below the job cap. Otherwise absence is not proof of closure.
Does it require a proxy? Usually no. Public ATS boards normally work without Apify Proxy, but the proxy input is available for run environments that need outbound routing.
Can I turn off job descriptions? Yes. Set includeDescriptions to false to reduce dataset size while keeping titles, departments, locations, deltas, and summaries.
When should I enable AI analysis? Enable it when you want a concise narrative brief over the hiring signal rows. Leave it off for lowest-cost structured exports.
Will it scrape private applicant tracking data? No. It reads public job boards only and does not access applicant systems or private recruiter dashboards.