# Indeed Jobs Scraper - Salary, Company, Remote & Description (`topapi/indeed-jobs-scraper`) Actor

Scrape Indeed job postings by keyword and location on 62 Indeed country sites: title, company profile and rating, salary, full description, location, job type, remote flag, skills and dates. Date, job-type, remote and salary filters; monitor mode; lookup by job key. No login.

- **URL**: https://apify.com/topapi/indeed-jobs-scraper.md
- **Developed by:** [Top Api](https://apify.com/topapi) (community)
- **Categories:** Jobs, Business, Lead generation
- **Stats:** 1 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.04 / 1,000 job scrapeds

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

### What does Indeed Jobs Scraper do?

**Indeed Jobs Scraper** searches Indeed job postings by keyword and location on any of the 62 Indeed country sites and turns every hit into a structured row: one row per job with the title, the company profile and rating, the salary, the full description, the location with coordinates, job type, remote flag, skills, benefits and dates. Built for recruiters and staffing teams, job boards and aggregators, and labor-market analysts who need Indeed jobs data without a login, cookies or an API key.

Indeed Job Scraper - Indeed Job Postings API - Indeed Job Search Scraper - Indeed Jobs Data Extractor

<a href="https://console.apify.com/actors/siP1KEYOXCp8lh1ta"><img src="https://api.apify.com/v2/key-value-stores/qNQ9zP0xaj2yxGeMY/records/indeed-jobs-scraper-source.png" alt="Indeed jobs search results page that Indeed Jobs Scraper turns into rows" style="width:70%"></a>

- **Indeed's own job search, not a page crawl:** the same search Indeed runs for your keyword and location, 100 jobs per request, up to 1,000 jobs per search (measured: 1,000 unique jobs over 10 pages, 0 duplicates).
- **Every field a job board needs:** title, company, salary with an annualised minimum and maximum, full description as text and HTML, location down to coordinates, job types, remote flag, apply URL - on a 300-job test run 100% of rows had a title, company, location and coordinates, 42% a salary, 86% a job type, 82% a company rating.
- **One better than the rest:** `salary.annual_min` / `salary.annual_max` normalise hourly, daily, weekly and monthly pay to a yearly figure; `is_remote` and `work_arrangement` come on every row; `benefits`, `schedules` and `skills` are split out of Indeed's attribute list; `is_external` tells you whether the apply link leaves Indeed.
- **Filters:** date window, job type, remote, minimum salary, salary-only, title keywords and company exclusions.
- **Monitor mode:** remembers which jobs each search already delivered and returns only new ones - pair it with a schedule for a feed of fresh postings.
- **62 country sites:** indeed.com, uk.indeed.com, de.indeed.com, ca.indeed.com, in.indeed.com, jp.indeed.com and 56 more, with the local currency and labels.
- **Lookup by job key:** paste Indeed job keys or job URLs to get the full job, including expired postings.
- **No login, cookies or Indeed API key:** the actor reads only what Indeed's public search serves.
- **Export anywhere:** JSON, CSV, Excel, XML, RSS; schedules, webhooks, Make, Zapier, n8n, Google Sheets, Slack.
- **Works with AI agents:** call it through the Apify API or the MCP server; `compact` trims rows for LLM context windows.

### What data can you get from Indeed jobs?

<table>
<tr>
<td>🔑 Job key and URL (`id`, `url`)</td>
<td>📝 Title and normalised title</td>
<td>🏢 Company name, Indeed page, website, industry, revenue, logo</td>
</tr>
<tr>
<td>⭐ Company rating and review count</td>
<td>💲 Salary text, min, max, exact, currency, period</td>
<td>📈 Annualised salary (`salary.annual_min`, `salary.annual_max`)</td>
</tr>
<tr>
<td>📍 Location: city, state, county, postal code, street, country, latitude, longitude</td>
<td>🏠 Remote / hybrid / in-person (`is_remote`, `work_arrangement`)</td>
<td>💼 Job types (`job_types`)</td>
</tr>
<tr>
<td>🎁 Benefits, 🗓️ schedules and shifts</td>
<td>🧠 Skills and requirements (`skills`), full Indeed taxonomy (`attributes`)</td>
<td>🗂️ Occupation categories</td>
</tr>
<tr>
<td>📄 Full description as text and HTML, 300-character snippet</td>
<td>🔗 Apply URL, Indeed Apply flag, external-apply flag</td>
<td>📅 Posted date, date on Indeed, days ago, expired flag</td>
</tr>
<tr>
<td>🏷️ Reference number, language, source feed</td>
<td>🚀 Urgent-hire and high-volume-hiring flags</td>
<td>🔎 Search query, location, country, page and position</td>
</tr>
</table>

On a 300-job test run across three searches (warehouse in Dallas, nurse in Austin, software engineer in London) every row had a title, company, location, coordinates, description and apply URL; 42% published a salary, 86% a job type, 66% benefits, 82% a company rating, 78% a company website, 70% a company revenue band and 66% a postal code.

### How to scrape Indeed jobs with Indeed Jobs Scraper

1. [Create a free Apify account](https://console.apify.com/sign-up) - $5 of monthly credit, no card needed.
2. Open [Indeed Jobs Scraper](https://apify.com/topapi/indeed-jobs-scraper) and click **Try for free**.
3. Type your keywords into **Search queries** (one per line), a **Location** and pick the **Indeed country site**.
4. Set **Max jobs per query**, optionally a date window, job type, remote or salary filter.
5. Click **Start**. Rows stream into the dataset as each page of 100 jobs arrives.
6. Open the **Storage** tab and **Export** as JSON, CSV or Excel - or let a schedule run it for you.

### ⬇️ Input

| Parameter | Type | Description |
|---|---|---|
| **🔍 What to scrape** | | |
| `searchQueries` | List | Keywords, one per line, e.g. `warehouse`, `registered nurse`, `company:Amazon`, `title:("data engineer") -intern`. An Indeed search URL also works and brings its own location and filters. Default: the sample search `warehouse` in Dallas, TX. |
| `location` | String | City, state, postal code or region as typed on Indeed, e.g. `Dallas, TX`, `75201`, `London`, `Remote`. Empty = the whole country site. |
| `country` | Select | Indeed country site: `US`, `UK`, `CA`, `AU`, `IN`, `DE`, `FR`, `JP`, `BR`, `MX` and 52 more. Default `US`. |
| `jobKeys` | List | Direct lookup instead of a search: job keys (`5e5dafc2a80c214d`) or job URLs. Returns the full job, expired postings included. |
| **🎯 Filters** (applied by Indeed) | | |
| `sortBy` | Select | `relevance` (default) or `date` (newest first - pairs with monitor mode). |
| `postedWithinDays` | Select | Any time, `1`, `3`, `7`, `14` or `30` days, by the date the job reached Indeed. |
| `jobType` | Select | Any, `fulltime`, `parttime`, `contract`, `temporary`, `internship`, `permanent`. |
| `remote` | Select | Any, `remote`, `hybrid`, `inperson`. |
| `radius` | Integer | Miles around the location. Default `25`. |
| `minSalary` | Integer | Minimum yearly base salary in the site's currency, e.g. `50000`. Jobs without a salary stay unless `withSalaryOnly` is on. |
| **✂️ Refine results** | | |
| `withSalaryOnly` | Boolean | Keep only jobs that publish a salary or hourly rate. Default `false`. |
| `titleKeywords` | String | Keep only titles containing one of these, e.g. `nurse, rn`. |
| `excludeKeywords` | String | Drop jobs whose title or company contains one of these, e.g. `staffing, recruiting, travel`. |
| **➕ Extra data** | | |
| `includeDescription` | Boolean | Adds `description_text`, `description_html` and `description_snippet` - charged as **job-description** at $0.01 per 1,000 jobs that carry one. Default `true`. |
| **🔁 Monitoring** | | |
| `monitorMode` | Boolean | Return only jobs not delivered by previous runs of the same search. Pair with a daily schedule. |
| `monitorStoreName` | String | Name of the key-value store that keeps the per-search memory. Default `indeed-jobs-monitor`. |
| **📦 Output** | | |
| `maxResultsPerQuery` | Integer | Default `100`; `0` = everything Indeed serves (at most 1,000 per search). |
| `maxItems` | Integer | Hard cap for the whole run. `0` = none. |
| `compact` | Boolean | Core fields only, sized for AI agents and MCP. |
| **⚙️ Advanced** | | |
| `proxyConfiguration` | Object | Default: Apify proxy. Indeed's job-search API answered Apify datacenter and residential proxies alike in testing. |
| `maxConcurrency` | Integer | Parallel searches, 1-8. Default `4`. |

#### Input JSON

```json
{
  "searchQueries": ["registered nurse", "https://www.indeed.com/jobs?q=warehouse&l=Dallas%2C+TX&fromage=7"],
  "location": "Austin, TX",
  "country": "US",
  "sortBy": "date",
  "postedWithinDays": "7",
  "jobType": "fulltime",
  "withSalaryOnly": true,
  "maxResultsPerQuery": 100
}
```

#### Use Indeed's search syntax for exact matches

Plain keywords use Indeed's broad matching and bring related roles. **Do:** `title:("registered nurse")` for the exact phrase in the title, `nurse -travel` to exclude a word, `company:Amazon` for one employer · **Don't:** paste a whole sentence (`looking for a nursing job in Austin`), which Indeed treats as loose keywords and returns unrelated jobs.

#### One run, one country site

`country` picks the Indeed site, its language and its currency. A search for `lager` with `country: "DE"` runs on de.indeed.com and returns EUR salaries and German labels (`Vollzeit`); the same keyword on `US` returns almost nothing. To search several countries, add one Indeed URL per country to `searchQueries` (`https://uk.indeed.com/jobs?q=warehouse&l=London`): the URL's host sets the site for that line.

#### Pick the date window from the date on Indeed

`postedWithinDays` and the `date_on_indeed` field use the moment the posting reached Indeed, which is what Indeed's own "Date posted" filter uses; `date_published` is the employer's date and can be a day earlier. A job is checked against the window again.

#### Monitor mode works best with newest-first sorting

Set `sortBy: "date"`, `monitorMode: true` and a cap at least as large as the daily volume of your search. Each run reads the newest jobs, delivers only the ones it has not delivered before and stops at the first page that is entirely known - a typical daily check costs one API request.

### ⬆️ Output

Every Indeed job becomes one dataset item. Here is the table view of a test run for `warehouse` in Dallas, TX and `registered nurse` in Austin, TX:

<a href="https://console.apify.com/actors/siP1KEYOXCp8lh1ta"><img src="https://api.apify.com/v2/key-value-stores/qNQ9zP0xaj2yxGeMY/records/indeed-jobs-scraper-output.png" alt="Indeed Jobs Scraper output table with title, company, salary, job type and apply URL" style="width:70%"></a>

And one row as JSON (description shortened):

```json
{
  "id": "5891fd4c8516f38a",
  "title": "Registered Nurse - RN",
  "company": { "name": "Baylor Scott & White Institute for Rehabilitation", "rating": 3.6, "review_count": 164, "website": "https://www.bswrehab.com/", "industry": "Health Care", "indeed_url": "https://www.indeed.com/cmp/Baylor-Scott-&-White-Institute-For-Rehabilitation" },
  "location": { "formatted": "Lakeway, TX 78734", "city": "Lakeway", "state": "TX", "postal_code": "78734", "country_code": "US", "latitude": 30.3711, "longitude": -97.8699 },
  "is_remote": false,
  "job_types": ["Full-time"],
  "benefits": ["Disability insurance", "Dental insurance", "Tuition reimbursement", "Paid time off"],
  "salary": { "text": "$32 - $48 an hour", "min": 32, "max": 48, "currency": "USD", "period": "hour", "annual_min": 66560, "annual_max": 99840 },
  "description_snippet": "Overview: Baylor Scott & White Institute for Rehabilitation Location: Lakeway, TX Registered Nurse (RN) Inpatient Full Time Hours: Days 7a - 7p Compen ...",
  "url": "https://www.indeed.com/viewjob?jk=5891fd4c8516f38a",
  "apply_url": "https://jobs-selectmedicalcorp.icims.com/jobs/385837/job",
  "is_external": true,
  "date_on_indeed": "2026-10-03T09:02:21.814Z",
  "posted_days_ago": 0,
  "search_query": "registered nurse",
  "country": "US"
}
```

#### Fields

| Field | Type | What it is | Fill on test run |
|---|---|---|---|
| `id`, `url`, `title` | string | Indeed job key, job page on the country site, title | 100% |
| `normalized_title` | string | Indeed's normalised title | 99% |
| `company.name`, `company.key`, `company.indeed_url` | string | Employer and its Indeed company page | 100% / 96% / 94% |
| `company.website`, `company.industry`, `company.revenue`, `company.description` | string | Company profile from Indeed's employer dossier | 78% / 26% / 70% / 66% |
| `company.logo_url`, `company.header_image_url` | string (URL) | Company images | 77% / 70% |
| `company.rating`, `company.rating_count`, `company.review_count` | number | Indeed company rating (0-5) and counts | 82% |
| `location.*` | object | formatted, city, state, county, postal_code, street_address, country_code, country, latitude, longitude | 100% (postal code 66%, street 51%) |
| `is_remote`, `work_arrangement` | boolean, string | Indeed's remote / hybrid / in-person tag | always / 17% tagged |
| `job_types`, `benefits`, `schedules`, `skills` | string\[] | Indeed's attributes split by taxonomy group | 86% / 66% / 37% / 100% |
| `attributes`, `occupations` | object\[] | Every attribute and occupation as key + label | 100% |
| `salary` | object | text, min, max, exact, currency, period, annual_min, annual_max; `null` when the posting has no salary | 42% |
| `description_text`, `description_html`, `description_snippet` | string | Full description (add-on) and its first 300 characters | 100% with the add-on |
| `apply_url`, `is_indeed_apply`, `is_external` | string, boolean | Where applying leads; Indeed Apply available; link leaves indeed.com | 100% / 57% true / 89% true |
| `source_name`, `source_type` | string | Feed the posting came from (`Indeed` or the employer / ATS) | 100% |
| `is_urgent_hire`, `is_high_volume_hiring`, `work_schedule` | boolean, string | Hiring signals when Indeed shows them | 0% / 19% / 13% |
| `date_published`, `date_on_indeed`, `posted_days_ago` | string (ISO 8601), integer | Employer date, date the job reached Indeed, age | 100% |
| `expired`, `expiration_date`, `ref_num`, `language` | boolean, string | Status and references | 100% / 2% / 100% / 100% |
| `search_query`, `search_location`, `country`, `sort`, `page`, `position`, `scraped_at` | string, integer | Where the row came from | 100% |

### How can I use Indeed jobs data?

- 🎯 **Recruiters and staffing agencies** - find companies hiring now for a role in a metro area, with the company website, rating and revenue band on the same row.
- 📊 **Job boards and aggregators** - publish fresh listings with full descriptions, parsed salaries, coordinates and the external apply link; run it hourly with `sortBy: "date"` and monitor mode.
- 💰 **Compensation analysts** - compare `salary.annual_min` / `salary.annual_max` by title, region and country without converting hourly and yearly pay by hand.
- 🏢 **Sales and partnership teams** - a company posting ten warehouse jobs this week is buying equipment, software and services; filter by `postedWithinDays` and group by `company.name`.
- 🤖 **AI and research teams** - feed `description_text`, `skills` and `benefits` to an LLM; use `compact` to keep the rows small.
- 📈 **Labor-market researchers** - run the same search on a schedule and track postings, salaries and remote share week over week across 62 countries.

### How much does it cost to scrape Indeed jobs?

Indeed Jobs Scraper is pay-per-result: **$0.037 per 1,000 jobs** plus **$0.01 per 1,000 jobs with the full description** (on by default, so $0.047 per 1,000 jobs with descriptions), no start fee.

| Jobs | With description (default) | Without description |
|---:|---:|---:|
| 100 | $0.0047 | $0.0037 |
| 1,000 | $0.047 | $0.037 |
| 10,000 | $0.47 | $0.37 |
| 100,000 | $4.70 | $3.70 |

There is nothing else to pay: Apify platform usage (compute, proxy) is included in these prices. On the test runs a 25-job search took 8 seconds on 256 MB; a 1,000-job search is 10 API requests.

### Integrations, API, scheduling & MCP

- **Schedules:** run Indeed Jobs Scraper hourly, daily or weekly from the **Schedules** tab; combine with `monitorMode` and `sortBy: "date"` to get only new jobs.
- **Webhooks:** fire a URL when a run finishes - push rows to your ATS, CRM, Slack or a sheet.
- **No-code:** Make, Zapier, n8n, Google Sheets, Airtable, Slack via [Apify integrations](https://docs.apify.com/integrations).
- **API:** call it from Node.js or Python with `apify-client` - code on the [API tab](https://apify.com/topapi/indeed-jobs-scraper/api/python) and the [Apify API reference](https://docs.apify.com/api/v2).
- **MCP / AI agents:** connect Claude, Cursor or any MCP client through the [MCP tab](https://apify.com/topapi/indeed-jobs-scraper/api/mcp) and ask for Indeed jobs in plain language; `compact: true` keeps the rows small.

### More TopApi scrapers

<table>
<tr>
<td>📍 <a href="https://apify.com/topapi/google-maps-reviews-scraper">Google Maps Reviews Scraper</a> - reviews of any place with ratings, owner replies and dates</td>
<td>🎵 <a href="https://apify.com/topapi/tiktok-scraper">TikTok Scraper</a> - posts, stats and transcripts by profile, hashtag or keyword</td>
<td>📸 <a href="https://apify.com/topapi/instagram-scraper">Instagram Scraper</a> - posts, reels and profiles with engagement</td>
</tr>
<tr>
<td>🔎 <a href="https://apify.com/topapi/facebook-search-posts-scraper">Facebook Search Posts Scraper</a> - public posts found by keyword search</td>
<td>💼 <a href="https://apify.com/topapi/indeed-jobs-scraper">Indeed Jobs Scraper</a> - this actor: Indeed job postings by keyword, location and country</td>
<td>🧭 <a href="https://apify.com/topapi">All TopApi actors</a></td>
</tr>
</table>

### Limits & empty runs

- **Results per search:** Indeed serves 100 jobs per request and stops at 1,000 per search (measured). Split a broad search by city, radius, date window or job type to go deeper.
- **Speed:** about 100 jobs per second of API time; a 25-job run finished in 8 seconds on 256 MB including container start.
- **Salary:** 42% of US jobs published a salary on the test run; `salary` is `null` for the rest, never a fabricated zero. Indeed's own salary estimates are not part of this data.
- **Remote tag:** `work_arrangement` is filled only when Indeed tags the job (17% on the test run); `is_remote` also reads a "Remote" location.
- **Hiring signals:** `is_urgent_hire`, repost and applicant counts are not exposed by Indeed's public search and are not shipped as fields (except `is_high_volume_hiring`, filled on 19%).
- **Empty dataset:** means no jobs match the search and filters, an unknown job key, or every job was already delivered in monitor mode - the run status says which.
- **Lookups:** a job key Indeed does not return is listed under `notFound` in the run summary.

### FAQ

#### How many Indeed jobs can Indeed Jobs Scraper collect in one run?

Up to 1,000 per search query (Indeed's own ceiling, measured as 10 pages of 100 with 0 duplicates) and as many queries as you list. A query list of 20 city-level searches returns up to 20,000 jobs in one run.

#### Can I run Indeed Jobs Scraper on a schedule to get new jobs automatically?

Yes. Save your input as a task, open **Schedules**, pick the cadence, and turn on `monitorMode` with `sortBy: "date"`. Each run delivers only the jobs it has not delivered before.

#### Can Indeed Jobs Scraper search more than one country?

Yes. `country` sets the Indeed site for the run (62 sites); a search URL from another site in `searchQueries` (for example `https://uk.indeed.com/jobs?q=warehouse&l=London`) runs on that site in the same run.

#### Can I integrate Indeed Jobs Scraper with other apps?

Yes - Make, Zapier, n8n, Google Sheets, Slack and more via [Apify integrations](https://docs.apify.com/integrations), or use [webhooks](https://docs.apify.com/integrations/webhooks) to trigger an action when a run finishes.

#### Can I use Indeed Jobs Scraper with the Apify API?

Yes. The API lets you start runs, fetch datasets and manage schedules. Use `apify-client` for [Node.js](https://apify.com/topapi/indeed-jobs-scraper/api/javascript) or [Python](https://apify.com/topapi/indeed-jobs-scraper/api/python); the API tab has ready-to-paste code.

#### Can I use Indeed Jobs Scraper through an MCP server?

Yes. Open the [MCP tab](https://apify.com/topapi/indeed-jobs-scraper/api/mcp), connect your MCP client (Claude Desktop, Cursor, LibreChat...), and ask for Indeed jobs in plain language. Set `compact: true` so each job is a short row.

#### Do I need an Indeed account, cookies or an API key for Indeed Jobs Scraper?

No. The actor reads only what Indeed's public job search serves to any visitor; you pass keywords, a location and a country and nothing else.

#### Why did my Indeed Jobs Scraper run return no results?

Most often the filters are too tight (a 24-hour window plus `withSalaryOnly` on a small market), the search uses a sentence instead of keywords, or the location is spelt in a way Indeed does not recognise. In monitor mode an empty run means nothing new was posted. The run status names the cause.

#### How is Indeed Jobs Scraper different from other Indeed scrapers?

It reads Indeed's own job-search API instead of rendering pages, so it needs no browser and 256 MB of memory; it annualises every salary, splits job types, benefits, schedules and skills out of Indeed's attributes, flags remote and external-apply jobs, applies date, type, remote, salary and keyword filters, and remembers what it delivered for scheduled monitoring - at $0.047 per 1,000 jobs with descriptions.

#### Is it legal to scrape Indeed jobs data?

Indeed Jobs Scraper extracts only publicly available job postings; it does not log in or collect private data. Job postings are business data, but descriptions can contain personal data such as a recruiter's name or phone number, which is regulated (for example by GDPR). Make sure you have a legitimate purpose before you use it.

#### Your feedback

We keep improving Indeed Jobs Scraper. Found a bug or missing a field? Open an issue on the [Issues tab](https://apify.com/topapi/indeed-jobs-scraper/issues/open) - we answer within one working day.

# Actor input Schema

## `searchQueries` (type: `array`):

Job titles, skills or company names, one per line, e.g. "warehouse", "registered nurse", "company:Amazon". Indeed search syntax works: title:("data engineer"), nurse -travel. An Indeed search URL (https://www.indeed.com/jobs?q=nurse\&l=Austin) also works and brings its own location and filters.

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

City, state, postal code or region as you would type it on Indeed, e.g. "Dallas, TX", "75201", "London", "Remote". Leave empty to search the whole country site.

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

Which Indeed site to search; it sets the job market, language and currency. US = indeed.com, UK = uk.indeed.com, DE = de.indeed.com and so on (62 sites).

## `jobKeys` (type: `array`):

Direct lookup instead of a search: Indeed job keys (the 16-character jk value, e.g. 5e5dafc2a80c214d) or job URLs (indeed.com/viewjob?jk=..., indeed.com/job/...-<key>), one per line. Returns the full job, including expired postings (expired = true). Search queries and filters are ignored when keys are given.

## `sortBy` (type: `string`):

"Newest first" pairs with monitor mode and a schedule: the run stops as soon as it reaches jobs it delivered before.

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

Only jobs that reached Indeed within this window (Indeed's date_on_indeed). Re-checked on every row.

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

Filter by employment type. Combines with the date, remote and salary filters.

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

Keep only jobs Indeed tags as remote, hybrid or in person. Every row also carries is_remote and work_arrangement.

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

Search distance around the location in miles, e.g. 5 for one postal code, 25 (Indeed's default), 100 for a metro area. Ignored when the location is empty or a whole state/region.

## `minSalary` (type: `integer`):

Keep jobs whose base salary is at least this amount per year in the country's currency, e.g. 50000. Indeed applies it to jobs that publish a salary; jobs without a salary stay unless 'Only jobs with a salary' is on. 0 = no minimum.

## `withSalaryOnly` (type: `boolean`):

Keep only jobs that publish a salary or hourly rate (salary.min, salary.max or salary.exact present). Measured on 300 jobs: 42% carried a salary.

## `titleKeywords` (type: `string`):

Keep only jobs whose title contains one of these words or phrases, case-insensitive, e.g. "nurse" or "senior, lead, principal" (comma = any of them). Leave empty for no filter.

## `excludeKeywords` (type: `string`):

Drop jobs whose title or company name contains one of these, case-insensitive, e.g. "staffing, recruiting, travel" to remove agency postings. Leave empty for no filter.

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

Adds description_text, description_html and description_snippet to every row (about 100 times the data of a bare row). Charged as the job-description event only for rows that carry a description.

## `monitorMode` (type: `boolean`):

Remembers, per search (query + location + country + filters), which job keys were already delivered (in the named key-value store below) and returns only new ones. Best with 'Newest first': the run stops at the first page that is entirely known, so a scheduled check costs one or two API calls. A run that finds nothing new delivers nothing.

## `monitorStoreName` (type: `string`):

Name of the key-value store that keeps the per-search memory for monitor mode. Give each separate feed (a client, a Slack channel) its own name so they do not hide jobs from each other. Letters, digits and hyphens.

## `maxResultsPerQuery` (type: `integer`):

Cap per search query after filters (your main cost control; you pay per delivered job). Indeed serves 100 jobs per API page and at most 1,000 per search (measured). 0 = everything Indeed serves, up to 1,000 per query.

## `maxItems` (type: `integer`):

Hard cap for the whole run across all queries and lookups. 0 = no total cap (each query is still capped above).

## `compact` (type: `boolean`):

Core fields only (id, title, company name and rating, location, remote flag, job types, salary with annual min/max, posted date, URLs, description snippet, search query): about a tenth of the bytes, sized for AI agents and MCP clients.

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

Indeed's job-search API answered Apify datacenter proxies, residential proxies and direct egress alike in testing. The actor rotates to a fresh proxy session when a request is refused.

## `maxConcurrency` (type: `integer`):

How many search queries (or lookup batches) run at once. 4 is a safe default; raise to 8 for long query lists.

## Actor input object example

```json
{
  "searchQueries": [
    "warehouse"
  ],
  "location": "Dallas, TX",
  "country": "US",
  "sortBy": "relevance",
  "postedWithinDays": "",
  "jobType": "",
  "remote": "",
  "radius": 25,
  "minSalary": 0,
  "withSalaryOnly": false,
  "titleKeywords": "",
  "excludeKeywords": "",
  "includeDescription": true,
  "monitorMode": false,
  "monitorStoreName": "indeed-jobs-monitor",
  "maxResultsPerQuery": 25,
  "maxItems": 0,
  "compact": false,
  "proxyConfiguration": {
    "useApifyProxy": true
  },
  "maxConcurrency": 4
}
```

# Actor output Schema

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

The dataset of Indeed job postings (one item per job).

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

Per-query counts (read, filtered, already delivered, delivered), pages, API calls, sessions and bytes transferred; lookup keys not found.

# 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 = {
    "searchQueries": [
        "warehouse"
    ],
    "location": "Dallas, TX",
    "includeDescription": true,
    "maxResultsPerQuery": 25
};

// Run the Actor and wait for it to finish
const run = await client.actor("topapi/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 = {
    "searchQueries": ["warehouse"],
    "location": "Dallas, TX",
    "includeDescription": True,
    "maxResultsPerQuery": 25,
}

# Run the Actor and wait for it to finish
run = client.actor("topapi/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 '{
  "searchQueries": [
    "warehouse"
  ],
  "location": "Dallas, TX",
  "includeDescription": true,
  "maxResultsPerQuery": 25
}' |
apify call topapi/indeed-jobs-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,topapi/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/siP1KEYOXCp8lh1ta/builds/6rMrS0m9bwHkNOS65/openapi.json
