Company Career Page Jobs Scraper: ATS Jobs from 6 Platforms avatar

Company Career Page Jobs Scraper: ATS Jobs from 6 Platforms

Pricing

from $1.05 / 1,000 jobs

Go to Apify Store
Company Career Page Jobs Scraper: ATS Jobs from 6 Platforms

Company Career Page Jobs Scraper: ATS Jobs from 6 Platforms

Scrape ATS jobs from company career pages: enter company names or careers URLs and get every open job, live from each company's Greenhouse, Lever, Ashby, Recruitee, Personio or Teamtailor board, in one format. Filter by keyword, place, department, job type, salary or date, or get only new jobs.

Pricing

from $1.05 / 1,000 jobs

Rating

0.0

(0)

Developer

Michael Costa

Michael Costa

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

0

Monthly active users

2 hours ago

Last modified

Share

What does Company Career Page Jobs Scraper do?

Company Career Page Jobs Scraper is an ATS jobs scraper: it takes a list of company names or careers pages and returns every open job at those companies in one clean format, fetched live from each company's own job board on Greenhouse, Lever, Ashby, Recruitee, Personio or Teamtailor. No login.

It is not a job-board search: it doesn't search Indeed, LinkedIn, ZipRecruiter or similar sites. It goes to each company's own careers site, so you get every job the company lists, the moment it's listed.

Three ways to name a company, one per line, mixed freely:

You typeExampleHow it's found
Company nameStripe, Linear, PalantirLooked up on all 6 platforms. If a company runs more than one board, you get all of them.
Careers page or websitehttps://linear.app/careers, ramp.comThe page is scanned for its job board (links, embedded boards, the careers/jobs pages it links to). When the site renders jobs with JavaScript or blocks bots, a board named like the website is used only if that board links back to the same website.
Job-board URLhttps://boards.greenhouse.io/stripe or greenhouse:stripeUsed as is. Open any of the company's jobs to find it.

Input fields · API · Use it from Claude, ChatGPT or Cursor (MCP)

Jump to: Monitor jobs · Fields · Price · How to use · Supported platforms · Input · Output · AI agents (MCP) · Limits · FAQ

Try it in one click: the input comes pre-filled with 6 example companies, one on each platform, some typed as names and some as URLs: Linear, bunq, Greenhouse, Outreach, ottonova and Teamtailor. That's about 120 jobs, or roughly $0.18 (120 × $0.0015 per job, plus $0.00005 for the run start). Then replace them with the companies you actually want.

Monitor new, changed and closed jobs at your target companies

Company Career Page Jobs Scraper can watch a list of companies and give you only what happened since its last run: new jobs, and optionally the jobs that closed or changed. Set it up once:

  1. Save a task. Fill in Companies (and any filters), turn on Only jobs new since my last run (onlyNewJobs: true in the API), then click Save as a new task at the top right of the actor's page. The first run returns every current job that matches; later runs return only jobs posted since. For a full job-change feed, also turn on Also report closed and changed jobs (includeClosedAndChanged: true): each row then has a changeType of new, changed (title, location, department, employment type or salary changed; changedFields shows old and new) or closed (taken off the company's board; the row keeps its last known title, location and link). Useful for spotting ghost jobs and filled roles.
  2. Schedule it. In Apify Console, open Schedules, click Create new, pick the task and set how often it runs (for example every day at 07:00, cron 0 7 * * *).
  3. Send the new jobs where you work, from the task's Integrations tab:
    • Slack: a message in the channel you choose when a run succeeds (you pick the events and can edit the message).
    • Email: Send results email via Gmail sends the run's results, with the dataset attached.
    • Webhook: a POST to your URL on the ACTOR.RUN.SUCCEEDED event. The payload's resource.defaultDatasetId points to the new jobs: GET https://api.apify.com/v2/datasets/<defaultDatasetId>/items?format=json with your API token.
    • Make, Zapier or n8n: each has an Apify step that starts on a finished run and reads its dataset.

A run that finds nothing new (or changed or closed) returns 0 jobs and costs only the $0.00005 start fee. Slack and email are sent for every successful run, including a quiet one; to hear only about new jobs, use the webhook or Make/Zapier/n8n and skip runs whose dataset is empty. Add the run failed event too, so a failed run doesn't go unnoticed. Keep the task's filters fixed: the memory is per company and per filter combination, so changing them starts a fresh search.

What data does Company Career Page Jobs Scraper return?

FieldExampleNotes
titleTechnical Program Manager, Compute Infrastructure
companyNameOpenAIFilled in even where the platform's feed leaves it out (Lever, Ashby).
platform, companyashby, openaiWhich board the job came from.
department, teamTechnical Program Managementnull when the board doesn't group jobs.
location, locations, countrySan Francisco, United StatesAs the company lists them.
workplaceType, remoteremote, hybrid, onsitenull when the job doesn't say.
employmentTypeFULL_TIMEOne of FULL_TIME, PART_TIME, CONTRACT, TEMPORARY, INTERNSHIP, VOLUNTEER, or null.
postedAt, updatedAt2026-03-12T16:38:15.322000ZISO 8601 UTC.
url, applyUrlhttps://jobs.ashbyhq.com/openai/...The job page and its application form.
salaryMin, salaryMax, salaryCurrency, salaryPeriod257000, 335000, USD, YEARnull when the company publishes no pay.
salaryText, salarySource$257K - $335K, atsats from the platform's own field, description from the job text.
descriptionABOUT THE TEAM...Plain text; switch off Include full job description to leave it out.
idashby:openai:8fb1615c-...Stable across runs, for deduplication.
changeTypenew, changed, closedOnly with Also report closed and changed jobs; the fields below too.
changedFields{"title": {"old": "Engineer", "new": "Senior Engineer"}}For changed jobs: each field that changed, old and new. null otherwise.
closedDetectedAt, firstSeenAt2026-10-02T07:00:00ZWhen a run found the job gone, and when a run first returned it (null for jobs returned before version 1.1).

Every job has the same fields on every platform; the full record is under Output.

How much does it cost to scrape company career pages?

You pay per job returned: $1.50 per 1,000 jobs, plus $0.00005 each time a run starts. Filters are applied before you're charged, so you only pay for jobs you keep. A company that isn't found, fails or has no matching jobs costs nothing, and a repeat run with nothing new costs only the start fee.

It's cheaper on paid Apify plans: $1.35 per 1,000 jobs on Starter, $1.20 on Scale and $1.05 on Business. The prices on this page are the Free-plan price, so on a paid plan you pay less than the examples show.

  • The example below: 115 jobs × $0.0015 = $0.17, plus the $0.00005 start fee; the repeat run $0.00005.
  • Closed and changed jobs are rows like any job, $0.0015 each, and only when you turn that option on.
  • A month, for example: 100 companies with 3,000 open jobs between them, checked daily: the first run is 3,000 × $0.0015 = $4.50; if 40 new jobs a day are posted after that, 1,160 × $0.0015 = $1.74: about $6.24, plus 30 starts ($0.0015). Your numbers depend on how many jobs your companies post.
  • Caps: Max jobs per run in the input, and Maximum cost per run in the run options. The scraper stops cleanly at whichever comes first, and stops fetching as soon as the limit is covered, so a capped run is also a fast one.

How to scrape jobs from company career pages

  1. Open the actor and type your companies into Companies, one per line: names, careers pages or job-board URLs.
  2. Optionally add Title keywords, Locations, Departments, Employment types, Minimum salary or Posted within (days) to keep only the jobs you want.
  3. Click Start. The prefilled 6 companies take a few seconds.
  4. Open the Output tab and export the jobs as JSON, CSV or Excel, or read them through the API.
  5. To keep watching the same companies, save it as a task and schedule it (see Monitor new, changed and closed jobs at your target companies above).
Company Career Page Jobs Scraper input form with the 6 prefilled companies

Each run's log and the RUN_STATS record show what every name or page was matched to, and anything that couldn't be found, with the reason.

Which ATS platforms does it support?

6 platforms, each through the public job feed it publishes for machines:

ATSPaste a URL like
Greenhousehttps://boards.greenhouse.io/stripe
Leverhttps://jobs.lever.co/palantir (EU boards too)
Ashbyhttps://jobs.ashbyhq.com/openai
Recruiteehttps://bunq.recruitee.com
Personiohttps://<company>.jobs.personio.de
Teamtailorhttps://<company>.teamtailor.com

Workday, Workable, SmartRecruiters, Rippling, Breezy HR, iCIMS, SuccessFactors, Taleo, BambooHR, Jobvite, JazzHR and a dozen smaller platforms are not supported: see the FAQ for why. Their URLs are recognised and reported with the reason, and the rest of the run continues.

Example: six companies, then a daily re-check

The pre-filled input, with Only jobs new since my last run turned on:

{"companies": ["Linear", "bunq", "https://boards.greenhouse.io/greenhouse", "https://jobs.lever.co/outreach",
"https://ottonova.jobs.personio.de", "https://career.teamtailor.com"], "onlyNewJobs": true, "includeDescription": true}

It returned 115 jobs from all six boards (30 Ashby, 30 Lever, 22 Greenhouse, 15 Teamtailor, 10 Recruitee, 8 Personio). One of them (real output from a local run on 2026-09-25; description shortened):

{
"id": "recruitee:bunq:2356299",
"platform": "recruitee",
"company": "bunq",
"companyName": "bunq",
"title": "Chief Financial & Operating Officer, US",
"department": "Leadership",
"location": "New York",
"country": "US",
"remote": false,
"workplaceType": "hybrid",
"employmentType": "FULL_TIME",
"postedAt": "2025-11-21T12:58:08Z",
"url": "https://careers.bunq.com/o/chief-financial-operating-officer-us",
"salaryMin": 22883.0,
"salaryMax": 29528.0,
"salaryCurrency": "USD",
"salaryPeriod": "MONTH",
"salaryText": "$22,883 - $29,528",
"salarySource": "description",
"description": "We’re building bunq in the US, and we need a CFOO who can help take us from regulatory readiness to..."
}

Run again straight after, the same input returned 0 jobs, so only the start fee was charged.

Example: engineering jobs paying $150,000 a year or more

Six companies on four platforms, only engineering jobs whose pay reaches $150,000 a year, and only jobs known to pay that much:

{"companies": ["Discord", "https://boards.greenhouse.io/figma", "https://jobs.lever.co/palantir",
"https://jobs.lever.co/outreach", "https://channable.recruitee.com", "https://jobs.ashbyhq.com/ramp"],
"departments": ["engineering"], "minSalary": 150000, "minSalaryCurrency": "USD", "minSalaryPeriod": "YEAR",
"keepJobsWithoutSalary": false, "includeDescription": false, "onlyNewJobs": true}

It returned 87 jobs out of 732 open (36 Ramp, 27 Figma, 21 Discord, 2 Outreach, 1 Palantir, 0 Channable), so the run cost 87 × $0.0015 = $0.13 plus the start fee; the other 645 were never charged. Ramp's pay came from Ashby's own compensation field; Figma's, Discord's and Palantir's from the job text, which was read for pay although descriptions were switched off. The log said, per company, how many engineering jobs were left out for publishing no comparable salary (Channable: 4; Outreach: 3). One of the jobs (real output from a local run on 2026-09-25):

{
"id": "ashby:ramp:34413f8d-26bf-4bbc-8ade-eb309a0e2245",
"platform": "ashby",
"companyName": "Ramp",
"title": "Security Engineer, Cloud",
"department": "Engineering",
"team": "Backend",
"location": "New York, NY (HQ)",
"workplaceType": "hybrid",
"employmentType": "FULL_TIME",
"salaryMin": 211400,
"salaryMax": 290600,
"salaryCurrency": "USD",
"salaryPeriod": "YEAR",
"salaryText": "$211.4K - $290.6K",
"salarySource": "ats",
"description": null
}

Ready-to-run examples

Each example opens with the input already filled in. Run it as it is, or change the input first.

Input

FieldWhat it does
CompaniesOne per line: a company name, a careers page, or a job-board URL (see above).
Title keywords / Exclude keywordsKeep or drop jobs by words in the title (case-insensitive).
LocationsKeep jobs whose location or country contains any of these. Add remote to include remote jobs.
Remote jobs onlyOnly jobs marked remote.
Posted within (days)Only recently published jobs.
DepartmentsKeep jobs whose department or team contains any of these (case-insensitive).
Employment typesOnly jobs of these types (FULL_TIME, CONTRACT, ...). Jobs with no stated type are left out while it's set; Greenhouse and Teamtailor state none.
Minimum salary, currency, perOnly jobs whose pay reaches this amount at the top of their range, in this currency (default USD) and period (default a year). Currencies are never converted.
Keep jobs with no comparable salaryWith a minimum salary: keep (default) or drop jobs whose pay isn't published or can't be compared.
Only jobs new since my last runFirst run returns everything that matches; later runs return only jobs posted since. Remembered in your own Apify storage, per company and per filter combination.
Also report closed and changed jobsLater runs also return jobs you were given before that have since closed or changed, each marked with changeType. Implies the option above.
Include full job descriptionPlain-text description (on by default).
Max jobs per runCap the total number of jobs across all companies.
Max jobs per companyCap results per company.
{
"companies": ["https://jobs.ashbyhq.com/openai", "https://boards.greenhouse.io/stripe", "lever:palantir"],
"keywords": ["engineer"],
"locations": ["San Francisco", "remote"],
"departments": ["Engineering"],
"minSalary": 150000,
"postedWithinDays": 30
}

Output

Every job has the same fields on every platform. Fields a platform doesn't publish are null.

Company Career Page Jobs Scraper output table: title, company, location, workplace type, employment type, salary, posted date
{
"id": "ashby:openai:8fb1615c-34bf-47c4-a1d1-b7b2f836bbd3",
"platform": "ashby",
"company": "openai",
"companyName": "OpenAI",
"title": "Technical Program Manager, Compute Infrastructure",
"department": "Technical Program Management",
"team": "Technical Program Management",
"location": "San Francisco",
"locations": ["San Francisco"],
"country": "United States",
"remote": null,
"workplaceType": null,
"employmentType": "FULL_TIME",
"postedAt": "2026-03-12T16:38:15.322000Z",
"updatedAt": null,
"url": "https://jobs.ashbyhq.com/openai/8fb1615c-34bf-47c4-a1d1-b7b2f836bbd3",
"applyUrl": "https://jobs.ashbyhq.com/openai/8fb1615c-34bf-47c4-a1d1-b7b2f836bbd3/application",
"salaryMin": 257000,
"salaryMax": 335000,
"salaryCurrency": "USD",
"salaryPeriod": "YEAR",
"salaryText": "$257K - $335K",
"salarySource": "ats",
"description": "ABOUT THE TEAM\n\nThe compute infrastructure team runs the GPU fleet…",
"scrapedAt": "2026-09-24T04:30:00Z"
}

id is stable across runs (platform:company:jobId), so you can use it to deduplicate.

Run it on a schedule, or from your own code

  • Schedule: save the input as a task and add it to a schedule, as in Monitor new, changed and closed jobs at your target companies above.
  • API: fetch a task's latest results with GET https://api.apify.com/v2/actor-tasks/<task id>/runs/last/dataset/items?status=SUCCEEDED&format=csv and your API token (format can also be json or xlsx).
  • Webhooks and automation: a webhook when a run succeeds, or Make, Zapier or n8n through Apify's integrations.

Can I use Company Career Page Jobs Scraper from an AI agent (MCP)?

Yes, through Apify's MCP server, from Claude, ChatGPT, Cursor or any other MCP client. Add this to your client's MCP configuration (or let the agent find it with the server's actor search); your client signs you in to Apify:

{
"mcpServers": {
"apify": {
"url": "https://mcp.apify.com?tools=humble-echidna/ats-jobs"
}
}
}

To use an Apify API token instead of signing in, add "headers": {"Authorization": "Bearer <APIFY_TOKEN>"} next to url.

The agent passes the same input JSON as above. To keep answers small, have it set includeDescription: false and a Max jobs per run (maxJobs).

Who it's for

Niche job boards and aggregators that list jobs from a known set of employers, recruiters and sourcers keeping track of their target companies, and anyone reading hiring as a signal (which companies are hiring, for what, and where) or researching pay (ranges as numbers, with currency and period). The recurring job: keep a list of companies, whatever platform each one hires on, run it daily with Only jobs new since my last run, and get each new posting once.

Why this one?

  • One flat price, no usage bill. You pay per result at the price above and nothing else: no compute, proxy or storage charges on top, apart from the $0.00005 run-start fee, so you know what a run costs before it starts. Results you don't get aren't charged.
  • One schema for 6 ATSs. Employment type is one of FULL_TIME, PART_TIME, CONTRACT, TEMPORARY, INTERNSHIP, VOLUNTEER, and workplace type one of remote, hybrid or onsite (null when the job doesn't say). Dates are always ISO 8601 UTC. No per-platform cleanup on your side.
  • Salary where others return nothing. Structured pay from the ATS when it has it. Otherwise it's extracted from pay-transparency text in the description ("$150,000 - $200,000 USD", "£45k–£55k per annum", "$28.50/hr"). salarySource tells you which. Extraction is deliberately conservative: stipends, bonuses, and funding amounts are ignored.
  • Fast. The 6 example companies (~120 jobs, with descriptions) finish in seconds: every platform delivers a company's whole board in one feed (Teamtailor pages through it), with no per-job requests. No login, no browser, no proxies.
  • Reliable. A broken or unreachable company never affects the others in your run. A malformed job record is skipped instead of failing its company. Rate limits are handled automatically with a shared per-site cooldown. The run log and the RUN_STATS record say exactly which company had a problem and why.
  • Live, not cached. Every job is fetched from each company's board during your run. There's no pre-crawled database in between, so every job returned is posted right now, and a job the company closed this morning isn't in your results. With Also report closed and changed jobs, you're also told that it closed.
  • Company names filled in even where the ATS API omits them (Lever, Ashby).

Limits

  • It reads only the companies you list: the platforms don't publish a directory of their customers, so it can't search every company on a platform.
  • Only the 6 platforms above. Others are reported with the reason (see the FAQ), never fetched.
  • A careers page that loads its jobs with JavaScript or blocks bots is found only if the company's board links back to that website; otherwise type the company name or the job-board URL instead. Bot checks are never worked around.
  • On our benchmark of 88 real companies (names, homepages and careers pages, checked by hand), 1.3 finds the right board for 88% of what users type (92% of names, 83% of homepages, 88% of careers pages), up from 52% in 1.2.

FAQ

Can I search all companies on Greenhouse (or any platform)?

No. This actor fetches the career pages you list, not a search across every company on a platform. The ATSs don't publish a directory of their customers. If you need a searchable database of millions of jobs, use a job-database actor instead. Use this one when you know which companies you want to track and need their complete, fresh listings.

How is this different from a job database?

A job database searches a pre-crawled index; job databases re-check their listings about once a day. This actor reads each company's board during your run, so you get the company's complete, current list, but only for the companies you name.

Can I use just one platform?

Yes. List only companies on that platform, or mix platforms freely. Each URL is detected automatically.

How does "Only jobs new since my last run" know about my last run?

It stores the IDs of the jobs it returned in a named key-value store (ats-jobs-seen) in your Apify account, which persists between runs. Each company and filter combination has its own memory, so a daily "engineer" alert and a weekly "sales" alert on the same company don't interfere. Changing the filters starts a fresh search, and so does deleting that store. Jobs held back by Max jobs per company are not marked as seen, so they come through on a later run.

How are closed jobs detected?

With Also report closed and changed jobs on, the same memory also keeps each returned job's title, locations, department, employment type, salary text and link. On the next run, a job that's no longer on the company's board comes back once as changeType: "closed", with those last known fields and closedDetectedAt; a job whose tracked fields differ comes back once as changeType: "changed", with changedFields (old and new). Only jobs you were already given are tracked, so a search with filters sees closures and changes of its own jobs.

A job only counts as closed when its company's board was read cleanly. If the board fails, is blocked, times out or has records that don't parse, or if it suddenly lists nothing or far fewer jobs (more than half of the tracked jobs gone at once, or the board's open jobs halving), its closed-job check is skipped for that run and the log and RUN_STATS (closureChecksHeld) say why. A sudden drop that the next run sees again is real, and is reported then; one that recovers is never reported. Salary is compared only when it can be read on both runs, so switching Include full job description off doesn't show up as a salary change. Turning the option on for a search that already has a memory from before version 1.1 starts from what's on the board now: nothing is reported for jobs that closed or changed before that.

How do the department, employment type and salary filters work?

Departments keeps jobs whose department or team contains any of your words, ignoring case ("engineering" matches "Product Engineering"). Employment types keeps jobs of the types you pick. Minimum salary keeps jobs whose pay range reaches your amount at its top, in the currency and period you choose: pay per hour, day, week or month is compared as a full-time year (2,080 hours, 260 days, 52 weeks, 12 months), and amounts are never converted between currencies. All three run before you're charged, so a job they leave out costs nothing, and each is part of the search that Only jobs new since my last run remembers: changing one starts a fresh search instead of hiding jobs.

A filter can only use what the board publishes. A job with no department or team, or no stated employment type, is left out while that filter is set; Greenhouse and Teamtailor state no employment type at all, so none of their jobs pass that filter. A job with no comparable pay (none published, another currency, or no period) is kept unless you turn off Keep jobs with no comparable salary. The log and RUN_STATS (boards → notes) say per company how many jobs that affected. With a minimum salary, descriptions are read for pay even when Include full job description is off, and are still left out of your results.

Why does a company that used to work now fail or return fewer jobs?

ATS vendors change their public feeds without notice, so a site change is the most likely cause. The run log names the company and what didn't parse, and every other company in the run is unaffected. Please open an issue with the URL so the change can be looked at.

Why wasn't a company found?

The run log and RUN_STATS (unresolved) say why, and the rest of the run continues. Common reasons: its careers page loads jobs with JavaScript and its board doesn't link back to the site (type the name instead), it has no open jobs right now, or it uses a platform this actor doesn't read (see below). Open an issue with the company and we'll check whether its platform can be added.

What if it matched the wrong company?

Names are only matched when the job board's own company name agrees with what you typed, but two companies can share a name. Paste the exact job-board URL to pin it down; the company and companyName fields on every job show which board it came from.

Why is the salary empty?

It's only there when the company publishes it, and how often that happens depends on the platform and, even more, on the company. Coverage is highest for US roles (pay-transparency laws). What we measured on real boards on 2026-09-25:

PlatformSalary field of its ownJobs with a salary (boards checked)
GreenhouseNo: pay comes only from the job text196 of 275 (Greenhouse, Discord, Dropbox, Figma)
LeverYes, when the company fills it in277 of 430: 23 from Lever's field, 254 from the text (Outreach, Spotify, Palantir)
AshbyYes, when the company publishes it150 of 157 at Ramp; 1 of 86 at Linear and Supabase
RecruiteeYes, when the company fills it in8 of 21: 7 from Recruitee's fields, 1 from the text (bunq, Channable)
PersonioNo: pay comes only from the job text5 of 15 (ottonova, Holidu)
TeamtailorNo: pay comes only from the job text0 of 38 (Teamtailor, Oatly)

salarySource says where each salary came from (ats or description). For a minimum salary filter, choose whether jobs without a comparable salary are kept (the default) or dropped.

It only reads platforms that publish their job feed for machines and whose terms allow this use; every platform was checked against its terms of service and robots.txt before it was added, and the ones that failed are listed below with the reason. It reads the public job-board data each company publishes for its own careers page. It collects job postings only: no recruiter names, emails, or other personal data. It identifies itself honestly (User-Agent HumbleEchidnaApify) and follows every site's robots.txt: a page or API a site disallows is never requested, and that company is reported with the reason instead of being skipped silently; a site's crawl delay is respected.

Which addresses does it request?

Only public web addresses on the standard web ports (80 and 443). A careers page on another port, or on a domain that points at a private network, is refused with the reason, and a careers domain that doesn't exist is reported as such. Each site's robots.txt is read once per run; a site that asks for more than 30 seconds between requests is reported rather than fetched slowly.

Why aren't Workday, Workable, SmartRecruiters, Rippling and Breezy HR supported?

This actor only reads platforms that publish their job feed for machines and whose terms allow this use. Each platform was checked, and these five were dropped (their URLs are still recognised and reported with the reason):

  • SmartRecruiters (since 1.0.1): its robots.txt disallows its job API for every automated client except LinkedIn's.
  • Workday (since 1.0.2): its career sites can only be read through the internal backend of Workday's own career-site web app, not a documented public API or feed, and Workday's terms require a separate agreement for its APIs.
  • Workable (since 1.0.2): its job-widget endpoint is documented only for embedding a company's jobs on that company's own website, not as an API for third parties.
  • Breezy HR (since 1.0.2): its terms forbid accessing the service by any means other than its publicly supported interfaces, and name scraping.
  • Rippling (since 1.0.2): its job-board endpoint isn't a documented public API, and a terms-of-service review didn't clear it for automated third-party use.

More platforms were checked in 1.0.3 (September 2026) and none could be added. Their URLs are now recognised and reported with the reason instead of "no supported job board":

  • iCIMS: its terms forbid "any robot, spider or other automatic device, process, or means to access the Website for any purpose", and its only documented jobs API needs credentials.
  • SAP SuccessFactors: its job feeds are set up by SAP for one named partner at a time ("Partners are asked to not re-distribute customer jobs to other 3rd parties"), and its career hosts' robots.txt disallows automated clients.
  • Oracle Taleo: no documented public job feed, and Oracle's terms forbid "any robot, spider, scraper or other automated means" without written permission.
  • BambooHR: its careers-list endpoint isn't documented, and its terms forbid using the service "with any robot, spider, other automated device, or manual process to monitor or copy any content".
  • Jobvite: its job feed is documented for a company's own websites, and its terms forbid scraping and providing job postings to third parties.
  • JazzHR: its feed is documented for building "a custom careers page on your company's website", and its API needs a key.
  • Pinpoint: its acceptable use policy, which applies to anyone using its sites, forbids republishing or distributing its data for commercial use or a third party's benefit.
  • Trakstar Hire: its acceptable use policy binds every visitor and forbids "letting other persons access or use the Services".
  • JobScore: its terms limit its content to "personal, non-commercial, and informational purposes".
  • Manatal: its terms forbid access "for reproduction purposes" and any commercial distribution of its data.
  • Zoho Recruit and Homerun: their job feeds are private links each company shares with the job boards it chooses.
  • Comeet, JOIN and Freshteam: their job APIs need a token or key from the company (Freshteam's robots.txt also disallows them).
  • Dover: its terms forbid robots and scrapers, and its robots.txt disallows its API.
  • Gem: its job-board API is documented only for a company's own careers page.
  • Polymer: its documented public API didn't return jobs for live career pages when checked.
ActorUse it when
Greenhouse Jobs ScraperYour whole list is on Greenhouse: a simpler starting point, with this same output format.
Lever Jobs ScraperThe same, for companies hiring on Lever.
Ashby Jobs ScraperThe same, for companies hiring on Ashby.
Remote Jobs ScraperYou want remote jobs from companies you haven't listed (We Work Remotely and Remote OK), in the same format.
Company Register SearchYou want official register records for the hiring companies themselves (France's SIREN/SIRET register and the global LEI index).

Feedback and support

Found a bug, or need a field or platform that isn't here? Open an issue on the Issues tab with the input you used.

Versions

Current version: 1.2. See the Changelog tab for what changed in each version.