Request a tool
All toolsAutomationsGuidesMCP serverRequest a toolPlatformsCategories
Career Site Jobs Scraper icon

Career Site Jobs Scraper

Scrape open jobs from a career page, a domain or a company name. Works with 10 ATS platforms. Get title, location, department and apply URL.

160 runs on Apify $0.00055 per job ($0.55 / 1,000)
Run this in the cloudRun on Apify →

Job Market Scrapers

How it works

  1. 1
    Open it on Apify

    Hit Run on Apify — it opens the tool in the cloud, no install.

  2. 2
    Set the inputs

    Adjust companies, maxItems, fullDetails (sensible defaults are pre-filled).

  3. 3
    Click Run

    The tool runs on Apify’s cloud and collects the data for you.

  4. 4
    Export the results

    Download as JSON, CSV or Excel, or pipe straight into your app, Google Sheets, or an AI agent.

Pricing

$0.00055 per job = $0.55 per 1,000

You are charged forWhenPrice
Job scrapedOne open job returned from a company career page.$0.00055

Pay-per-event pricing: you are billed per result, not per subscription. Billing is handled by Apify on your own account. These are the live Apify store prices, in effect since 2026-08-16, and they are what you are actually charged.

Inputs

FieldWhat it doesType
companiesOne entry per company, up to 50 per run. Any of these work: a careers page (https://www.figma.com/careers), a bare domain (figma.com), a board URL you already know (https://boards.greenhouse.io/figma, https://jobs.lever.co/matchgroup, https://jobs.ashbyhq.com/ramp, https://apply.workable.com/skroutz), or just the company name (Figma). The Actor works out which applicant tracking system the company uses and reads that system's public job board.array
maxItemsTotal jobs to return across all companies. The budget is shared evenly between them, so five companies and 50 jobs gives you ten each. Keep it low while you are testing - you pay per job.integer
fullDetailsOff by default. When on, each row gains a plain-text `description` field, and Ashby rows also gain their posted date. It makes the run slower and heavier because the description feeds are many times larger, so leave it off unless you actually need the job text.boolean
titleIncludesKeep only jobs whose title has at least one of these words or phrases. Whole words, any case: engineer finds "Senior Engineer" but not "Engineering Manager", so add both if you want both.array
titleExcludesLeave out jobs whose title has any of these words or phrases, for example intern or director. Whole words, any case.array
locationIncludesKeep only jobs whose location, as the board writes it, has at least one of these: London, New York, Remote, US. Whole words, any case, so US does not match Austin.array
locationExcludesLeave out jobs whose location has any of these words or phrases. Whole words, any case.array
remoteOnlyKeep only jobs the board marks remote: the remote flag on Lever, Ashby, Workable, SmartRecruiters, Recruitee and Breezy HR, or the word remote in the location on Greenhouse, Personio and Workday (in the title on Teamtailor), which have no flag. Hybrid jobs do not count.boolean
hasSalaryKeep only jobs whose salary field carries a figure. Only Lever, Ashby, Recruitee and Breezy HR publish pay; a company on any other system gets one free row saying it was skipped, and its board is not read.boolean
employmentTypesKeep only jobs whose employment type, in the board's own words, fits one of these. Contract also covers contractor and freelance; Temporary covers fixed term, short term and seasonal; Internship covers intern, trainee, apprentice and working student. A job with no type is left out. Greenhouse and Workday publish no type, so their companies are skipped.array
atsIncludesRead only companies whose jobs are on one of these systems. Any other company gets one free row saying it was skipped.array
atsExcludesSkip companies whose jobs are on any of these systems. Each skipped company gets one free row saying so.array
proxyUrlsLeave this empty for a normal run. Fill it in only if you want the traffic to leave through proxy servers you already pay for, one URL per line, in the form http://user:pass@host:port.array

What you get

A structured dataset — each result includes fields like:

inputUrlcompanyatsboardTokentitlelocationremotedepartmentemploymentTypepostedAtapplyUrljobUrljobIdsalary

Export every run as JSON, CSV or Excel, or send it to your app, a database, Google Sheets, or an AI agent.

Related tools in Job Market Scrapers

Other ready-to-run tools in the same category — all pay-per-use on the Apify cloud.

Internshala Scraper iconJob Market Scrapers

Internshala Scraper

Scrape Internshala internships and fresher jobs by keyword, city, category, stipend or work from home. Duration, apply-by date, openings. $0.34/1,000.

Ready to run — no setup

XING Jobs Scraper iconJob Market Scrapers

XING Jobs Scraper

Scrape XING jobs in Germany, Austria and Switzerland. Company, employment type, career level, posted date, apply URL and salary. $0.51 per 1,000 jobs.

1 use cases

ZipRecruiter Scraper iconJob Market Scrapers

ZipRecruiter Scraper

Scrape ZipRecruiter jobs by keyword, city, remote or salary. Exact posted dates, apply URLs, pay marked published or estimated. $0.80 per 1,000.

Ready to run — no setup

LinkedIn Company Employees Scraper iconJob Market Scrapers

LinkedIn Company Employees Scraper

Find a company's employees on LinkedIn, no login. Give a company URL or name. Get name, headline, job title, location and profile URL. $1.80 per 1,000.

1 use cases

Indeed Jobs Scraper iconJob Market Scrapers

Indeed Jobs Scraper

Scrape Indeed jobs by keyword and location in 11 countries. Get company, salary, benefits, remote flag, employer rating and apply URL. $4.00 per 1,000.

16 use cases

Glassdoor Company Reviews Scraper iconJob Market Scrapers

Glassdoor Company Reviews Scraper

Scrape Glassdoor reviews: pros, cons, six sub-ratings, recommend rate and CEO approval. First page per company without login. $2.50 per 1,000.

20 use cases

See all Job Market Scrapers →

Career Site Jobs Scraper: open roles from a company careers page, no account needed

Paste a careers page, a bare domain, a job-board URL or just a company name. You get one row per open job, with the title, location, department, posted date, the apply link, and the salary where the board publishes one.

The catch to know before you buy: it reads ten applicant tracking systems. A company running on anything else comes back as an uncharged diagnostic row saying so, not as data.

InputCareers page URLs, domains, board URLs or company names
OutputOne row per open job
Ceiling50 companies and 5,000 jobs per run
Account neededNone
Price$0.55 per 1,000 jobs, flat on every plan

🔎 What Career Site Jobs Scraper does

Most careers pages are a thin front end over an applicant tracking system, and those systems publish the open roles as plain JSON so the company page has something to draw. That feed is what this reads. Ten families are covered: Greenhouse, Lever, Ashby, Workable, SmartRecruiters, Recruitee, Personio, Teamtailor, Breezy HR and Workday.

The work it saves you is the detection. Knowing in advance that Figma hires through Greenhouse under the token figma and that Ramp uses Ashby is fine for three companies and hopeless for three hundred. Paste whatever you happen to have, and every row comes back stamped with the ats and the boardToken it resolved to, so your first run also builds that mapping for you.

You can narrow the rows too: words in the title or the location, the system, remote only, jobs that show a salary, or an employment type. Jobs a filter leaves out are not charged.

📥 What you give it

Every field is optional. Run it with the input empty and you get one labelled sample row so you can see the shape first.

{
  "companies": [
    "https://www.figma.com/careers",
    "https://jobs.ashbyhq.com/ramp",
    "notion.com",
    "Databricks"
  ],
  "maxItems": 100,
  "titleIncludes": ["engineer", "engineering"],
  "titleExcludes": ["intern"]
}
FieldDefaultWhat it is
companiesnoneOne entry per company, up to 50. A careers page, a bare domain, a board URL, or the company name on its own.
maxItems50Total jobs across every company, 1 to 5,000. The budget is split evenly, so five companies and 50 jobs gives ten each.
fullDetailsfalseAdds a plain-text description to each row, and fills in the posted date on Ashby rows. Much heavier, because those feeds carry the whole job text.
titleIncludesnoneKeep only jobs whose title has one of these words or phrases. Whole words, any case: engineer finds "Senior Engineer" but not "Engineering Manager", so list both if you want both.
titleExcludesnoneLeave out jobs whose title has any of these, for example intern (which leaves "International Sales" alone).
locationIncludesnoneKeep only jobs whose location, as the board wrote it, has one of these. Whole words, so US finds "Remote - US" and not "Austin".
locationExcludesnoneLeave out jobs whose location has any of these.
remoteOnlyfalseKeep only jobs the board marks remote: the remote flag on Lever, Ashby, Workable, SmartRecruiters, Recruitee and Breezy HR, or the word "remote" in the location on Greenhouse, Personio and Workday (in the title on Teamtailor). Hybrid jobs never count.
hasSalaryfalseKeep only jobs whose salary carries a figure. Only Lever, Ashby, Recruitee and Breezy HR publish pay, so companies on the other six are skipped.
employmentTypesnoneAny of fulltime, parttime, contract, temporary, internship, permanent, matched on the board's own employmentType wording. Contract also takes contractor and freelance; temporary takes fixed term, short term and seasonal; internship takes intern, trainee, apprentice and working student. A job with no type is left out, and Greenhouse and Workday publish none, so their companies are skipped.
atsIncludesnoneRead only companies on these systems: greenhouse, lever, ashby, workable, smartrecruiters, recruitee, personio, teamtailor, breezy, workday.
atsExcludesnoneSkip companies on any of these systems.
proxyUrlsnoneLeave it empty for a normal run. It exists for callers who want the traffic to leave through servers they already pay for, as http://user:pass@host:port.

A board URL is the most reliable input, a domain is next, a bare name is loosest. Workday always needs a full URL, because its addresses carry a tenant and a site name nothing can guess.

Filters run on what each board sends, so a strict one can return fewer jobs than maxItems. On Lever, SmartRecruiters and Workday, which send boards in pages, a filtered run reads at most 1,000 jobs per company, or the company's share of maxItems if larger. A company no filter could pass, say a Greenhouse board when you ask for a salary, gets one free row saying it was skipped.

📤 What you get back

A real row, from run VwcL7Y48Jfl3CxOKL:

{
  "ok": true,
  "charged": true,
  "recordType": "job",
  "inputUrl": "https://www.figma.com/careers",
  "company": "figma",
  "ats": "greenhouse",
  "atsName": "Greenhouse",
  "boardToken": "figma",
  "title": "Distribution Partner Manager",
  "location": "San Francisco, CA • New York, NY • United States",
  "remote": null,
  "department": "Business Development",
  "employmentType": null,
  "postedAt": "2026-02-28T00:00:43.000Z",
  "applyUrl": "https://boards.greenhouse.io/figma/jobs/5813967004?gh_jid=5813967004",
  "jobUrl": "https://boards.greenhouse.io/figma/jobs/5813967004?gh_jid=5813967004",
  "jobId": "5813967004",
  "salary": null,
  "detectedVia": "token",
  "scrapedAt": "2026-09-21T01:23:09.209Z"
}

Three nulls on that row, and none of them are guesses: Greenhouse publishes no employment type, salary or remote flag in its listing feed.

FieldWhat it is
inputUrlThe exact string you supplied, so you can join rows back onto your list.
ats, boardTokenThe system and the company's id on it. atsName is the same system spelled for people.
jobIdThe posting's id on its board. This is the key to diff on when you re-run.
postedAtISO 8601 in UTC. null where the board does not publish a date.
locationAs the company wrote it, not normalised. One writes "Remote - US", another writes the full country.
detectedViaurl if your input already named the board, token if it was matched from the domain or name, html if it was read off the careers page.

🧾 Reading the output

Three kinds of row, and they are easy to separate.

RowHow to spot itBilled
A jobrecordType: "job"yes
The sample row_sample: true, and only when the input named no companiesno
A diagnostic_diagnostic: true and ok: falseno

Filter on recordType == "job" and you have your jobs. The charged field is written when the row is built, a moment before the charge goes out, so read it as "this is a real row" rather than as a receipt. If a charge ever fails, the run adds a CHARGE_ERROR diagnostic at the end saying so.

Each diagnostic carries the inputUrl it belongs to and an errorCode:

CodeWhat it means
NO_RESULTSThe company resolved to no supported board, its board has no open roles, none of its jobs passed your filters, or your filters skip its system. details says which.
BAD_INPUTA filter could never match, for example an entry with no letters, or hasSalary with only Greenhouse allowed. Nothing was read.
NOT_FOUNDA board id was tried and does not exist.
RATE_LIMITEDA board throttled the run. Split the list across two runs.
SERVER_ERROR, NETWORKA board answered badly or could not be reached. Re-run it.
BLOCKEDA board turned the request away this time.
TIME_BUDGETThe run ran out of time before it reached that company.
PROXY_INPUT_ADJUSTEDSomething in your proxyUrls was not usable and was adjusted.

▶️ How to run it

1. Open Career Site Jobs Scraper and click Try for free. 2. Put your companies in Career page URLs or company names, one per line. 3. Set Maximum jobs. Keep it small on the first run. 4. Tick Include the full job description only if you need the job text. 5. Click Start, then download the dataset as JSON, CSV or Excel, or read it from the Apify API.

💰 How much does it cost?

$0.55 per 1,000 jobs. The same rate on every Apify plan, with no volume tiers.

One charge per job row written to your dataset. Duplicate postings inside a company and jobs your filters leave out are dropped before anything is billed, and neither the sample row nor any diagnostic row is charged. Working out which system a company uses is not billed either: you pay for jobs, not for lookups.

💡 What people use it for

  • Watching a named list of companies and diffing on jobId to see what opened this week.
  • Building an ATS map for a portfolio or a market, since every row names the system and the token.
  • Pulling the full open board of a company before a sales or recruiting push.
  • Checking how a role is actually titled across twenty companies before writing a job ad.

🚧 What it does not do

  • Ten systems, not all of them. A company on any other software returns a diagnostic row, not

data.

  • Filters read the board's own words. A remote job the board never flags, or pay written only

inside the job text, is left out by remoteOnly or hasSalary.

  • A company only resolves if its board id can be derived from its domain or name, or is sitting

on its careers page, or you supplied the board URL yourself.

  • Posted dates are not universal. Ashby carries them only with full details on, and Personio

never does.

  • Department, employment type and salary depend on the board, and most boards never publish a

salary.

  • Open roles only. No history, no closed-job archive.
  • Job text is off by default and is flattened to plain text when you turn it on.
  • A list that starts with dead entries gives up early and returns TIME_BUDGET rows for the

rest rather than grinding through all fifty. Board URLs avoid it entirely.

🧭 Which jobs scraper do you need?

If you wantUse
Open jobs from a company's own careers pageThis one
Greenhouse, Lever and Ashby boards with full descriptionsMulti-ATS Jobs Scraper
Jobs by keyword and location on LinkedInLinkedIn Jobs Scraper
Remote-only listingsRemotive Jobs Scraper
German, Austrian and Swiss listingsXING Jobs Scraper

❓ Questions people ask

What exactly do I paste in? Whatever you have. figma.com, https://www.figma.com/careers or just Figma all reach the same board, and the more specific the input, the fewer lookups.

Why did I get fewer jobs than I asked for? Because the budget is split evenly between companies and some boards are small, because a company returned nothing, or because your filters left most of a board out. Either way you are billed for the rows you got.

Will one broken company kill the run? No. It becomes an uncharged diagnostic row and the run carries on through the rest of your list.

Is scraping job boards legal? These are public feeds companies publish so their own careers pages can render. Apify's write-up on scraping and the law is a fair starting point, and we are not lawyers.

🆘 If something breaks

Open the Issues tab on the actor page. Send the run ID and the exact entry from companies that misbehaved. The diagnostic row's errorCode and inputUrl usually explain it on their own.