Career Page Jobs Scraper: Workable, SmartRecruiters, Personio avatar

Career Page Jobs Scraper: Workable, SmartRecruiters, Personio

Pricing

$2.00 / 1,000 job scrapeds

Go to Apify Store
Career Page Jobs Scraper: Workable, SmartRecruiters, Personio

Career Page Jobs Scraper: Workable, SmartRecruiters, Personio

Scrape job postings from any company careers page. Works with Workable, SmartRecruiters, Personio, Recruitee, Teamtailor, BambooHR, Greenhouse, Lever, Ashby, Workday, Breezy and Pinpoint (auto-detected). Normalized jobs with location, remote, salary, description, apply URL.

Pricing

$2.00 / 1,000 job scrapeds

Rating

0.0

(0)

Developer

PulseData

PulseData

Maintained by Community

Actor stats

0

Bookmarked

20

Total users

4

Monthly active users

an hour ago

Last modified

Features

Limited permissions

Share

Career Page Jobs Scraper reads the public job boards of 12 applicant tracking systems (ATS) and returns every open position as one normalized record with title, locations, remote flag, department, salary where available, posting date, description and apply link. Paste career page or job board URLs and the actor detects the ATS. It costs $2 per 1,000 jobs, with descriptions included.

Supported ATS (auto-detected): Greenhouse, Lever, Ashby, Workday, Workable, SmartRecruiters, Personio, Recruitee, Teamtailor, BambooHR, Breezy HR, Pinpoint.

Works with Workable, SmartRecruiters, Personio, Recruitee, Teamtailor and BambooHR

There is no separate PulseData actor for these six systems. Each example is a real board:

ATSExample board
Workablehttps://apply.workable.com/huggingface/
SmartRecruitershttps://careers.smartrecruiters.com/BoschGroup
Personiohttps://360t.jobs.personio.de (.de and .com boards)
Recruiteehttps://bunq.recruitee.com
Teamtailorhttps://oatly.teamtailor.com
BambooHRhttps://gitkraken.bamboohr.com/careers

Features

  • Scrape jobs from any company careers page. Paste https://example.com/careers and the actor scans the page HTML for an embedded or linked board.
  • Scrape Greenhouse, Lever, Ashby and Workday jobs with one input list, including EU-hosted Greenhouse and Lever boards and any myworkdayjobs.com career site.
  • Scrape Workable, SmartRecruiters, Personio, Recruitee, Teamtailor, BambooHR, Breezy and Pinpoint jobs with the same input and output.
  • One schema for every ATS, so you can mix hundreds of companies and export jobs to CSV, JSON or Excel.
  • Filter jobs by keyword, location, remote and posting date before they are saved and charged.
  • Monitor new job postings of a company. With onlyNewJobs a scheduled run returns and charges only jobs it has not delivered before.

Use cases

  • Job boards and aggregators: pull fresh postings from a list of companies on a schedule and keep your own board in sync.
  • Sales and lead generation: a company hiring a "Salesforce Administrator" or "Head of SEO" is often buying tooling for that team. Put those titles in keywords.
  • Talent intelligence: hiring volume by department, location, remote policy and published salary ranges over time.

Input

{
"startUrls": [
{ "url": "https://boards.greenhouse.io/stripe" },
{ "url": "https://jobs.lever.co/spotify" },
{ "url": "https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite" }
],
"keywords": ["engineer", "data"],
"locations": ["Remote", "Berlin", "United States"],
"remoteOnly": false,
"postedWithinDays": 30,
"includeDescription": true,
"maxJobsPerCompany": 200
}
FieldTypeDefaultWhat it does
startUrlsarray(required)Career pages or ATS job board URLs.
keywordsarray[]Keep only jobs whose title contains one of these words (case-insensitive).
locationsarray[]Keep only jobs whose location, secondary locations or country contain one of these strings.
remoteOnlybooleanfalseKeep only jobs flagged as remote by the ATS or whose location mentions remote.
postedWithinDaysinteger0Keep only jobs posted or updated in the last N days. 0 means no limit. Jobs without any date are kept.
includeDescriptionbooleantrueReturn the description as HTML and plain text. For Workday, SmartRecruiters, BambooHR, Workable and Breezy this costs one extra request per job.
maxJobsPerCompanyinteger0Cap on jobs per career page, counting only jobs that pass the filters. Once reached, no further job details are fetched. 0 means no limit.
onlyNewJobsbooleanfalseMonitor mode: output and charge only jobs not delivered on an earlier run.
monitorStoreNamestringemptyKey-value store that remembers delivered jobs. Empty means a name derived from the career pages and filters.
proxyConfigurationobject{ "useApifyProxy": false }Optional Apify Proxy.

Other supported URL shapes:

ATSExample
Greenhousehttps://boards.greenhouse.io/stripe, https://job-boards.greenhouse.io/company, EU: https://job-boards.eu.greenhouse.io/company
Leverhttps://jobs.lever.co/spotify, https://jobs.eu.lever.co/company
Ashbyhttps://jobs.ashbyhq.com/ramp
Workdayhttps://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite
SmartRecruitersalso https://jobs.smartrecruiters.com/BoschGroup
Breezy HRhttps://company.breezy.hr
Pinpointhttps://company.pinpointhq.com
Company sitehttps://example.com/careers (server-rendered pages only; see the FAQ).

Get new jobs from career pages every day (monitor mode)

Turn on onlyNewJobs to get only the jobs a company posted since your last run:

{
"startUrls": [{ "url": "https://boards.greenhouse.io/stripe" }],
"maxJobsPerCompany": 0,
"onlyNewJobs": true
}

Delivered job IDs are kept in a named key-value store, and later runs skip them. A ready task is on the example page Get new jobs from a Greenhouse board every day. For alerts:

For alerts, save the input as a task with an Apify schedule and an integration (email, Slack, Google Sheets, Make, Zapier or a webhook) that fires on each succeeded run.

Details:

  • maxJobsPerCompany counts new jobs only. Leave it at 0 on the first run so that run remembers every open job.
  • Jobs seen before are dropped before their detail request, and are neither output nor charged.
  • Without monitorStoreName each combination of career pages and filters keeps its own history. Set a name to share history between inputs, or a new one to start over.
  • A job cut off by maxJobsPerCompany, the run timeout or the run's maximum cost is not remembered and comes on the next run. Schedule one run per store, since two parallel runs can deliver the same new job.

Output

One dataset item per job:

{
"title": "Security Engineer, Cloud",
"company": "ramp",
"location": "New York, NY (HQ)",
"locations": ["New York, NY (HQ)", "Remote (Canada)"],
"country": "USA",
"remote": true,
"workplaceType": "Hybrid",
"department": "Engineering",
"team": "Backend",
"employmentType": "FullTime",
"seniority": null,
"salary": "$211.4K–$290.6K",
"postedAt": "2026-04-07T17:12:35.753Z",
"updatedAt": null,
"url": "https://jobs.ashbyhq.com/ramp/34413f8d-26bf-4bbc-8ade-eb309a0e2245",
"applyUrl": "https://jobs.ashbyhq.com/ramp/34413f8d-26bf-4bbc-8ade-eb309a0e2245/application",
"descriptionHtml": "<h1><strong>About Ramp</strong></h1><p>…</p>",
"descriptionText": "ABOUT RAMP\n\nRamp is building the smart infrastructure for finance teams…",
"ats": "ashby",
"atsJobId": "34413f8d-26bf-4bbc-8ade-eb309a0e2245",
"sourceUrl": "https://jobs.ashbyhq.com/ramp",
"scrapedAt": "2026-08-19T12:41:29.000Z"
}

Which fields are filled depends on what each ATS publishes. seniority comes from SmartRecruiters, Personio and Recruitee. salary comes from the ATS where it has a pay field (Lever, Ashby, Teamtailor, BambooHR, Recruitee, Breezy, Pinpoint); otherwise the actor looks for a pay range in the first part of the description text.

If a URL fails (unknown board, no ATS found on a careers page), the dataset gets one row with sourceUrl and error (for example NO_SUPPORTED_ATS_DETECTED). These rows are not charged.

Pricing

Pay per event: you pay for each job saved to the dataset.

  • job-scraped: $0.002 per job ($2 per 1,000 jobs). There is no separate start fee.

Worked example: 50 company career pages with an average of 120 open jobs each is 6,000 jobs. That is 6,000 x $0.002 = $12.00. Jobs removed by filters are not charged, so filtering to engineering roles only (say 1,500 jobs) brings the same run down to $3.00.

In monitor mode only new jobs are charged: a daily run over the same 50 career pages that finds 40 new jobs costs 40 x $0.002 = $0.08, and a run with nothing new costs nothing in result events.

FAQ

What can it not do? It does not render JavaScript, so a careers page that builds its board entirely in the browser may return NO_SUPPORTED_ATS_DETECTED; paste the board URL instead. It does not support systems outside the 12 listed (for example iCIMS, Taleo or SuccessFactors), and it does not log in or read internal job postings.

Do I need proxies? Normally no. The actor retries on HTTP 429 and 5xx with backoff. Turn on proxyConfiguration only if very large lists hit rate limits.

How accurate is postedAt? It is the date the ATS publishes. With includeDescription off, Workday dates are estimated from labels like "Posted 3 Days Ago" and missing for "30+ days" jobs.

Use it from Claude, ChatGPT or Cursor (Apify MCP server)

Add the Apify MCP server to your MCP client with this URL, which loads only this actor as a tool:

https://mcp.apify.com?tools=pulsedata/career-page-jobs-scraper

Then ask, for example, "list every remote job posted in the last 7 days on these career pages", and the assistant fills the input, runs the actor and reads the jobs back as JSON. Billing is the same as a normal run.

Paying from an AI agent without an Apify account (x402 and Skyfire)

An agent can buy a prepaid, spend-capped Apify token at Apify AGI, paid in USDC through x402 or from a Skyfire wallet, and use it for both the API and the MCP server. This actor runs with limited permissions, so it works with these tokens. The smallest token is $1, tokens expire 14 days after purchase, and Apify marks agentic payments as experimental.

Example pages

Example runs of this actor:

The single-ATS versions have their own example runs: