Multi-ATS Job Board Scraper (Greenhouse, Lever, Ashby & More) avatar

Multi-ATS Job Board Scraper (Greenhouse, Lever, Ashby & More)

Pricing

from $3.00 / 1,000 job posting fetcheds

Go to Apify Store
Multi-ATS Job Board Scraper (Greenhouse, Lever, Ashby & More)

Multi-ATS Job Board Scraper (Greenhouse, Lever, Ashby & More)

Scrape job postings from Greenhouse, Lever, Ashby, SmartRecruiters, and Recruitee in one run. Returns title, location, department, employment type, description, and apply URL - normalized JSON for pipelines, job alerts, and hiring-trend analysis.

Pricing

from $3.00 / 1,000 job posting fetcheds

Rating

0.0

(0)

Developer

Geo

Geo

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

10 days ago

Last modified

Share

Multi-ATS Job Board Scraper (Greenhouse, Lever, Ashby, SmartRecruiters, Recruitee)

Use this multi-ATS job board scraper to fetch normalized public job postings from Greenhouse, Lever, Ashby, SmartRecruiters, and Recruitee in one run. Get title, location, department, employment type, description, and apply URL for recruiting pipelines, job alerts, dashboards, or hiring-trend analysis.

Why use this actor

Talent data is siloed across ATS platforms. A single company may post jobs on Greenhouse while a competitor uses Lever. Checking each platform manually, or building and maintaining five separate API integrations, is expensive.

This actor gives you one normalized job dataset from all five platforms with a single input. It's designed for:

  • Recruiters and sourcing teams monitoring competitor or partner job boards
  • Product managers analyzing hiring trends by department, location, or role
  • Data engineers building talent-intel pipelines or company-growth signals
  • Developers automating job alerts, career aggregators, or internal hiring dashboards
  • VC/PE analysts tracking portfolio company headcount via live job postings

Supported ATS platforms: Greenhouse, Lever, Ashby, SmartRecruiters, Recruitee

PlatformInput exampleNotes
Greenhouse{ "platform": "greenhouse", "companyId": "vercel" }Official JSON board API; per-job description fetch available
Lever{ "platform": "lever", "companyId": "netflix" }Official v0 postings API; crawl-delay honored
Ashby{ "platform": "ashby", "companyId": "notion" }Documented public posting-api endpoint
SmartRecruiters{ "platform": "smartrecruiters", "companyId": "McDonalds" }Official /v1/companies API
Recruitee{ "platform": "recruitee", "companyId": "acme" }Public /api/offers/ endpoint

Input

FieldTypeDefaultDescription
sourcesarrayrequiredList of {platform, companyId} objects
maxJobsPerCompanyinteger100Max jobs per source, capped at 500
includeDescriptionbooleantrueFetch and include full job description (plain text, HTML stripped)
scrubPiibooleantrueRedact incidental email/phone in descriptions (GDPR)
maxTotalChargeUsdnumber10.0Hard charge cap; actor stops gracefully when reached

Output

One dataset record per job posting. Fields:

{
"platform": "greenhouse",
"companyId": "vercel",
"jobId": "7612345",
"title": "Senior Software Engineer, Edge Network",
"location": "Remote",
"department": "Engineering",
"employmentType": null,
"description": "Join Vercel's Edge Network team...",
"applyUrl": "https://boards.greenhouse.io/vercel/jobs/7612345",
"postedAt": null,
"updatedAt": "2026-06-15T10:30:00Z",
"fetchedAt": "2026-07-28T12:00:00Z"
}

Error records (invalid companyId, platform unreachable, zero results) are pushed to the dataset with "status": "error" and a plain-English "reason", so the run never exits silently on bad input.

Worked example + cost math

Input:

{
"sources": [
{ "platform": "greenhouse", "companyId": "vercel" },
{ "platform": "lever", "companyId": "netflix" },
{ "platform": "ashby", "companyId": "notion" }
],
"maxJobsPerCompany": 50,
"includeDescription": true
}

Expected events and cost:

EventCountUnit priceSubtotal
actor-start1$0.005$0.005
job-fetched~150 (50 per co.)$0.003$0.45
Total~$0.46

For 3 companies × 50 jobs each (150 jobs):

  • Platform compute: 0.005 CU × $0.40/CU = **$0.002** (< 1% of revenue — well under the 30% cost cap)
  • Revenue per run: ~$0.46
  • Gross margin: ~99%

At $0.003 per job, a user fetching 1,000 jobs/month spends $3.00 — comparable to a manual analyst spending 2–3 hours.

Compliance and rate limiting

  • All five platforms are accessed via their official, documented public APIs (not HTML scraping)
  • robots.txt honored on all target domains (Greenhouse: allows all; Lever: crawl-delay 1 honored; Ashby posting-api: not disallowed; SmartRecruiters /v1/companies/: explicitly allowed; Recruitee: Cloudflare-gated but public)
  • Rate limited to ~1 request/second per-tenant, well within each platform's tolerance
  • Descriptive User-Agent header set on every request
  • Incidental PII (recruiter emails/phones in descriptions) is redacted by default (scrubPii: true)
  • No login-walled content, no candidate data, no session cookies

Limitations

  • Workday is not supported: Cloudflare + Akamai bot-management makes reliable access infeasible without a browser; a separate Workday actor is warranted
  • SmartRecruiters descriptions require a per-job secondary fetch that would multiply requests; descriptions are omitted for that platform to stay polite
  • Recruitee descriptions similarly require a per-posting HTML parse; omitted for the same reason
  • Company IDs are platform-specific slugs — use the slug visible in the platform's job board URL (e.g. boards.greenhouse.io/vercelvercel)

Job posting API, MCP & webhooks

Run it from the API with your Apify token:

curl -X POST "https://api.apify.com/v2/acts/gp005~multi-ats-jobs-scraper/runs?token=$APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{"sources":[{"platform":"greenhouse","companyId":"vercel"}],"maxJobsPerCompany":10,"includeDescription":false}'
  • Apify API: POST /v2/acts/gp005~multi-ats-jobs-scraper/runs — get a JSON feed of jobs in any pipeline
  • Make / n8n: Trigger on schedule, filter by department or location, post to Slack/Sheets
  • MCP: Available via the Apify MCP server (apify/actors-mcp-server) — let your AI assistant query live job postings
  • Webhooks: Use ACTOR_RUN_FINISHED webhooks to push new jobs to your CRM, ATS, or data warehouse

FAQ

Which companyId should I use? Use the slug in the platform's job-board URL. For Greenhouse it's boards.greenhouse.io/<slug>, for Lever it's jobs.lever.co/<slug>, for Ashby it's jobs.ashbyhq.com/<slug>.

Can I monitor new postings automatically? Yes — schedule the actor on a daily/weekly cadence and compare datasets across runs, or use Apify webhooks to get notified on completion.

Does this work for private/internal job boards? No — only publicly accessible boards (no login required) are supported.

Is this GDPR-compliant? The core data (job titles, departments, locations) is not personal data. Descriptions may incidentally include recruiter contact details; the scrubPii: true default redacts those. Users are responsible for their own downstream data handling.

What if a company has no open jobs? An error record is pushed with "reason": "No job postings found..." so you always get a result, not a silent empty run.

How much does scraping job postings cost? Pricing is pay-per-event: $0.005 per actor run plus $0.003 per job posting fetched. 1,000 jobs/month therefore costs about $3.05 — comparable to an analyst spending 2-3 hours manually.

Which ATS platforms have public job posting APIs? Greenhouse, Lever, Ashby, SmartRecruiters, and Recruitee all ship official public endpoints and are covered here. Workday does not — its bot management makes reliable programmatic access infeasible without a browser, so a dedicated Workday actor would be needed.

Is it OK to scrape Greenhouse, Lever, and Ashby job boards? This actor only uses each platform's official, documented public API (no HTML scraping, no login-walled content), honors robots.txt and crawl delays, and stays within their rate limits. Users remain responsible for their own downstream use of the data.