# Jobs Index (`aspen-technology-labs-inc/jobsindex-api`) Actor

Jobs Index provides access to 11+ million organically-collected jobs from hundreds of thousands of direct employer company career websites.
Data you can trust! JobsIndex is offered by Aspen Tech Labs Inc, which has been making jobs data content available for nearly 20 years.

- **URL**: https://apify.com/aspen-technology-labs-inc/jobsindex-api.md
- **Developed by:** [Aspen Technology Labs, Inc.](https://apify.com/aspen-technology-labs-inc) (community)
- **Categories:** Jobs, Developer tools
- **Stats:** 30 total users, 5 monthly users, 42.9% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $4.00 / 1,000 job records

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/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## JobsIndex API - JobsIndex by Aspen Tech Labs

Access fresh, deduplicated job postings from direct employer career sites worldwide through the JobsIndex API, built by Aspen Tech Labs. JobsIndex aggregates 11M+ active job postings daily from 300K+ employer source sites globally. Job data is sourced directly from company career pages and ATS platforms, not scraped from job boards or aggregators.

Use this Actor when you need flexible access to the full JobsIndex jobs API rather than a pre-filtered specialty Actor. You can search by keyword, title, company, location, category, salary, seniority, employment type, work arrangement, posting age, and more.

### What You Can Use It For

- Power job boards, job search features, or backfill workflows with fresh job postings
- Find jobs by title, keyword, company, location, category, industry, or posting age
- Monitor hiring activity for specific companies or employer domains
- Build recruiting, HR analytics, sales intelligence, workforce intelligence, or labor-market products
- Retrieve structured job data with company, location, salary, category, seniority, remote status, source URL, and application URL fields where available

### Why JobsIndex Is Different

- 11M+ active job postings worldwide
- 300K+ employer source sites
- Direct employer career-site and ATS coverage
- Fresh active jobs, updated daily
- Deduplicated job records
- Direct source and application links where available
- Salary, location, company, category, seniority, remote, and employment-type fields where available
- Historical job postings, custom feeds, and bulk delivery available separately

### Quick Start

#### Fresh software jobs in the United States

```json
{
  "what": "software engineer",
  "country": "United States",
  "posted": "1w",
  "size": 10
}
```

#### Jobs for a specific company domain

```json
{
  "company_domain": "ibm.com",
  "size": 10
}
```

#### Jobs with salary data

```json
{
  "country": "United States",
  "salary": "20h-30h",
  "size": 10
}
```

#### Remote jobs

```json
{
  "remote": "remote",
  "what": "customer success",
  "size": 10
}
```

### Input Parameters

| Parameter | Description | Example |
|---|---|---|
| `id` | Optional JobsIndex job ID filter. Use this to retrieve a known job record. | `9343167339286732210` |
| `what` | Main job search query. Supports keywords, boolean logic, exact phrases, and field-targeted search such as `@title engineer` or `@(title,description) (python)`. | `python developer OR junior javascript` |
| `where` | Free-text location search. Supports place names, boolean logic, and field-targeted search such as `@country United States` or `@(city,metro_area) (Denver)`. Prefer structured location fields for exact filters. | `Germany` |
| `country` | Country filter. | `United States` |
| `region` | State, province, or region. | `California` |
| `city` | City filter. | `New York` |
| `postal_code` | ZIP or postal code. | `10001` |
| `metro_area` | Metropolitan area filter. | `San Francisco-Oakland-Fremont, CA` |
| `title` | Job title filter. | `Sales Representative` |
| `company_name` | Company name filter. Company filters reduce the retrievable item cap; see Limits and Pagination. | `IBM` |
| `company_domain` | Company website domain in valid DNS form. Company filters reduce the retrievable item cap; see Limits and Pagination. | `ibm.com` |
| `category` | Job category. | `Healthcare` |
| `sub_category` | More specific job function or role. | `Physician` |
| `industry` | Company industry. | `Food Products` |
| `posted` | Relative posting age or ISO date. | `1w` |
| `salary` | Salary amount or range filter. | `20h-30h` |
| `employment_type` | Employment type. | `Full-Time` |
| `remote` | Work arrangement filter. Supported values: `remote`, `on-site`, `hybrid`. | `remote` |
| `seniority` | Seniority level. | `Senior` |
| `page` | Page number, starting from 0. | `0` |
| `size` | Number of results per page. Default 20, min 1, max 100. | `20` |

### Salary Filter Format

Use:

```text
NUMBER[UNIT]
```

or:

```text
NUMBER[UNIT]-NUMBER[UNIT]
```

Supported units:

- `h` - per hour
- `d` - per day
- `w` - per week
- `m` - per month
- `y` - per year

Examples:

- `20h-30h` - hourly rate between 20 and 30
- `35h` - fixed hourly rate
- `20h-200000y` - range from hourly to yearly comparison

### Advanced Filters

`what` and `where` support plain-text search, boolean logic, and field-targeted search.

If no field is provided, the API expands the search across a default set of relevant fields.

Plain keyword examples:

```text
what = engineer OR manager
where = United States
```

Field-specific examples:

```text
what = @title engineer OR manager
where = @country United States
```

Multi-field examples:

```text
what = @(title,description) (python)
what = @(title,title_raw,description) (engineer OR manager)
what = @(title,description) (python AND developer)

where = @(country,region,city,metro_area,county,sub_city) (United States)
where = @(city,region,metro_area) (San Francisco OR California)
where = @(city,region,metro_area) (California)
```

#### Structured Filter Precedence

When using `what` or `where`, avoid sending separate structured filters for the same search unless you want those structured filters to take priority.

- For `where`, location fields such as `country`, `region`, `city`, `postal_code`, and `metro_area` take priority and can override or narrow the free-text location query.
- For `what`, structured job filters such as `title`, `company_name`, `company_domain`, `category`, `sub_category`, `industry`, `posted`, `salary`, `employment_type`, `remote`, and `seniority` take priority and can override or narrow the keyword query. For example, `sub_category = Registered Nurse` takes priority over `what = engineer`.

Use `what` and `where` as free-text searches when their corresponding structured filters are not set.

Common job/content fields for `what`:

- `title`, `title_raw`, `description`, `reference`
- `category`, `sub_category`, `seniority`, `industry`, `company_type`
- `company_name`, `company_domain`, `company_name_raw`
- `employment_type`, `remote`, `language`
- `posted`, `posted_raw`, `expired`
- `url_source`, `url_apply`
- `salary_value`, `salary_currency`, `salary_unit`
- `id`

Common location fields for `where`:

- `country`, `region`, `city`, `metro_area`, `county`, `sub_city`, `postal_code`

### Location Filtering

For precise location matching, use structured filters when possible:

- `country`
- `region`
- `city`
- `postal_code`
- `metro_area`

Use `where` as a free-text location search when structured location filters are not set. If `where` is provided together with structured location filters, the structured filters take priority and `where` may be ignored or narrowed.

### Limits and Pagination

This Actor uses the JobsIndex jobs API. Results are paginated with `page` and `size`.

| Parameter | Default | Min | Max |
|---|---:|---:|---|
| `page` | 0 | 0 | Depends on `size` and the item cap |
| `size` | 20 | 1 | 100 |

Invalid `page` or `size` values can return `400 Invalid page or size parameters`.

#### Item Caps

The maximum number of retrievable jobs depends on the query shape:

| Query shape | Max items | Effective max `size` | Over-size behavior |
|---|---:|---:|---|
| No company filter | 1000 | 100 | Validation error; not silently capped |
| Company filter plus another keyword or filter | 20 | 20 | Silent cap with capping metadata |
| Company filter only | 5 | 5 | Silent cap with capping metadata |

A company filter means `company_name`, `company_domain`, or a company field referenced inside `what`. Another keyword or filter means anything in `what` other than `company_*`, or a value in fields such as `title`, `category`, `sub_category`, `industry`, `posted`, `salary`, `employment_type`, `remote`, or `seniority`.

When a company-filtered request asks for `size` greater than the effective cap, the API returns up to the capped number of results instead of erroring. The response metadata includes:

- `size_requested` - the original requested `size`
- `size_capped_by` - `"company"` for the 5-item cap or `"company|keywords"` for the 20-item cap

On uncapped responses, `size_requested` and `size_capped_by` are not present.

No-company-filter requests are not silently capped. If the request exceeds the 1000-item retrieval window, the API can return `400 Item limit reached. Maximum of 1000 items can be retrieved`.

#### Free-Text Query Limits

`what` and `where` support advanced matching syntax but have safety limits:

| Limit | Value | Error behavior |
|---|---:|---|
| Raw URL length before decoding | 700 characters | `400 'what' or 'where' parameters exceed 700 characters` |
| Decoded text length | 500 characters | `400 MATCH input exceeds length limit` |
| Combined operator characters: `?`, `+`, pipe, `@` | 20 | `400 Too many MATCH operators` |
| Unsafe SQL-like keywords | blocked | `400 Unsafe MATCH expression` |

Unsupported characters may be normalized before search. Unbalanced quotes and trailing `@` characters may be stripped.

#### Field Validation

Invalid filter values can return `400 Invalid value for parameter: <name>`. Common validation examples include malformed company domains, invalid dates or relative `posted` values, invalid salary format, invalid job IDs, unsupported location formats, or overly long field values.

#### ID Lookup Shortcut

When `id` is provided, the search query is bypassed and the API returns the matching job record or records. Job IDs must be numeric; otherwise the API returns `400 Invalid job id format`.

### Output

Each run stores job records returned by the JobsIndex API in the default Apify dataset and metadata in `meta.json` in the default key-value store.

The dataset schema exposes the raw JobsIndex job fields returned by the API. Common fields include:

- `id`
- `title`, `title_raw`
- `category`, `sub_category`, `seniority`
- `reference`, `industry`, `company_type`
- `company_name`, `company_name_raw`, `company_domain`
- `posted`, `posted_raw`, `expired`
- `url_source`, `url_apply`
- `country`, `region`, `city`, `metro_area`, `county`, `sub_city`, `postal_code`
- `salary_value`, `salary_currency`, `salary_unit`
- `employment_type`, `remote`, `language`
- `description`

`meta.json` includes:

- `page`
- `size`
- `total`
- `pages`
- `returned_count`
- `query`
- `status_code`
- `size_requested` and `size_capped_by`, when company-filter capping is applied

Example dataset item:

```json
{
  "id": "3956505510037809027",
  "title": "Software Engineer",
  "company_name": "Example Company",
  "category": "Information Technology",
  "sub_category": "Software Development",
  "country": "United States",
  "region": "California",
  "city": "San Francisco",
  "salary_value": "120000.00-160000.00",
  "salary_currency": "USD",
  "salary_unit": "YEAR",
  "employment_type": "Full-Time",
  "remote": "hybrid",
  "posted": "2026-04-20",
  "url_apply": "https://example.com/apply"
}
```

Field availability depends on the source job posting. Missing or unavailable values may appear as an empty string, `"n/a"`, or `null`, depending on the field and source data.

### Empty Results

If no jobs match your query, the API returns a successful response with `total: 0` and an empty `data` array. The Actor run still succeeds and writes an empty dataset plus metadata.

### Custom Jobs Data

For custom job data needs, bulk downloads, or tailored job feeds, contact us via [JobsIndex](https://jobsindex.com/) or by [email](mailto:inquiry+apify@aspentechlabs.com). You can also explore [JobMarketPulse](https://jobmarketpulse.com/), our next-generation labor and job market intelligence platform.

# Actor input Schema

## `id` (type: `string`):

Optional job ID filter. Use a specific JobsIndex job ID to retrieve known job records.

## `what` (type: `string`):

Main job search query. Supports keywords, exact phrases, boolean logic (AND, OR, NOT or &, |, !), and field targeting. Examples: python developer OR junior javascript, "data scientist", @(title) (manager), @(title,description) (python), @(company\_name) ((="google, inc.") OR (microsoft AND corporation)). Maximum 700 raw URL chars or 500 decoded chars.

## `where` (type: `string`):

Free-text location search. Supports place names, boolean logic, and field targeting. Examples: Germany, San Francisco, @country United States, @(city,metro\_area) (Denver). Structured fields such as country, region, city, postal\_code, and metro\_area take priority when also provided. Maximum 700 raw URL chars or 500 decoded chars.

## `country` (type: `string`):

Country for job location filter.

## `region` (type: `string`):

Region, state, or province.

## `city` (type: `string`):

City filter.

## `postal_code` (type: `string`):

Postal or ZIP code.

## `metro_area` (type: `string`):

Metropolitan area filter.

## `title` (type: `string`):

Job title filter.

## `company_name` (type: `string`):

Company name filter.

## `company_domain` (type: `string`):

Company website domain, for example ibm.com.

## `category` (type: `string`):

Job category, for example Healthcare or Retail.

## `sub_category` (type: `string`):

More specific job function.

## `industry` (type: `string`):

Company industry.

## `posted` (type: `string`):

Relative posting age, such as 1h, 1d, 1w, 1m, or an ISO date: YYYY, YYYY-MM, YYYY-MM-DD.

## `salary` (type: `string`):

Salary amount/range filter. Format: 1-9 digits followed by y, m, w, d, or h; optional range A-B. Examples: 20h-30h, 35h, 20h-200000y.

## `employment_type` (type: `string`):

Employment type, for example Full-Time or Part-Time.

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

Work arrangement filter. Supported values: remote, on-site, hybrid.

## `seniority` (type: `string`):

Seniority level, for example Junior, Middle, Senior.

## `page` (type: `integer`):

Page number. Starts from 0. Pagination is capped by query shape: no company filter up to 1000 items, company filter with another filter up to 20 items, company filter only up to 5 items.

## `size` (type: `integer`):

Number of results per page. Maximum 100.

## Actor input object example

```json
{}
```

# Actor output Schema

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

No description

## `meta` (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 = {};

// Run the Actor and wait for it to finish
const run = await client.actor("aspen-technology-labs-inc/jobsindex-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 = {}

# Run the Actor and wait for it to finish
run = client.actor("aspen-technology-labs-inc/jobsindex-api").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{}' |
apify call aspen-technology-labs-inc/jobsindex-api --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=aspen-technology-labs-inc/jobsindex-api",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/cwL4IQZv73gSe41gZ/builds/UFrAgUygo6n6Dp2Vt/openapi.json
