ATS Jobs: Greenhouse/Lever/Ashby/Recruitee/Personio/Teamtailor
Pricing
from $0.70 / 1,000 jobs
ATS Jobs: Greenhouse/Lever/Ashby/Recruitee/Personio/Teamtailor
From $0.70 per 1,000 jobs ($1 on Free): open jobs with salary ranges from Greenhouse, Lever, Ashby, Recruitee, Personio and Teamtailor company career boards. Paste board URLs, domains or names. One normalized schema, title/location/remote/salary filters, new & closed job monitoring.
Pricing
from $0.70 / 1,000 jobs
Rating
0.0
(0)
Developer
Otama Labs
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
19 days ago
Last modified
Categories
Features
Share
Get every open job of the companies you choose, straight from their own public job boards on Greenhouse, Lever, Ashby, Recruitee, Personio and Teamtailor. Paste job board URLs, company domains or just company names. Results are live (read at run time, not from a stale index), normalized into one table with salary ranges wherever the board publishes them (including Greenhouse pay transparency ranges), and cost from $0.70 per 1,000 jobs ($1.00 on the Apify Free plan, less on paid plans; see Pricing).
Turn on monitoring and schedule the Actor to get only the jobs that were added or closed since the last run: a simple hiring-signal feed for sales prospecting, investor research, competitor tracking or recruiting.
What you can do with it
- Sales prospecting: companies hiring for a role you sell into (e.g. "Head of Security", "Salesforce Admin") are likely buyers.
- Competitor and market tracking: see which teams your competitors are growing and where.
- Recruiting and job search: one feed of fresh roles from your target companies, filtered by title, location or remote.
- AI agents: give an agent a list of companies and get structured, current openings back.
Output example
One row per job, with the same fields for every ATS:
{"company": "Ramp","title": "Manager, Account Manager | Growth","department": "Sales","team": "Account Manager","location": "New York, NY (HQ)","allLocations": ["New York, NY (HQ)", "San Francisco, CA"],"countryCode": "US","workplaceType": "hybrid","isRemote": false,"employmentType": "FullTime","salaryMin": 180000,"salaryMax": 247000,"salaryCurrency": "USD","salaryInterval": "year","salaryText": "$180K – $247K • Offers Equity • Offers Commission","postedAt": "2026-10-13T15:07:59.917000+00:00","url": "https://jobs.ashbyhq.com/ramp/190c265a-...","applyUrl": "https://jobs.ashbyhq.com/ramp/190c265a-.../application","ats": "ashby","boardSlug": "ramp","jobId": "190c265a-ca4f-48b7-b2a4-13412299249d","change": null,"matchedBy": "direct","input": "https://jobs.ashbyhq.com/ramp","scrapedAt": "2026-10-14T06:01:12+00:00"}
Fields a board does not publish are null (for example many boards do not publish salaries).
Salaries. Lever, Ashby, Recruitee and Personio send salary fields with the job. For Greenhouse the Actor turns on the job board API's pay transparency option (documented for single jobs; the job list returns the same ranges today). salaryMin/salaryMax/salaryCurrency come from the first range, and salaryText lists every range when a job has one per country, e.g. "United Kingdom Annual Pay Range: 71,000 – 84,000 GBP; Germany Annual Pay Range: 71,000 – 84,000 EUR". salaryInterval is filled only when the board says it (Annual, Monthly, Hourly); a plain "Pay Range" stays null. Teamtailor's feed has no salary. If Greenhouse ever stops sending the ranges, the run log says so and those salary fields stay empty.
How to use
- Put your companies in Companies, one per line (job board URLs are the most reliable).
- Optionally add title, location, remote or date filters.
- Click Start. Jobs appear in the Output tab; download them as JSON, CSV or Excel, or read them through the API.
- For a hiring-signal feed, turn on monitoring and add a schedule (see below).
Input
| Field | What it does |
|---|---|
| Companies | One per line. A job board URL works best: https://boards.greenhouse.io/airbnb, https://jobs.lever.co/palantir, https://jobs.ashbyhq.com/ramp, https://bunq.recruitee.com, https://1komma5grad.jobs.personio.de, https://tibber.teamtailor.com. Teamtailor career sites on the company's own domain work too (https://jobs.tibber.com or teamtailor:jobs.tibber.com). You can also write greenhouse:airbnb, a domain (stripe.com) or a company name (Notion). |
| Title must contain / must not contain | Case-insensitive, whole-word keyword filters on the job title (AI matches "AI Engineer", not "Retail"). |
| Location contains | Whole words, e.g. London, Germany, US, Remote. |
| Remote jobs only | Keep only jobs whose workplace type is remote (hybrid jobs are not remote). |
| Only jobs with a published salary | Drop jobs whose board does not publish a pay range. |
| Posted within (days) | Only jobs published in the last N days. |
| Max jobs per company | Newest first. 0 = all. |
| Include job description | Adds the full description as plain text. |
| Only new and closed jobs since the last run | Monitoring mode (see below). |
| Monitor name | Keep separate memories for different company lists. |
How companies are matched. Board URLs and ats:slug are read directly. For a domain the Actor looks for job board links on the company website (only pages its robots.txt allows), then tries likely board names on each supported ATS. For a company name it tries likely board names. Each job has a matchedBy field (direct, website or guess); please check guess matches, because two companies can share a name. The run summary (SUMMARY in the key-value store) lists, for each input, the board found and a status: ok, not_found (no supported board), error (the input could not be read or a board did not answer; the reason is included) or skipped_cost_limit. One bad input never stops the run.
Monitoring: new and closed jobs
- Turn on Only new and closed jobs since the last run and set a Monitor name.
- The first run returns the matching jobs (
change: "new") and remembers the ones it returned. - Schedule the Actor (e.g. daily). Each later run returns only matching jobs you have not received yet (
change: "new") and jobs you received earlier that are no longer on the board (change: "closed").
Details:
- Every job is delivered as new exactly once. If Max jobs per company or your maximum cost per run stops the output early, the remaining jobs come in the next runs; nothing is lost.
- A job is reported closed only when it disappears from the company's board, not when it stops matching your filters (for example when it gets older than Posted within (days)).
- Closed-job rows are free.
- Use a separate monitor name for each company list. If you change the title or location filters of a monitor, jobs that start to match are delivered as new. The same happens with Only jobs with a published salary on: a job that later starts publishing a salary is delivered as new then.
Pricing
Pay per event, per job in the output, with Apify Store discounts on paid plans:
| Apify Store discount tier | Price per 1,000 jobs |
|---|---|
| Free | $1.00 |
| Bronze | $0.90 |
| Silver | $0.80 |
| Gold and higher | $0.70 |
The tiers are Apify Store's discount levels, which follow your paid Apify plan; the Actor's pricing tab in the Store shows the price for your account. Example: 2,000 jobs at the Free price cost $2.00; at the Gold price $1.40. On top of that there is a tiny Apify start fee of $0.00005 per GB of memory per run (the default 512 MB counts as one). You are not charged for inputs where no board was found, for jobs removed by your filters, or for closed-job rows. Set a maximum cost per run in the run options if you want a hard cap.
Supported job boards
| ATS | Board URL looks like |
|---|---|
| Greenhouse | boards.greenhouse.io/{company}, job-boards.greenhouse.io/{company} |
| Lever | jobs.lever.co/{company} (and jobs.eu.lever.co) |
| Ashby | jobs.ashbyhq.com/{company} |
| Recruitee | {company}.recruitee.com |
| Personio | {company}.jobs.personio.de (and .com), read from Personio's official XML job feed |
| Teamtailor | {company}.teamtailor.com or the company's own career site domain, read from Teamtailor's official RSS job feed (up to 3,000 jobs per site) |
Companies that run their own career site without one of these systems (for example Google or Apple) are not supported and show up in the summary as not found.
Responsible use
The Actor only reads job boards that the companies publish through their ATS's public job board API, spaces requests to each host (Lever's Crawl-delay is respected), and only reads company websites where robots.txt allows it. It does not log in anywhere and does not collect personal data about candidates or employees. You are responsible for how you use the data.
FAQ
A company was not found. Paste its job board URL directly (open the company's careers page, click a job, and copy the board address). If the board is on another ATS, it is not supported yet.
Can I get more than one company per run? Yes, add as many lines as you like. Boards are read in parallel.
Why is the salary empty? The company does not publish it on the board. Turn on Only jobs with a published salary to keep only the jobs that have one.
How do I use it from Make, n8n or Zapier? Use the official Apify app or node in Make, n8n or Zapier: pick the action that runs an Actor, choose tamatama/ats-jobs, paste the JSON input (for example {"companies": ["https://jobs.ashbyhq.com/ramp"], "onlyNewSinceLastRun": true}), then read the dataset items in the next step. For a daily feed, schedule the Actor in Apify and trigger your scenario from the run's webhook.
How do I use it from LangChain, LlamaIndex or my own code? LangChain and LlamaIndex have Apify integrations that run an Actor and load its dataset as documents. From any language, one HTTP call returns the jobs: POST https://api.apify.com/v2/acts/tamatama~ats-jobs/run-sync-get-dataset-items?token=<APIFY_TOKEN> with the JSON input as the body. The official apify-client package does the same in Python with client.actor("tamatama/ats-jobs").call(run_input={...}) and in JavaScript with client.actor("tamatama/ats-jobs").call({...}).
Related Actors by the same author
| Actor | What it does |
|---|---|
| RemoteOK & Jobicy Remote Jobs API | Remote jobs across many companies from two job boards, when you do not have a company list yet. |
| Website Change Monitor | For a careers page that is not on a supported ATS: get the added and removed lines on every run. |
| PDF to Markdown | Job descriptions or company reports in PDF, Word or PowerPoint as Markdown. |
| PDF OCR | Scanned PDFs and images to text and searchable PDFs. |
For AI Agents
Sales, recruiting and research agents often need "which roles is company X hiring for right now?". Give this Actor company names, domains or job board URLs and it answers with live jobs in one schema, plus a SUMMARY of which board it found for each company. No login and no API key are needed, jobs are paid per row through Apify (pay per event), and the Actor runs with limited permissions.
Apify MCP server configuration with this Actor as the only tool:
{"mcpServers": {"ats-jobs": {"url": "https://mcp.apify.com?tools=tamatama/ats-jobs"}}}
Your MCP client signs in with OAuth (or uses the header Authorization: Bearer <APIFY_TOKEN>). The agent sees the Actor as one tool, tamatama--ats-jobs, and can page through a long job list with the get-dataset-items tool the server adds. For "engineer roles at Ramp and Notion":
{ "companies": ["https://jobs.ashbyhq.com/ramp", "Notion"], "titleKeywords": ["engineer"], "maxJobsPerCompany": 50 }
Title keywords match any of the words (["engineer", "developer"] keeps both kinds of titles).
Board URLs give exact matches. For names, the agent should check matchedBy: rows marked guess deserve a second look before they are reported as facts.
OpenAPI: https://api.apify.com/v2/acts/tamatama~ats-jobs/builds/default/openapi.json. REST: POST https://api.apify.com/v2/acts/tamatama~ats-jobs/run-sync-get-dataset-items with the JSON input.