# JobPulse: Live Career-Site Jobs (Greenhouse, Lever, JazzHR) (`1701_engage/jobpulse-career-sites`) Actor

Live jobs of every kind straight from company career sites: Greenhouse, Lever and 100k+ JazzHR jobs. Filter by keyword, country, city, remote, category, seniority, salary, visa sponsorship, industry and company size. $0.0015/job.

- **URL**: https://apify.com/1701_engage/jobpulse-career-sites.md
- **Developed by:** [Thomas Jonkergouw](https://apify.com/1701_engage) (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 $1.50 / 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

## JobPulse: Live Career-Site Jobs (Greenhouse, Lever & JazzHR)

Get **live job postings straight from company career sites**, the moment you run it. No database delay, no login, no LinkedIn or Indeed reposts. Every job links to the employer's own application page.

JobPulse reads the **official public job feeds** of three applicant tracking systems and turns every posting into one clean, filterable format:

- **Greenhouse** and **Lever**: tech, fintech, healthcare and public companies (Stripe, Coinbase, Airbnb, GitLab, Toast, Palantir and many more).
- **JazzHR**: about 100,000 jobs at small and mid-size US employers, from dental practices and schools to manufacturers. These are the jobs other career-site tools miss.

### Why JobPulse

- ⚡ **Live, not cached.** Data is fetched from the source during your run. Other tools serve jobs from their own database with a delay of an hour or more.
- 💰 **Real salary data.** Uses the employer's official pay-transparency ranges where published, and otherwise parses the salary from the description. Hourly and monthly pay is converted to a yearly figure, so you can filter on it.
- 🎯 **Filters people actually need.** Title, description keywords, country, state, city, remote/hybrid/on-site, job category, seniority, employment type, salary range and currency, visa sponsorship, posting date, company industry, company size and public companies.
- 🔁 **Schedule-friendly.** With *Only new jobs since my last run* on, each scheduled run returns (and bills) only jobs you have not seen yet.
- 🏢 **Monitor any company.** Paste any Greenhouse, Lever or JazzHR career-site URL to track just those companies.
- 🔒 **Privacy by design.** No candidate or recruiter data. Email addresses and phone numbers are removed from descriptions.
- 🏆 **Employer profiles.** Switch the output to one row per company: open jobs, whether it accepts open applications, growth since your last run, how long jobs stay open, salary and remote share, and a 0-100 hiring score.
- 💵 **Lower price.** You pay only per job (or employer profile) returned.

### What you get per job

| Group | Fields |
|---|---|
| Job | `title`, `url`, `applyUrl`, `postedAt`, `updatedAt` |
| Company | `name`, `website`, `industry`, `subIndustry`, `employees`, `stockTicker`, `headquarters` |
| Location | `raw`, `city`, `region`, `country`, `countryCode`, `workplaceType` (remote / hybrid / onsite), `allLocations` |
| Role | `category`, `department`, `team`, `experienceLevel`, `employmentType` |
| Salary | `min`, `max`, `currency`, `period`, `yearlyMin`, `yearlyMax`, `source` (`ats` = official range, `description` = parsed) |
| Extra | `visaSponsorship` (true / false / null), `description` (`text` and/or `html`), `source` (`ats`, `jobId`, `fetchedAt`) |

The dataset comes with two ready-made table views: **Overview** (the job at a glance) and **Company details**. Export to JSON, CSV, Excel or XML, or connect to Google Sheets, Make, Zapier, n8n or the Apify API.

```json
{
  "title": "Senior Backend Engineer, Platform Enablement",
  "applyUrl": "https://job-boards.greenhouse.io/gitlab/jobs/...",
  "postedAt": "2026-09-18T...",
  "company": { "name": "GitLab", "industry": "Technology", "stockTicker": "GTLB" },
  "location": { "city": null, "region": null, "country": "United States", "countryCode": "US", "workplaceType": "remote" },
  "job": { "category": "Engineering", "experienceLevel": "senior", "employmentType": "full-time" },
  "salary": { "min": 156800, "max": 235200, "currency": "USD", "period": "year", "yearlyMin": 156800, "yearlyMax": 235200, "source": "ats" },
  "visaSponsorship": null
}
```

### Employer profiles: find the best companies that are hiring

Set **What do you want back?** to *Employer profiles*. JobPulse then reads every selected career site in full and returns **one row per company** instead of one row per job. All job filters still apply: with title `engineer` and country `Netherlands`, `openJobs` counts only engineering jobs in the Netherlands.

| Field | What it tells you |
|---|---|
| `openJobs` | Open jobs that match your filters (open-application postings not included) |
| `openApplication`, `openApplicationUrl` | The company has a *General application*, *Open application*, *Spontaneous application* or talent-pool posting, plus its link. About 1 in 7 Greenhouse and Lever companies has one. |
| `jobsByCategory`, `jobsByCountry` | Where the company is hiring, by job category and by country |
| `newJobsLast30Days`, `medianJobAgeDays`, `staleJobsShare` | Hiring pace. Jobs that stay open for months (`staleJobsShare` = share open longer than 60 days) can point to hard-to-fill roles or high turnover. |
| `salaryShare`, `remoteShare` | Share of jobs with a published salary and share of remote jobs |
| `previousOpenJobs`, `openJobsChange`, `previousRunAt` | Growth or shrink since your previous run with the same filters (empty on your first run, so schedule it weekly) |
| `hiringScore` | 0 to 100: the average of fresh jobs (1 − `staleJobsShare`), salary transparency (`salaryShare`) and growth since your last run. It measures how healthy a company's hiring is, **not** employee satisfaction. |
| `externalRating` | Your own rating for this company, if you supplied one (see below) |
| `company` | Name, industry, employees, stock ticker and website, as in job mode |

**Filters and sorting for employer profiles:** *Only companies that accept open applications*, *Minimum open jobs* (use 0 to include companies with only an open application), *Minimum hiring score*, *Minimum own rating*, and sorting by hiring score, open jobs, growth or your own rating.

**Bring your own ratings.** JobPulse does not collect employee reviews. Review sites forbid automated collection in their terms, and reviews are personal opinions. If you have ratings you are allowed to use, paste them under *Your own company ratings* as `[{"company": "GitLab", "rating": 4.1}]`. JobPulse matches them by company name and returns them as `externalRating`, so you can filter on "rated 4+ and hiring right now".

**JazzHR in employer profiles:** JazzHR's feed only lists job titles, so JazzHR rows have `openJobs` and `openApplication` but no age, salary, remote or score fields, and the company name is the career-site subdomain. JazzHR is skipped when you filter on location, category or job details.

Example: *Employer profiles*, country `United States`, category *Engineering*, *Only companies that accept open applications* on, sorted by hiring score. You get US companies that are hiring engineers and also accept general applications, healthiest first.

### Example searches

- **Job seeker:** title `engineer`, country `United States`, workplace *Remote*, seniority *Senior*, minimum salary `150000` USD, posted within `7` days, scheduled every morning with *Only new jobs* on.
- **Recruiter / sales:** category *Sales*, industry *Fintech*, company size `201-1000`. Shows which mid-size fintechs are hiring sellers right now (a strong buying signal).
- **Job board owner:** run daily with *Only new jobs* on and *Remove duplicates* on, and import the dataset into your board.
- **Best employers that are hiring:** *Employer profiles*, minimum hiring score `60`, *Only companies that accept open applications* on.
- **Competitor tracking:** paste the career-site URLs of 5 competitors under *Monitor specific career sites*.

### Coverage

- **JazzHR:** every job in JazzHR's public Google Jobs feed, about 100,000 jobs at 20,000+ employers.
- **Greenhouse and Lever:** a built-in list of verified company career sites. Public companies include their stock ticker and industry (from SEC data).
- **Unlimited extension:** add any Greenhouse, Lever or JazzHR board yourself under *Monitor specific career sites*.
- The built-in list is refreshed regularly.

### Pricing

**$0.0015 per job or employer profile returned** plus **$0.005 per run start**. Filtered-out jobs and companies are not billed. Example: 1,000 jobs cost $1.505. With *Only new jobs* on, jobs you already received are not billed again.

### Good to know

- **Lever:** Lever's robots.txt asks for at most 1 request per second, so JobPulse reads Lever career sites one by one at that pace. Broad searches stop at *Max run time*.

- **Detail fields:** filters on description, salary, visa or workplace need each job's detail page. That makes those runs slower but no more expensive per job.

- **JazzHR limits:** JazzHR pages show no posting date and no company industry or size. JazzHR jobs are therefore left out when you filter on posting date, industry, company size or public companies. We never guess a date.

- **Derived fields:** category, seniority, employment type, workplace and visa are derived with fixed rules, not AI. *Visa sponsorship* is `null` when the posting doesn't mention it. *Employment type* is `full-time` unless the posting says otherwise.

- **Employer profiles take longer:** every selected career site is read in full, so a run over all 2,600 built-in companies needs more than the default 5 minutes (within 4 minutes about 2,300 were done). Narrow it with industry, company size or *Monitor specific career sites*, or raise *Max run time*.

### Is this legal?

JobPulse only uses public job data that the platforms publish for this purpose: the documented Greenhouse and Lever job-board APIs (Greenhouse: "Job Board data is publicly available"; Lever: "all job postings in the published state are publicly viewable") and the JazzHR job feeds listed in JazzHR's robots.txt. It respects each host's robots.txt, does not log in, and does not collect personal data about candidates or recruiters.

Company discovery uses the [Majestic Million](https://majestic.com/reports/majestic-million) (CC BY 3.0), the SEC company list and the Y Combinator directory.

Questions or a feature request? Open an issue on the Issues tab.

# Actor input Schema

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

'Employer profiles' returns one row per company: open jobs matching your filters, whether it accepts open (general) applications, hiring momentum since your last run, how long jobs stay open, salary and remote share, and a 0-100 hiring score. All job filters below decide which jobs are counted.

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

Whole-word match on the job title, e.g. 'data engineer', 'account executive'. Empty = all titles.

## `titleExcludeKeywords` (type: `array`):

E.g. 'intern', 'manager'.

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

E.g. 'python', 'kubernetes', 'HIPAA'.

## `descriptionExcludeKeywords` (type: `array`):

Skip jobs whose description mentions any of these words, e.g. 'clearance', 'commission only'.

## `jobCategories` (type: `array`):

Function of the role, derived from title and department.

## `experienceLevels` (type: `array`):

Seniority derived from the job title.

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

Full-time is assumed when the posting does not say otherwise.

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

Country name or 2-letter code, e.g. 'United States', 'GB', 'Germany'.

## `regions` (type: `array`):

Full name, e.g. 'California', 'New York', 'Ontario'.

## `cities` (type: `array`):

E.g. 'Austin', 'London'.

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

Remote, hybrid or on-site, taken from the ATS when available, otherwise from title/location/description.

## `salaryMin` (type: `integer`):

Keeps jobs whose range reaches at least this amount (hourly/monthly pay is converted to yearly). Jobs without a published salary are kept unless 'Only jobs with salary' is on.

## `salaryMax` (type: `integer`):

Keeps jobs whose range starts at or below this yearly amount.

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

Only compare salaries in this currency.

## `onlyWithSalary` (type: `boolean`):

Drop jobs that do not publish a salary.

## `visaSponsorship` (type: `string`):

Based on the job description. 'Mentions sponsorship is available' keeps only jobs that explicitly offer it.

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

Only jobs first published in the last N days.

## `postedAfter` (type: `string`):

Only jobs first published on or after this date.

## `onlyNewSinceLastRun` (type: `boolean`):

For schedules: each run returns (and bills) only jobs you have not received before with the same filters.

## `industries` (type: `array`):

Company industry (Y Combinator data for startups, SEC SIC code for public companies). Boards without known industry are excluded when this filter is set.

## `companySizes` (type: `array`):

Company headcount where known. Boards without known size are excluded when this filter is set.

## `publicCompaniesOnly` (type: `boolean`):

Only companies listed on a US stock exchange (with ticker).

## `companyNames` (type: `array`):

Search only companies whose name contains one of these words.

## `excludeCompanies` (type: `array`):

Exact company names to skip.

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

Greenhouse, Lever or JazzHR career-site URLs or slugs, e.g. 'https://job-boards.greenhouse.io/airbnb', 'https://jobs.lever.co/palantir' or 'https://acme.applytojob.com'. When set, only these boards are searched.

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

Which applicant tracking systems to search. JazzHR covers ~100,000 jobs at small and mid-size US employers (no posting date and no company industry/size, so JazzHR is skipped when you filter on those).

## `onlyWithOpenApplication` (type: `boolean`):

Keep companies with a 'General application', 'Open application' or talent-pool posting on their career site.

## `minOpenJobs` (type: `integer`):

Minimum number of open jobs matching your filters. Use 0 to also get companies that only take open applications.

## `minHiringScore` (type: `integer`):

Hiring score = share of fresh jobs (open < 60 days), share with published salary and growth since your last run, averaged. It measures hiring health, not employee satisfaction.

## `companyRatings` (type: `array`):

Optional: attach your own ratings (e.g. from a review export you are allowed to use). Format: \[{"company": "GitLab", "rating": 4.1}]. Matched on company name or career-site slug and returned as 'externalRating'.

## `minExternalRating` (type: `number`):

Keep only companies whose rating from 'Your own company ratings' is at least this value.

## `sortCompaniesBy` (type: `string`):

Highest first. Companies without a value go last.

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

Maximum number of jobs (or employer profiles) to return and bill in this run.

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

Plain text, HTML, both, or no description (smallest output).

## `dedupe` (type: `string`):

Collapse the same job posted for several locations.

## `maxRunSeconds` (type: `integer`):

Lever boards are read at max 1 request/second (Lever's robots.txt). Broad searches stop at this time limit.

## Actor input object example

```json
{
  "outputType": "jobs",
  "titleKeywords": [
    "software engineer"
  ],
  "onlyWithSalary": false,
  "visaSponsorship": "any",
  "onlyNewSinceLastRun": false,
  "publicCompaniesOnly": false,
  "atsPlatforms": [
    "greenhouse",
    "lever",
    "jazzhr"
  ],
  "onlyWithOpenApplication": false,
  "minOpenJobs": 1,
  "sortCompaniesBy": "hiringScore",
  "maxResults": 200,
  "descriptionFormat": "text",
  "dedupe": "none",
  "maxRunSeconds": 300
}
```

# Actor output Schema

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

All matching jobs, shown in the Overview table (title, company, location, workplace, category, seniority, salary, visa, posted date, apply link).

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

The same jobs with company details (industry, employees, stock ticker, website).

## `employers` (type: `string`):

Only for output type 'Employer profiles': one row per company with open jobs, open application, hiring score and growth.

# 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 = {
    "titleKeywords": [
        "software engineer"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("1701_engage/jobpulse-career-sites").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 = { "titleKeywords": ["software engineer"] }

# Run the Actor and wait for it to finish
run = client.actor("1701_engage/jobpulse-career-sites").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 '{
  "titleKeywords": [
    "software engineer"
  ]
}' |
apify call 1701_engage/jobpulse-career-sites --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,1701_engage/jobpulse-career-sites"
        }
    }
}
```

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/cFqVCydeByuaLnPN2/builds/4O2FWaZ4RkBz1qZ9B/openapi.json
