# Greenhouse, Lever & Ashby Jobs + Hiring Company Leads (`snappytools/greenhouse-lever-ashby-jobs`) Actor

Open jobs from companies' own Greenhouse, Lever and Ashby boards. Paste names, websites or board links, or search 12,000 companies by job title. Plus one row per hiring company with website, emails and phones.

- **URL**: https://apify.com/snappytools/greenhouse-lever-ashby-jobs.md
- **Developed by:** [Snappy](https://apify.com/snappytools) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.00 / 1,000 jobs

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Greenhouse, Lever & Ashby Jobs + Hiring Company Leads

Find companies that are hiring right now, with their website, emails and phone numbers. Jobs come from companies' own job boards on Greenhouse, Lever and Ashby, the hiring systems used by thousands of tech companies and startups.

Search a built-in directory of about 12,000 companies by job title ("every company that posted a remote Account Executive job in the last two weeks"), or paste the companies you care about in whatever form you have them: a name, a website, a careers page or a job board link.

You get **one row per hiring company** (open jobs, which departments are hiring, jobs posted in the last 7 and 30 days, website, and if you turn it on, emails, phones and socials), and **one row per job** (title, department, location, remote or hybrid, salary when published, posted date and apply link). Choose either or both.

Put it on a schedule with **Only new jobs since my last run** and each run returns only jobs you haven't had before, with company rows showing how many jobs opened and closed since the last run.

### Why this one

- **Hiring companies as leads, not just job rows.** A company with 40 open jobs becomes one row with its website, emails, phone numbers, socials and hiring signals. In a real directory search (remote Account Executive jobs posted in the last 14 days, 18 Oct 2026), 32 of 38 hiring companies came back with an email or phone number.
- **Search by job title across about 12,000 companies.** No need to know the companies first. In the test above, checking all 12,441 boards took about 7 minutes, and the whole run, contacts included, under 10.
- **Input you already have.** Company names, websites, careers pages or job board links, one per line. The tool works out which system each company uses, and only uses a board when the board's own company name matches, so you don't get another company's jobs.
- **Contacts from the company's own website.** The tool finds the website (from the job board where possible) and checks the homepage and contact page. General mailboxes like hello@ and sales@ come before hiring and privacy addresses.
- **Pay once per lead.** "Only companies I haven't had before" skips companies an earlier run already gave you.
- **$1 per 1,000 jobs.** Nothing for companies that weren't found, boards with no matching jobs, or status rows.

### Quick start: a lead list in one run

Paste this into the Input tab (JSON view) and click Start:

```json
{
    "mode": "directory",
    "titleKeywords": ["account executive", "sales development"],
    "workplaceTypes": ["remote"],
    "postedWithinDays": "14",
    "output": "companies",
    "findCompanyContacts": true,
    "maxJobsTotal": 300
}
```

You get one row per company that posted a remote Account Executive or Sales Development role in the last two weeks, with their website and contact details. Turn on **Only companies I haven't had before** and schedule it weekly to get only new companies each time.

Or check a list of companies you already know:

```json
{
    "companies": [
        "Stripe",
        "ramp.com",
        "https://jobs.lever.co/palantir",
        "Acme Robotics | acmerobotics.com"
    ],
    "output": "jobsAndCompanies",
    "findCompanyContacts": true,
    "titleKeywords": ["engineer"]
}
```

### What you can use it for

| Who | What for |
| --- | --- |
| B2B sales teams and agencies | A company hiring its first marketer, five engineers or a new sales team is a buying signal. Find companies hiring for roles your product or service supports and contact them while it's relevant |
| Recruiters | See who is hiring what, how fast (jobs posted in the last 7 and 30 days), and who to contact |
| Job boards and aggregators | A scheduled feed of new jobs from the companies or roles in your niche, with apply links |
| Investors and market researchers | Hiring by department, location and remote share across a list of companies, tracked over time |
| Salary research | Published salary ranges (structured on Lever and Ashby, and pay ranges written in Greenhouse job descriptions) |

### How to use it

1. Click **Try for free**.
2. Pick **Where to look**:
   - **My list of companies**: paste one company per line. Any of these work:
     - `Stripe` (a company name)
     - `ramp.com` (a website)
     - `acme.com/careers` (a careers page)
     - `https://job-boards.greenhouse.io/stripe`, `https://jobs.lever.co/palantir`, `https://jobs.ashbyhq.com/ramp` (job board links, including EU Lever boards on jobs.eu.lever.co)
     - `greenhouse:stripe`, `lever:palantir`, `ashby:ramp` (a board name with its system)
     - `Acme Robotics | acmerobotics.com` (a name and a website, for example two columns pasted from a spreadsheet)
   - **Search the directory**: add at least one job title keyword. Every board in the directory is checked, which takes about 7 minutes, plus a few more if you ask for contacts.
3. Choose **What to return**: Jobs, Jobs and hiring companies, or Hiring companies only.
4. Optionally filter by job title words, words to exclude, location, remote/hybrid/on-site, department, and how recently the job was posted.
5. Click **Start**.

For a daily feed, go to **Schedules**, use the same input, and tick **Only new jobs since my last run**.

### What data you get

The Output has four tabs: **Jobs**, **Salaries**, **Hiring companies** and **Run status**.

#### Job rows

| Field | What it is | Example |
| --- | --- | --- |
| `title`, `company` | Job title and company | `Security Engineer, Cloud`, `Ramp` |
| `department`, `team` | As the company labels them | `Engineering`, `Backend` |
| `location`, `locations`, `country` | Main location, all locations, and country when the board gives one | `New York, NY (HQ)` |
| `workplaceType` | `remote`, `hybrid` or `on-site`, from the board's setting or the words "Remote" or "Hybrid" in the location. Empty when the board doesn't say | `hybrid` |
| `employmentType` | `Full-time`, `Part-time`, `Contract`, `Internship` or `Temporary` | `Full-time` |
| `salaryText`, `salaryMin`, `salaryMax`, `salaryCurrency`, `salaryPeriod` | When published. `salaryCurrency` is left empty when the ad only shows "$" without saying which dollar | `$211.4K - $290.6K`, `211400`, `290600`, `USD`, `year` |
| `salarySource` | `job board` (the board's salary fields) or `job description` (a pay range written in the text) | `job board` |
| `postedAt`, `daysAgo`, `updatedAt` | When the job was first posted (and last updated, on Greenhouse and Lever) | |
| `jobUrl`, `applyUrl` | Links to the job and its application form | |
| `companyWebsite` | The company's website, when the board or your input gives it | `https://ramp.com/` |
| `ats`, `boardSlug`, `boardUrl` | Which system, and the company's board | `Ashby`, `ramp`, `https://jobs.ashbyhq.com/ramp` |
| `jobId` | The board's own job ID | |
| `isNew` | Only with "Only new jobs since my last run" | `true` |

With **Include full job descriptions** you also get `description` (plain text) and `descriptionHtml`.

#### Hiring company rows

One row per company with matching jobs in the run.

| Field | What it is |
| --- | --- |
| `companyName` | As shown on the job board |
| `website`, `websiteSource` | Their website, and where it came from: `your input`, `job board page`, `job links on the company careers site`, `web address in job ads`, `email domain in job ads`, or (with contact finding on) `matched from company name`, where the homepage has to show the company's name |
| `emails`, `phones`, `socials`, `contactPageUrl` | With **Find company emails and phone numbers** on: from their homepage and contact page, plus emails in their job ads. Own-domain emails first, general mailboxes before hiring and privacy ones. Phones are in international format (`+14155550123`) |
| `contactStatus` | `found`, `no website found`, `none found on website`, `website unreachable (...)`, or `not requested` |
| `jobAdEmails`, `jobAdPhones` | Contact details written in their job ads (often a recruiting address) |
| `openJobs` | All open jobs on their board |
| `matchingJobs`, `matchingJobTitles` | Jobs that match your filters, and their titles |
| `jobsPostedLast7Days`, `jobsPostedLast30Days` | How many of their open jobs were posted recently |
| `topDepartments` | Departments with the most open jobs, with counts |
| `locations`, `countries`, `remoteShare` | Where the matching jobs are, and the share marked remote (0 to 1) |
| `newestPostingDate`, `oldestPostingDate`, `salaryRange` | Posting dates of matching jobs, and the range of published yearly salaries in one currency |
| `newJobsSinceLastRun`, `jobsClosedSinceLastRun` | With "Only new jobs": matching jobs that are new since the last run, and previously delivered jobs that have closed |
| `ats`, `boardSlug`, `boardUrl`, `foundBy` | Their board, and how it was found (`company directory`, `link on the company website`, `your job board link`, or a board named after the company whose name was confirmed) |
| `sampleJobUrls`, `input` | A few job links, and the line of your list it came from |

Example from a real run (directory search for remote Account Executive jobs, 18 Oct 2026, trimmed):

```json
{
    "type": "company",
    "companyName": "Motive",
    "website": "https://gomotive.com/",
    "websiteSource": "job board page",
    "emails": ["info@gomotive.com", "sales@gomotive.com", "press@gomotive.com", "support@gomotive.com"],
    "phones": ["+18555113529", "+18554343564"],
    "socials": { "linkedin": "https://linkedin.com/company/motive-inc", "x": "https://x.com/Motive_inc" },
    "contactPageUrl": "https://gomotive.com/company/contact-us/",
    "contactStatus": "found",
    "openJobs": 153,
    "jobsPostedLast7Days": 14,
    "jobsPostedLast30Days": 52,
    "topDepartments": ["Software Engineering (14)", "Marketing (10)", "Customer Support (CSP) (9)"],
    "matchingJobTitles": ["Mid Market Account Executive"],
    "salaryRange": "USD 200,000–217,000 per year",
    "ats": "Greenhouse",
    "boardUrl": "https://job-boards.greenhouse.io/gomotive"
}
```

#### Run status

One free row per line of your list saying what happened, for example: "Delivered 20 jobs from Acme's Greenhouse board (found by: company directory). The board has 140 open jobs; 35 match your filters." Companies that couldn't be found, boards with no matching jobs, links to other job systems (Workday, Workable and so on) and lines that couldn't be read each get their own row, and you aren't charged for them. There's one more row for the hiring companies, or one for the whole directory search. A run summary is saved as `OUTPUT` in the key-value store.

### Pricing

You pay per result, nothing for empty boards, companies that weren't found, or status rows.

| Event | Price |
| --- | --- |
| Job | $1.00 per 1,000 jobs |
| Full job description (only if you turn it on) | $0.50 per 1,000 jobs |
| Hiring company row | $0.002 per company |
| Contact details found for a company (only if you turn it on, and only when at least one email or phone number is found) | $0.008 per company |
| Run start | $0.00005 per run |

So a company lead with contact details costs $0.01, and one where nothing was found costs $0.002. For example:

| Run | Cost |
| --- | --- |
| 1,000 jobs | $1.00 |
| 1,000 jobs with full descriptions | $1.50 |
| 100 hiring companies only, with contacts found for 70 | $0.76 |
| 300 jobs plus their 120 hiring companies, contacts found for 80 | $1.18 |

If you set a maximum cost per run, the run stops cleanly at that limit and the status row says so.

### Good to know

- **Greenhouse, Lever and Ashby only.** Companies on Workday, Workable, SmartRecruiters, BambooHR and others get a free status row saying which system their careers page links to.
- **Finding a company by name**: names in the built-in directory are matched directly. Otherwise the tool tries boards named after the company ("Acme Robotics" → `acmerobotics`, `acme-robotics`) and only uses one when the board's company name matches. If it finds a board it can't confirm, the status row names it so you can add it yourself (for example `greenhouse:acme`). A website or a board link is always more reliable than a name.
- **The directory** was built in October 2026 from two open lists of company boards. Some of those companies have since moved to another system or stopped hiring; their boards are skipped. Companies not in the directory can still be found from your list.
- **Directory searches** keep the newest matching jobs across all companies, up to **Max jobs in total** (500 by default), and make company rows for the companies behind them. For a bigger lead list, raise it.
- **Job aggregators and recruitment agencies** that have their own boards (they repost other companies' jobs) are left out of directory searches by default, judged by their name. Turn off "Leave out job aggregators" to include them.
- **Remote, hybrid and on-site** come from the board's own setting when it has one (Lever and Ashby), otherwise from the words "Remote" or "Hybrid" in the location. Greenhouse boards often say neither, so filtering by on-site leaves those jobs out.
- **Salaries** are only there when the company publishes them. Lever and Ashby have salary fields. On Greenhouse, salaries are read from pay ranges written in the job description, only when they sit next to a word like "salary", "pay" or "compensation".
- **Only new jobs** remembers job IDs per company and filter combination, for as long as each job stays open. Changing the filters starts fresh. **Only companies I haven't had before** works the same way for companies.
- **Contact details** come only from public pages: the company's own website and its job ads. Nothing behind a login is accessed. Contact crawling checks up to 4 pages per company and doesn't run JavaScript. Use the details in line with the data protection and anti-spam laws where you and the company are (for example GDPR, the UK's PECR, CAN-SPAM and Canada's CASL).
- **Hiring in Australia, New Zealand or Asia on job boards?** See [SEEK Jobs Scraper + Hiring Company Leads](https://apify.com/snappytools/seek-jobs-scraper), [JobStreet & JobsDB Scraper + Hiring Company Leads](https://apify.com/snappytools/jobstreet-jobsdb-scraper) and [MyCareersFuture Scraper + Hiring Company Leads](https://apify.com/snappytools/mycareersfuture-scraper). Same company rows, same prices.
- This tool isn't affiliated with or endorsed by Greenhouse, Lever or Ashby.

### Getting the data out

Download results as Excel, CSV or JSON from the Output tab, or send them on automatically: Google Sheets, Slack, Zapier, Make and webhooks are in the **Integrations** tab, and every run is available through the Apify API.

### Questions or problems

Open an issue on the **Issues** tab and include the run link. I reply within one business day.

# Actor input Schema

## `mode` (type: `string`):

"My list of companies": the companies you paste below. "Search the directory": every company in the built-in directory of about 12,000 Greenhouse, Lever and Ashby boards, filtered by your job title keywords. Takes about 7 to 10 minutes.

## `companies` (type: `array`):

One company per line, in any of these forms: a name ("Stripe"), a website ("ramp.com"), a careers page ("acme.com/careers"), a job board link ("https://jobs.lever.co/palantir", "https://job-boards.greenhouse.io/stripe", "https://jobs.ashbyhq.com/ramp"), or a board name with its system ("greenhouse:stripe", "lever:palantir", "ashby:ramp"). A name and website together also work: "Acme Robotics | acme.io". The tool works out which system each company uses. Up to 1,000 lines.

## `output` (type: `string`):

Jobs only, jobs plus one row per hiring company, or just the hiring companies (for lead lists).

## `findCompanyContacts` (type: `boolean`):

For each hiring company, find its website (from the job board, its job links, its job ads, or its name) and check the homepage and contact page for emails, phone numbers and social links. Emails written in the job ads are added too. Needs "Jobs and hiring companies" or "Hiring companies only". Allow about 2 to 5 seconds per company.

## `maxJobsPerCompany` (type: `integer`):

The most jobs to return from each company, newest first. Company rows still count all of the company's matching jobs.

## `titleKeywords` (type: `array`):

Only jobs whose title contains one of these words or phrases, for example "account executive", "engineer" or "marketing". A word matches at the start of a word, so "engineer" also finds "Engineering Manager". Leave empty for all jobs. Required for a directory search.

## `excludeTitleKeywords` (type: `array`):

Leave out jobs whose title contains one of these, for example "intern" or "senior".

## `locations` (type: `array`):

Only jobs whose location contains one of these, as the company wrote it, for example "London", "New York", "Germany", "Remote" or "US". Leave empty for anywhere.

## `workplaceTypes` (type: `array`):

Leave empty for all. Uses the board's own remote/hybrid/on-site setting, or the word "Remote" or "Hybrid" in the location. Jobs that say neither count as on-site only when the board says so.

## `departments` (type: `array`):

Only jobs in a department or team containing one of these, for example "Sales" or "Engineering". Departments are named by each company, so check a few rows.

## `postedWithinDays` (type: `string`):

Only jobs first posted in this many days.

## `directoryAts` (type: `array`):

For a directory search only. Leave empty for all three (about 6,500 Greenhouse, 2,500 Lever and 3,400 Ashby boards).

## `maxJobsTotal` (type: `integer`):

For a directory search only. The newest matching jobs across all companies are kept, up to this many, and company rows are made for the companies behind them.

## `skipAggregators` (type: `boolean`):

For a directory search only. Leaves out boards that repost other companies' jobs (job aggregators such as Jobgether) and recruitment or staffing agencies, judged by their name, so your leads are companies hiring for themselves. A few may slip through.

## `includeDescriptions` (type: `boolean`):

Adds the full job description as plain text and as HTML. Costs a little extra per job.

## `onlyNewSinceLastRun` (type: `boolean`):

For schedules. Remembers the jobs each company has already returned and skips them next time. Company rows also show how many jobs opened and closed since the last run. The first run returns everything, as usual.

## `newCompaniesOnly` (type: `boolean`):

Skip hiring companies that an earlier run already delivered (with the same list, or the same watch name). Stops you paying twice for the same lead.

## `watchName` (type: `string`):

Optional. Runs with the same input share their memory automatically. Give a name to keep two schedules separate, or to share one company memory across different inputs.

## Actor input object example

```json
{
  "mode": "companies",
  "companies": [
    "Stripe",
    "ramp.com",
    "https://jobs.lever.co/palantir"
  ],
  "output": "jobsAndCompanies",
  "findCompanyContacts": true,
  "maxJobsPerCompany": 20,
  "postedWithinDays": "any",
  "maxJobsTotal": 500,
  "skipAggregators": true,
  "includeDescriptions": false,
  "onlyNewSinceLastRun": false,
  "newCompaniesOnly": false
}
```

# Actor output Schema

## `jobs` (type: `string`):

No description

## `salaries` (type: `string`):

No description

## `companies` (type: `string`):

No description

## `status` (type: `string`):

No description

## `allResults` (type: `string`):

No description

## `runSummary` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "mode": "companies",
    "companies": [
        "Stripe",
        "ramp.com",
        "https://jobs.lever.co/palantir"
    ],
    "output": "jobsAndCompanies",
    "findCompanyContacts": true,
    "maxJobsPerCompany": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("snappytools/greenhouse-lever-ashby-jobs").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "mode": "companies",
    "companies": [
        "Stripe",
        "ramp.com",
        "https://jobs.lever.co/palantir",
    ],
    "output": "jobsAndCompanies",
    "findCompanyContacts": True,
    "maxJobsPerCompany": 20,
}

# Run the Actor and wait for it to finish
run = client.actor("snappytools/greenhouse-lever-ashby-jobs").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "mode": "companies",
  "companies": [
    "Stripe",
    "ramp.com",
    "https://jobs.lever.co/palantir"
  ],
  "output": "jobsAndCompanies",
  "findCompanyContacts": true,
  "maxJobsPerCompany": 20
}' |
apify call snappytools/greenhouse-lever-ashby-jobs --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,snappytools/greenhouse-lever-ashby-jobs"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/F0m4MgMYzPeeyNbHu/builds/rRXdWFjB6hje8qZqQ/openapi.json
