🦖 TinyRex Data Toolspractical guides for web data APIs

How to scrape Greenhouse, Lever and Ashby jobs (plus Personio, Teamtailor, Recruitee)

Updated 2026-10-08 · Tool used: Greenhouse / Lever / Ashby Jobs Scraper - Personio & more on Apify · Price: $1 per 1,000 jobs; companies without a supported ATS and filtered-out jobs are free

Greenhouse, Lever and Ashby all expose public job-board feeds, but each has a different URL scheme and schema, and you first need to know which ATS a company uses and what its board token is. Doing that for 200 companies by hand takes a day.

This guide shows how to give a list of company websites (e.g. stripe.com) or board URLs and get every open job in one normalized dataset: title, department, locations, country, remote/hybrid, salary where published, posting date and description.

Open Greenhouse / Lever / Ashby Jobs Scraper on Apify →

Steps

  1. List companies as websites, careers URLs, board URLs or ats:token shortcuts like personio:kb1.
  2. Add title / location keywords and postedWithinDays to keep only relevant jobs (filtered jobs are free).
  3. Schedule it with monitoring mode on to receive only jobs that are new since the previous run.

Example input

{
  "companies": [
    "stripe.com",
    "polestar.com",
    "https://jobs.ashbyhq.com/ramp",
    "personio:kb1",
    "bunq.com"
  ],
  "titleKeywords": [
    "engineer",
    "developer"
  ],
  "locationKeywords": [
    "Germany",
    "Remote",
    "Amsterdam"
  ],
  "postedWithinDays": 30,
  "descriptionFormat": "text"
}

Example output (one item, shortened)

{
  "company": "Ramp",
  "companyInput": "ramp.com",
  "ats": "ashby",
  "atsBoard": "ramp",
  "jobId": "baf0a4d2-e07e-4f76-af85-d85c91f479a4",
  "title": "Senior Manager, Account Manager | Mid-Market",
  "department": "Sales",
  "team": "Account Manager",
  "employmentType": "FullTime",
  "seniority": null,
  "locations": [
    "New York, NY (HQ)",
    "San Francisco, CA"
  ],
  "location": "New York, NY (HQ)",
  "country": "USA",
  "workplaceType": "hybrid",
  "salary": {
    "min": 290000,
    "max": 350000,
    "currency": "USD",
    "period": "1 YEAR",
    "text": "$290K - $350K"
  },
  "postedAt": "2026-09-23T16:31:53.863Z",
  "updatedAt": null,
  "url": "https://jobs.ashbyhq.com/ramp/baf0a4d2-e07e-4f76-af85-d85c91f479a4",
  "applyUrl": "https://jobs.ashbyhq.com/ramp/baf0a4d2-e07e-4f76-af85-d85c91f479a4/application",
  "language": null,
  "isNew": null,
  "scrapedAt": "2026-10-04T07:15:18.313Z",
  "descriptionText": "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 over $200B in annualized spend flows in and out of 70,000+ compa..."
}

Every run's dataset can be downloaded as JSON, CSV, Excel, XML or HTML from the Apify Console, or via https://api.apify.com/v2/datasets/<datasetId>/items?format=csv.

Run it from code

Python

from apify_client import ApifyClient  # pip install apify-client

client = ApifyClient("<YOUR_APIFY_TOKEN>")
run_input = {
  "companies": [
    "stripe.com",
    "polestar.com",
    "https://jobs.ashbyhq.com/ramp",
    "personio:kb1",
    "bunq.com"
  ],
  "titleKeywords": [
    "engineer",
    "developer"
  ],
  "locationKeywords": [
    "Germany",
    "Remote",
    "Amsterdam"
  ],
  "postedWithinDays": 30,
  "descriptionFormat": "text"
}
run = client.actor("tinyrex/ats-jobs-scraper").call(run_input=run_input)
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

JavaScript / Node.js

import { ApifyClient } from 'apify-client'; // npm i apify-client

const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('tinyrex/ats-jobs-scraper').call({
  "companies": [
    "stripe.com",
    "polestar.com",
    "https://jobs.ashbyhq.com/ramp",
    "personio:kb1",
    "bunq.com"
  ],
  "titleKeywords": [
    "engineer",
    "developer"
  ],
  "locationKeywords": [
    "Germany",
    "Remote",
    "Amsterdam"
  ],
  "postedWithinDays": 30,
  "descriptionFormat": "text"
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);

curl (no SDK)

# Runs the actor and returns the results directly (CSV here; use format=json for JSON)
curl -X POST "https://api.apify.com/v2/acts/tinyrex~ats-jobs-scraper/run-sync-get-dataset-items?format=csv" \
  -H "Authorization: Bearer $APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"companies": ["stripe.com", "polestar.com", "https://jobs.ashbyhq.com/ramp", "personio:kb1", "bunq.com"], "titleKeywords": ["engineer", "developer"], "locationKeywords": ["Germany", "Remote", "Amsterdam"], "postedWithinDays": 30, "descriptionFormat": "text"}' > results.csv

Get your API token in Apify Console → Settings → API & Integrations. The free Apify plan includes monthly credit that is enough to try this.

Use it from an AI agent (MCP)

The Apify MCP server exposes this actor as a tool for Claude, Cursor, VS Code, n8n and other MCP clients. Add this to your client's MCP config (or use the OAuth flow at mcp.apify.com instead of a token):

{
  "mcpServers": {
    "apify": {
      "url": "https://mcp.apify.com?tools=tinyrex/ats-jobs-scraper",
      "headers": {
        "Authorization": "Bearer <YOUR_APIFY_TOKEN>"
      }
    }
  }
}

Then ask in plain language, e.g. "Scrape greenhouse jobs api for this list and give me a table".

Pricing

Pay per result: $1 per 1,000 jobs; companies without a supported ATS and filtered-out jobs are free. You can cap the cost of every run in the run options.

FAQ

Does Greenhouse have a public jobs API?

Yes, Greenhouse's Job Board API (boards-api.greenhouse.io) is public for each company's board. The actor uses it and the equivalent official feeds of Lever, Ashby, Personio, Teamtailor and Recruitee, so no HTML scraping or login is involved.

How do I find which ATS a company uses?

Just pass the company website. The actor scans the site and careers pages for ATS links and checks the company name on each supported ATS.

Can I use it as a hiring signal for sales?

Yes. Monitoring mode returns only new jobs per run, which is a common trigger for outbound (e.g. companies hiring a first data engineer).

Try it on Apify →

More guides