Career Site Jobs Scraper & API: 12 ATS, One JSON Shape avatar

Career Site Jobs Scraper & API: 12 ATS, One JSON Shape

Pricing

from $0.70 / 1,000 jobs

Go to Apify Store
Career Site Jobs Scraper & API: 12 ATS, One JSON Shape

Career Site Jobs Scraper & API: 12 ATS, One JSON Shape

One job board API across 12 applicant tracking systems. Paste a career page URL, get 30 fields per job in one shape, no key. Monitor returns only changes.

Pricing

from $0.70 / 1,000 jobs

Rating

0.0

(0)

Developer

Dodo Data

Dodo Data

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

7 days ago

Last modified

Share

Get every open job from company career pages hosted on Greenhouse, Lever, Ashby, SmartRecruiters, Recruitee, Workable, Personio, Breezy, Pinpoint, Rippling, Teamtailor and Workday as one clean JSON shape. 30 fields per job, 304 jobs from three companies in 18 seconds, with pay ranges as numbers, remote/hybrid flag, department, team and full description.

Paste career-page URLs. The Actor reads the job feed each of these systems publishes for embedding career pages, so jobs come straight from the employer: no aggregator, no duplicates, no expired listings.

What you get

The sample rows below show a plain run. A run with a Monitor name adds change_status, first_seen_at and last_seen_at, which is what takes the row to 30 fields.

Ten real rows from the run of 2026-09-17 (descriptions shortened here to 160 characters; the dataset carries them in full):

[
{
"id": "greenhouse:duolingo:8653419002",
"ats": "greenhouse",
"company": "duolingo",
"company_name": "Duolingo",
"title": "Ad Sales Lead, Central",
"department": "Business Development",
"team": null,
"location": "Remote - Illinois",
"locations": [
"Remote - Illinois",
"Remote"
],
"country": null,
"workplace_type": "remote",
"remote": true,
"employment_type": null,
"experience_level": null,
"salary_min": 140000,
"salary_max": 210000,
"salary_currency": "USD",
"salary_period": "year",
"salary_text": "Salary Range:",
"posted_at": "2026-07-28T13:47:45.000Z",
"updated_at": "2026-08-21T17:02:33.000Z",
"requisition_id": "R-01182",
"description": "Our mission at Duolingo is to develop the best education in the world and make it universally available. It’s a big mission, and that’s where you come in!\nAt…",
"apply_url": "https://careers.duolingo.com/jobs/8653419002?gh_jid=8653419002",
"url": "https://careers.duolingo.com/jobs/8653419002?gh_jid=8653419002",
"scraped_at": "2026-09-17T18:57:16.103Z"
},
{
"id": "greenhouse:duolingo:8705196002",
"ats": "greenhouse",
"company": "duolingo",
"company_name": "Duolingo",
"title": "Ad Sales Lead - West",
"department": "Business",
"team": null,
"location": "Remote - California",
"locations": [
"Remote - California",
"Remote"
],
"country": null,
"workplace_type": "remote",
"remote": true,
"employment_type": null,
"experience_level": null,
"salary_min": 152000,
"salary_max": 228000,
"salary_currency": "USD",
"salary_period": "year",
"salary_text": "Salary Range:",
"posted_at": "2026-08-13T13:22:34.000Z",
"updated_at": "2026-09-03T16:23:10.000Z",
"requisition_id": "R-01199",
"description": "Our mission at Duolingo is to develop the best education in the world and make it universally available. It’s a big mission, and that’s where you come in!\nAt…",
"apply_url": "https://careers.duolingo.com/jobs/8705196002?gh_jid=8705196002",
"url": "https://careers.duolingo.com/jobs/8705196002?gh_jid=8705196002",
"scraped_at": "2026-09-17T18:57:16.112Z"
},
{
"id": "greenhouse:duolingo:8806187002",
"ats": "greenhouse",
"company": "duolingo",
"company_name": "Duolingo",
"title": "Associate Product Manager, Intern",
"department": "University",
"team": null,
"location": "Pittsburgh, PA",
"locations": [
"Pittsburgh, PA",
"Pittsburgh, Pennsylvania, United States"
],
"country": null,
"workplace_type": null,
"remote": null,
"employment_type": null,
"experience_level": null,
"salary_min": 54,
"salary_max": 56,
"salary_currency": "USD",
"salary_period": "year",
"salary_text": "Hourly Range for this internship is:",
"posted_at": "2026-09-15T16:00:00.000Z",
"updated_at": "2026-09-15T17:20:27.000Z",
"requisition_id": "1267",
"description": "Our mission at Duolingo is to develop the best education in the world and make it universally available. It’s a big mission, and that’s where you come in!\nAt…",
"apply_url": "https://careers.duolingo.com/jobs/8806187002?gh_jid=8806187002",
"url": "https://careers.duolingo.com/jobs/8806187002?gh_jid=8806187002",
"scraped_at": "2026-09-17T18:57:16.115Z"
},
{
"id": "lever:spotify:2193db3f-77c5-43b8-b030-8f92c9882bf1",
"ats": "lever",
"company": "spotify",
"company_name": null,
"title": "Android Engineer - Experience",
"department": "Engineering",
"team": "Experience",
"location": "London",
"locations": [
"London",
"Stockholm"
],
"country": "GB",
"workplace_type": "hybrid",
"remote": false,
"employment_type": "Permanent",
"experience_level": null,
"salary_min": null,
"salary_max": null,
"salary_currency": null,
"salary_period": null,
"salary_text": null,
"posted_at": "2026-06-23T11:29:45.805Z",
"updated_at": null,
"requisition_id": null,
"description": "We design Spotify’s consumer experience—end to end, moment to moment, across every screen, platform, and partner integration. Our mission is to make listenin…",
"apply_url": "https://jobs.lever.co/spotify/2193db3f-77c5-43b8-b030-8f92c9882bf1/apply",
"url": "https://jobs.lever.co/spotify/2193db3f-77c5-43b8-b030-8f92c9882bf1",
"scraped_at": "2026-09-17T18:57:25.877Z"
},
{
"id": "lever:spotify:d87833d0-fb78-4794-b45d-3fe5c8274bc8",
"ats": "lever",
"company": "spotify",
"company_name": null,
"title": "Artist & Label Partnerships Contractor, Vietnam",
"department": "Content",
"team": "Music Business",
"location": "Ho Chi Minh",
"locations": [
"Ho Chi Minh"
],
"country": "VN",
"workplace_type": "hybrid",
"remote": false,
"employment_type": "Short Term",
"experience_level": null,
"salary_min": null,
"salary_max": null,
"salary_currency": null,
"salary_period": null,
"salary_text": null,
"posted_at": "2026-08-27T03:43:07.805Z",
"updated_at": null,
"requisition_id": null,
"description": "Spotify is looking for a short-term contractor for the Artist & Label Partnerships team in Vietnam.\nThe Artist & Label Partnerships team are the face of Spot…",
"apply_url": "https://jobs.lever.co/spotify/d87833d0-fb78-4794-b45d-3fe5c8274bc8/apply",
"url": "https://jobs.lever.co/spotify/d87833d0-fb78-4794-b45d-3fe5c8274bc8",
"scraped_at": "2026-09-17T18:57:25.878Z"
},
{
"id": "lever:spotify:ddb5dfa9-c5ef-4199-bd19-c179af568cc8",
"ats": "lever",
"company": "spotify",
"company_name": null,
"title": "Artist & Label Partnerships Manager, Maghreb",
"department": "Content",
"team": "Music Business",
"location": "Dubai",
"locations": [
"Dubai"
],
"country": "AE",
"workplace_type": "onsite",
"remote": false,
"employment_type": "Permanent",
"experience_level": null,
"salary_min": null,
"salary_max": null,
"salary_currency": null,
"salary_period": null,
"salary_text": null,
"posted_at": "2026-08-12T17:18:58.306Z",
"updated_at": null,
"requisition_id": null,
"description": "What You'll Do\n• Be a primary Spotify partner for artists, labels, and other music partners across Morocco, Algeria, and Tunisia, building relationships that…",
"apply_url": "https://jobs.lever.co/spotify/ddb5dfa9-c5ef-4199-bd19-c179af568cc8/apply",
"url": "https://jobs.lever.co/spotify/ddb5dfa9-c5ef-4199-bd19-c179af568cc8",
"scraped_at": "2026-09-17T18:57:25.879Z"
},
{
"id": "ashby:ramp:34413f8d-26bf-4bbc-8ade-eb309a0e2245",
"ats": "ashby",
"company": "ramp",
"company_name": null,
"title": "Security Engineer, Cloud",
"department": "Engineering",
"team": "Backend",
"location": "New York, NY (HQ)",
"locations": [
"New York, NY (HQ)",
"Remote (Canada)",
"Remote (US)",
"Miami, FL"
],
"country": "USA",
"workplace_type": "hybrid",
"remote": false,
"employment_type": "FullTime",
"experience_level": null,
"salary_min": 211400,
"salary_max": 290600,
"salary_currency": "USD",
"salary_period": "year",
"salary_text": "$211.4K – $290.6K • Offers Equity",
"posted_at": "2026-04-07T17:12:35.753Z",
"updated_at": null,
"requisition_id": null,
"description": "ABOUT RAMP\nRamp is building the smart infrastructure for finance teams, embedded in the transaction flow of every dollar a business spends. We automate how o…",
"apply_url": "https://jobs.ashbyhq.com/ramp/34413f8d-26bf-4bbc-8ade-eb309a0e2245/application",
"url": "https://jobs.ashbyhq.com/ramp/34413f8d-26bf-4bbc-8ade-eb309a0e2245",
"scraped_at": "2026-09-17T18:57:16.331Z"
},
{
"id": "ashby:ramp:f564dcf9-9390-4a3f-896f-8047a5086040",
"ats": "ashby",
"company": "ramp",
"company_name": null,
"title": "Mobile Engineer, Android",
"department": "Engineering",
"team": "Mobile",
"location": "New York, NY (HQ)",
"locations": [
"New York, NY (HQ)",
"Remote (Canada)",
"San Francisco, CA",
"Remote (US)"
],
"country": "USA",
"workplace_type": "hybrid",
"remote": false,
"employment_type": "FullTime",
"experience_level": null,
"salary_min": 189000,
"salary_max": 330000,
"salary_currency": "USD",
"salary_period": "year",
"salary_text": "$189K – $330K • Offers Equity",
"posted_at": "2025-07-31T21:58:34.674Z",
"updated_at": null,
"requisition_id": null,
"description": "ABOUT RAMP\nRamp is building the smart infrastructure for finance teams, embedded in the transaction flow of every dollar a business spends. We automate how o…",
"apply_url": "https://jobs.ashbyhq.com/ramp/f564dcf9-9390-4a3f-896f-8047a5086040/application",
"url": "https://jobs.ashbyhq.com/ramp/f564dcf9-9390-4a3f-896f-8047a5086040",
"scraped_at": "2026-09-17T18:57:16.331Z"
},
{
"id": "ashby:ramp:4e64ab86-4e30-403b-b1b9-41dc052570ce",
"ats": "ashby",
"company": "ramp",
"company_name": null,
"title": "Software Engineer, Frontend",
"department": "Engineering",
"team": "Frontend",
"location": "New York, NY (HQ)",
"locations": [
"New York, NY (HQ)",
"Remote (Canada)",
"San Francisco, CA",
"Remote (US)",
"Miami, FL"
],
"country": "USA",
"workplace_type": "hybrid",
"remote": false,
"employment_type": "FullTime",
"experience_level": null,
"salary_min": 143200,
"salary_max": 284000,
"salary_currency": "USD",
"salary_period": "year",
"salary_text": "$143.2K – $284K • Offers Equity",
"posted_at": "2023-03-09T17:44:00.817Z",
"updated_at": null,
"requisition_id": null,
"description": "ABOUT RAMP\nRamp is building the smart infrastructure for finance teams, embedded in the transaction flow of every dollar a business spends. We automate how o…",
"apply_url": "https://jobs.ashbyhq.com/ramp/4e64ab86-4e30-403b-b1b9-41dc052570ce/application",
"url": "https://jobs.ashbyhq.com/ramp/4e64ab86-4e30-403b-b1b9-41dc052570ce",
"scraped_at": "2026-09-17T18:57:16.332Z"
},
{
"id": "ashby:ramp:4745807e-82f4-4b1a-857c-dc8dadc73076",
"ats": "ashby",
"company": "ramp",
"company_name": null,
"title": "Credit Risk Associate",
"department": "Risk",
"team": "Risk",
"location": "New York, NY (HQ)",
"locations": [
"New York, NY (HQ)"
],
"country": "USA",
"workplace_type": "hybrid",
"remote": false,
"employment_type": "FullTime",
"experience_level": null,
"salary_min": 108000,
"salary_max": 200000,
"salary_currency": "USD",
"salary_period": "year",
"salary_text": "$108K – $200K • Offers Equity",
"posted_at": "2026-08-12T20:22:32.685Z",
"updated_at": null,
"requisition_id": null,
"description": "ABOUT RAMP\nRamp is building the smart infrastructure for finance teams, embedded in the transaction flow of every dollar a business spends. We automate how o…",
"apply_url": "https://jobs.ashbyhq.com/ramp/4745807e-82f4-4b1a-857c-dc8dadc73076/application",
"url": "https://jobs.ashbyhq.com/ramp/4745807e-82f4-4b1a-857c-dc8dadc73076",
"scraped_at": "2026-09-17T18:57:16.332Z"
}
]

In that run 224 of 304 jobs (74%) carried a published pay range, parsed into salary_min, salary_max, salary_currency and salary_period.

What people use it for

  • Track who is hiring, and for what. For example, "every new engineering role at my 200 target accounts since yesterday" as a sales or recruiting signal. Set Posted within (days) to 1 and schedule it daily.
  • Feed a job board, a newsletter or an AI agent with first-party jobs. For example, "remote data roles with a published salary, from these 500 startups", without scraping aggregators.
  • Benchmark pay. For example, "published pay ranges for product managers across companies using Ashby and Greenhouse", already numeric.

Why not build it yourself

Building this yourself: twelve different sources, twelve shapes, escaped HTML, pay ranges in three formats, pagination on one of them: about 12 hours, then upkeep each time a vendor changes a field. This Actor: $1.00 per 1,000 jobs, and when a feed changes we fix it within 48 hours. Every Apify account includes $5 of free usage a month, so your first 5,000 jobs cost nothing.

Founding price: $1.00 per 1,000 jobs for the first 100 users. It then rises to $1.50. Users who joined at the founding price keep it.

Proof

Success rate (staging runs on Apify, 17 to 18 Sept 2026)100% from 5 runs, 15 requests, 0 failed attempts
Last verified against the live feeds2026-09-18
Typical run300 jobs from 3 companies in 5 to 20 seconds
Issues answered within6 hours
Feed changes fixed within48 hours

Changelog at the bottom of this page, and every fix is dated.

Supported career pages

SystemExample URLShort form
Greenhousehttps://job-boards.greenhouse.io/duolingo or https://boards.greenhouse.io/duolingogreenhouse:duolingo
Leverhttps://jobs.lever.co/spotify (EU: jobs.eu.lever.co)lever:spotify
Ashbyhttps://jobs.ashbyhq.com/rampashby:ramp
SmartRecruitershttps://jobs.smartrecruiters.com/BoschGroupsmartrecruiters:BoschGroup
Recruiteehttps://bunq.recruitee.comrecruitee:bunq
Workablehttps://apply.workable.com/zegoworkable:zego
Personiohttps://personio.jobs.personio.depersonio:personio.de
Breezy HRhttps://attentive.breezy.hrbreezy:attentive
Pinpointhttps://workwithus.pinpointhq.compinpoint:workwithus
Ripplinghttps://ats.rippling.com/rippling/jobsrippling:rippling (title, department, location and URL only, the feed carries no description)
Workdayhttps://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSiteworkday:nvidia.wd5/NVIDIAExternalCareerSite. A Workday career site lists its 2,000 newest jobs at most; the description comes from each job's public page, so Workday costs one request per job
Teamtailorhttps://career.teamtailor.comteamtailor:career.teamtailor.com, and for a career site on the company's own domain use teamtailor:careers.example.com

A career page on the company's own domain usually links or redirects to one of these. Open a job, look at the address bar, and paste that.

Monitor career pages: only new, changed and closed jobs

Most people do not want the whole board every day. They want to know what changed. Give the run a Monitor name and put it on a schedule:

  • every job comes back with change_status (new, updated, unchanged) and first_seen_at, the date the monitor first saw it, which survives later edits and tells you how long a role has been open
  • with Only changes on, unchanged jobs are left out and not billed. Measured on five real boards (Duolingo, Figma, Ramp, Notion, Match Group): the first run returned 580 jobs, a second run minutes later returned 0 rows, with no job falsely reported as updated
  • closed jobs are reported too. A job that was listed last time and is gone now comes back once with change_status: "removed", its title, URL and last_seen_at. A filled or withdrawn role is a signal most job feeds never give you
  • with Only changes on, an unchanged job on Workday or SmartRecruiters is recognised from the listing and never opened again, so a daily run on those two is faster as well as cheaper. Without Only changes every job is still opened, because you asked for every row

A closed job is only ever claimed when the board was read completely in that run, measured against the unfiltered listing, so a keyword filter or a row cap cannot produce a false alarm, and never at all for a run the platform moved to another server mid-way, or for a Workday site that did not state its job total. A Workday site at its 2,000-job ceiling is excluded from closed-job detection for the same reason. State is kept in a key-value store on your own Apify account, one per Actor (the same name in another Dodo Data Actor tracks that Actor's sources separately), under the name you chose. Nothing is written until the run ends, so a failed run changes nothing.

One limitation worth knowing: a company given as a bare name under Companies is looked up across systems, and if its board ever returns no jobs at all we cannot tell "this company closed every role" from "that name is not on this system", so no closed jobs are reported for it. Pin the system (greenhouse:stripe) when you want closed-job detection for a specific board.

Two things to know. The first run under a new name marks everything new. And updated means the title, locations, workplace type, employment type, pay range or description text changed; on Workday and SmartRecruiters it means the title or locations changed, because those are judged from the listing.

Pay ranges, including the ones only written in the job text

Most tools read pay from the system's structured field and stop there. That field is empty more often than you would think: across 22 real boards we measured on 2026-09-21, Greenhouse boards filled it for 56% of jobs and Ashby for 73%, but Affirm, Discord, Stripe and Notion filled it for none of theirs, while stating a range in the description.

This Actor reads the structured field first, and when it is empty it looks for a range in the job text. On Affirm's board that takes pay coverage from 0 to 95 of 120 jobs. salary_source tells you which path produced the figures, so you can trust or discard them per row. It is deliberately strict: a pay phrase has to sit right before the numbers, and equity grants, bonuses, 401k matches and on-target earnings are left out rather than mixed into base pay.

What we deliberately do not collect

  • No personal data. Recruiter names, mailboxes and creator fields that some feeds carry are never read; e-mail addresses and phone numbers inside descriptions are replaced with [email removed] / [phone removed].
  • Public sources only: the feeds these vendors provide so that career pages can be embedded, and for Workday the career site's own public listing and job pages (allowed by its robots.txt). No logins, no candidate data, nothing behind authentication.
  • Rate-limited: at most 5 requests a second. Most boards are a single request.
  • This Actor declares limited permissions: it can only write to its own dataset.

How to run it

  1. Click Run. The defaults read three sample boards (Duolingo, Spotify, Ramp, about 300 jobs).
  2. Replace them with your own Career page URLs, or just type company names under Companies (stripe, notion, spotify). A bare name is looked up on the nine systems where a name is enough, and read wherever it has open jobs; the log says where each one was found (in our test: Stripe on Greenhouse, Notion on Ashby, Spotify on Lever, 864 jobs in 7 seconds). To pin one system use the short form (lever:spotify). Hundreds of companies per run are fine.
  3. Narrow with Title keywords, Locations (remote, berlin, united kingdom) and Posted within (days). Jobs that do not match are never saved and never charged.
  4. Set Max rows to cap the run. That is also your spend cap.
  5. Download as JSON, CSV or Excel, or call it from the API or from an AI agent through the Apify MCP server. The id field is stable, so de-duplicating between runs is one line.

A board name that does not exist is reported in the log and skipped; it does not fail the run.

Use it from an AI agent (MCP)

Add this Actor as a tool in Claude, Cursor, VS Code or any other MCP client through the hosted Apify MCP server:

https://mcp.apify.com/?tools=actors,docs,dododata/career-site-jobs-scraper

The input is small and typed, and every field in the output is documented in the dataset schema, so an agent can call it without reading this page. The Actor is enabled for Apify's agentic payments (x402, experimental on Apify's side): an agent can pay per run without an Apify account. With a Monitor name, an agent that checks a career page every morning pays only for what changed.

Input reference

FieldDefaultMeaning
startUrlsthree sample boardsCareer-page URLs on any supported system
companiesnoneBare company names (looked up on nine systems) or the short form ats:company
keywordsnoneKeep jobs whose title contains one of these words
locationsnoneKeep jobs whose location, country or workplace type contains one of these
postedWithinDaysnoneKeep jobs published in the last N days
includeDescriptiontrueTurn off for lighter rows
monitorNamenoneTurns on change tracking between runs; use the same name every run
onlyChangesfalseWith a monitor name: leave out, and do not bill, unchanged jobs
includeRemovedtrueWith a monitor name: report jobs that are gone since the previous run
maxItems500Stop after this many rows
maxConcurrency5Parallel requests
useProxyfalseRoute requests through the Apify proxy. Off by default: these public APIs answered four to eight times faster without it. Turn it on if a run reports being blocked

FAQ

Is there one API for Greenhouse, Lever, Ashby and Workday jobs? Not from the vendors: each system publishes its own feed in its own shape. This Actor reads twelve of them and returns one 30-field row, so a pipeline over many employers needs no branch per system.

I only know the company names, not which system they use. Does that work? Yes. Put the names under Companies. Each one is looked up on Greenhouse, Lever, Ashby, SmartRecruiters, Workable, Recruitee, Breezy, Pinpoint and Rippling, and the log reports where it was found. Workday, Personio and Teamtailor need a URL, because a name alone does not identify a board there. If a name answers on two systems, both are read and the log tells you how to pin one.

How do I get only the jobs posted since yesterday? Two ways. Posted within (days) set to 1 keeps jobs whose publish date is recent. A Monitor name with Only changes is stricter and also catches edits and closed jobs: it compares against what your previous run actually saw, so it works even on boards that publish no dates.

How do I find out that a job was closed or filled? Run with a Monitor name on a schedule. A job that was listed in the previous run and is gone comes back once with change_status: "removed" and the dates it was first and last seen.

Do I need proxies, an API key or a login? No. The sources are public feeds read at a polite rate: 5 requests a second at most, and one a second to Lever, as its robots.txt asks. The Apify proxy is off by default, because these public APIs answered four to eight times faster without it in our measurements; it is included if you turn it on.

How fresh is the data? Every run is live. There is no database in between: what the career page shows at that moment is what you get.

Does it collect recruiter names or contact details? No. Recruiter and creator fields are never read, and e-mail addresses and phone numbers inside descriptions are replaced before a row is saved.

What does it cost to watch 200 companies every day? The first run is one row per open job. After that, with Only changes, you pay for what is new, changed or closed, typically a few percent of the board per day, at $1 per 1,000 rows.

Changelog

  • 2026-09-21, v0.1: bare company names. Type stripe instead of a URL and the Actor finds which system hosts it.
  • 2026-09-21, v0.1: monitoring. A monitor name adds change_status, first_seen_at and last_seen_at; Only changes returns and bills only new, changed and closed jobs. Pay ranges written only in the job text are parsed (salary_source).
  • 2026-09-18, v0.1: first release: Greenhouse, Lever, Ashby, SmartRecruiters, Recruitee, Workable, Personio, Breezy, Pinpoint, Rippling, Teamtailor, Workday. Every source verified live on 2026-09-17/18.