You have a list of companies: target accounts, a startup portfolio, or simply the places you want to work. You want one table with all their open jobs: title, location, remote or not, department, date and salary.
The problem: each company uses a different applicant tracking system (ATS). Stripe is on Greenhouse, Ramp is on Ashby, Spotify is on Lever, many European companies use Personio or Workable. Every board looks different, and none of them has an "Export to Excel" button. Copying by hand does not scale past five companies.
This guide shows how to get all of it into one spreadsheet, with the same columns for every company, without code.
Disclosure: I built the tool used in this guide, the Greenhouse, Lever & Ashby Jobs Scraper on Apify.
Step 1: Run the example
Open Greenhouse, Lever & Ashby Jobs Scraper and click Try for free (free Apify account needed). The form is prefilled:
{ "companies": ["Stripe", "Ramp", "Hugging Face"], "maxJobsPerCompany": 20 } Click Start. It saves about 48 jobs, takes about 15 seconds and costs about $0.06. You don't need to know which ATS each company uses: the Actor checks Greenhouse, Lever (US and EU), Ashby, Workable, Recruitee and Personio for each name. If you know your companies use only some of them, select just those in Platforms to check (atsPlatforms); detection is faster.
Step 2: Paste your own company list
Put one company per line. You can mix names (Stripe), websites (ramp.com) and board URLs (https://jobs.lever.co/spotify). You can paste hundreds of companies in one run.
Max jobs per company is a limit per company, not per run. The form starts at 20 for a quick test. Set it to 0 to get every open job (0 is also the default when you call the Actor through the API).
Step 3: Add filters (optional)
Example: engineering and data jobs in London or remote, posted in the last 30 days, without internships or senior roles:
{ "companies": ["Stripe", "Ramp", "Hugging Face", "https://jobs.lever.co/spotify", "personio.com"], "titleIncludes": ["engineer", "data"], "titleExcludes": ["internship", "senior"], "locations": ["London", "Remote"], "postedWithinDays": 30, "maxJobsPerCompany": 0 } -
titleIncludeskeeps a job if its title contains any of the words.titleExcludesdrops it if the title contains any of them. Both are simple, case-insensitive "contains" checks, sointernwould also drop "International". Useinternshipinstead. -
locationskeeps a job if any of its locations contains one of the words as a whole word.USmatches "Remote - US" but not "Austin". -
remoteOnly: truekeeps only remote jobs. Hybrid jobs are not included. -
postedWithinDayskeeps jobs posted in the last N days.
Jobs removed by a filter are not saved, don't count toward the per-company limit and are not charged.
Step 4: Check which companies were found
Open the RUN_SUMMARY record in the run's key-value store. For each company it shows the ATS and board found, how many jobs were on the board, how many were saved and how many were skipped by filters. Companies without a board get a note such as "no job board found". A company is usually missing because it uses another system (Workday, SAP SuccessFactors, iCIMS or its own site). For Workday companies, use the separate Workday Jobs Scraper.
If a name is matched to the wrong company, check the boardUrl column, or paste the exact board URL instead of the name.
Step 5: Export
Open the run's Output tab and click Export: Excel, CSV, JSON or HTML.
What the output looks like
Every platform returns the same columns. One real row from a test run (2026-10-05):
| title | company | ats | locations | workMode | department | salaryMin | salaryMax | salaryCurrency |
|---|---|---|---|---|---|---|---|---|
| Security Engineer, Cloud | Ramp | ashby | New York, NY (HQ); Remote (Canada); Remote (US); Miami, FL | hybrid | Engineering | 211400 | 290600 | USD |
Other columns include location, postedDate, employmentType, team, country, salaryPeriod, salaryText, url, applyUrl, boardUrl and description. Salary comes from the ATS when it has a structured range (Ashby, Lever, Recruitee) or is parsed from ranges like "$120,000 - $150,000" in the description. Many companies don't publish pay, so expect empty salary cells. Fields a platform doesn't have are empty, so every row has the same columns.
What it costs
$1.25 per 1,000 jobs saved ($0.00125 per job), plus Apify's per-run start fee of $0.00005. Platform compute is included.
You don't pay for:
- jobs removed by your filters,
- jobs already seen in "only new jobs" mode,
- companies where no job board was found.
Examples:
- The prefill test (3 companies, 20 jobs each, 48 jobs): about $0.06.
- 700 jobs, for example all open jobs at Stripe: about $0.88.
- 100 companies with 4,000 open jobs in total: 4,000 x $1.25 / 1,000 = $5.00 for the first full export.
- Daily monitoring with about 50 new jobs per day: 1,500 jobs a month, about $1.88 per month.
To cap spending, set Max charge per run in the run options. The Actor stops at that limit and keeps what it saved.
Automation tip: a daily hiring-signal feed
This is the setup sales teams use to spot companies that are hiring for roles that suggest they need a product (for example "Head of RevOps" or "Data Engineer"):
- Paste your target-account list.
- Add words to Job title must contain (
titleIncludes), for examplerevops,data engineer,security. - Set Max jobs per company to
0, so the first run sees every open job. - Turn on Only new jobs (
onlyNewJobs: true). The first run returns all matching jobs and stores them as a baseline. Later runs return only jobs not seen before, markedisNew: true, and you pay only for those. - If you run several schedules on the same companies with different filters, give each one its own Monitor name (
monitorName). - Save it as a task and add a daily Schedule in Apify Console.
- Connect the output: the Google Sheets integration on the Integrations tab, or in Make / Zapier / n8n use "Actor run finished" -> "Get dataset items" -> "Google Sheets: add row" (or Slack, or your CRM).
Each morning you get only the new postings at your accounts.
Try it
Greenhouse, Lever & Ashby Jobs Scraper on Apify. If a company is matched wrongly or not found, open an issue on the Issues tab with the company name.


