# Indeed Jobs Scraper | Only New Jobs, Yearly Salary (`akatra/indeed-jobs-scraper`) Actor

Scrape Indeed job listings in 30 countries: title, company, location, remote type, salary normalized to yearly, posting date and optional full description. Turn on 'Only new jobs' to get just today's new postings on a schedule. No login, no personal data.

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

## Pricing

from $1.50 / 1,000 job listings

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

## Indeed Jobs Scraper: only new jobs, yearly salary, 30 countries

Get clean, ready-to-use job data from Indeed in 30 countries, **up to 1,000 jobs per search** in about a minute. Search by keyword and location, and get title, company, industry and size, location, remote type, salary (also converted to a yearly figure so you can compare hourly and monthly pay), posting date and, if you want, the full job description.

Run it on a daily schedule with **Only new jobs** turned on and you get just the postings that appeared since your last run. No duplicates, no manual diffing.

### What you can use it for

- **Job market and salary research.** Compare pay for a role across cities or countries with salaries normalized to yearly.
- **Daily job alerts and job boards.** Feed only new postings into your own board, Slack, Google Sheets or CRM.
- **Recruiting and sales intelligence.** See which companies are hiring for which roles right now.
- **Training data and analytics.** Build datasets of job titles, skills and descriptions.

### How to use it

1. Add one or more **search queries**, for example `data analyst` or `nurse`.
2. Set a **location** (city, region, postcode or `Remote`) and pick the **country**.
3. Optionally filter by **posted within**, **job type**, and choose **newest first**.
4. Turn on **Include full description** if you need the whole job text.
5. Turn on **Only new jobs** and add a schedule (for example daily) to get just fresh postings every day.
6. Run it and download the results as JSON, CSV, Excel, or connect them through the API.

### Input example

```json
{
  "queries": ["data analyst", "business analyst"],
  "location": "London",
  "country": "uk",
  "maxItemsPerQuery": 200,
  "postedWithinDays": "3",
  "sortByDate": true,
  "onlyNew": true,
  "includeDescription": false
}
```

### Output example

```json
{
  "jobKey": "4a6df13252c12605",
  "title": "Registered Nurse - ICU",
  "company": "Example Health",
  "companyIndustry": "Hospitals & Health Care",
  "companySize": "1,001 to 5,000",
  "companyWebsite": "https://www.example-health.org",
  "location": "Austin, TX 78701",
  "city": "Austin",
  "region": "TX",
  "postalCode": "78701",
  "country": "US",
  "remote": null,
  "jobTypes": ["Full-time"],
  "attributes": ["Full-time", "Night shift", "Health insurance"],
  "salaryText": "$31 - $32 an hour",
  "salaryMin": 31,
  "salaryMax": 32,
  "salaryPeriod": "HOURLY",
  "salaryCurrency": "USD",
  "salaryEstimated": false,
  "salaryYearlyMin": 64480,
  "salaryYearlyMax": 66560,
  "workSchedule": "8 hour shift",
  "postedAt": "2026-09-30T05:00:00+00:00",
  "firstSeenOnIndeedAt": "2026-09-30T05:00:00+00:00",
  "description": "We are looking for a Registered Nurse...",
  "url": "https://www.indeed.com/viewjob?jk=4a6df13252c12605",
  "searchQuery": "data analyst",
  "searchLocation": "Remote",
  "source": "www.indeed.com",
  "scrapedAt": "2026-10-01T18:00:00+00:00"
}
```

### Fields

| Field | Meaning |
|---|---|
| `title`, `company`, `location`, `city`, `region`, `postalCode`, `country` | Basic job information |
| `companyIndustry`, `companySize`, `companyWebsite` | Company details when Indeed has them |
| `remote` | `REMOTE` or `HYBRID` when the job says so |
| `jobTypes`, `attributes` | Employment type, shifts, benefits and other tags |
| `salaryMin`, `salaryMax`, `salaryPeriod`, `salaryCurrency` | Salary as posted |
| `salaryYearlyMin`, `salaryYearlyMax` | Salary converted to a yearly amount (hourly × 2080, daily × 260, weekly × 52, monthly × 12) |
| `salaryEstimated` | `true` when Indeed shows its own estimate instead of a posted salary |
| `postedAt`, `firstSeenOnIndeedAt` | Posting date and the date Indeed first listed it (ISO). The **Posted within** filter uses the Indeed listing date. |
| `description` | Full job text when enabled |
| `url` | Link to the job on Indeed |

### Pricing

You pay per job result, nothing for empty runs beyond a tiny start fee. See the price on the Pricing tab. Full descriptions are included at no extra charge.

### Good to know

- You get up to 1,000 jobs per search query. For more, split a broad search into several narrower queries or locations.
- Typical speed: 1,000 jobs in about a minute. If Indeed's main search is unavailable, the scraper automatically falls back to the regular web search, which returns fewer jobs per query. IPs rotate automatically and residential IPs are used only when a request is blocked.
- **Only new jobs** remembers jobs per search (same query, location, country, job type and date filter). Changing any of these starts a fresh memory.
- **Privacy:** the scraper collects public job listing data only. It does not collect recruiter names or contact fields, and any email address or phone number that an employer wrote inside a job description is masked as `[email removed]` / `[phone removed]`.

### Disclaimer

This scraper is an independent tool and is not affiliated with, endorsed by, or sponsored by Indeed. "Indeed" and the Indeed logo are trademarks of their owner and are used here only to show which website the tool works with. Use the data in line with the laws that apply to you and the source site's terms.

### Support

Found a bug or need a field that is missing? Open an issue on the Issues tab and we usually reply within a day.

# Actor input Schema

## `queries` (type: `array`):

Job titles or keywords to search, one per line. Each query runs as a separate Indeed search.

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

City, region, postcode or 'Remote'. Leave empty to search the whole country.

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

Which Indeed site to search.

## `maxItemsPerQuery` (type: `integer`):

Stop after this many jobs for each query. Indeed shows up to about 1,000 results per search.

## `postedWithinDays` (type: `string`):

Only jobs posted in the last N days.

## `jobType` (type: `string`):

Only jobs of this employment type.

## `sortByDate` (type: `boolean`):

Sort by posting date instead of relevance.

## `onlyNew` (type: `boolean`):

Remember jobs from earlier runs with the same search and return only jobs you have not seen yet. Ideal for a daily schedule.

## `includeSponsored` (type: `boolean`):

Only affects the backup web search, where Indeed mixes in paid job ads that rotate on every request. Excluded by default.

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

Add the full job description text to each result.

## `proxyConfiguration` (type: `object`):

Apify Proxy is recommended. The scraper rotates IPs automatically and switches to residential IPs only when it gets blocked.

## Actor input object example

```json
{
  "queries": [
    "data analyst"
  ],
  "location": "Remote",
  "country": "us",
  "maxItemsPerQuery": 100,
  "postedWithinDays": "",
  "jobType": "",
  "sortByDate": true,
  "onlyNew": false,
  "includeSponsored": false,
  "includeDescription": false,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

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

All scraped job listings, shown in the overview table.

## `jobsFull` (type: `string`):

All scraped job listings with every field.

# 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 = {
    "queries": [
        "data analyst"
    ],
    "location": "Remote",
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("akatra/indeed-jobs-scraper").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 = {
    "queries": ["data analyst"],
    "location": "Remote",
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("akatra/indeed-jobs-scraper").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 '{
  "queries": [
    "data analyst"
  ],
  "location": "Remote",
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call akatra/indeed-jobs-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,akatra/indeed-jobs-scraper"
        }
    }
}
```

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/m2fHGnPMY12jHaxa4/builds/Ozf8lTNUB5hGhNkcp/openapi.json
