# Jobs Index: Greenhouse, Lever & Ashby by Place, Radius & Pay (`fairquery/jobs-index-search`) Actor

Search Fairquery's daily index of public Greenhouse, Lever and Ashby postings across ~8,800 company boards by US ZIP or City radius, place, role, seniority and employer-published pay. One row per open job with a link to the employer's posting. No description bodies stored.

- **URL**: https://apify.com/fairquery/jobs-index-search.md
- **Developed by:** [Fairquery](https://apify.com/fairquery) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.75 / 1,000 job results

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

## Jobs Index Search: Greenhouse, Lever & Ashby by Place, Radius & Pay

Search Fairquery's daily index of **public** job postings from companies' own Greenhouse, Lever and Ashby boards (about 8,800 boards and 268,000 open postings at the 2026-11-03 refresh). Filter by US ZIP or "City, ST" radius, role words, seniority, employment type, freshness and **employer-published** pay. Every row links to the employer's own posting.

Use the free [Company Jobs Feed MCP](https://mcp.getfairquery.com/jobs/mcp) when you already know the company and want its live board. Use this Actor when you want openings **across** thousands of boards near a place.

### What it costs

Pay per event, no subscription.

| Event | Free | Bronze | Silver | Gold | When |
|---|---|---|---|---|---|
| `job-result` (primary) | $0.00099 | $0.00095 | $0.00085 | $0.00075 | each open job row delivered after your filters |
| `search-run` | $0.001 | $0.001 | $0.001 | $0.001 | once per run that returns at least one job |

Runs with **zero matches** or an **error** cost nothing. Error rows are never charged. Live re-check of the top rows is included.

The [Apify Free plan](https://apify.com/pricing) includes **$5 of usage every month**, no credit card needed, and this Actor's event charges come out of that $5. That covers about **5,000 job rows from 40 searches a month** (5,000 × $0.00099 + 40 × $0.001 = $4.99).

**Example (Free-plan prices):** one search near "Pittsburgh, PA" within 50 miles with the default 50 rows: 50 × $0.00099 + $0.001 = $0.0505, about **5 cents**. A daily search like that for 30 days = 1,500 rows × $0.00099 + 30 × $0.001 = **$1.52**.

Paid Apify plans get the Store discount automatically: Starter = Bronze, Scale = Silver, Business = Gold. Set a maximum cost per run in the run options and the Actor stops cleanly at that limit; it never delivers a row it cannot charge.

### Input

At least one place is required: **Near** (ZIP or City, ST + Radius), **Locations**, **Countries**, or **Remote = only**.

- `near`, `radiusMiles` (default 25, max 150) — static US Census 2024 Gazetteer, no geocoder call
- `locations`, `countries`, `remote` (any / only / exclude)
- `roleIncludes`, `titleIncludes`, `titleExcludes`, `employmentTypes`, `seniority`
- `salaryMin`, `salaryMax`, `salaryUnit`, `salaryCurrency`, `includeUnknownSalary`
- `postedWithinDays`, `longOpenDays`, `excludeLongOpen`
- `liveRecheck`, `liveRecheckLimit` (max 10)
- `maxResults` (1-1000, default 50), `offset` (pass `nextOffset` from the run's OUTPUT to continue)

Example: `{"near": "Allentown, PA", "radiusMiles": 50, "roleIncludes": ["engineer"], "salaryMin": 80000}`

### Output

One dataset row per posting: title, company, ATS, board, job id, locations, public job and apply URL, department, team, employment and workplace type, seniority, posted/updated dates, age_days, long_open, stale_signal, salary\_\* (employer-published only), distance_miles (with Near), live_status (when re-checked), fetched_at.

The run's key-value store `OUTPUT` has `delivered`, `total`, `nextOffset`, `hasMore`, `stoppedBy` (max_results / end_of_results / no_results / charge_limit / error) and index `meta` (freshness, board_count). With zero matches the dataset gets one free `no_results` row with relaxed `suggestions`.

### Data and privacy

- Sources: only companies' **public** Greenhouse, Lever and Ashby job-board APIs. Personio, Pinpoint and Gem are not in this index.
- **Description bodies are not stored.** Only listing metadata and one employer-stated pay line read at crawl time.
- Pay is never estimated. Most postings publish none, so a strict salary filter returns fewer rows.
- `long_open` is a heuristic, not proof of a ghost job.
- Removed postings are deleted at the next refresh; nothing historical is kept.
- Employers can ask to be removed: **info@getfairquery.com** with the board link.

### Support

info@getfairquery.com · Built by Fairquery.

# Actor input Schema

## `near` (type: `string`):

Radius center: 5-digit US ZIP ("18013") or "City, ST" ("Allentown, PA"). Satisfies the place requirement; Locations and Countries are ignored when set. Static US Census 2024 Gazetteer table, no geocoder call.

## `radiusMiles` (type: `integer`):

Statute miles from Near. Default 25, max 150. Only single 'City, ST' or ZIP location lines get a distance; state-only, regional, country-wide and remote lines are never radius hits.

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

Place names, any-of, when Near is not set. Examples: "Costa Mesa", "Allentown, PA", "PA". Max 50.

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

ISO-3166 alpha-2 codes, e.g. \["US"]. Max 50.

## `remote` (type: `string`):

"only" keeps remote postings and counts as a place. With Near, remote rows are excluded unless set to any/only.

## `roleIncludes` (type: `array`):

Whole words matched on title, department or team. Posting bodies are not stored or searched.

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

Whole words matched on the title, any-of.

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

Drop titles containing these whole words.

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

Case-insensitive, e.g. \["Full-time"], \["Contract","Part-time"], \["Intern"]. Max 10.

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

Heuristic from ATS metadata or whole title words; rows with unknown seniority are excluded when set.

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

Lowest pay you want, in Salary unit. Matches rows whose published range overlaps the band. Pay is never estimated; most postings publish none.

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

Highest pay in the band, same unit.

## `salaryUnit` (type: `string`):

Compared as annual: hour x2080, day x260, week x52, month x12.

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

ISO 4217. Rows in another currency do not match.

## `includeUnknownSalary` (type: `boolean`):

With a salary band set, false drops rows with no comparable published pay; true keeps them marked salary_match unknown.

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

Keep postings whose posted_at is within this many days.

## `longOpenDays` (type: `integer`):

Rows posted longer ago than this and not updated by the ATS within it get long_open = true (heuristic, not proof of a ghost job).

## `excludeLongOpen` (type: `boolean`):

Drop rows with long_open = true.

## `liveRecheck` (type: `boolean`):

Probe the public posting page of the top rows for live_status (live / gone / unknown). Read-time only; never changes the index. Included in the job-result price; only the first page's top rows are probed.

## `liveRecheckLimit` (type: `integer`):

How many top rows to probe. Max 10.

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

Total job rows to deliver, 1-1000 (the Actor reads the index 50 at a time). Each delivered row is one job-result event. Default 50.

## `offset` (type: `integer`):

Rows to skip. Pass nextOffset from a previous run.

## Actor input object example

```json
{
  "near": "18013",
  "radiusMiles": 25,
  "roleIncludes": [
    "engineer"
  ],
  "salaryUnit": "year",
  "salaryCurrency": "USD",
  "includeUnknownSalary": false,
  "longOpenDays": 60,
  "excludeLongOpen": false,
  "liveRecheck": true,
  "liveRecheckLimit": 5,
  "maxResults": 50,
  "offset": 0
}
```

# Actor output Schema

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

No description

## `summary` (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 = {
    "near": "Pittsburgh, PA",
    "roleIncludes": [
        "engineer"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("fairquery/jobs-index-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 = {
    "near": "Pittsburgh, PA",
    "roleIncludes": ["engineer"],
}

# Run the Actor and wait for it to finish
run = client.actor("fairquery/jobs-index-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 '{
  "near": "Pittsburgh, PA",
  "roleIncludes": [
    "engineer"
  ]
}' |
apify call fairquery/jobs-index-search --silent --output-dataset

```

## MCP server setup

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