# Company Jobs API: Greenhouse, Lever, Ashby & More (`openfeeds/greenhouse-lever-ashby-jobs-api`) Actor

Live job postings from company boards on Greenhouse, Lever, Ashby, Workable, Recruitee and Personio. One clean schema with salaries, keyword filters and a new-or-changed jobs monitor.

- **URL**: https://apify.com/openfeeds/greenhouse-lever-ashby-jobs-api.md
- **Developed by:** [OpenFeeds](https://apify.com/openfeeds) (community)
- **Categories:** Jobs, Lead generation, Automation
- **Stats:** 3 total users, 2 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.80 / 1,000 job returneds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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

### What does Company Jobs API do?

**Company Jobs API** fetches every open job from a company's own **job board on Greenhouse, Lever, Ashby, Workable, Recruitee or Personio** and returns them in **one clean, flat schema**. It reads the vendors' official public job-board APIs (for example the [Greenhouse Job Board API](https://developers.greenhouse.io/job-board.html), the [Lever Postings API](https://github.com/lever/postings-api) and the [Ashby public job posting API](https://developers.ashbyhq.com/docs/public-job-posting-api)), so you get **live jobs** without scraping careers pages.

You enter **companies** (job-board URLs, careers-page URLs, domains, company names or `ats:slug`), and you get each job with title, department, normalised location, workplace type, employment type, **salary** (where the company publishes it), the description as **Markdown** or clean HTML, ISO dates and the source URL.

An optional **monitoring mode** returns only jobs that are **new or changed** since the last run, plus free **closed** notices.

It is **not** a keyword search over millions of pre-scraped jobs, and it does not touch LinkedIn, Indeed or Glassdoor. It never collects recruiter or contact data.

### Why use Company Jobs API?

- 📈 **Hiring signals for sales (GTM):** monitor 50–500 target accounts and get alerted when they open roles you sell into.
- 🧑‍💼 **Recruiting and sourcing:** track openings at client and target companies, filtered by department and location.
- 🗂️ **Niche job boards and aggregators:** ingest jobs from a curated company list, with `uniqueId` for deduplication and Markdown descriptions.
- 💶 **Salary and labour-market research:** structured pay ranges from Greenhouse, Lever, Ashby, Recruitee and Personio, plus ranges parsed from description text.
- 🤖 **AI agents (Apify MCP):** answer "is company X hiring for Y?" with a small, cheap output.

**Features**

- **Six job-board systems** in one schema: Greenhouse, Lever, Ashby, Workable, Recruitee and Personio.
- **Auto-detection** from board URLs, careers pages, domains or company names:
  - **Names:** a board is used only when it has **open jobs and its published company name matches** the name you entered, so a board that merely uses the same slug but belongs to a differently named company is rejected.
  - **Domains and careers pages:** the job board the site redirects to or links to is used. When a page links **several companies' boards** (for example an investor's portfolio jobs page), a board is used only if its company name matches the site name or domain, its Ashby company website is that domain, or its board name equals the domain name. Otherwise the Actor looks for boards named after the domain and checks them like names.
  - For common names, paste the board URL.
- **Filters before you pay:** keywords, excluded words, locations, workplace types, departments, posting date. You pay only for jobs that pass.
- **Salary** from the job board's pay fields or parsed from the description (`salarySource` tells you which).
- **Monitoring mode** with `changedFields` and free closed-job notices.
- **No personal data:** contact details in descriptions are removed by default.
- **Apify platform extras:** scheduling, API access, integrations (Make, Zapier, Slack and webhooks), datasets in JSON/CSV/Excel, and use from AI agents via the Apify MCP server.

### What data does Company Jobs API return?

| Field                                                         | Example                                                          | Description                                                                                                                     |
| ------------------------------------------------------------- | ---------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------- |
| `companyName`                                                 | `GitLab`                                                         | Company name as published on the job board                                                                                      |
| `ats`                                                         | `greenhouse`                                                     | Job-board system: greenhouse, lever, ashby, workable, recruitee, personio                                                       |
| `title`                                                       | `Senior Software Engineer, Security Factory: Code Security`      | Job title                                                                                                                       |
| `department` / `team`                                         | `Sec Engineering`                                                | Department and team, where the job board has them                                                                               |
| `location` / `locations`                                      | `Remote, Canada; Remote, United States`                          | Primary location and all listed locations                                                                                       |
| `countryCodes`                                                | `["CA", "US"]`                                                   | ISO country codes from the job board's country field or, for Greenhouse and Personio, from a country named in the location text |
| `workplaceType` / `isRemote`                                  | `remote` / `true`                                                | remote, hybrid or onsite                                                                                                        |
| `employmentType`                                              | `FULL_TIME`                                                      | FULL_TIME, PART_TIME, CONTRACT, TEMPORARY, INTERNSHIP, APPRENTICESHIP, OTHER                                                    |
| `salaryMin` / `salaryMax` / `salaryCurrency` / `salaryPeriod` | `139200` / `235200` / `USD` / `YEAR`                             | Published pay range                                                                                                             |
| `salarySource` / `salaryText`                                 | `structured` / `United States Salary Range: 139,200–235,200 USD` | Where the salary came from, and the text as published                                                                           |
| `descriptionMarkdown` / `descriptionHtml`                     | `GitLab is the intelligent…`                                     | Description as Markdown and/or clean HTML                                                                                       |
| `jobUrl` / `applyUrl`                                         | `https://job-boards.greenhouse.io/gitlab/jobs/8738179002`        | Job posting and application page                                                                                                |
| `publishedAt` / `updatedAt`                                   | `2026-10-10T00:31:32.000Z`                                       | UTC ISO 8601 dates (Workable: date only)                                                                                        |
| `uniqueId`                                                    | `greenhouse:gitlab:8738179002`                                   | Stable key for deduplication: `ats:boardSlug:jobId`                                                                             |
| `changeType` / `changedFields`                                | `changed` / `["salary"]`                                         | Monitoring mode only: new, changed or closed                                                                                    |

Fields a job board does not provide are `null` (lists are `[]`), so every item has the same 35 fields.

### How to get jobs from Greenhouse, Lever, Ashby and other job boards

1. Open the Actor and paste your **companies**, one per line (board URLs are best).
2. Optionally set **filters** (keywords, locations, workplace types, departments, posted within N days) and limits.
3. Click **Start**.
4. Download the jobs as JSON, CSV, Excel or HTML, or read them through the API.

**Monitoring recipe (new-job alerts):** turn on **Only new or changed jobs**, give the monitor a **state store name** (e.g. `sales-accounts`), create a **daily schedule**, and connect a Slack, email or webhook integration. Each run then delivers only what changed.

### How much does it cost to get company jobs?

The Actor uses **pay-per-event** pricing. You pay per job returned after your filters:

| Apify plan | Price per job | Per 1,000 jobs |
| ---------- | ------------- | -------------- |
| Free       | $0.0015       | $1.50          |
| Starter    | $0.0012       | $1.20          |
| Scale      | $0.0010       | $1.00          |
| Business   | $0.0008       | $0.80          |

Plus **$0.00005 per run** (the standard Actor start fee).

Examples:

- 20 jobs from 3 companies ≈ **$0.03** on the Free plan.
- The default example (3 companies × 20 jobs = 60 jobs) ≈ **$0.09** on the Free plan, $0.072 on Starter.
- Monitoring 100 accounts daily with about 30 new or changed jobs per day ≈ 900 jobs per month ≈ **$1.08 per month** on Starter.

**Not charged:** jobs removed by your filters, closed-job notices, empty job boards, companies not found or unsupported, failed fetches, and repeat entries for a job board that is already in your list. The run stops cleanly at your spending limit.

### Input

See the **Input** tab for every option. Accepted company formats:

| Format                 | Example                                                                                                                                                                                         |
| ---------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Greenhouse board       | `https://boards.greenhouse.io/gitlab`, `https://job-boards.greenhouse.io/gitlab`                                                                                                                |
| Lever board            | `https://jobs.lever.co/spotify` (EU-hosted boards: `https://jobs.eu.lever.co/…`)                                                                                                                |
| Ashby board            | `https://jobs.ashbyhq.com/linear`                                                                                                                                                               |
| Workable board         | `https://apply.workable.com/huggingface/`                                                                                                                                                       |
| Recruitee board        | `https://bunq.recruitee.com`                                                                                                                                                                    |
| Personio board         | `https://1komma5grad.jobs.personio.de` (or `.jobs.personio.com`)                                                                                                                                |
| `ats:slug`             | `greenhouse:stripe`, `lever:spotify`, `lever-eu:…` (jobs.eu.lever.co), `ashby:openai`, `workable:huggingface`, `recruitee:bunq`, `personio:1komma5grad`, `personio-com:…` (….jobs.personio.com) |
| Careers page or domain | `https://linear.app/careers`, `stripe.com`                                                                                                                                                      |
| Company name           | `Hugging Face`                                                                                                                                                                                  |

**Tip:** board URLs and `ats:slug` are the fastest and most reliable. For names, the Actor checks the systems in **Job-board systems to check** and accepts a board only when it has open jobs and its published company name matches. For domains and careers pages it uses the board the site links to; when a page links several companies' boards, only a board that matches the site's name or domain is used.

**Same board twice:** entries that point to the same job board (for example `https://jobs.ashbyhq.com/linear`, `ashby:linear`, `Linear` and `linear.app`) are returned and charged once (repeated board URLs and `ats:slug` entries are not even fetched again). The extra entries appear in the COMPANIES record, in input order, with the note "Same job board as entry …"; lines repeated with different capitalisation get "Repeat of entry …".

**Reusing a board:** the COMPANIES record has each board's exact `boardUrl`, which you can paste as input. `ats:boardSlug` from the dataset works too, except for EU-hosted Lever boards (`lever-eu:boardSlug`) and Personio boards on ….jobs.personio.com (`personio-com:boardSlug`); the `jobUrl` host shows which.

Example input:

```json
{
    "companies": [
        "https://boards.greenhouse.io/gitlab",
        "https://jobs.ashbyhq.com/linear",
        "https://jobs.lever.co/spotify"
    ],
    "keywords": ["engineer"],
    "locations": ["Remote", "Germany"],
    "maxJobsPerCompany": 20,
    "descriptionFormat": "markdown"
}
```

**Filters:** keywords match the job title (and optionally the description), ignoring case and accents. Locations match the location text, the country name or a two-letter ISO code (`DE`). A two-letter code needs a country on the job: Ashby, Lever, Workable and Recruitee publish one, Greenhouse jobs get one when the location text names a country ("Remote, Germany"), but Personio boards list city names only, so filter Personio jobs by city (`Berlin`, `München`) instead of `DE`. Workplace-type filters exclude jobs whose board does not state a workplace type.

**Personio language:** by default you get each job ad in the company's own language. Choosing a language in **Personio language** drops the descriptions the company did not write in that language.

### Output

You can download the dataset in various formats such as JSON, HTML, CSV or Excel. A Greenhouse job with a published pay range (description shortened):

```json
{
    "companyInput": "https://boards.greenhouse.io/gitlab",
    "companyName": "GitLab",
    "ats": "greenhouse",
    "boardSlug": "gitlab",
    "jobId": "8738179002",
    "uniqueId": "greenhouse:gitlab:8738179002",
    "title": "Senior Software Engineer, Security Factory: Code Security",
    "department": "Sec Engineering",
    "team": null,
    "location": "Remote, Canada; Remote, United States",
    "locations": ["Remote, Canada; Remote, United States", "Canada", "United States of America"],
    "countryCodes": ["CA", "US"],
    "workplaceType": "remote",
    "isRemote": true,
    "employmentType": null,
    "employmentTypeRaw": null,
    "seniority": null,
    "salaryMin": 139200,
    "salaryMax": 235200,
    "salaryCurrency": "USD",
    "salaryPeriod": "YEAR",
    "salarySource": "structured",
    "salaryText": "United States Salary Range: 139,200–235,200 USD",
    "descriptionMarkdown": "GitLab is the intelligent orchestration platform for DevSecOps. GitLab enables organizations to increase developer productivity, improve operational efficiency,…",
    "descriptionHtml": null,
    "jobUrl": "https://job-boards.greenhouse.io/gitlab/jobs/8738179002",
    "applyUrl": "https://job-boards.greenhouse.io/gitlab/jobs/8738179002",
    "publishedAt": "2026-10-10T00:31:32.000Z",
    "updatedAt": "2026-10-10T00:31:32.000Z",
    "sourceUrl": "https://boards-api.greenhouse.io/v1/boards/gitlab/jobs?content=true&pay_transparency=true",
    "scrapedAt": "2026-10-13T00:30:47.603Z",
    "changeType": null,
    "changedFields": null,
    "firstSeenAt": null,
    "lastSeenAt": null
}
```

A Lever job whose salary was parsed from the description (fields shortened):

```json
{
    "companyName": "Spotify",
    "ats": "lever",
    "title": "Senior Program Analyst - GTM Ops",
    "department": "Advertising",
    "team": "Advertising Sales - Emerging and Scaled Sales",
    "location": "New York, NY",
    "countryCodes": ["US"],
    "workplaceType": "hybrid",
    "employmentType": "FULL_TIME",
    "employmentTypeRaw": "Permanent",
    "salaryMin": 92293,
    "salaryMax": 131847,
    "salaryCurrency": "USD",
    "salaryPeriod": "YEAR",
    "salarySource": "description",
    "salaryText": "$92,293 - 131,847",
    "jobUrl": "https://jobs.lever.co/spotify/ed409ff1-a241-4c2c-96ea-c988ca131671",
    "publishedAt": "2026-10-09T13:26:45.620Z"
}
```

A monitoring-mode item for a job whose pay range changed (fields shortened):

```json
{
    "companyName": "GitLab",
    "title": "Senior Software Engineer, Security Factory: Code Security",
    "salaryMin": 139200,
    "salaryMax": 235200,
    "jobUrl": "https://job-boards.greenhouse.io/gitlab/jobs/8738179002",
    "changeType": "changed",
    "changedFields": ["salary"],
    "firstSeenAt": "2026-10-13T00:28:18.505Z",
    "lastSeenAt": "2026-10-13T00:31:12.446Z"
}
```

**Per-company summary.** The run's key-value store holds a `COMPANIES` record with one entry per input: the status (`OK`, `NO_OPEN_JOBS`, `NOT_FOUND`, `NOT_DETECTED`, `UNSUPPORTED_ATS`, `BOARD_GONE`, `BLOCKED`, `ERROR`, `SKIPPED_LIMIT`), the detected job board, job counts and a message:

```json
{
    "input": "https://boards.greenhouse.io/gitlab",
    "status": "OK",
    "ats": "greenhouse",
    "boardSlug": "gitlab",
    "companyName": "GitLab",
    "boardUrl": "https://job-boards.greenhouse.io/gitlab",
    "apiUrl": "https://boards-api.greenhouse.io/v1/boards/gitlab/jobs?content=true&pay_transparency=true",
    "jobsOnBoard": 221,
    "jobsMatched": 221,
    "jobsOutput": 20,
    "jobsCharged": 20,
    "closedOutput": 0,
    "jobsSkippedErrors": 0,
    "alternatives": [],
    "message": "Limited to 20 newest jobs (maxJobsPerCompany).",
    "durationMs": 553
}
```

The Output tab also has three table views: **Overview**, **Changes (monitoring mode)** and **Salaries**.

### Monitoring mode explained

- **State store:** with **Only new or changed jobs** on, the Actor remembers the jobs of each job board in a named key-value store in your account (default `company-jobs-state`). Use a different **State store name** for each separate monitor, e.g. `sales-accounts` and `client-a`.
- **First run:** every current job is returned as `new` (and charged once).
- **Later runs:** only `new` jobs and `changed` jobs (with `changedFields`: title, location, details, salary, description) are returned and charged. Jobs that disappeared are returned once as `closed` notices, **free of charge**, if **Include closed jobs** is on.
- **Safety:** a company whose job board could not be fetched (network error, block, timeout) is never compared, so jobs are never marked closed because of an outage. If a job board returns "not found" but the monitor has stored jobs for it, the company gets the status `BOARD_GONE` and no closed notices; delete its record from the state store to confirm.
- **Reset:** delete the state store (or use a new name) to start over.

### Use with AI agents and MCP

For agents, keep the output small with `descriptionFormat: "none"`:

```json
{
    "companies": ["stripe"],
    "keywords": ["data engineer"],
    "descriptionFormat": "none",
    "maxJobsPerCompany": 10
}
```

### Tips

- **Cut costs:** use keyword, location and department filters and **Max jobs per company**. You pay only for jobs that pass.
- **Speed up:** use board URLs or `ats:slug`, and narrow **Job-board systems to check** when you enter names or domains.
- **Large monitors:** run them daily rather than hourly. Lever allows about one request per second, so very Lever-heavy lists take longer.
- **Long lists and the run timeout:** shortly before the run timeout the Actor stops starting new companies, marks the rest `SKIPPED_LIMIT` in the COMPANIES record and finishes successfully. Run those companies again, or raise the timeout. Board URLs are much faster than names.
- **Proxy:** not needed. Only set one if your runs report `BLOCKED`.

### FAQ

#### Is it legal to get jobs from these job boards?

The Actor uses the public job-board APIs that Greenhouse, Lever, Ashby, Workable, Recruitee and Personio document for publishing job ads. No login is used. robots.txt is respected, including Lever's crawl delay, and careers pages you enter are only read where robots.txt allows it. Job ads are business information that employers publish for wide distribution. You remain responsible for how you use the data; this is not legal advice.

#### Does it collect personal data?

No recruiter or contact data is collected, and **Remove contact details from descriptions** (on by default) removes email addresses, phone numbers, personal LinkedIn profile links, "contact person: name" lines and contact intros such as "Ihre Ansprechpartnerin Frau …" from descriptions. This is best effort, because descriptions are free text: a name mentioned in an ordinary sentence can remain.

Our Actors are ethical and do not extract any private user data, such as email addresses, gender, or location. They only extract what the user has chosen to share publicly. We therefore believe that our Actors, when used for ethical purposes by Apify users, are safe. However, you should be aware that your results could contain personal data. Personal data is protected by the GDPR in the European Union and by other regulations around the world. You should not scrape personal data unless you have a legitimate reason to do so. If you're unsure whether your reason is legitimate, consult your lawyers.

#### Can I use the jobs to train AI models?

Some job boards signal that their content must not be used for AI training (for example Workable's robots.txt). Do not use the output to train AI models. Using it as search results or as input for an AI agent is fine.

#### Why are SmartRecruiters and Workday not supported?

SmartRecruiters' API host disallows crawlers in robots.txt and requires API keys, and Workday has no documented public job-board API. Those companies get the status `UNSUPPORTED_ATS` and are free.

#### Why was my company "not found"?

Name matching needs a job board with open jobs whose published company name matches. Paste the job-board URL instead. A domain whose site only links other companies' boards (for example a portfolio jobs page) gets `NOT_DETECTED`, and an expired job-board link (for example a Workable `/j/…` link) gets `NOT_FOUND`; neither is charged. The same applies to common names: the check cannot tell apart two companies with the same name, so if a name returns another company's jobs, use the board URL. Known limits: Recruitee boards on a custom domain (use the `….recruitee.com` address) and EU-hosted Greenhouse boards (`job-boards.eu.greenhouse.io`, which have no public API).

#### How fresh is the data?

Live: every run reads the job boards at run time. There is no database delay.

#### Can I get jobs from all companies on Greenhouse?

No. Company Jobs API fetches the companies you list; it is not a search engine over all job boards.

#### Where do I report a problem?

Use the **Issues** tab. You can also call the Actor from your own code through the **API** tab.

### Changelog

- **1.0 (2026-10-13):** first release. Six job-board systems (Greenhouse, Lever, Ashby, Workable, Recruitee, Personio), name detection with company-name verification, domain detection from the site's own links (with a company check when a page links several companies' boards), filters before charging, salaries, Markdown and clean HTML descriptions, monitoring mode with free closed notices; a job board named by several entries is returned and charged once.

# Actor input Schema

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

Companies to fetch jobs from. Each line can be a job-board URL (boards.greenhouse.io/…, jobs.lever.co/…, jobs.ashbyhq.com/…, apply.workable.com/…, ….recruitee.com, ….jobs.personio.de), a careers-page URL, a domain (stripe.com), a company name (Stripe) or `ats:slug` (greenhouse:stripe). Board URLs are fastest and most reliable. A name is used only when a board with open jobs publishes a matching company name; a domain uses the board its site links to (checked against the site's name when the site links several companies' boards). Entries that point to the same board are returned and charged once.

## `atsToTry` (type: `array`):

Which job-board systems to check when you enter a company name or domain. Board URLs ignore this. Fewer systems means faster runs.

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

Only return jobs whose title contains at least one of these words (case and accents ignored). Leave empty for all jobs. You only pay for jobs that pass the filters.

## `searchInDescription` (type: `boolean`):

Also match keywords in the job description, not only the title.

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

Skip jobs whose title contains any of these words, e.g. "intern" or "senior".

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

Only return jobs whose location, country name or ISO country code contains one of these, e.g. "Berlin", "Germany", "DE", "Remote". Two-letter codes need a country on the job; Personio boards list cities only, so use city names for them.

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

Only return jobs with one of these workplace types. Jobs whose board does not state a workplace type are excluded when this filter is set.

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

Only return jobs whose department or team contains one of these, e.g. "Engineering", "Sales".

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

Only return jobs published (or, if no publish date exists, updated) in the last N days. 0 = no date filter.

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

Maximum jobs returned per company after filters (newest first). 0 = no limit.

## `maxJobs` (type: `integer`):

Maximum jobs returned in total for the run. 0 = no limit. The run also stops at your spending limit.

## `descriptionFormat` (type: `string`):

Format of the job description. "none" keeps the output small, for example for AI agents and alerts.

## `redactContactDetails` (type: `boolean`):

Remove email addresses, phone numbers, personal LinkedIn profile links and "contact person: <name>" lines from descriptions. Recommended under GDPR.

## `personioLanguage` (type: `string`):

Language of Personio job ads. With "Company default" you get every description; choosing a language drops descriptions the company did not write in it.

## `onlyNewOrChanged` (type: `boolean`):

Return only jobs that are new or changed since the previous run with the same state store, plus jobs that closed. The first run returns all current jobs as "new". You only pay for new and changed jobs; closed notices are free.

## `includeClosedJobs` (type: `boolean`):

In monitoring mode, also output jobs that disappeared from the board (changeType "closed", free).

## `stateStoreName` (type: `string`):

Name of the key-value store that remembers jobs between runs. Use a different name for each separate monitor (e.g. "sales-accounts", "client-a").

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

Not needed: the job-board APIs are public. Only change this if your runs report BLOCKED.

## Actor input object example

```json
{
  "companies": [
    "https://boards.greenhouse.io/gitlab",
    "https://jobs.ashbyhq.com/linear",
    "https://jobs.lever.co/spotify"
  ],
  "atsToTry": [
    "greenhouse",
    "lever",
    "ashby",
    "workable",
    "recruitee",
    "personio"
  ],
  "keywords": [],
  "searchInDescription": false,
  "excludeKeywords": [],
  "locations": [],
  "workplaceTypes": [],
  "departments": [],
  "postedWithinDays": 0,
  "maxJobsPerCompany": 20,
  "maxJobs": 0,
  "descriptionFormat": "markdown",
  "redactContactDetails": true,
  "personioLanguage": "default",
  "onlyNewOrChanged": false,
  "includeClosedJobs": true,
  "stateStoreName": "company-jobs-state",
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

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

All job items in the default dataset.

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

Jobs in the overview table view.

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

Per-company status, detected job board and job counts (COMPANIES record).

# 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": [
        "https://boards.greenhouse.io/gitlab",
        "https://jobs.ashbyhq.com/linear",
        "https://jobs.lever.co/spotify"
    ],
    "maxJobsPerCompany": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("openfeeds/greenhouse-lever-ashby-jobs-api").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": [
        "https://boards.greenhouse.io/gitlab",
        "https://jobs.ashbyhq.com/linear",
        "https://jobs.lever.co/spotify",
    ],
    "maxJobsPerCompany": 20,
}

# Run the Actor and wait for it to finish
run = client.actor("openfeeds/greenhouse-lever-ashby-jobs-api").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": [
    "https://boards.greenhouse.io/gitlab",
    "https://jobs.ashbyhq.com/linear",
    "https://jobs.lever.co/spotify"
  ],
  "maxJobsPerCompany": 20
}' |
apify call openfeeds/greenhouse-lever-ashby-jobs-api --silent --output-dataset

```

## MCP server setup

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

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/6yQSnmeihoAkmPpRM/builds/y9qJF21SZr8iQvKLg/openapi.json
