ATS Job Board Scraper: Greenhouse, Lever, Ashby & More avatar

ATS Job Board Scraper: Greenhouse, Lever, Ashby & More

Pricing

from $2.50 / 1,000 job scrapeds

Go to Apify Store
ATS Job Board Scraper: Greenhouse, Lever, Ashby & More

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

Nick

Maintained by Community

Actor stats

0

Bookmarked

1

Total users

0

Monthly active users

3 days ago

Last modified

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 jobs dataset view.
  • Monitor company hiring signals creates a capped SmartRecruiters and Workable snapshot with the summaries view. Set previousJobsDatasetId to 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 with url, source_url, source_ats, company, company_domain, ats_slug, job_id, title, department, team, location, remote_status, country, employment_type, seniority, salary fields, currency, optional description_text, detected skills, detected functions, posting timestamps, first_seen, last_seen, content_hash, and change_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 when enableAiAnalysis is 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

InputTypeDefaultNotes
companyNamesstring listemptyOptional display labels and discovery hints.
companyDomainsstring listemptyOptional domains for best-effort public ATS discovery.
atsBoardUrlsstring listemptyRecommended input. Supports public Greenhouse, Lever, Ashby, SmartRecruiters, and Workable URLs.
atsSlugsstring listemptyUse greenhouse:stripe, lever:mistral, ashby:openai, smartrecruiters:boschgroup, workable:huggingface, or a raw slug.
maxCompaniesinteger25Limits company or board targets scanned. Minimum 1, maximum 500.
maxJobsPerCompanyinteger100Limits jobs returned per company. Minimum 1, maximum 1000.
includeDescriptionsbooleantrueInclude cleaned job descriptions when available. Turn off for smaller output.
watchModebooleanfalseEnables previous-dataset comparison when previousJobsDatasetId is set.
previousJobsDatasetIdstringemptyDataset from a prior run of this Actor, accessible with its limited permissions. Arbitrary dataset access is not granted.
alertWebhookUrlstringemptyOptional HTTP endpoint for hiring signal summaries.
enableAiAnalysisbooleanfalseGenerates an optional AI hiring brief.
llmProviderselectopenrouterOne of openrouter, anthropic, google, openai, or ollama.
llmModelstringprovider defaultOptional model override.
openrouterApiKeysecret stringemptyOptional input key, or use OPENROUTER_API_KEY.
anthropicApiKeysecret stringemptyOptional input key, or use ANTHROPIC_API_KEY.
googleApiKeysecret stringemptyOptional input key, or use GOOGLE_API_KEY.
openaiApiKeysecret stringemptyOptional input key, or use OPENAI_API_KEY.
ollamaBaseUrlstringhttp://localhost:11434Self-hosted Ollama endpoint.
proxyConfigurationobjectApify Proxy offOptional 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:

ATSDirect URL exampleDocumented public feed
Greenhousehttps://boards.greenhouse.io/stripeGreenhouse Job Board API
Leverhttps://jobs.lever.co/mistralLever Postings API
Ashbyhttps://jobs.ashbyhq.com/openaiAshby public job posting API
SmartRecruitershttps://jobs.smartrecruiters.com/boschgroupSmartRecruiters Posting API
Workablehttps://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.

EventPriceWhen charged
company-scanned$0.01A supported public ATS source is checked.
job-scraped$0.0025A normalized public job row is pushed.
hiring-summary-generated$0.03A company summary is generated.
ai-analysis-completed$0.05Optional AI hiring brief succeeds.
skyfire-bundle-500-companies$5.00Bundle 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.

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.