# Career Site Jobs Search API: Greenhouse, Workday, Lever, Ashby (`deriverge/career-site-jobs-search`) Actor

Search 1M+ open jobs straight from 40,000+ company career sites on Greenhouse, Workday, Oracle, iCIMS, Ashby, Lever, SmartRecruiters and more: filter by title, country, skills, years of experience, seniority, remote, salary, visa and language. JSON, CSV, API.

- **URL**: https://apify.com/deriverge/career-site-jobs-search.md
- **Developed by:** [deriverge s.r.o.](https://apify.com/deriverge) (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

from $0.25 / 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

## Career Site Jobs Search: Open Jobs Straight from Company ATS Boards

Search **over 1,200,000 open jobs from more than 40,000 companies**, taken straight from their own career sites on **Greenhouse, Workday, Oracle Recruiting Cloud, Ashby, Workable, SmartRecruiters, BambooHR, Lever, iCIMS, Rippling, Recruitee, Personio, Teamtailor and Breezy HR**. The index is rebuilt every day. Filter by keywords in the title or the description, **country, job category, seniority, skills, years of experience, remote, hybrid or on-site, employment type, salary and visa sponsorship**, company, ATS, department and posting date, and get each job with the **full description, apply link and pay range read live** from the company’s board at run time, so jobs closed since the last index are left out and never charged.

No job board reposts and no aggregator duplicates: every row is a job the employer publishes on its own career site.

You pay only for jobs returned, from $0.25 per 1,000, with no start fee. The $5 of monthly credit in Apify's Free plan covers about 10,000 jobs, so you can try it for free.

### Why use Career Site Jobs Search?

- **Direct from employers.** Jobs come from the company’s own applicant tracking system, not from job boards, so there are no reposts, fake listings or agency duplicates.
- **One search across fourteen ATS.** Greenhouse, Workday, Oracle Recruiting Cloud, iCIMS, Ashby, Workable, SmartRecruiters, BambooHR, Lever, Rippling, Recruitee, Personio, Teamtailor and Breezy HR in one table with the same fields.
- **Ready-to-filter fields.** Every job gets its country code, job category, seniority, work arrangement, normalised employment type, salary as numbers with currency and period (and per year), a visa sponsorship flag, the skills it asks for (Python, AWS, Salesforce, CPA...), years of experience, education level and, where the ATS publishes it, the company website, read by transparent rules from the ATS data and the description.
- **Fresh by design.** The index is rebuilt daily and descriptions are read live, so closed jobs drop out before you pay for them.
- **Fast.** Filtering the whole index takes seconds; 1,000 jobs with full descriptions take about a minute.
- **Job alerts and lead feeds.** New-only mode with a watch name returns only jobs you have not seen before; schedule it daily.
- **No start fee.** You pay per job only, with the full description included.

### What data does Career Site Jobs Search return?

| Field | What it contains |
|---|---|
| `title` | Job title |
| `company` | Company |
| `seniority` | Seniority: intern to executive |
| `jobCategory` | Job category: software, sales, healthcare... |
| `locations` | Locations |
| `countries` | Country codes |
| `workArrangement` | Remote, hybrid or on-site |
| `employmentTypes` | Full-time, part-time, contract, internship... |
| `department` | Department |
| `salaryMin` | Salary minimum |
| `salaryMax` | Salary maximum |
| `salaryCurrency` | Currency |
| `salaryPeriod` | Per hour, month or year |
| `visaSponsorship` | Visa sponsorship |
| `skills` | Skills: Python, AWS, Salesforce, CPA... |
| `experienceYearsMin` | Years of experience required |
| `educationLevel` | Education level |
| `language` | Language of the job ad |
| `companyWebsite` | Company website (Ashby, Lever, iCIMS, Workable) |
| `postedAt` | Posted at |
| `firstSeenAt` | First seen at |
| `ats` | ATS |
| `careerSiteUrl` | Career site |
| `url` | Job page |
| `applyUrl` | Apply link |
| `description` | Full description |

Apply link, description, pay ranges written in the description, visa sponsorship, skills, years of experience, education level and language come from the live read of the career site (Include full description, on by default at no extra cost).

### How many jobs does the index cover?

Open jobs in the daily index by applicant tracking system (from the latest build, rounded down). Workday, Workable, Personio and iCIMS career sites are refreshed in rotation every one to three days, all other systems every day.

| ATS | Open jobs in the index |
|---|---|
| Workday | 290,000+ |
| SmartRecruiters | 280,000+ |
| Greenhouse | 190,000+ |
| Oracle Recruiting Cloud | 100,000+ |
| Workable | 70,000+ |
| iCIMS | 60,000+ |
| Ashby | 60,000+ |
| Lever | 50,000+ |
| BambooHR | 40,000+ |
| Breezy HR | 30,000+ |
| Personio | 20,000+ |
| Teamtailor | 17,000+ |
| Rippling | 14,000+ |
| Recruitee | 13,000+ |

### Who uses Career Site Jobs Search?

- **Recruitment and staffing agencies:** find companies that are hiring for the roles you place, straight from their career sites.
- **Sales and business development teams:** use hiring as a buying signal: a company hiring data engineers is evaluating data tools.
- **Job boards and aggregators:** import direct employer jobs with full descriptions, refreshed daily.
- **HR and labour market analysts:** track which companies hire which roles, where, and how fast.
- **Job seekers:** get alerts for new jobs at startups and scale-ups before they reach the big job boards.

### How much does it cost to search career site jobs?

You pay per result. There is no start fee and no charge for compute time or proxies.

| | Free plan | Starter | Scale | Business |
|---|---|---|---|---|
| 1,000 jobs with full descriptions | $0.50 | $0.40 | $0.33 | $0.25 |

For example, exporting 5,000 jobs with full descriptions costs $2.50 on the Free plan and $1.25 on the Business plan. The $5 of monthly credit in Apify's Free plan covers about 10,000 jobs.

Jobs closed since indexing, jobs removed by a filter and jobs already returned in new-only mode are never charged.

### How to search career site jobs

1. Click **Try for free** (or **Start** if you are signed in) to open the actor in Apify Console.
2. Type **Keywords in the job title** and optionally **Locations**.
3. Optionally narrow by country, job category, seniority, work arrangement, employment type, salary, visa sponsorship, skills, years of experience, job ad language, keywords in the description, companies or posting date.
4. For a daily feed, give the run a **Watch name**, turn on **Return only jobs new since the last run** and schedule it.
5. Click **Start**. Rows appear in the **Output** tab within seconds.
6. Download the results as JSON, CSV, Excel or HTML, or read them through the API.

### Input example

```json
{
  "keywords": [
    "data engineer",
    "analytics engineer"
  ],
  "countries": [
    "Germany",
    "Netherlands"
  ],
  "seniority": [
    "mid",
    "senior"
  ],
  "workArrangement": [
    "remote",
    "hybrid"
  ],
  "postedWithinDays": 14,
  "maxItems": 300
}
```

### Output example

A real row from a run in September 2026 (the description is shortened). In the **Output** tab the **Overview** view shows the same data as a table.

```json
{
  "key": "ashby:kayak:2063db99-2a6c-415c-b8d1-8f6e358c6942",
  "ats": "ashby",
  "company": "KAYAK",
  "companySlug": "kayak",
  "careerSiteUrl": "https://jobs.ashbyhq.com/kayak",
  "companyWebsite": "https://www.kayak.com/",
  "jobId": "2063db99-2a6c-415c-b8d1-8f6e358c6942",
  "title": "Senior Data Engineer",
  "seniority": "senior",
  "jobCategory": "data",
  "locations": [
    "Berlin Office"
  ],
  "countries": [
    "DE"
  ],
  "remote": true,
  "workArrangement": "hybrid",
  "department": "Cost Centers",
  "team": "Data",
  "employmentType": "FullTime",
  "employmentTypes": [
    "full-time"
  ],
  "workplaceType": "Hybrid",
  "salaryText": null,
  "salaryMin": null,
  "salaryMax": null,
  "salaryCurrency": null,
  "salaryPeriod": null,
  "salaryYearlyMin": null,
  "salaryYearlyMax": null,
  "visaSponsorship": null,
  "skills": [
    "Python",
    "SQL",
    "Airflow",
    "Redshift",
    "MySQL",
    "PostgreSQL",
    "Docker",
    "Kafka",
    "Flink",
    "Looker",
    "CI/CD",
    "GitHub Actions",
    "Django",
    "Flask"
  ],
  "experienceYearsMin": 5,
  "experienceYearsMax": null,
  "educationLevel": null,
  "postedAt": "2026-09-18T09:55:37.466Z",
  "updatedAt": null,
  "url": "https://jobs.ashbyhq.com/kayak/2063db99-2a6c-415c-b8d1-8f6e358c6942",
  "applyUrl": "https://jobs.ashbyhq.com/kayak/2063db99-2a6c-415c-b8d1-8f6e358c6942/application",
  "description": "KAYAK, part of Booking Holdings (NASDAQ: BKNG), is the world's leading travel search engine. With billions of queries across our platforms, we help people find their perfect flight, stay, rental car and vacation package. We're also transforming business travel with a new corporate travel solution, KAYAK for Business.\nAs an employee of KAYAK, you will be part of a travel company that operates a portfolio of global…",
  "language": null,
  "descriptionIncluded": true,
  "indexDate": "2026-09-28T15:31:12.115Z",
  "scrapedAt": "2026-09-28T16:44:13.556Z"
}
```

### Tips and limitations

- Keywords match the job title, so "engineer" finds every engineering title while "data engineer" is precise. To require skills, use Skills (all must appear) or Keywords in the description (any may appear).
- Countries are read from the location, so "Austin, TX", "München" and "Remote - USA" all get a country; jobs located only as "Remote" or "EMEA" have none.
- Salary, visa sponsorship, skills, years of experience, language and description keywords are checked on the live job, so combine them with title keywords or a country for fast runs.
- Seniority, work arrangement, employment type and salary are read by rules from the job data, not guessed by AI; a field stays empty when the job does not say.
- Results come newest first by posting date. iCIMS, BambooHR and Rippling do not publish the date in their job lists, so their jobs rank after dated ones unless we saw them appear after the company was already in the index; Posted within days also checks the date read live.
- Leave Keywords empty and set Companies to export every open job of chosen companies.
- Turn off Include full description for the fastest runs when titles, companies and links are enough.
- Names and contact details of recruiters are not collected.
- To scrape one company you name yourself, or a Workday career site, see our Greenhouse, Lever and Workday Jobs Scraper.

### Integrations and API

Connect the actor to **Make**, **Zapier**, **n8n**, **Google Sheets**, **Slack** or any webhook, or call it from your own code. With the Python client:

```python
from apify_client import ApifyClient

client = ApifyClient("<YOUR_API_TOKEN>")
run = client.actor("deriverge/career-site-jobs-search").call(run_input={"keywords": ["product manager"], "locations": ["London"], "maxItems": 200})
for j in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(j["title"], j["company"], j["locations"], j["url"])
```

The **API** tab on this page has the same call for Node.js and cURL, and AI agents can run the actor through the Apify MCP server.

### Is it legal to scrape company career sites?

The index reads job boards that companies publish on their applicant tracking systems for everyone to see, through the same public interfaces those job boards use, at a moderate pace, and collects no personal data of recruiters or candidates. The list of companies comes from the public Common Crawl web archive. Job ads are business information. Check the terms before republishing descriptions, and link back to the job page.

### FAQ

#### How fresh is the data?

The index is rebuilt every day, and with the full description on each job is read live from the career site when you run the actor.

#### Which companies are included?

More than 40,000 companies whose career sites run on the fourteen supported ATS; the list grows as we find more.

#### Can I add my own companies?

Use our Greenhouse, Lever and Workday Jobs Scraper for companies you name yourself.

#### How is the salary read?

From the salary field the ATS publishes (Greenhouse pay transparency, Ashby, Lever, Recruitee, BambooHR) or from a pay range written in the description, such as "The base pay range is $120,000 - $150,000". Bonuses, funding amounts and benefits are ignored. The text as posted stays in salaryText.

#### How are seniority and work arrangement decided?

Seniority comes from words in the job title (Senior, Staff, Head of, Werkstudent and more). Work arrangement comes from the ATS workplace field, the location and clear sentences in the description; a job with a place and no mention of remote or hybrid counts as on-site.

#### Do I need an account, an API key or proxies?

No.

### Related scrapers

- [Remote Jobs Scraper](https://apify.com/deriverge/remote-jobs-scraper): six remote job boards in one table
- [SEEK Jobs Scraper](https://apify.com/deriverge/seek-jobs-scraper): Australian and New Zealand jobs with salaries
- [Dice Jobs Scraper](https://apify.com/deriverge/dice-jobs-scraper): US tech jobs with salaries and skills
- [Internshala Scraper](https://apify.com/deriverge/internshala-jobs-scraper): Indian internships and jobs with applicants
- [Foundit Jobs Scraper](https://apify.com/deriverge/foundit-jobs-scraper): India, Southeast Asia and Gulf jobs
- [Career Site Jobs Scraper](https://apify.com/deriverge/greenhouse-lever-workday-jobs-scraper): fourteen applicant tracking systems in one table
- [Greenhouse Jobs Scraper](https://apify.com/deriverge/greenhouse-jobs-scraper): any Greenhouse job board
- [Lever Jobs Scraper](https://apify.com/deriverge/lever-jobs-scraper): any Lever careers page
- [Workday Jobs Scraper](https://apify.com/deriverge/workday-jobs-scraper): any myworkdayjobs career site

### Support and feedback

Missing a field or found something that does not work? Open an issue in the **Issues** tab and it will be answered, usually within a day. If the actor saves you time, a short review helps other people find it.

# Actor input Schema

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

Jobs whose title contains any of these, for example "data engineer", "account executive", "product designer" or "nurse". Leave empty for all jobs.

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

Drop jobs whose title or company contains any of these, for example "sales" or "recruiter".

## `countries` (type: `array`):

Jobs in any of these countries: English names or two-letter codes, for example United States, Germany, UK or DE. Read from the job location, so "Austin, TX" counts as United States.

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

Jobs whose location text contains any of these, for example London, Berlin, New York or Bay Area.

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

Only jobs from companies whose name or career site slug contains any of these, for example "stripe" or "anthropic".

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

Only jobs whose department contains any of these, for example Engineering, Sales or Marketing.

## `ats` (type: `array`):

Only jobs from these applicant tracking systems. Leave empty for all.

## `seniority` (type: `array`):

Read from the job title in English, German, French, Spanish and more: "Senior", "Sr.", "Staff", "Head of", "Werkstudent", "Stagiaire". Titles without a level count as mid.

## `categories` (type: `array`):

Read from the job title (and the department when the title says nothing), for example software, healthcare, sales or logistics. Jobs whose title fits no category are left out when this filter is on.

## `workArrangement` (type: `array`):

From the ATS workplace field, the location and clear sentences in the description ("This is a hybrid role"). Jobs with a place and no remote or hybrid mention count as on-site.

## `employmentTypes` (type: `array`):

Only jobs whose ATS field or title states one of these types. Jobs that state no type are left out when this filter is on.

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

Only jobs posted in the last N days; jobs without a posting date count from the day the index first saw them.

## `hasSalary` (type: `boolean`):

Only jobs that state pay: from the ATS salary field or a pay range in the description, returned as numbers in salaryMin, salaryMax, salaryCurrency and salaryPeriod.

## `minYearlySalary` (type: `integer`):

Only jobs whose pay, converted to a year (hourly × 2,080, monthly × 12), reaches this amount in the currency below, for example 120000.

## `salaryCurrency` (type: `string`):

Currency of the minimum yearly salary: USD, EUR, GBP, CAD, AUD and so on. Jobs paid in other currencies are left out when the minimum is set.

## `visaSponsorship` (type: `boolean`):

Only jobs whose description says the company sponsors visas or work permits. Jobs that say they do not sponsor are left out.

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

Same as choosing Remote in Work arrangement; kept for saved tasks.

## `descriptionKeywords` (type: `array`):

Only jobs whose title or full description contains any of these, for example "python", "kubernetes" or "SAP". Read live from each career site, so it takes longer than title keywords.

## `excludeDescriptionKeywords` (type: `array`):

Drop jobs whose title or description contains any of these, for example "security clearance" or "commission only".

## `skills` (type: `array`):

Only jobs that ask for all of these skills, for example Python, AWS or Salesforce. Known tools, languages and certifications match their other spellings (golang, k8s, postgres); anything else is matched as a whole word in the title or description.

## `maxYearsOfExperience` (type: `integer`):

Leave out jobs whose description asks for more years of experience than this, for example 2 for junior roles. Jobs that do not state years are kept.

## `languages` (type: `array`):

Only jobs written in these languages, as two-letter codes or names, for example en or English to find English-language jobs in Germany. Detected from the description.

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

Reads each company’s job board live for the full description, apply link and salary, and leaves out jobs closed since the index was built. The price is the same.

## `newOnly` (type: `boolean`):

Keeps a snapshot per watch name (or per saved task) and returns only jobs that were not there before. Schedule it daily for a job alert or a lead feed.

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

Name of the snapshot used by the new-only mode, for example "data-engineers-berlin". Runs from a saved task get one automatically.

## `maxItems` (type: `integer`):

Hard cap on returned jobs, newest first; empty means 1,000. 1,000 jobs with descriptions take about a minute; without descriptions a few seconds.

## Actor input object example

```json
{
  "keywords": [
    "data engineer"
  ],
  "hasSalary": false,
  "salaryCurrency": "USD",
  "visaSponsorship": false,
  "remoteOnly": false,
  "includeDescription": true,
  "newOnly": false,
  "maxItems": 50
}
```

# Actor output Schema

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

One row per open job with company, locations, department, dates, apply link and full description.

## `summary` (type: `string`):

Index date and size, jobs matching and returned, jobs closed since indexing and warnings.

# 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 = {
    "keywords": [
        "data engineer"
    ],
    "maxItems": 50
};

// Run the Actor and wait for it to finish
const run = await client.actor("deriverge/career-site-jobs-search").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 = {
    "keywords": ["data engineer"],
    "maxItems": 50,
}

# Run the Actor and wait for it to finish
run = client.actor("deriverge/career-site-jobs-search").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 '{
  "keywords": [
    "data engineer"
  ],
  "maxItems": 50
}' |
apify call deriverge/career-site-jobs-search --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,deriverge/career-site-jobs-search"
        }
    }
}
```

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/mob6cAmTG6FU6kUij/builds/LPlztgVZvCuYtLYe6/openapi.json
