# Greenhouse, Lever, Ashby & Workable Jobs Scraper (`northloop-labs/company-jobs-finder`) Actor

Get every open job from company career pages on Greenhouse, Lever, Ashby, Workable, SmartRecruiters and Recruitee in one normalized list with location, remote, salary and description. Just enter company names or careers URLs.

- **URL**: https://apify.com/northloop-labs/company-jobs-finder.md
- **Developed by:** [Northloop Labs](https://apify.com/northloop-labs) (community)
- **Categories:** Jobs, Lead generation, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per event

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 & Workable Jobs Scraper

**Get every open job from company career pages in one clean, normalized list.** Enter company names like `stripe`, `notion` or `Hugging Face`, or paste careers page URLs. The Actor finds each company's job board on **Greenhouse, Lever, Ashby, Workable, SmartRecruiters or Recruitee** and returns every open position. Each job comes with its title, department, location, remote/hybrid/onsite, employment type, posting date, salary range when published, apply link and the full description as plain text.

It reads the official public job board APIs that these platforms provide for career sites. That makes it fast (hundreds of jobs in seconds), stable, and independent of proxies or browsers.

### What you can use it for

- **Sales and lead generation:** find companies hiring for roles your product serves ("hiring 5 data engineers" = buying signal).
- **Recruiting and sourcing:** watch competitors' and target companies' openings every day.
- **Job boards and newsletters:** build a niche board (remote AI jobs, climate jobs, jobs in Berlin) from direct company sources.
- **Market and salary research:** compare pay ranges, locations and team growth across companies.
- **AI and RAG pipelines:** feed clean job descriptions into LLMs, matching tools or alerts.

### Supported job boards and ATS platforms

| Platform | Example careers URL |
|---|---|
| Greenhouse | `https://boards.greenhouse.io/airbnb` |
| Lever | `https://jobs.lever.co/spotify` |
| Ashby | `https://jobs.ashbyhq.com/openai` |
| Workable | `https://apply.workable.com/huggingface` |
| SmartRecruiters | `https://jobs.smartrecruiters.com/BoschGroup` |
| Recruitee | `https://bunq.recruitee.com` |

Using a company name instead of a URL? The Actor tries the likely board names (for example `Hugging Face` → `huggingface`, `hugging-face`) on every platform and uses the one with open jobs. If a company isn't found, paste its careers URL from the "Apply" link on its job pages.

### How to scrape jobs from Greenhouse, Lever, Ashby and Workable

| Field | Description |
|---|---|
| `companies` | Company names, domains or careers URLs (required) |
| `keywords` / `excludeKeywords` | Keep or drop jobs by words in the title |
| `locations` | Keep jobs whose location contains any of these (e.g. `London`, `Germany`, `Remote`) |
| `departments` | Keep jobs in matching departments or teams |
| `remoteOnly` | Only remote jobs |
| `postedWithinDays` | Only jobs posted in the last N days |
| `includeDescription` | Add the full description as plain text (default on) |
| `maxJobsPerCompany` / `maxResults` | Limits. When the total limit is hit, it is shared fairly between companies |

#### Input example

```json
{
  "companies": ["stripe", "https://jobs.ashbyhq.com/openai", "spotify"],
  "keywords": ["engineer"],
  "locations": ["London", "Remote"],
  "postedWithinDays": 30,
  "maxResults": 200
}
```

#### Output example

```json
{
  "company": "Notion",
  "title": "Solutions Consultant, Commercial, Benelux",
  "department": "Sales",
  "team": "Solutions Consultant",
  "employmentType": "FullTime",
  "workplaceType": null,
  "isRemote": null,
  "location": "Dublin, Ireland",
  "city": "Dublin",
  "region": "Ireland",
  "country": "Ireland",
  "allLocations": ["Dublin, Ireland"],
  "postedAt": "2026-10-19T14:12:22.410+00:00",
  "salaryMin": 144000,
  "salaryMax": 156000,
  "salaryCurrency": "EUR",
  "salaryText": "€144,000 - €156,000",
  "salarySource": "description",
  "url": "https://jobs.ashbyhq.com/notion/7ee208b1-...",
  "applyUrl": "https://jobs.ashbyhq.com/notion/7ee208b1-.../application",
  "ats": "ashby",
  "companySlug": "notion",
  "jobId": "7ee208b1-...",
  "descriptionText": "WHO WE ARE\n\nNotion is the collaborative AI workspace ...",
  "input": "notion",
  "scrapedAt": "2026-10-19T16:46:23.845Z"
}
```

`salarySource` tells you where the salary came from: `structured` (published by the ATS) or `description` (a pay range found in the job text). A per-company summary (detected platform, open jobs, saved jobs, errors) is saved as `RUN_SUMMARY` in the run's key-value store.

### How much does it cost?

Pay-per-event, with platform usage included:

- **$0.005 per run** (Actor start)
- **$0.0015 per job saved** ($1.50 per 1,000 jobs)

Example: 1,000 jobs from 10 companies cost about $1.51. Set a maximum cost per run in Apify and the Actor stops when it is reached.

### Tips

- SmartRecruiters boards are read up to 1,000 newest jobs per company unless you set `maxJobsPerCompany`.
- Run it on a schedule and compare `jobId`s to spot new openings.
- Turn off `includeDescription` if you only need titles and locations; it makes the dataset much smaller.

### Use with AI agents, MCP, Make, Zapier, n8n and the API

#### AI agents and the Apify MCP server

Your AI agent can run this Actor as a tool through the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp). In Claude, Cursor, VS Code or any other MCP client, add this server URL to load only this Actor:

```text
https://mcp.apify.com?tools=northloop-labs/company-jobs-finder
```

You sign in to Apify on first connection. Agents that use the default server can also find the Actor with `search-actors` and run it with `call-actor`. Pass `maxTotalChargeUsd` in `callOptions` to cap what one run may cost. The Actor uses pay-per-event pricing, so it also works with Apify's agentic payments.

Example prompt: *"List the open engineering roles at Stripe and Notion that are remote or in London, with salary ranges where published."*

#### Make, Zapier and n8n

Apify has official integrations for [Make](https://docs.apify.com/platform/integrations/make), [Zapier](https://docs.apify.com/platform/integrations/zapier) and [n8n](https://docs.apify.com/platform/integrations/n8n). Use "Run Actor", pick `northloop-labs/company-jobs-finder`, paste your input as JSON, and send the dataset items on to Google Sheets, Slack, a CRM or email. Inside Apify you can also connect Google Sheets or Slack, or add a [webhook](https://docs.apify.com/platform/integrations/webhooks) that fires when a run finishes.

#### API

Run it and get the results in one call (this endpoint waits up to 5 minutes, which suits small and medium runs):

```bash
curl -X POST "https://api.apify.com/v2/acts/northloop-labs~company-jobs-finder/run-sync-get-dataset-items" \
  -H "Authorization: Bearer $APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"companies": ["stripe", "notion"], "keywords": ["engineer"], "maxResults": 100}'
```

Or with the Python client (`pip install apify-client`). The JavaScript client works the same way:

```python
from apify_client import ApifyClient

client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("northloop-labs/company-jobs-finder").call(run_input={"companies": ["stripe", "notion"], "keywords": ["engineer"], "maxResults": 100})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)
```

### Data & privacy

- The Actor collects only **public job postings** that the companies publish on their career pages: job, company, location, salary and description data.
- It collects **no personal data**: no recruiter or hiring-manager names, emails or phone numbers, and no candidate or applicant data. Application inbox addresses that some platforms expose are dropped.
- Results are written **only to the run's default Apify dataset** in your account. The Actor uses no external storage or webhooks, sends the data nowhere else and keeps no copy. The `RUN_SUMMARY` record holds only per-company counts and errors.

### Is it legal to scrape job postings?

The Actor reads job postings that companies publish publicly through their job board providers' public APIs, which exist so career sites and job aggregators can display them. It does not log in or bypass any access control. You are responsible for how you use the data. Respect the companies' and platforms' terms and applicable laws. Read more in Apify's post [Is web scraping legal?](https://blog.apify.com/is-web-scraping-legal/)

### FAQ

#### How much does it cost to scrape company job postings?

$0.0015 per job saved plus $0.005 per run start, with platform usage included. 1,000 jobs cost about $1.51. Companies whose job board isn't found save no jobs, so they cost nothing beyond the run start. Apify's free plan includes monthly usage credit you can spend on this Actor.

#### How many companies and jobs can one run handle?

As many companies as you like; they are processed in batches. One run can save up to 100,000 jobs (`maxResults`), and `maxJobsPerCompany` caps each company. SmartRecruiters boards are read up to the 1,000 newest jobs per company unless you set your own limit.

#### Does it scrape LinkedIn, Indeed or Glassdoor?

No. It reads jobs straight from company career pages hosted on Greenhouse, Lever, Ashby, Workable, SmartRecruiters and Recruitee.

#### How do I track new job openings every day?

Add a schedule in Apify (for example daily at 7:00) and set `postedWithinDays` to `1` or `2`. Or compare `jobId` with the previous run to see which roles are new and which were filled.

#### Does it include salaries?

When the company publishes one. `salaryMin`, `salaryMax` and `salaryCurrency` come from the platform's structured pay data or from a pay range in the job text, and `salarySource` tells you which.

#### A company wasn't found. What should I do?

Open any job on its careers site and paste the URL of the job board (for example `https://jobs.lever.co/spotify`) instead of the name. The `RUN_SUMMARY` record lists every input with its detected platform or the reason it wasn't found.

#### Where does the data come from, and is it allowed?

From the public job board APIs these platforms run for career sites. No recruiter, hiring-manager or candidate data is collected. See "Is it legal to scrape job postings?" above.

#### Which export formats can I use?

Results land in an Apify dataset. Download them as JSON, JSONL, CSV, Excel, XML, HTML or RSS from the run page, or read them through the API, Make, Zapier, n8n or Google Sheets.

### How this Actor was made

This Actor was made with AI. An AI agent wrote and tested the code, this README and the store listing, and a human owns and maintains the Actor.

### More Actors from Northloop Labs

- [Luma, Eventbrite & Meetup Events Scraper](https://apify.com/northloop-labs/tech-events-finder): tech, AI and startup events from Luma, Eventbrite and Meetup.
- [Google Ads Transparency Center Scraper](https://apify.com/northloop-labs/google-ads-transparency-library): a company's ads from the Google Ads Transparency Center.
- [Podcast Transcriber for RSS & Apple Podcasts](https://apify.com/northloop-labs/podcast-transcriber): podcast transcripts with timestamps and SRT subtitles.
- [EU TED & UK Find a Tender Scraper](https://apify.com/northloop-labs/public-tenders-monitor): UK and EU public tenders with daily alerts.

### Feedback

Missing a platform (Personio, Teamtailor, BambooHR, Workday)? Open an issue in the **Issues** tab.

# Actor input Schema

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

Company names ("stripe", "Hugging Face"), domains ("notion.so") or careers page URLs (https://jobs.lever.co/spotify, https://boards.greenhouse.io/airbnb, https://jobs.ashbyhq.com/openai, https://apply.workable.com/huggingface, https://jobs.smartrecruiters.com/BoschGroup, https://bunq.recruitee.com). The job board is detected automatically.

## `keywords` (type: `array`):

Keep only jobs whose title contains any of these words, e.g. engineer, designer, sales. Leave empty for all jobs.

## `excludeKeywords` (type: `array`):

Drop jobs whose title contains any of these words, e.g. intern, senior.

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

Keep only jobs whose location contains any of these, e.g. London, Germany, Remote, US.

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

Keep only jobs in departments or teams containing any of these, e.g. Engineering, Marketing.

## `remoteOnly` (type: `boolean`):

Keep only jobs marked remote.

## `postedWithinDays` (type: `integer`):

Keep only jobs posted in the last N days. 0 = any time.

## `includeDescription` (type: `boolean`):

Add the full job description as clean plain text.

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

Newest jobs first. 0 = no limit.

## `maxResults` (type: `integer`):

Maximum number of jobs to save in total. You pay per saved job.

## `atsPlatforms` (type: `array`):

Which job board platforms to try when you give a company name. Leave all selected unless you know the platform.

## `proxyConfiguration` (type: `object`):

Not needed: all job boards are read through their public APIs.

## Actor input object example

```json
{
  "companies": [
    "stripe",
    "notion",
    "spotify",
    "huggingface",
    "bunq"
  ],
  "keywords": [],
  "excludeKeywords": [],
  "locations": [],
  "departments": [],
  "remoteOnly": false,
  "postedWithinDays": 0,
  "includeDescription": true,
  "maxJobsPerCompany": 20,
  "maxResults": 100,
  "atsPlatforms": [
    "greenhouse",
    "lever",
    "ashby",
    "workable",
    "recruitee",
    "smartrecruiters"
  ],
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `overview` (type: `string`):

Company, title, department, location, workplace, type, salary, posted date, ATS and link.

## `details` (type: `string`):

Every field, including salary details and the plain-text job description.

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

Per company: detected ATS, board slug, open jobs, jobs saved and any error (no job data).

# 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 = {
    "companies": [
        "stripe",
        "notion",
        "spotify",
        "huggingface",
        "bunq"
    ],
    "maxJobsPerCompany": 20,
    "maxResults": 100,
    "proxyConfiguration": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("northloop-labs/company-jobs-finder").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 = {
    "companies": [
        "stripe",
        "notion",
        "spotify",
        "huggingface",
        "bunq",
    ],
    "maxJobsPerCompany": 20,
    "maxResults": 100,
    "proxyConfiguration": { "useApifyProxy": False },
}

# Run the Actor and wait for it to finish
run = client.actor("northloop-labs/company-jobs-finder").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 '{
  "companies": [
    "stripe",
    "notion",
    "spotify",
    "huggingface",
    "bunq"
  ],
  "maxJobsPerCompany": 20,
  "maxResults": 100,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}' |
apify call northloop-labs/company-jobs-finder --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,northloop-labs/company-jobs-finder"
        }
    }
}
```

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/BRHRXSql4Y6IsSo3i/builds/7lXZ9jLrVsnIfXSbw/openapi.json
