# JSearch - Google for Jobs Search API (`openweb-ninja/jsearch`) Actor

Real-time job postings and salary data from LinkedIn, Indeed, Glassdoor, ZipRecruiter and all public job sites via Google for Jobs. Search jobs, get job details, estimated and company salaries.

- **URL**: https://apify.com/openweb-ninja/jsearch.md
- **Developed by:** [OpenWeb Ninja](https://apify.com/openweb-ninja) (community)
- **Categories:** Jobs, Lead generation
- **Security:** Limited permissions
- **Stats:** 3 total users, 2 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.75 / 1,000 api requests

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

## JSearch - Google for Jobs Search API

JSearch is a fast, reliable, and comprehensive job search API for real-time job listings and salary data aggregated from Google for Jobs and the open web, including LinkedIn, Indeed, Glassdoor, ZipRecruiter, Monster, CareerBuilder, SimplyHired and many others. It is built for developers, HR platforms, recruiting tools, career sites, and researchers who need up-to-date job market data.

It returns live job postings with titles, descriptions, requirements, locations, employer details, apply links, and estimated or company-specific salaries.

This actor runs the same JSearch API that thousands of developers use on RapidAPI and OpenWeb Ninja, with the same endpoints, parameters and output.

### What you can do with it

- Build job boards and career sites with fresh postings from every major job site
- Feed ATS and recruiting tools with live openings by title, location, seniority and remote status
- Benchmark salaries by job title, location and experience, or for a specific company
- Track hiring at target companies for sales prospecting and market research
- Analyse the job market: demand by role, skill, region and employment type

### Endpoints

Pick the endpoint in the **Endpoint** field. Each run makes one call to that endpoint and writes its results to the dataset.

#### Job Search

`GET /search-v2`

Search for jobs posted on any public job site across the web on the largest job aggregate in the world (Google for Jobs). Extensive filtering support and most options available on Google for Jobs.

| Parameter | Required | Description |
|---|---|---|
| `query` | Yes | Free-form jobs search query. It is highly recommended to include job title and location as part of the query. |
| `cursor` | No | Cursor for paginating results. Pass the value of `data.cursor` returned by the previous response to fetch the next page. Leave empty (or omit) to start from the first page. |
| `num_pages` | No | Number of pages to return, starting from page. **Note**: Each page (containing up to 10 results) returned by the API consumes one request credit. Default: `1`. |
| `country` | No | Country code of the country from which to return job postings. Default: `us`. |
| `language` | No | Language code in which to return job postings. Leave empty to use the primary language in the specified country (country parameter). |
| `date_posted` | No | Find jobs posted within the time you specify. Values: `all`, `today`, `3days`, `week`, `month`. Default: `all`. |
| `work_from_home` | No | Only return work from home / remote jobs. Default: `false`. |
| `employment_types` | No | Find jobs of particular employment types (comma separated). Values: `FULLTIME`, `CONTRACTOR`, `PARTTIME`, `INTERN`. |
| `job_requirements` | No | Find jobs with specific requirements (comma separated). Values: `under_3_years_experience`, `more_than_3_years_experience`, `no_experience`, `no_degree`. |
| `radius` | No | Return jobs within a certain distance from location as specified as part of the query (in km). |
| `exclude_job_publishers` | No | Exclude jobs published by specific publishers, specified as a comma (,) separated list of publishers to exclude. |
| `fields` | No | A comma separated list of job fields to include in the response (field projection). By default all fields are returned. |

#### Job Details

`GET /job-details`

Get all job details, including additional information such as: application options / links, employer reviews and estimated salaries for similar jobs.

| Parameter | Required | Description |
|---|---|---|
| `job_id` | Yes | Job Id of the job for which to get details. Batching of up to 20 Job Ids is supported by separating multiple Job Ids by comma (,). Note that each Job Id in a batch request is counted as a request for quota calculation. |
| `country` | No | Country code of the country from which to return job posting. Default: `us`. |
| `language` | No | Language code in which to return job postings. Leave empty to use the primary language in the specified country (country parameter). |
| `fields` | No | A comma separated list of job fields to include in the response (field projection). By default all fields are returned. |

#### Job Salary

`GET /estimated-salary`

Get estimated salaries / pay for a jobs around a location by job title and location. The salary estimation is returned for several periods, depending on data availability / relevance, and includes:  hourly, daily, weekly, monthly, or yearly.

| Parameter | Required | Description |
|---|---|---|
| `job_title` | Yes | Job title for which to get salary estimation. |
| `location` | Yes | Location in which to get salary estimation. |
| `location_type` | No | Specify the type of the location you are looking to get salary estimation for additional accuracy. Values: `ANY`, `CITY`, `STATE`, `COUNTRY`. Default: `ANY`. |
| `years_of_experience` | No | Get job estimation for a specific experience level range (years). Values: `ALL`, `LESS_THAN_ONE`, `ONE_TO_THREE`, `FOUR_TO_SIX`, `SEVEN_TO_NINE`, `TEN_TO_FOURTEEN`, `ABOVE_FIFTEEN`. Default: `ALL`. |
| `fields` | No | A comma separated list of job salary fields to include in the response (field projection). By default all fields are returned. |

#### Company Job Salary

`GET /company-job-salary`

Get estimated job salaries/pay in a specific company by job title and optionally a location and experience level in years.

| Parameter | Required | Description |
|---|---|---|
| `company` | Yes | The company name for which to get salary information (e.g. Amazon). |
| `job_title` | Yes | Job title for which to get salary estimation. |
| `location` | No | Free-text location/area in which to get salary estimation. |
| `location_type` | No | Specify the type of the location you are looking to get salary estimation for additional accuracy. Values: `ANY`, `CITY`, `STATE`, `COUNTRY`. Default: `ANY`. |
| `years_of_experience` | No | Get job estimation for a specific experience level range (years). Values: `ALL`, `LESS_THAN_ONE`, `ONE_TO_THREE`, `FOUR_TO_SIX`, `SEVEN_TO_NINE`, `TEN_TO_FOURTEEN`, `ABOVE_FIFTEEN`. Default: `ALL`. |

### Example input

```json
{
  "endpoint": "/search-v2",
  "query": "developer jobs in chicago"
}
```

### Example output

One dataset item per result. A Job Search item looks like this (trimmed):

```json
{
  "job_id": "woj2gE2S_6LqvmLAAAAAAA==",
  "job_title": "Senior Developer",
  "employer_name": "United Airlines",
  "employer_logo": "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcS6DMswunk7F25_BeXSf2w8JVHG65s4lc7v5wfG&s=0",
  "employer_website": "https://www.united.com",
  "job_publisher": "United Airlines Jobs",
  "job_employment_type": "Full-time",
  "job_employment_types": [
    "FULLTIME"
  ],
  "job_apply_link": "https://careers.united.com/us/en/job/WHQ00024243/Senior-Developer?utm_campaign=google_jobs_apply&utm_source=google_jobs_apply&utm_medium=organic",
  "job_apply_is_direct": false,
  "apply_options": [
    {
      "publisher": "United Airlines Jobs",
      "apply_link": "https://careers.united.com/us/en/job/WHQ00024243/Senior-Developer?utm_campaign=google_jobs_apply&utm_source=google_jobs_apply&utm_medium=organic",
      "is_direct": false
    },
    {
      "publisher": "Salesforce Careers",
      "apply_link": "https://careers.salesforce.com/it/lavori/jr287763/senior-certification-developer/?utm_campaign=google_jobs_apply&utm_source=google_jobs_apply&utm_medium=organic",
      "is_direct": false
    }
  ],
  "job_description": "Description\n\nFind your future at United! We’re reinventing what our industry looks like, and what an airline can be – from the planes we fly to the people who fly them. When you join us, you’re joining a global team of 100,000+ connected by a shared passion with a wide spectrum of experience and ski...",
  "job_is_remote": false,
  "job_posted_at": "2 days ago",
  "job_posted_at_timestamp": 1743206400,
  "job_posted_at_datetime_utc": "2025-03-29T00:00:00.000Z",
  "job_location": "Chicago, IL",
  "job_city": "Chicago",
  "job_state": "Illinois",
  "job_country": "US",
  "job_latitude": 41.8781136,
  "job_longitude": -87.6297982,
  "job_benefits": [
    "dental_coverage",
    "paid_time_off"
  ],
  "job_google_link": "https://www.google.com/search?q=jobs&gl=us&hl=en&udm=8#vhid=vt%3D20/docid%3Dwoj2gE2S_6LqvmLAAAAAAA%3D%3D&vssid=jobs-detail-viewer",
  "job_salary": null,
  "job_min_salary": null,
  "job_max_salary": null,
  "job_salary_period": null,
  "job_highlights": {
    "Qualifications": [
      "Bachelor's degree",
      "Computer Science, Computer Engineering, Electrical Engineering, Management Information Systems or related field"
    ],
    "Benefits": [
      "Get the care you need with industry-leading health plans and best-in-class programs to support your emotional, physical, and financial wellness",
      "The base pay range for this role is $109,820.00 to $149,600.00"
    ],
    "Responsibilities": [
      "Expand your horizons with travel across the world’s biggest route network",
      "The Senior Software Developer will be responsible for the development of critical applications, while working with a team of developers"
    ]
  },
  "job_onet_soc": "15113200",
  "job_onet_job_zone": "4"
}
```

The run's key-value store `OUTPUT` record holds the request parameters, the request id and any non-list fields of the response (for example a pagination cursor).

### Pricing

Pay per event: you pay per API request, at the same rates as our API plans. Most runs are one request; some parameters (such as fetching several pages at once) count as several, exactly as they do on the API.

| Apify plan | Price per 1,000 requests |
|---|---|
| Free | $5.00 |
| Starter (Bronze) | $2.50 |
| Scale (Silver) | $1.50 |
| Business (Gold) and above | $0.75 |

A request that fails is not charged.

### Using it from code

Run it through the [Apify API](https://docs.apify.com/api/v2) or a client library, with the input above as the JSON body:

```bash
curl -X POST "https://api.apify.com/v2/acts/openweb-ninja~jsearch/run-sync-get-dataset-items?token=<YOUR_APIFY_TOKEN>" \
  -H "Content-Type: application/json" \
  -d '{"endpoint":"/search-v2","query":"developer jobs in chicago"}'
```

Need higher volume or a direct REST API? JSearch - Google for Jobs Search API is also available as an API on [OpenWeb Ninja](https://www.openwebninja.com/api/jsearch) and [RapidAPI](https://rapidapi.com/letscrape-6bRBa3QguO5/api/jsearch).

### Support

For custom plans, high volumes or anything else:

- Email: support@openwebninja.com
- Discord: https://discord.gg/wxJxGsZgha

# Actor input Schema

## `endpoint` (type: `string`):

Which endpoint of the API to call. Each endpoint uses the parameters listed in its section below; parameters of other endpoints are ignored.

## `query` (type: `string`):

Free-form jobs search query.<br>  It is highly recommended to include job title and location as part of the query, see query examples below.<br><br>  <strong>Examples:</strong><br>  <code>web development jobs in chicago</code><br>  <code>marketing manager in new york via linkedin</code><br><br><em>Used by: Job Search. Required for Job Search.</em>

## `cursor` (type: `string`):

Cursor for paginating results.<br>  Pass the value of <code>data.cursor</code> returned by the previous response to fetch the next page.<br>  Leave empty (or omit) to start from the first page.<br><br><em>Used by: Job Search.</em>

## `num_pages` (type: `integer`):

Number of pages to return, starting from page.<br>   <strong>Allowed values:</strong> <code>1-20</code><br><br>   <strong>Note</strong>: Each page (containing up to 10 results) returned by the API consumes one request credit.<br><br><em>Used by: Job Search.</em>

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

Country code of the country from which to return job postings.<br>  Please note that this parameter must be set in order to get jobs in a specific country, for example, to query for software developer jobs in Berlin,  one should add *country=de* to the request - *e.g. query=software+developers+in +berlin\&country=de*.<br>  For the list of supported values see \*https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2<br><br><em>Used by: Job Search, Job Details.</em>

## `language` (type: `string`):

Language code in which to return job postings. Leave empty to use the primary language in the specified country (country parameter).   In case a language not supported by the specified country is used, it is likely that no results will be returned.<br>  For the list of supported values see https://en.wikipedia.org/wiki/List_of_ISO_639_language_codes<br><br><em>Used by: Job Search, Job Details.</em>

## `date_posted` (type: `string`):

Find jobs posted within the time you specify.<br><br><em>Used by: Job Search.</em>

## `work_from_home` (type: `boolean`):

Only return work from home / remote jobs.<br><br><em>Used by: Job Search.</em>

## `employment_types` (type: `array`):

Find jobs of particular employment types, specified as a comma delimited list of the following values:<br><br><em>Used by: Job Search.</em>

## `job_requirements` (type: `array`):

Find jobs with specific requirements, specified as a comma delimited list of the following values:<br><br><em>Used by: Job Search.</em>

## `radius` (type: `integer`):

Return jobs within a certain distance from location as specified as part of the query (in km).<br>  This internally sent as the Google "lrad" parameter and although it might affect the results, it is not strictly followed by Google for Jobs.<br><br><em>Used by: Job Search.</em>

## `exclude_job_publishers` (type: `string`):

Exclude jobs published by specific publishers, specified as a comma (,) separated list of publishers to exclude.<br><br><em>Used by: Job Search.</em>

## `fields` (type: `string`):

A comma separated list of job fields to include in the response (field projection).<br>  By default all fields are returned.<br><br><em>Used by: Job Search, Job Details, Job Salary.</em>

## `job_id` (type: `string`):

Job Id of the job for which to get details.<br>  Batching of up to 20 Job Ids is supported by separating multiple Job Ids by comma (,).<br>  Note that each Job Id in a batch request is counted as a request for quota calculation.<br><br><em>Used by: Job Details. Required for Job Details.</em>

## `job_title` (type: `string`):

Job title for which to get salary estimation.<br><br><em>Used by: Job Salary, Company Job Salary. Required for Job Salary, Company Job Salary.</em>

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

Location in which to get salary estimation.<br><br><em>Used by: Job Salary, Company Job Salary. Required for Job Salary.</em>

## `location_type` (type: `string`):

Specify the type of the location you are looking to get salary estimation for additional accuracy.<br><br><em>Used by: Job Salary, Company Job Salary.</em>

## `years_of_experience` (type: `string`):

Get job estimation for a specific experience level range (years).<br><br><em>Used by: Job Salary, Company Job Salary.</em>

## `company` (type: `string`):

The company name for which to get salary information (e.g. Amazon).<br><br><em>Used by: Company Job Salary. Required for Company Job Salary.</em>

## Actor input object example

```json
{
  "endpoint": "/search-v2",
  "query": "developer jobs in chicago",
  "num_pages": 1,
  "country": "us",
  "date_posted": "all",
  "work_from_home": false,
  "job_id": "20N57zBfi3eT9BdpAAAAAA==",
  "job_title": "nodejs developer",
  "location": "new york",
  "location_type": "ANY",
  "years_of_experience": "ALL",
  "company": "Amazon"
}
```

# Actor output Schema

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

One dataset item per result of the API call.

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

Endpoint, parameters, request id, billed requests and any non-list response fields (such as a pagination cursor).

# 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 = {
    "query": "developer jobs in chicago",
    "num_pages": 1,
    "country": "us"
};

// Run the Actor and wait for it to finish
const run = await client.actor("openweb-ninja/jsearch").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 = {
    "query": "developer jobs in chicago",
    "num_pages": 1,
    "country": "us",
}

# Run the Actor and wait for it to finish
run = client.actor("openweb-ninja/jsearch").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 '{
  "query": "developer jobs in chicago",
  "num_pages": 1,
  "country": "us"
}' |
apify call openweb-ninja/jsearch --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,openweb-ninja/jsearch"
        }
    }
}
```

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/oBUIGlwUFz5e6XFdw/builds/hVLi8Uw8F547wTPeA/openapi.json
