Company Jobs Scraper — Greenhouse, Lever, Ashby, Workday + more avatar

Company Jobs Scraper — Greenhouse, Lever, Ashby, Workday + more

Pricing

$1.00 / 1,000 job results

Go to Apify Store
Company Jobs Scraper — Greenhouse, Lever, Ashby, Workday + more

Company Jobs Scraper — Greenhouse, Lever, Ashby, Workday + more

Give company names, domains, or careers-page URLs; get every open job as clean JSON (title, location, remote, apply link, date). Auto-detects 9 ATS — Greenhouse, Lever, Ashby, Workable, Workday & more. Pay only per job returned. Built for hiring signals, recruiting, and AI agents (MCP tool).

Pricing

$1.00 / 1,000 job results

Rating

0.0

(0)

Developer

Kjel Schlemmer

Kjel Schlemmer

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

5 days ago

Last modified

Share

Company Jobs Scraper — get every open job at any company

Give it a list of company names, website domains, or careers-page URLs — it finds each company's job board automatically and returns every open position as clean, structured data: title, department, location, remote flag, employment type, direct apply link, and posting date.

No configuration, no per-company setup, no API keys. Paste companies, get jobs.

  • Detects 9 applicant tracking systems (ATS) — Greenhouse, Lever, Ashby, Workable, Recruitee, SmartRecruiters, Personio, BambooHR, and Workday
  • Any input formatstripe.com, OpenAI, or https://jobs.lever.co/spotify all just work, mixed in one run
  • Built-in filters — title keywords, department, remote-only, posted-after date
  • One normalized schema across every ATS, so your spreadsheet, CRM, or agent pipeline doesn't care where the jobs came from

Four things you're not charged for

Job data is easy to sell and hard to trust. Most complaints about scrapers in this category are variations of "I paid for rows I didn't ask for." So the billing rules here are deliberately narrow:

  1. Rows your filters excluded. Filtering happens before billing, not after. There's no "we returned everything and flagged the non-matches" behaviour.
  2. Jobs that aren't really the company you asked for. Every row carries a matchConfidence. If a board can't be independently tied to your company, it's excluded by default and never billed — you don't pay to discover that a guess was wrong.
  3. Hybrid roles dressed up as remote. Some boards set a remote flag on hybrid postings — on one board we tested, 446 of 748. remoteOnly filters on the stated workplaceType, so hybrid stays out.
  4. Jobs you already saw. In monitoring mode you're billed for genuinely new postings only — not for re-reading the board.

And the run tells you where every number came from: per company, the SUMMARY reports boardTotalJobsmatchedFiltersjobs returned, plus a truncationReason if those differ. If a count looks low, you can see exactly why instead of guessing.

Sample output

{
"company": "Anthropic",
"ats": "greenhouse",
"title": "Engineering Manager, Inference",
"department": "Engineering",
"seniority": "manager",
"location": "San Francisco, CA",
"workplaceType": "hybrid",
"remote": false,
"employmentType": "Full-time",
"url": "https://job-boards.greenhouse.io/anthropic/jobs/5183044008",
"publishedAt": "2026-04-09T20:28:23-04:00",
"scrapedAt": "2026-07-27T14:02:11.000Z",
"matchConfidence": "verified"
}

What can I use it for?

Sales prospecting & hiring signals. A company that is hiring is a company that is growing and buying. Track open roles across your target accounts to time outreach: engineering hires signal new tooling budgets, sales hires signal expansion, a first-ever "Head of X" signals a brand-new budget line.

Recruiting & talent intelligence. Monitor which companies are hiring for the roles you place, spot hiring surges, and build outreach lists of companies with live openings — straight from their own job boards, always current.

Job aggregation & job boards. Pull normalized postings from hundreds of companies' career pages in one run, on a schedule, without writing a parser per ATS.

Market & competitor research. Watch competitors' job boards to see what they're building next — new market entries, new team formations, and headcount shifts show up in job postings months before they show up in the news.

AI agents & RAG pipelines. Output is flat, clean JSON — ready for LLM consumption. This Actor works out of the box as an MCP tool, so your agent can answer "who's hiring platform engineers among these 50 companies?" with live data.

How it works

For each company you provide, the Actor resolves the right job board in three steps:

  1. Direct URL recognition — if you pasted an ATS or careers URL, it's parsed immediately.
  2. Smart probing — company names and domains are converted to likely board identifiers and checked against every supported system in parallel.
  3. Careers-page scan — if probing misses, the Actor visits the company's website and finds the ATS link on its careers page.

Companies whose ATS can't be identified are reported in the run summary (see the SUMMARY record in the key-value store) — you always know exactly what was and wasn't covered, per company.

Input

{
"companies": ["stripe.com", "OpenAI", "https://jobs.lever.co/spotify"],
"titleKeywords": ["engineer", "developer"],
"remoteOnly": true,
"postedAfter": "2026-07-01"
}
FieldTypeDescription
companiesarrayCompany names, domains, or careers/job-board URLs — mix freely
titleKeywordsarrayOnly jobs whose title contains one of these keywords (case-insensitive)
departmentKeywordsarrayOnly jobs in matching departments/teams
remoteOnlybooleanOnly fully remote jobs — hybrid roles are excluded, not quietly counted as remote
postedAfterstringOnly jobs published on/after this date (jobs without a date are kept)
includeDescriptionbooleanInclude the full job description (HTML + plain text). Available for Greenhouse, Lever, Ashby, Recruitee; other ATSs return the posting without body text
includeUnconfirmedbooleanAlso return name-guessed boards we couldn't independently confirm (flagged probable, never charged). Off by default
onlyNewJobsbooleanMonitoring mode — return and charge for only postings not seen on a previous run. Off by default
monitorIdstringNames the history onlyNewJobs compares against, so you can keep several independent monitors
maxJobsPerCompanyintegerCap jobs returned per company; 0 = no limit
maxJobsintegerCap total jobs for the whole run — your spend ceiling; the run stops when it's reached. 0 = no limit

The cost-effective choice: a flat $1 per 1,000 jobs — no subscription, no per-company fee, no actor-start fee. You're only charged for jobs that pass your filters (filtering happens before billing), and maxJobs lets you set a hard ceiling on any run's cost up front.

Output

One dataset record per open job, normalized to the same shape across every ATS:

FieldTypeDescription
companystringThe company exactly as you passed it in
atsstringSource ATS: greenhouse, lever, ashby, workable, recruitee, smartrecruiters, personio, bamboohr, or workday
atsSlugstringThe company's board identifier on that ATS
jobIdstring | nullJob ID on the ATS
titlestring | nullJob title
departmentstring | nullDepartment
teamstring | nullTeam, when the ATS separates it from department
locationstring | nullLocation(s) as listed
workplaceTypestring | nullremote, hybrid, onsite, or null — the working arrangement as the board states it
remoteboolean | nulltrue only for fully remote, false for hybrid/on-site, null not stated
employmentTypestring | nulle.g. Full-time, Contract
urlstring | nullDirect link to the job posting / apply page
applyUrlstring | nullDirect link to the application form, where the board exposes one separately (Ashby, Lever)
senioritystring | nullInferred from the title: intern, entry, senior, staff, principal, lead, manager, director, vp, executivenull rather than a guessed default
publishedAtstring | nullPublish date, ISO 8601
updatedAtstring | nullLast-updated date, ISO 8601 (few ATSs)
descriptionHtml / descriptionTextstring | nullFull description, only with includeDescription and only on ATSs that expose it
scrapedAtstringFetch time, ISO 8601 (always present)
matchConfidencestringHow the board was tied to the company: url, site, verified, or probable (see FAQ)

Export as JSON, CSV, or Excel from the dataset tab, or fetch via the API. A per-run SUMMARY record (which companies resolved, via which ATS, how many jobs, and which came back not_found) is stored in the run's key-value store.

Monitoring mode — get only what's new

Set onlyNewJobs: true and put the Actor on a schedule: each run returns only the postings that weren't there last time. That turns a company list into a live hiring-signal feed — and because you're billed per returned job, a daily monitor over a big account list costs a fraction of a full re-scrape.

{
"companies": ["stripe.com", "figma.com", "databricks.com"],
"onlyNewJobs": true,
"monitorId": "target-accounts"
}
  • First run has no history, so it returns everything currently open and becomes your baseline. Later runs return only new postings (often zero — that's a working monitor, not a broken one).
  • Closed roles age out of the baseline automatically, so a genuinely re-opened role is reported again.
  • A company that fails to resolve keeps its history, so a transient outage doesn't cause a flood of false "new" jobs on the next run.
  • You're billed for the new postings only — not for re-reading the board each run, which is what makes a daily monitor over a big account list cheap.
  • The summary reports closedSinceLastRun per company, so roles disappearing is itself a signal you can track.
  • Use monitorId to run several independent monitors (e.g. target-accounts vs competitors) without them interfering.
  • Works with every filter, so you can monitor a narrow slice: "new sales roles at these 40 accounts."

For AI agents & MCP

This Actor is a live jobs API / ATS API and works out of the box as an MCP tool — any MCP-capable agent can call it to answer questions like "which of these accounts posted a sales-leadership role in the last 30 days?" against real-time data.

The contract is simple and deterministic:

  • Input: one required array, companies (names, domains, or board URLs — mixable). Everything else is an optional filter (titleKeywords, departmentKeywords, remoteOnly, postedAfter) or limit (maxJobs, maxJobsPerCompany). Full JSON Schema is published with the Actor, so tools introspect the parameters automatically.
  • Output: a flat JSON array, one object per job, always the same fields regardless of source ATS (see the table above) — no per-ATS branching in your prompt or code.
  • Grounding: every row carries matchConfidence so an agent can trust or down-weight a result; unconfirmed name guesses are excluded by default and never billed. For an exact, unambiguous lookup, pass the board URL.
  • Cost is legible: a flat $1 per 1,000 jobs, charged only for returned jobs after filters, with maxJobs as a hard per-call ceiling.

FAQ

Which applicant tracking systems are supported? Greenhouse, Lever, Ashby, Workable, Recruitee, SmartRecruiters, Personio, BambooHR, and Workday. Together these power the careers pages of most startups and scaleups and a large share of enterprises. One note on Workday: its boards can't be guessed from a company name, so provide the careers URL (e.g. https://company.wd5.myworkdayjobs.com/External) or make sure the company links its board from its website. More systems are added based on user requests — open an issue and it goes on the list.

What if a company isn't on any supported ATS? It's reported as not_found in the run summary rather than silently skipped, and you aren't charged for it. Companies using fully custom careers pages (most large enterprises) aren't covered by this Actor.

Can I run it on a schedule? Yes — use Apify Schedules to run it daily or weekly and feed the results anywhere via integrations (Google Sheets, webhooks, Make, Zapier, n8n) or the API. Job postings change fast; most users run recurring monitors on a fixed company list.

Is this legal? The Actor only accesses publicly available job postings that companies deliberately publish to attract applicants — no logins, no personal data. Still, always make sure your use case complies with applicable laws and the target sites' terms.

How fresh is the data? It's fetched live from each company's own job board at run time — the same data a visitor to their careers page sees, at the moment you run it.

How do I know the jobs really belong to the company I asked for — and what am I charged for? Every job row carries a matchConfidence field, and by default you're only charged for the confirmed tiers:

  • url — you provided the board URL (exact match, no ambiguity).
  • site — the board was found linked on the company's own website (strong).
  • verified — the board's own details match the company. On ATSs that publish a website (Workable, SmartRecruiters) this is a domain match; on ATSs that expose only a company name (Greenhouse, Lever, Ashby) it's a company-name match — reliable for distinctive names, but a very generic one-word name can collide with a different company that uses the same word (e.g. two unrelated firms both called "Vector"). Household-name enterprises (Walmart, Microsoft, etc.) mostly run custom career sites this Actor doesn't cover, so a generic-word domain is the main place to double-check.
  • probable — a name-guessed board we couldn't independently confirm; skipped and never charged unless you set includeUnconfirmed.

For a generic single-word company, an ambiguous name, or absolute certainty, paste the careers/board URL — that always resolves to exactly the board you gave.

A company I need isn't detected — what do I do? Paste its careers-page or job-board URL directly instead of the bare name/domain (this always wins), and open an issue so detection improves for everyone. Issues are typically answered same day.


This Actor is an independent tool and is not affiliated with or endorsed by Greenhouse, Lever, Ashby, Workable, Recruitee, SmartRecruiters, Personio, BambooHR, or any of the companies whose public job postings it retrieves.