# Career Site Jobs: Greenhouse, Lever, Workday, Oracle, ADP (`tidelane/career-site-jobs`) Actor

Get open jobs from company career sites on 18 job board systems: Greenhouse, Lever, Ashby, Workday, Oracle, ADP, Paylocity, Jobvite, BambooHR, Rippling, Teamtailor, Workable, SmartRecruiters, Recruitee, Personio, Pinpoint, Breezy, d.vinci. Paste URLs, websites or ats:slug. Salaries, filters.

- **URL**: https://apify.com/tidelane/career-site-jobs.md
- **Developed by:** [Tidelane Data](https://apify.com/tidelane) (community)
- **Categories:** Jobs, Automation, Lead generation
- **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

## Career Site Jobs Scraper: Greenhouse, Lever, Ashby, Workday, Oracle, ADP and 12 more

Get every open job straight from company career sites. This Actor reads the **public job board APIs and job feeds** of 18 applicant tracking systems (ATS), the same job lists the companies' own career pages load, and returns clean, normalized job listings in one format, ready for a spreadsheet, a job board, a CRM or an AI agent.

- ✅ **18 job board systems in one Actor:** Greenhouse, Lever, Ashby, Workable, SmartRecruiters, Recruitee, Personio, Workday and Oracle Recruiting Cloud (used by many large enterprises; Workday sites with more than 2,000 jobs are read completely), ADP Workforce Now, Paylocity and Jobvite (common with US mid-size companies, often with pay ranges), BambooHR, Rippling, Teamtailor, Pinpoint, Breezy HR and d.vinci (popular with German and European companies, like Personio)
- ✅ **Paste whatever you have:** a career page URL, `ats:slug` (for example `greenhouse:stripe`) or just the company website. The Actor finds the embedded job board for you
- ✅ **One normalized schema:** title, department, team, location(s), country, remote/hybrid/onsite, employment type, salary (when the company publishes it), posted date, job and apply links, full description as plain text
- ✅ **Extra fields on every job, no AI costs:** seniority (intern to executive), years of experience asked, skills (about 110 tools and technologies), yearly salary (hourly and monthly pay converted), visa sponsorship (yes/no when the ad says so) and the ad's language
- ✅ **Filters:** title keywords, excluded words, locations (country names match ISO codes, so `Germany` also finds `DE`), remote only, posted in the last N days
- ✅ **Fast and cheap:** about 1,900 jobs from 7 companies in 5 seconds in our tests
- ✅ **Clean data:** official APIs and the career sites' own job lists, robots.txt respected, and direct emails, phone numbers and the names of contact persons in job descriptions are removed

### What can you use it for?

- **Job boards and aggregators:** keep a niche job board fresh with jobs from hundreds of companies, scheduled daily
- **Recruiting and sales intelligence:** see which companies are hiring for which roles, a strong buying signal for B2B sales
- **Market and salary research:** count openings by department, location or seniority; collect published salary ranges
- **AI agents and RAG:** give an agent current, structured job data via the Apify API or MCP
- **Job seekers:** watch your dream companies and get only new matching roles

### How to use it

1. Add companies in **Companies**, one per line. Examples:
   - `https://boards.greenhouse.io/stripe`
   - `https://jobs.lever.co/palantir`
   - `https://jobs.ashbyhq.com/openai`
   - `https://apply.workable.com/huggingface`
   - `https://jobs.smartrecruiters.com/BoschGroup`
   - `https://bunq.recruitee.com`
   - `https://tado.jobs.personio.de`
   - `https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite`
   - `https://company.fa.us2.oraclecloud.com/hcmUI/CandidateExperience/en/sites/CX_1` (Oracle Recruiting Cloud)
   - `https://company.bamboohr.com/careers`, `https://ats.rippling.com/company/jobs`, `https://company.teamtailor.com/jobs`
   - `https://company.pinpointhq.com`, `https://company.breezy.hr`, `https://company.dvinci-hr.com`
   - `https://workforcenow.adp.com/mascsr/default/mdf/recruitment/recruitment.html?cid=…` (ADP Workforce Now), `https://recruiting.paylocity.com/recruiting/jobs/All/…`, `https://jobs.jobvite.com/company/jobs`
   - `lever:spotify`, `ashby:ramp` or `bamboohr:company` (Workday and Oracle need the career site URL)
   - `https://www.notion.com/careers` (the Actor detects that Notion uses Ashby)
2. Optionally set filters (keywords, locations, remote only, posted within N days).
3. Run, then download the results as JSON, CSV, Excel or HTML, or connect them to Google Sheets, Make, Zapier, n8n or your own code.

#### Input example

```json
{
    "companies": ["https://boards.greenhouse.io/stripe", "ashby:openai", "https://www.notion.com/careers"],
    "keywords": ["engineer", "developer"],
    "locations": ["Germany", "Remote"],
    "postedWithinDays": 30,
    "includeDescription": true
}
```

#### Output example

```json
{
    "title": "Contract Operations",
    "companyName": "Palantir Technologies",
    "companySlug": "palantir",
    "ats": "lever",
    "jobId": "2a41a2e2-55a4-4641-a3bf-101b7616dd63",
    "department": null,
    "team": "Legal",
    "location": "Palo Alto, CA",
    "locations": ["Palo Alto, CA"],
    "country": "US",
    "workplaceType": "hybrid",
    "remote": null,
    "employmentType": "Full-time",
    "seniority": "mid",
    "experienceYears": { "min": 3, "max": null },
    "skills": ["Microsoft 365"],
    "salary": {
        "min": 75000,
        "max": 112000,
        "currency": "USD",
        "interval": "year",
        "text": "The estimated salary range for this position is estimated to be $75,000 - $112,000/year."
    },
    "salaryYearly": {
        "min": 75000,
        "max": 112000,
        "currency": "USD"
    },
    "postedAt": "2026-09-25T15:29:37.738Z",
    "updatedAt": null,
    "jobUrl": "https://jobs.lever.co/palantir/2a41a2e2-55a4-4641-a3bf-101b7616dd63",
    "applyUrl": "https://jobs.lever.co/palantir/2a41a2e2-55a4-4641-a3bf-101b7616dd63/apply",
    "visaSponsorship": null,
    "language": "en",
    "description": "A World-Changing Company\n\nPalantir builds the world’s leading software for data-driven ...",
    "sourceInput": "lever:palantir",
    "scrapedAt": "2026-10-23T13:57:00.864Z"
}
```

Fields a board does not publish are `null`. For example, Greenhouse has no employment type, Pinpoint no posting date and ADP no company name, and only some companies publish salaries (Ashby, Lever, Recruitee, Personio, Rippling, Pinpoint, d.vinci, ADP, Paylocity and Jobvite boards often do). For Workday, Oracle, BambooHR, Rippling, ADP, Paylocity and Jobvite the description is loaded per job, so turning off **Include description** makes those runs much faster. Jobvite lists only show "2 Locations" for jobs open in several places; the places come with the description. `postedAt` is the date the board reports, which for long-running openings can be years old.

A run summary is saved in the key-value store as `OUTPUT`: for every company the detected ATS, the jobs found, matched and returned, and the reason when nothing came back (`not_found`, `empty`, `undetected`, `unsupported`, `duplicate`, `error`).

### Pricing

You pay per job returned. Filters run before charging, so jobs you filter out cost nothing. Companies that are not found cost nothing. Set **Max jobs in total** or a run spending limit to cap the cost of a run.

### FAQ

**Which companies are supported?** Any company whose career site runs on one of the 18 systems above. Many thousands of companies do, from startups to Bosch, Stripe and OpenAI. iCIMS, SAP SuccessFactors, Freshteam and JazzHR are not supported yet.

**How are seniority, experience and skills found?** With fixed rules, not AI, so they cost nothing extra and give the same answer every time. Seniority comes from the title (Senior, Junior, Head of, Werkstudent, ...) or, without such a word, from the years of experience the ad asks for. Experience is the first "3+ years" or "mindestens 3 Jahre" the ad links to experience. Skills come from a list of about 110 common tools and technologies (Python, React, SAP, Excel, AutoCAD, ...). Without descriptions only the title-based seniority, title skills and the yearly salary are filled.

**How do I find a company's slug?** Open the company's careers page and click on a job. The URL shows the board, for example `jobs.lever.co/palantir/...` means `lever:palantir`. Or paste the company website and let the Actor detect it.

**Is it legal?** The Actor only reads the public job board APIs, job feeds and job lists that these systems publish so companies' job ads can be displayed and shared, and it follows their robots.txt. When it scans a company website to detect the board, it respects robots.txt. Job ads are published to be found; we remove recruiters' direct emails, phone numbers and names from descriptions. The ad texts belong to the employers: use them to find, filter and link jobs, not to republish them as your own content. You are responsible for how you use the data. If in doubt, ask a lawyer.

**Why did a company return 0 jobs?** Check the `OUTPUT` summary. `empty` means the board exists but has no open jobs, `not_found` means the slug is wrong, and `undetected` means no supported board was found on the website. Then try the career page URL directly.

**Can I run it on a schedule?** Yes. Create a schedule in Apify Console and use `postedWithinDays: 1` to collect only new jobs every day.

Found a bug or need another ATS? Open an issue on the Actor page and we will look at it quickly.

***

#### Impressum (Angaben gemäß § 5 DDG)

Levi Griesinger, Tidelane Data\
Besigheimer Straße 18\
74369, Löchgau, Deutschland\
E-Mail: LeviGriesinger@gmail.com

# Actor input Schema

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

One entry per company: a career page URL of a supported board (e.g. https://boards.greenhouse.io/stripe, https://jobs.lever.co/palantir, https://company.wd5.myworkdayjobs.com/Careers, https://company.bamboohr.com/careers, https://ats.rippling.com/company/jobs, https://company.teamtailor.com/jobs), the form ats:slug (e.g. greenhouse:stripe, bamboohr:company; Workday and Oracle need the URL), or the company website, which is scanned for an embedded job board.

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

Keep only jobs whose title, department or team contains at least one of these words. Case-insensitive. 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 or country contains one of these texts, e.g. Berlin, Germany, DE, London. The word remote also matches jobs flagged as remote.

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

Keep only jobs the board marks as remote (or whose location says remote).

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

Keep only jobs published or updated in the last N days. 0 means no date filter. Jobs without any date on the board are kept.

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

Add the full job description as plain text. Turn off for faster, smaller results. Direct emails and phone numbers in descriptions are removed.

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

Limit the number of jobs returned per company after filters. 0 means no limit.

## `maxTotalJobs` (type: `integer`):

Stop after this many jobs across all companies. 0 means no limit.

## Actor input object example

```json
{
  "companies": [
    "https://boards.greenhouse.io/stripe",
    "https://jobs.ashbyhq.com/openai"
  ],
  "remoteOnly": false,
  "postedWithinDays": 0,
  "includeDescription": true,
  "maxJobsPerCompany": 0,
  "maxTotalJobs": 0
}
```

# Actor output Schema

## `results` (type: `string`):

All results of the run as dataset items.

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

Summary per input with status (ok, error and the reason).

# 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/stripe",
        "https://jobs.ashbyhq.com/openai"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("tidelane/career-site-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 = { "companies": [
        "https://boards.greenhouse.io/stripe",
        "https://jobs.ashbyhq.com/openai",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("tidelane/career-site-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 '{
  "companies": [
    "https://boards.greenhouse.io/stripe",
    "https://jobs.ashbyhq.com/openai"
  ]
}' |
apify call tidelane/career-site-jobs --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,tidelane/career-site-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/2M4dGlESMO11WW2sd/builds/iysQoaahiCGKe0TGa/openapi.json
