Skip to the content.

Career Site Jobs Scraper & API (Any ATS)

▶ Run it on Apify: no install, no login to any data source. Apify’s free plan includes monthly credit, enough for small runs.

Give it any company (careers page URL, domain or just the name) and get every open job in one clean format. The Actor finds out which applicant tracking system the company uses and pulls title, department, location, remote/hybrid/on-site, employment type, salary range, posting date, apply link and the full description. Works with companies on Greenhouse, Lever, Ashby, Workday, SmartRecruiters, Workable, Recruitee, Personio, Teamtailor, BambooHR, Breezy HR, Rippling, Oracle Cloud HCM, Jobvite and Pinpoint: from startups like OpenAI, Ramp and Notion to enterprises like NVIDIA and Bosch.

Who uses it

How to use it

  1. Add one or more companies. Anything that identifies a company: a careers page URL (https://openai.com/careers/), a domain (stripe.com), a company name (Hugging Face) or a direct ATS URL. The Actor detects whether it uses Greenhouse, Lever, Ashby, Workday, SmartRecruiters, Workable, Recruitee, Personio, Teamtailor, BambooHR, Breezy HR, Rippling, Oracle Cloud HCM, Jobvite or Pinpoint.
  2. Optionally filter by title keywords, locations, departments, remote only, posting date, experience level, employment type, minimum salary, words in the description or visa sponsorship (only jobs that say they sponsor visas).
  3. Click Start. Download the results as JSON, CSV, Excel or connect them to Google Sheets, Zapier, Make, n8n or your own app via API.

Example input

{
    "companies": ["stripe.com","https://openai.com/careers/","Hugging Face"],
    "keywords": ["engineer"],
    "locations": ["Remote", "New York"],
    "onlyNewJobs": false
}

Output

Each job is one item:

{
    "ats": "greenhouse",
    "company": "Example Inc",
    "companySlug": "example",
    "jobId": "4012345",
    "title": "Senior Software Engineer, Payments",
    "department": "Engineering",
    "team": null,
    "location": "New York, NY",
    "locations": ["New York, NY", "Remote (US)"],
    "country": "US",
    "workplaceType": "hybrid",
    "isRemote": false,
    "employmentType": "full-time",
    "seniority": "senior",
    "salaryMin": 180000,
    "salaryMax": 240000,
    "salaryCurrency": "USD",
    "salaryPeriod": "year",
    "salaryText": "$180,000 - $240,000",
    "postedAt": "2026-10-28T14:52:05.000Z",
    "updatedAt": "2026-10-30T09:12:00.000Z",
    "url": "https://...",
    "applyUrl": "https://...",
    "description": "About the role ...",
    "scrapedAt": "2026-11-03T20:23:21.879Z"
}
Field Description
workplaceType remote, hybrid, onsite or null when the posting does not say
seniority Detected from the title: intern, junior, mid, senior, lead, manager, director, executive
salaryMin / salaryMax Numbers parsed from the posting’s pay range (when the company publishes one)
salaryPeriod year, month, week, day or hour
description Plain text by default; choose Markdown, HTML or none in the input
visaSponsorship true when the description says visas are sponsored, false when it says they are not, null when it does not say

A SUMMARY record in the run’s key-value store lists how many jobs were found per company and any company that could not be loaded.

Pricing

You pay $1.50 per 1,000 jobs saved to the dataset, plus a tiny fee per run start. Filters are applied before saving, so you never pay for jobs you filtered out. Use Max jobs in total to cap the cost of any run.

Monitoring mode (only new jobs)

Turn on Only new jobs and schedule the Actor (for example every morning). Each run returns only openings that were not returned before, so you can pipe them straight into Slack, email or a spreadsheet. The list of already-seen jobs is stored in a named key-value store in your own Apify account.

🧹 Closed jobs, free: in monitoring mode each run also writes a CLOSED_JOBS record listing the jobs you received earlier that are no longer open (job ID, title, URL and when the closure was detected). Job boards use it to remove expired listings. Closed jobs are not charged.

FAQ

Is this an alternative to a LinkedIn or Indeed jobs scraper? Yes, and a safer one. Most jobs you see on LinkedIn and Indeed are first published on the employer’s own career site (Greenhouse, Lever, Workday and the other ATS this Actor reads), so you get the same openings from the original source, usually earlier and with the full description, salary range and direct apply link. No LinkedIn or Indeed account, cookies, proxies or login are needed, nothing is scraped from those sites, and there are no blocked runs or duplicated reposts. This Actor is not affiliated with LinkedIn or Indeed.

Is it legal? The Actor reads public job postings that companies publish so that anyone can see them, using the official public job APIs of 15 applicant tracking systems (it detects the right one for each company). It does not log in and does not collect personal data. As always, use the data in line with the laws that apply to you.

Which companies are supported? Any company whose careers page runs on one of these systems:

Supported ATS    
Greenhouse Lever Ashby
Workday SmartRecruiters Workable
Recruitee Personio Teamtailor
BambooHR Breezy HR Rippling
Oracle Cloud HCM Jobvite Pinpoint

If a company cannot be detected (for example a fully custom careers site), it is listed under unrecognized in the SUMMARY record and you are not charged for it.

Why did a company return 0 jobs? Either it has no open roles right now, or it moved to another applicant tracking system. Check the SUMMARY record of the run.

Use it from your code, AI agents and automations

Python

from apify_client import ApifyClient

client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("richiedc95/career-site-jobs-scraper").call(run_input={
    "companies": [
        "stripe.com",
        "https://openai.com/careers/"
    ],
    "keywords": [
        "engineer"
    ],
    "onlyNewJobs": True
})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

JavaScript

import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: '<YOUR_APIFY_TOKEN>' });
const run = await client.actor('richiedc95/career-site-jobs-scraper').call({
    "companies": [
        "stripe.com",
        "https://openai.com/careers/"
    ],
    "keywords": [
        "engineer"
    ],
    "onlyNewJobs": true
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();

Get a fresh feed automatically (job boards, dashboards, alerts)

  1. Click Save as a new task with your input (turn on the monitoring option if the Actor has one, so each run returns only new jobs).
  2. Add a schedule to the task (hourly, daily or weekly) under Schedules.
  3. Read the latest results from one stable URL, in the format your tool expects:
https://api.apify.com/v2/actor-tasks/<TASK_ID>/runs/last/dataset/items?token=<YOUR_APIFY_TOKEN>&status=SUCCEEDED&format=csv

Use format=json, csv, xlsx, xml or rss. Job-board plugins and spreadsheets can import that URL directly.

Run it

Job Data APIs: Company Career Sites, ATS Job Boards and Job Search · All data APIs