# Live Jobs HTTP API: Greenhouse, Lever, Ashby, Workday (`conserving_celerytop/live-jobs-http-api`) Actor

The live HTTP version of ATS Jobs API. Send company names, websites or job board links in one GET or POST request and get their open jobs in the response, from 22 job boards. $0.01 per company, the same event prices, plus Apify platform usage. For scripts, Clay and no-code tools.

- **URL**: https://apify.com/conserving\_celerytop/live-jobs-http-api.md
- **Developed by:** [Don Mangu](https://apify.com/conserving_celerytop) (community)
- **Stats:** 1 total users, 0 monthly users, 0.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $8.00 / 1,000 companies

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.
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

**Get the open jobs of the companies you name in one HTTP request.** Send company names, websites or job board links in a URL or a JSON body, and the response has their open jobs. There is no run to start and no dataset to fetch. It is the live HTTP version of [ATS Jobs API](https://apify.com/conserving_celerytop/live-career-page-jobs-api), with the same 22 job boards, fields, filters and event prices.

Use it from a script, Clay, Zapier, Make, n8n or any tool that can call a URL.

### How do I call it?

1. Copy your Apify API token from **Settings**, **API & Integrations**.
2. Copy this Actor's URL from the **Endpoints** tab.
3. Send a GET request with your companies.

```bash
curl -H "Authorization: Bearer <YOUR_APIFY_TOKEN>" \
  "https://conserving-celerytop--live-jobs-http-api.apify.actor/?companies=databricks,https://jobs.ashbyhq.com/openai&department=engineering&postedSince=7%20days"
```

A POST to the same URL with a JSON body, such as `{"companies": ["stripe", "linear.app"]}`, also works.

`GET /openapi.json` describes every parameter and field, for free.

### What is in the response?

| Part | What it holds |
|---|---|
| `companies` | One status per company, such as `ok`, `no_matching_jobs` or `not_found`, with its job counts and whether it was charged |
| `jobs` | One object per job, with title, department, location, workplace type, salary when published, posted date and apply link |
| `closedJobs` | With `onlyNewJobs`, the jobs that closed since your last check |
| `spendingLimitReached` | true when your spending limit stopped the request |

### Parameters

Only `companies` is needed. Up to 500 companies per request.

| Parameter | What it does | Example |
|---|---|---|
| `companies` | Job board links, websites or company names, separated by commas | `stripe,linear.app` |
| `companyLists` | Ready-made lists, such as `ai-companies`, `tech-companies`, `remote-first` or `europe-tech` | `remote-first` |
| `department` | Keep jobs in these departments | `engineering,sales` |
| `titleIncludes`, `titleExcludes` | Keep or drop jobs whose title has these whole words | `data engineer` |
| `location`, `locationExcludes` | Keep or drop jobs in a country, US state or city | `London` |
| `workplaceTypes` | Jobs that are remote, hybrid or onsite | `remote,hybrid` |
| `postedSince`, `postedBefore` | Jobs posted in a recent period, or before a date | `7 days` |
| `hasSalary`, `minAnnualSalary` | Jobs with pay, or with at least this pay per year | `120000` |
| `includeDescription` | Add the full description and the tools it names | `true` |
| `outputMode` | `jobs`, `companies` for one summary per company, or `both` | `companies` |
| `onlyNewJobs`, `monitorName` | Only the jobs that are new or closed since your last check | `true` |
| `maxJobsPerCompany` | At most this many jobs per company | `20` |

The other filters of ATS Jobs API work too, such as `jobFunctions`, `seniorities` and `maxExperienceYears`. In a URL, separate several values with commas. For several locations, repeat the parameter (`location=London&location=Berlin`), since a place name can contain a comma.

### How much does it cost?

The event prices are the same as in ATS Jobs API. On top, you pay the Apify platform usage of the request, because this Actor runs as a live server that waits for your calls.

| Event | Price | What you get |
|---|---|---|
| Company (`company-lookup`) | $0.01 per company; $0.0095 on Starter, $0.009 on Scale, $0.008 on Business | All open jobs of one company, up to 1,000, also when its board is empty, not found or fails |
| Extra job block (`extra-1000-jobs`) | $0.01 per 1,000 jobs | Each further 1,000 jobs of the same company, or part of them |
| Repeat monitor check (`new-jobs-check`) | $0.002 per check | A later check with `onlyNewJobs`, per 1,000 open jobs on the board or part of them |
| Description block (`job-details`) | $0.01 per 200 jobs | Descriptions of 200 jobs on JazzHR, Paylocity, Freshteam, JOIN, Polymer, ClearCompany, GoHire, Workday, Eightfold or HiringThing career portals. Free on other boards |

Invalid, unsupported, duplicate and skipped entries, and websites we cannot open, are free. If your spending limit cannot cover a company, you get none of its jobs and pay nothing for it.

For many companies, daily schedules or exports to Google Sheets, run [ATS Jobs API](https://apify.com/conserving_celerytop/live-career-page-jobs-api) instead. A normal run there charges only the events, with no platform usage on top.

### Limits

- Each request has 240 seconds. Companies not read by then are `skipped_time_limit` and free, so send fewer per request.
- If your client disconnects first, companies not yet read are free (`skipped_client_disconnected`).

### Only new jobs

With `onlyNewJobs=true`, the first request for a company returns all its open jobs, and later requests only the new and closed ones. Use `monitorName` to keep separate checks. This Actor keeps its own memory, so a check you ran with ATS Jobs API does not count here.

### FAQ

#### How is this different from ATS Jobs API?

The code, boards, fields and event prices are the same. ATS Jobs API saves a dataset in a normal Apify run. This Actor answers each HTTP request directly, which suits a few companies at a time. For many companies, ATS Jobs API costs less.

#### Which job boards does it read?

Greenhouse, Lever, Ashby, Workable, Personio, Teamtailor, Recruitee, JOIN, Homerun, Gem, JazzHR, Paylocity, Freshteam, PageUp, Polymer, HireHive, HiringThing, Trakstar Hire, ClearCompany and GoHire, and Workday and Eightfold where the employer's robots.txt allows it. Other boards return `unsupported_job_board`, free, and `error` says why.

#### Is it legal?

It reads only job postings that companies publish on public job boards, with no login, and removes email addresses and phone numbers from descriptions. Check that your use follows the laws and terms that apply to you.

This Actor is not affiliated with or endorsed by Greenhouse, Lever, Ashby, Workday, Eightfold or any other job board. Their names are trademarks of their owners.

Found a problem? Open an issue on the **Issues** tab.

# Actor input Schema

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

One entry per company, up to 500. A job board link works best, such as boards.greenhouse.io/stripe, on Greenhouse, Lever, Ashby, Workday, Eightfold, Workable, Personio, Teamtailor, Recruitee, JOIN, Homerun, Gem, JazzHR, Paylocity, Freshteam, PageUp, Polymer, HireHive, HiringThing, Trakstar Hire, ClearCompany or GoHire. A website (stripe.com) works too, as does a plain name (stripe) for many companies. $0.01 per company, 1,000 jobs included, also when no board is found.

## `companyLists` (type: `array`):

Run on ready-made lists of companies instead of, or next to, your own list in Companies. Each company in a list is one company lookup ($0.01, 1,000 jobs included), and filters such as title, location and posted date apply as usual. To run only the lists, clear Companies. A company in two lists, or in a list and in Companies, is read and charged once. At most 500 companies per run in all. The lists are refreshed monthly. API value: a list such as \["ai-companies"].

## `outputMode` (type: `string`):

jobs: one row per job. companies: one summary row per company with open jobs, jobs posted in the last 7 and 30 days, remote share, top departments, locations, countries, seniority, job functions, leadership and first-hire roles, salary medians, top tools, and new and closed jobs with Only new jobs. Counts use every job passing your filters. It costs one lookup per company, never the extra 1,000-job charge. both: job rows plus summary rows (rowType job, company or status).

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

true: add each job's full description as plain text (up to 60,000 characters, no contact details) and the tools it names (field tools). Free on most boards. $0.01 per started 200 jobs on JazzHR, Paylocity, Freshteam, JOIN, Polymer, Workday, Eightfold, ClearCompany, GoHire and HiringThing portals. With Only new jobs, only new jobs are described. At your spending limit, the rest come without one. With Rows to return: companies, summary rows get top tools and first-hire roles.

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

Return at most this many jobs per company, the newest first, for example 50. To answer a quick question, 20 is enough. Leave empty for all jobs, up to 10,000 per company. Set 1,000 or less to never pay the $0.01 charge for each further 1,000 jobs. With Only new jobs, closed jobs come on top of this cap and count toward that charge. Summary rows still count every matching job.

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

true: return only jobs you have not received from this Actor before, plus jobs that closed since your previous check (field change is new or closed). The first check of a company returns all its jobs for $0.01. A later check costs $0.002 per started 1,000 open jobs on the board, so $0.002 for 300 jobs and $0.006 for 2,400. Use it with a schedule. What you received is saved in your own Apify account, per Monitor name and set of filters. Default false.

## `monitorName` (type: `string`):

Only used with Only new jobs. Name of the saved list of jobs you received, so separate watchlists do not mix, for example sales-accounts or competitors. Letters, numbers, - and \_ only, up to 40 characters. Default: default.

## `includeUpdatedJobs` (type: `boolean`):

Only used with Only new jobs. true: also return jobs you received before whose title, location, salary or job type changed since your previous check, with change updated, changedFields and the previous values. Each is one more row, so it counts toward the $0.01 per further 1,000 jobs. Default false: the price stays the same and changes are only counted in summary rows.

## `alertWebhookUrl` (type: `string`):

Only used with Only new jobs. An https link that gets one short message after a check with new or closed jobs, and nothing on days without changes. Paste the incoming webhook link of a Slack, Discord or Teams channel, or a Make, Zapier or n8n webhook, such as https://hooks.slack.com/services/... The message has the counts per company and the jobs with their links. Free. Kept secret. Leave empty for no alert.

## `alertMaxJobs` (type: `integer`):

Only used with Alert webhook URL. How many new and closed jobs the alert lists, one line each with title, location and salary when known, for example 20. More jobs are counted with a link to the dataset. A whole number from 1 to 50. Free. Default 10.

## `alertOnFirstCheck` (type: `boolean`):

Only used with Alert webhook URL. true: also send an alert on the first check of a company, which returns all its open jobs as new. Default false: the first check sends nothing, and later checks alert only on new and closed jobs. Free.

## `titleIncludes` (type: `array`):

Keep only jobs whose title contains one of these words or phrases, ignoring case. Use it to check if a company is hiring for a role, for example data engineer or account executive. Whole words only, so engineer matches Software Engineer but not Engineering Manager. A list of up to 100. Leave empty for all titles.

## `department` (type: `string`):

Keep only jobs whose department, team or department path contains this text, ignoring case, for example engineering. For several, put one per line. A job that matches any of them is kept. In API input, put a line break between values, as in "engineering\nsales". Up to 100. Leave empty for all departments.

## `location` (type: `string`):

Keep only jobs in this place, such as London, California or Germany. A country name or code (Germany, DE) keeps jobs in that country, so DE does not keep Rio de Janeiro. A US state or Canadian province keeps its region, so California keeps San Mateo, CA. Other text matches whole words, so York keeps New York, not Yorkshire. For several, put one per line. Any match keeps a job. In API input, put a line break between values. For remote jobs use Remote only. Leave empty for all.

## `locationExcludes` (type: `array`):

Leave out jobs in any of these places, matched like Location: India or IN also leaves out jobs in Bangalore, and California leaves out San Mateo, CA. A job with several places is left out when any of them matches. Jobs with no location are kept. A list of up to 100, for example India and Brazil. Leave empty to keep every location.

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

true: keep only jobs that can be done fully remote. Hybrid and on-site jobs are left out. Default false.

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

Keep only jobs with one of these workplace types: remote, hybrid or onsite (field workplaceType), from the board's own field or the location text. Jobs whose workplace type is unknown are left out, and the company's warning says how many; Greenhouse marks only remote and hybrid jobs, so its on-site jobs are unknown. Leave empty for all jobs.

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

Keep only jobs with one of these job types (field employmentTypeNormalized), from the board's job type or the title. Jobs whose type is unknown are left out, and the company's warning says how many. Teamtailor gives no job type and Greenhouse only when the company sets one, so there mostly titles like Intern or Part-time tell. Leave empty for all.

## `seniorities` (type: `array`):

Keep only jobs at one of these levels (field seniority), read from the title: Senior Engineer is senior, Head of Sales is director. A title without a level word, such as Software Engineer, has no seniority: those jobs are left out, and the company's warning says how many. Leave empty for all levels.

## `jobFunctions` (type: `array`):

Keep only jobs in these functions, read from each job's title, then its department and team (output field jobFunction). Pick one or more, for example Engineering and Data. English and German titles are read, and basic French, Spanish, Dutch and Swedish ones. In our tests about 9 in 10 jobs got the right function. API value: a list such as \["engineering", "data"]. Leave empty for all functions.

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

Keep only jobs written in one of these languages, as two-letter codes such as en, de or fr (field language). Greenhouse gives each job's language; elsewhere it is read from the description, so this turns on Include job description, also with Rows to return: companies, with its price on JazzHR, Paylocity, Freshteam, JOIN, Polymer, Workday, Eightfold, ClearCompany, GoHire and HiringThing portals. Jobs whose language is unknown are left out; the company's warning says how many.

## `titleExcludes` (type: `array`):

Leave out jobs whose title contains any of these words or phrases, ignoring case. Whole words only, so intern does not match International. A list of up to 100, for example senior and intern. An excluded word wins over Title includes. Leave empty to keep every title.

## `descriptionIncludes` (type: `array`):

Keep only jobs whose description names any of these words or phrases, ignoring case, such as Snowflake, Rust or C++. Whole words only, so Rust does not match trust. A tool also matches its other names, so Postgres finds PostgreSQL. Up to 100. This turns on Include job description, also with Rows to return: companies, with its price on JazzHR, Paylocity, Freshteam, JOIN, Polymer, Workday, Eightfold, ClearCompany, GoHire and HiringThing portals. Leave empty for all jobs.

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

true: keep only jobs with a salary (salaryMin or salaryMax), from the board or written in the description. Many boards have no pay field or show pay only in the description, so this turns on Include job description, also with Rows to return: companies, with its job-details price on JazzHR, Paylocity, Freshteam, JOIN, Polymer, Workday, Eightfold, ClearCompany, GoHire and HiringThing portals. Default false.

## `minAnnualSalary` (type: `integer`):

Keep jobs whose yearly salary (salaryAnnualMax, else salaryAnnualMin) reaches this amount in the currency below, such as 120000. Pay in the description counts too, so this turns on Include job description, with its price on JazzHR, Paylocity, Freshteam, JOIN, Polymer, Workday, Eightfold, ClearCompany, GoHire and HiringThing portals. Jobs paid in another currency (no exchange rates) or with no yearly salary are left out; the warning says how many. Empty for no minimum.

## `minAnnualSalaryCurrency` (type: `string`):

Currency of Minimum yearly salary, as a three-letter code such as USD, EUR or GBP. Only jobs whose salary is in this currency can pass. Used only with Minimum yearly salary. Default USD.

## `postedSince` (type: `string`):

Keep only jobs posted on or after this date. Use a date as YYYY-MM-DD, for example 2026-09-01, or a period as a number plus hours, days, weeks, months or years, for example 24 hours or 7 days. A period counts back from the start of each run, which suits schedules. Jobs whose board gives no posting date are left out. Leave empty for all dates.

## `postedBefore` (type: `string`):

Keep only jobs posted before this date. Use a date as YYYY-MM-DD, for example 2026-06-01, or a period such as 30 days for jobs posted more than 30 days ago. With Posted since it gives a date range. Jobs whose board gives no posting date are left out, and the company's warning says how many. Leave empty for all dates.

## `maxExperienceYears` (type: `integer`):

Keep only jobs whose description asks for at most this many years of experience, read from phrases like 5+ years or mindestens 3 Jahre. A whole number from 0 to 50, such as 3. Jobs that give no years are left out, and the warning says how many. This turns on Include job description, also with Rows to return: companies, with its price on JazzHR, Paylocity, Freshteam, JOIN, Polymer, Workday, Eightfold, ClearCompany, GoHire and HiringThing portals. Leave empty for all.

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

true: keep only jobs whose description says the company sponsors visas. Jobs that do not mention it are left out, and the warning says how many. This reads the description, so it turns on Include job description, also with Rows to return: companies, with its price on JazzHR, Paylocity, Freshteam, JOIN, Polymer, Workday, Eightfold, ClearCompany, GoHire and HiringThing portals. Default false.

## `startUrls` (type: `array`):

Another name for Companies, so input written for other Actors works: links as strings or as {"url": "..."} objects. Merged into Companies.

## `urls` (type: `array`):

Another name for Companies, so input written for other Actors works: links as strings or as {"url": "..."} objects. Merged into Companies.

## Actor input object example

```json
{
  "companies": [
    "https://boards.greenhouse.io/stripe",
    "linear.app",
    "openai"
  ],
  "outputMode": "jobs",
  "includeDescription": false,
  "maxJobsPerCompany": 50,
  "onlyNewJobs": false,
  "monitorName": "default",
  "includeUpdatedJobs": false,
  "alertMaxJobs": 10,
  "alertOnFirstCheck": false,
  "titleIncludes": [
    "engineer"
  ],
  "department": "engineering",
  "location": "London",
  "remoteOnly": false,
  "jobFunctions": [
    "engineering",
    "data"
  ],
  "descriptionIncludes": [
    "Snowflake",
    "dbt"
  ],
  "hasSalary": false,
  "minAnnualSalaryCurrency": "USD",
  "postedSince": "7 days",
  "visaSponsorship": false
}
```

# Actor output Schema

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

Dataset items, one per job: company, companyName, matchedBy, companyStatus, title, department, team, location, countryCode, city, remote, seniority, jobFunction, employment type, salary with its yearly value, tools (with descriptions), postedAt and url. The dataset has more fields (jobId, applyUrl, description, country, region, salaryRanges, charged, warning, error); read it with fields=... to keep only what you need.

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

JSON array, one object per company in input order: companyStatus (ok, no\_open\_jobs, not\_found, no\_job\_board\_found, invalid\_input and others), charged, chargedEvent, companyName, matchedBy (link, website, directory, name or name variant), inputDomain and boardUrl for websites, companyTotalOpenJobs, companyMatchedJobs, companyJobsReturned, newJobsCount, closedJobsCount, updatedJobsCount, error and warning.

## `companySummaries` (type: `string`):

Dataset items with rowType company, one per company, when Rows to return is companies or both: openJobs, jobs posted in the last 7 and 30 days, jobs open over 90 days, remote, engineering and sales shares, top departments, locations and countries, seniority and job function counts, jobs per function posted in the last 30 days, leadership and first-hire roles, top tools, salary medians, and new, closed, updated and reposted jobs with Only new jobs. With jobs, this view has no summary rows.

# 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.lever.co/palantir",
        "https://jobs.ashbyhq.com/ashby"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("conserving_celerytop/live-jobs-http-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/stripe",
        "https://jobs.lever.co/palantir",
        "https://jobs.ashbyhq.com/ashby",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("conserving_celerytop/live-jobs-http-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/stripe",
    "https://jobs.lever.co/palantir",
    "https://jobs.ashbyhq.com/ashby"
  ]
}' |
apify call conserving_celerytop/live-jobs-http-api --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,conserving_celerytop/live-jobs-http-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/J4Hvw52qSjE0wsot4/builds/w3uWf56AOwXgIyL96/openapi.json
