Multi-ATS Jobs Scraper & Hiring Signal Monitor
Pricing
from $2.50 / 1,000 job scrapeds
Multi-ATS Jobs Scraper & Hiring Signal Monitor
Scans public Greenhouse, Lever, and Ashby job boards, returning normalized jobs, hiring velocity, new/changed/closed deltas, webhook alerts, and optional AI hiring briefs for sales, recruiting, and market teams.
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
4 hours ago
Last modified
Categories
Share
Multi-ATS jobs scraper for sales, recruiting, market intelligence, and RevOps teams that need public hiring signals from Greenhouse, Lever, and Ashby boards. It returns normalized job rows, company-level hiring velocity, new/changed/closed deltas, 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": 25,"includeDescriptions": true,"watchMode": false,"enableAiAnalysis": false}
For a second run, pass the first run's dataset ID as previousJobsDatasetId and set watchMode to true. The actor will classify rows as new, existing, changed, or closed and emit a company summary you can send to Slack, Zapier, Make, n8n, Discord, or your own endpoint.
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 with sources scanned, open jobs, new jobs, changed jobs, closed jobs, department counts, top locations, remote roles, AI-role count, engineering and sales counts, hiring velocity, 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.
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 watch target accounts for sales, solutions, security, data, and engineering hiring spikes.
- Recruiting teams can map which competitors are expanding in specific locations or functions.
- Market intelligence teams can compare hiring velocity across private companies that do not publish revenue metrics.
- 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 only reads public ATS boards and public company pages used for best-effort discovery.
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, and Ashby URLs. |
atsSlugs | string list | empty | Use greenhouse:stripe, lever:mistral, ashby:openai, 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 | Prior run dataset used for new, changed, existing, and closed job classification. |
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.
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 Greenhouse, Lever, or Ashby 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 as your baseline, then pass that dataset ID into the next run as previousJobsDatasetId with watchMode: true.
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": "YOUR_PREVIOUS_DATASET_ID","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 public Greenhouse, Lever, and Ashby boards only. It does not log in, use cookies, bypass private portals, or extract applicant data.
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 a previous dataset. Without previousJobsDatasetId, current jobs are treated as new for the run and closed jobs cannot be detected.
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, and Ashby public boards 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? Yes, when watchMode is true and previousJobsDatasetId points to a prior dataset containing job rows from the same targets.
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.