# Career Page Jobs & Hiring Signals (Greenhouse, Lever, Ashby) (`versant_nautilus/career-page-jobs`) Actor

Get every open job from any company's careers page — Greenhouse, Lever, Ashby, Workable, Recruitee, Teamtailor, Breezy. Just enter names or domains. Live data, salaries, new-job tracking and per-company hiring signals for sales teams.

- **URL**: https://apify.com/versant_nautilus/career-page-jobs.md
- **Developed by:** [Marsh](https://apify.com/versant_nautilus) (community)
- **Categories:** Jobs, Lead generation
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.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 Page Jobs & Hiring Signals

Get **every open job from any company's own careers page** by typing its name or website. No URL hunting, no
cookies, no proxies. The Actor finds the company's job board on **Greenhouse, Lever, Ashby, Workable, Recruitee,
Teamtailor or Breezy HR** and reads it live through the board's official public feed. It returns clean,
normalized jobs, or **one hiring-signals report per company** for sales and market research.

- **Live, not cached.** Jobs are fetched from the source at run time, so nothing is days old and closed roles never show up.
- **Names and domains work.** `stripe.com`, `Notion` and `https://jobs.lever.co/spotify` all work in the same list.
- **One schema for 7 job boards:** title, department, function, seniority, location, country, remote/hybrid,
  salary (when published), posted date, description, and apply link.
- **Track changes.** Give the run a `monitorId` and schedule it. You get only *new* jobs, plus roles opened
  and closed per company since the last run.
- **Hiring signals per company:** open roles by function, seniority and country, new roles in the last 7 and 30 days,
  leadership hires, and plain-English signals like *"72 new roles posted in the last 7 days"*.

#### Who uses it

| You are… | Use it to… |
|---|---|
| **Sales / SDR team** | Find accounts that are hiring for the team you sell to, e.g. companies opening Sales or Data roles, and time your outreach to new leadership hires. |
| **Recruiter / agency** | Watch target companies' openings daily and be first to new roles. |
| **Job seeker / job board** | Pull every role from a list of dream companies, filtered by title, location and remote. |
| **Investor / analyst** | Track headcount plans of portfolio companies or competitors: which functions are growing and where. |

#### Input

```json
{
  "companies": ["stripe.com", "Notion", "https://jobs.lever.co/spotify", "https://jobs.ashbyhq.com/ramp"],
  "outputType": "jobs",
  "titleKeywords": ["account executive", "sales"],
  "locationKeywords": ["remote", "united states"],
  "postedWithinDays": 30,
  "monitorId": "target-accounts",
  "onlyNewJobs": true
}
```

- **companies**: names, website domains or careers-page URLs, one per line (up to 1,000). URLs are exact. For a
  name or domain, the Actor first looks for job-board links on the company's own `/careers`, `/jobs` and home page
  (respecting `robots.txt`), then tries the name on each supported board. Each match is labeled with
  `matchMethod` and `matchConfidence`.
- **outputType**: `jobs` (one row per job) or `companies` (one hiring-signals report per company).
- **Filters**: `titleKeywords`, `excludeTitleKeywords`, `locationKeywords`, `departmentKeywords`, `remoteOnly`,
  `postedWithinDays`.
- **Change tracking**: `monitorId` (any short name) and `onlyNewJobs`.
- **Limits**: `maxJobsPerCompany`, `maxResults`, `includeDescription`.

#### Output: one row per job

```json
{
  "company": "Ramp",
  "title": "Solutions Consultant, Commercial",
  "department": "Sales",
  "team": "Solutions Consulting",
  "jobFunction": "Sales",
  "seniority": "Mid",
  "location": "Remote (US)",
  "country": "United States",
  "countryCode": "US",
  "workplaceType": "remote",
  "remote": true,
  "employmentType": "Full-time",
  "postedAt": "2026-11-03T17:04:10Z",
  "salaryMin": 119000,
  "salaryMax": 189000,
  "salaryCurrency": "USD",
  "salaryPeriod": "year",
  "salaryText": "$119K - $189K",
  "jobUrl": "https://jobs.ashbyhq.com/ramp/220e674a-…",
  "applyUrl": "https://jobs.ashbyhq.com/ramp/220e674a-…/application",
  "descriptionText": "ABOUT RAMP …",
  "isNew": true,
  "firstSeenAt": "2026-11-04T09:00:00Z",
  "ats": "ashby",
  "atsCompanyId": "ramp",
  "careersUrl": "https://jobs.ashbyhq.com/ramp",
  "matchConfidence": "high",
  "jobId": "ashby:ramp:220e674a-…",
  "scrapedAt": "2026-11-04T09:00:00Z"
}
```

#### Output: one hiring-signals report per company

Real Stripe report from a November 2026 run, trimmed. The opened/closed counts are illustrative, since they appear from the second monitored run onward.

```json
{
  "company": "Stripe",
  "openJobs": 744,
  "matchingJobs": 174,
  "newJobsLast7Days": 72,
  "newJobsLast30Days": 237,
  "hiringVelocity": "high",
  "newSinceLastRun": 12,
  "closedSinceLastRun": 9,
  "hiringSignals": [
    "12 roles opened and 9 closed since the last check",
    "72 new roles posted in the last 7 days",
    "Sales is the biggest hiring area: 265 of 744 open roles (36%)",
    "Go-to-market hiring: 265 Sales, 52 Marketing, 51 Customer Success & Support",
    "Hiring leadership: Head of AMER Startups (AI Sales); Head of Marketing, Japan; … (+15 more)",
    "Hiring in 23 countries; top: United States (353), Ireland (80), United Kingdom (46)"
  ],
  "jobsByFunction": {"Sales": 265, "Engineering": 159, "Marketing": 52, "…": 0},
  "jobsBySeniority": {"Mid": 462, "Manager": 112, "Lead": 93, "Director": 17, "…": 0},
  "jobsByCountry": [{"country": "United States", "jobs": 353}, {"country": "Ireland", "jobs": 80}],
  "jobsByDepartment": [{"department": "1185 Account Executives (EMEA)", "jobs": 45}],
  "leadershipRoles": ["Head of AMER Startups (AI Sales)", "Head of Marketing, Japan"],
  "remoteShare": 0.152,
  "salaryDisclosedShare": 0.0,
  "newestJobs": [{"title": "…", "postedAt": "…", "jobUrl": "…"}],
  "careersUrl": "https://job-boards.greenhouse.io/stripe"
}
```

Reports always count **all** of a company's open jobs. If you set filters, `matchingJobs` says how many matched.
`newSinceLastRun` and `closedSinceLastRun` appear from the second run of a `monitorId` onward.

Every run also saves:

- **SUMMARY**: per company, which board was found and how, with job counts, errors and candidates for anything not matched.
- **EXPORT.csv**: a spreadsheet-safe CSV of the results, without descriptions.

#### Track new jobs automatically

1. Set `monitorId`, e.g. `competitors-weekly`, and optionally `onlyNewJobs: true`.
2. Save the input as a **Task** and add a **Schedule** (daily or weekly).
3. Connect the dataset to Google Sheets, Slack, Zapier, Make or a webhook.

The first run saves a baseline. Every later run marks each job `isNew` with its `firstSeenAt`, and company reports
include roles opened and closed since the previous check. If your result limit holds back some new jobs, they
stay new until they're delivered.

#### Pricing

Pay only for results:

- **$0.002 per job**, i.e. $2 per 1,000 jobs
- **$0.01 per company report**

Companies that aren't found, and runs that return nothing new, cost nothing beyond the platform's tiny start fee.
Set `maxResults` to cap any run.

#### Coverage and limits

- **Supported job boards:** Greenhouse, Lever (US and EU), Ashby, Workable, Recruitee, Teamtailor, Breezy HR.
- **Not supported yet:** Workday, iCIMS, SmartRecruiters, SuccessFactors, Taleo and custom in-house career sites.
  Those companies show as `not_found` in SUMMARY and cost nothing.
- **Matching:** a name that exists on several boards is matched by the board's own company name, or by the company
  being named in its job descriptions. Boards that clearly belong to a differently named company are skipped and
  listed as candidates. For exact results, paste the careers-page URL.
- **Function and seniority** are rule-based estimates from the job title.
- **Missing fields:** salary appears only where the company publishes it (often Ashby, Lever and Recruitee boards).
  Breezy HR feeds have no descriptions.

#### How the data is collected

Only the official, unauthenticated feeds each job-board provider publishes for showing a company's openings
elsewhere: Greenhouse's Job Board API, Lever's Postings API, Ashby's public job posting API, Workable's jobs
widget API, Recruitee's careers-site API, Teamtailor's RSS feed and Breezy's JSON feed.

- No logins, cookies, CAPTCHA solving or proxy rotation.
- Requests to each host go one at a time with polite spacing, and Lever's published crawl delay is honored.
- Company websites are read only where `robots.txt` allows it.

SmartRecruiters is left out because its API host asks crawlers not to visit.

#### FAQ

**Why didn't my company match?**
It may use a job board that isn't supported yet, or its board may be under a different name. Paste the URL of
its careers page, e.g. `https://jobs.lever.co/<company>`, and the Actor will use it directly.

**Can I get only roles posted this week?**
Yes. Set `postedWithinDays: 7`. Or use `monitorId` with `onlyNewJobs` to get every role that appeared since your last run, even ones the board back-dates.

**Can I use it from code?**
Yes. Call it through the Apify API, or with the Python or JavaScript client, using the same input JSON.

# Actor input Schema

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

One per line: a company name (Notion), website domain (stripe.com), or careers-page URL (https://jobs.lever.co/spotify, https://boards.greenhouse.io/airbnb, https://jobs.ashbyhq.com/ramp, https://apply.workable.com/huggingface). URLs are exact; names and domains are matched automatically.

## `outputType` (type: `string`):

Jobs: every open role with title, department, location, salary, dates and description. Companies: open roles by function, seniority and country, new roles in the last 7/30 days, leadership hires and plain-English hiring signals.

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

Case-insensitive; matches words starting with the keyword (engineer matches Engineering Manager). Leave empty for all jobs.

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

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

## `locationKeywords` (type: `array`):

Matched against location, city, region, country, country code and workplace type, e.g. remote, united states, london, DE.

## `departmentKeywords` (type: `array`):

Matched against department, team and the detected job function (Sales, Marketing, Engineering, Data & AI, Product, Design, Customer Success & Support, Operations, Finance, People & Recruiting, Legal & Compliance).

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

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

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

0 = any date. Jobs without a posted date are excluded when this is set.

## `monitorId` (type: `string`):

Any short name, e.g. competitors-weekly. The Actor remembers which jobs it saw for this name in your account, marks each job isNew with firstSeenAt, and reports roles opened and closed since the last run. The first run saves the baseline.

## `onlyNewJobs` (type: `boolean`):

Needs a monitorId. The first run returns everything; later runs return only newly posted jobs. Jobs held back by your result limit stay new for the next run.

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

Plain-text description of each job. Turn off for smaller, faster exports. Breezy HR feeds have no descriptions.

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

Newest jobs first.

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

Hard cap on output rows (jobs or company reports), which also caps cost.

## `detectFromWebsite` (type: `boolean`):

For domains, read the company's /careers, /jobs and home page (respecting robots.txt) to find the exact job board before guessing from the name.

## Actor input object example

```json
{
  "companies": [
    "stripe.com",
    "Notion",
    "https://jobs.lever.co/spotify",
    "https://jobs.ashbyhq.com/ramp"
  ],
  "outputType": "jobs",
  "remoteOnly": false,
  "postedWithinDays": 0,
  "onlyNewJobs": false,
  "includeDescription": true,
  "maxJobsPerCompany": 500,
  "maxResults": 1000,
  "detectFromWebsite": true
}
```

# Actor output Schema

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

No description

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

No description

## `csv` (type: `string`):

No description

# API

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

## JavaScript example

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

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

// Prepare Actor input
const input = {
    "companies": [
        "stripe.com",
        "Notion",
        "https://jobs.lever.co/spotify",
        "https://jobs.ashbyhq.com/ramp"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("versant_nautilus/career-page-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": [
        "stripe.com",
        "Notion",
        "https://jobs.lever.co/spotify",
        "https://jobs.ashbyhq.com/ramp",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("versant_nautilus/career-page-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": [
    "stripe.com",
    "Notion",
    "https://jobs.lever.co/spotify",
    "https://jobs.ashbyhq.com/ramp"
  ]
}' |
apify call versant_nautilus/career-page-jobs --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,versant_nautilus/career-page-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/t4osCmG8PhKOfUXH9/builds/60pF4keEDhIuMlfcF/openapi.json
