Multi-ATS Jobs Scraper & Hiring Signal Monitor avatar

Multi-ATS Jobs Scraper & Hiring Signal Monitor

Pricing

from $2.50 / 1,000 job scrapeds

Go to Apify Store
Multi-ATS Jobs Scraper & Hiring Signal Monitor

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

Nick

Maintained by Community

Actor stats

0

Bookmarked

1

Total users

0

Monthly active users

4 hours ago

Last modified

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 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 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 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.

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

InputTypeDefaultNotes
companyNamesstring listemptyOptional display labels and discovery hints.
companyDomainsstring listemptyOptional domains for best-effort public ATS discovery.
atsBoardUrlsstring listemptyRecommended input. Supports public Greenhouse, Lever, and Ashby URLs.
atsSlugsstring listemptyUse greenhouse:stripe, lever:mistral, ashby:openai, 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.
previousJobsDatasetIdstringemptyPrior run dataset used for new, changed, existing, and closed job classification.
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.

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.

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 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.

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.