# Indeed Jobs Scraper — Bypass 25 Limit, 60+ Countries (`scrapepilot/indeed-jobs-scraper-bypass-25-limit-60-countries`) Actor

Scrape 100% real Indeed job postings from 60+ countries. Bypass the 25-job limit with multi-city discovery. Get salaries, company profiles, full descriptions, ATS apply URLs, and resume match scores. No login. Residential proxy. $1.40 per 1,000 jobs scraped

- **URL**: https://apify.com/scrapepilot/indeed-jobs-scraper-bypass-25-limit-60-countries.md
- **Developed by:** [Scrape Pilot](https://apify.com/scrapepilot) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.40 / 1,000 job listing scrapeds

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.

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 — Search by Keyword or URL \[Bypass the 25-Job Limit]

***

**Extract 100% genuine job postings from Indeed across 60+ countries — job titles, salaries, company ratings, full descriptions, GPS, company profiles, and ATS apply URLs — using keyword search, direct URLs, or regional auto-expansion. Bypasses Indeed's ~25-jobs-per-page limit with deep multi-city discovery.**
No login required. Residential proxy ready. Pay per successful result — just $1.40 per 1,000 jobs scraped.

***

### 💡 What is the Indeed Jobs Scraper?

This actor extracts **full job postings** from Indeed by loading public search result pages in a stealth Playwright browser, reading the embedded `mosaic-provider-jobcards` JSON model, and then batch-hydrating **complete HTML job descriptions** via Indeed's internal `/rpc/jobdescs` endpoint. It uses a **multi-layer enrichment pipeline** so each output record is as complete as possible:

1. **Search-page JSON extraction** — pulls the `mosaicProviderJobCardsModel.results` object straight from `window.mosaic.providerData` (title, company, salary, rating, location, taxonomy, external apply URL).
2. **RPC description hydration** — batches job keys and calls Indeed's internal `/rpc/jobdescs?jks=...` endpoint for the full rich HTML job description (not just the snippet).
3. **Company profile enrichment** — matches well-known employers against a built-in company database (CEO, revenue, industry, website, employee count, founded year), with sensible generic fallbacks for unknown companies.
4. **Resume keyword scoring** — compares your resume/CV skills against each job's title + description and returns a 0–100 match score plus matched/missing keyword lists.
5. **Requirements & benefits extraction** — automatically parses bullet-point requirements and benefits out of the job description using section-header heuristics with regex fallbacks.

On top of core job data, the actor supports **regional auto-expansion**: give a US state (e.g., "Texas") or country and it will run the same query across 5–8 top cities in that region, producing **2–5× more unique jobs** than a single national search — this is the main mechanism that **bypasses Indeed's ~25-jobs-per-page limit**.

No Indeed account, no login, no cookies required. **You are charged only for successful job records.**

***

### 🚀 Key Features

| Feature | Description |
|---------|-------------|
| **Dual search modes** | Keyword + Country + Location **OR** start URLs — perfect for ad-hoc searches and repeatable saved searches. |
| **Bypass the 25-job limit** | Deep multi-city discovery + seniority expansions + pagination produce 2–5× more unique jobs than a single national query. |
| **Rich structured data** | Salary (min/max/type/currency), job type, remote flag, city/state/postal, date published, company rating, review count. |
| **Full job descriptions** | Batch hydration via Indeed's internal `/rpc/jobdescs` RPC — plain text **and** original HTML. |
| **External / ATS apply URL** | Captures the `thirdPartyApplyUrl` so you can hit the real application portal directly. |
| **Company profile enrichment** | CEO name, revenue, industry, website, employee count, and founded year for known employers. |
| **Resume match score** | 0–100 fit score per job with matched & missing keyword lists. |
| **Requirements & benefits extraction** | Auto-parses bullet points under "Requirements", "Qualifications", "Benefits", "Perks", etc. |
| **Regional auto-expansion** | Give a US state, UK region, or Canadian province and it auto-expands to top cities. |
| **Seniority deep search** | Optional expansion to Senior / Lead / Junior variants of your base keyword. |
| **60+ country domains** | US, UK, Canada, Australia, Germany, France, India, Netherlands, Spain, Italy, Brazil, Mexico, Singapore, Japan, Ireland, and many more. |
| **Advanced Indeed filters** | Radius, date posted, remote/hybrid, job type, minimum salary, sort by relevance or date. |
| **Powerful post-filters** | Strict keyword match, only jobs with salary, only external jobs, one job per company. |
| **Residential proxy ready** | Uses Apify's `RESIDENTIAL` proxy group by default with stealth Playwright to avoid IP blocks. |
| **Pay per success** | Charged only for job records that pass all your filters. |
| **Spending limit protection** | Automatically stops the run when your Apify pay-per-event spending limit is reached. |
| **Clean, structured JSON** | Ready for CRM, job boards, dashboards, spreadsheets, and data pipelines. |

***

### 📥 Input Parameters

| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| `position` | string | No | `""` | Primary job title / keyword (e.g., `"Senior Full-Stack Developer"`). |
| `keywords` | array | No | `[]` | Additional keywords run as separate searches. |
| `country` | string | No | `"United States"` | Target Indeed country domain (60+ supported). |
| `location` | string | No | `""` | City, state, region, or `"Remote"`. Leave blank for a national search. |
| `radius` | integer | No | `25` | Search radius in miles. |
| `datePosted` | string | No | `"any"` | `any`, `1`, `3`, `7`, `14`, `30` (days). |
| `postedBy` | string | No | `"all"` | `all`, `employer`, `recruiter`. |
| `jobType` | array | No | `[]` | `full-time`, `part-time`, `contract`, `internship`, `temporary`. |
| `remote` | string | No | `"any"` | `any`, `remote`, `hybrid`. |
| `experienceLevel` | string | No | `"all"` | `all`, `entry`, `mid`, `senior`. |
| `minSalary` | integer | No | `null` | Minimum annualized salary floor. Hourly salaries are multiplied by 2080 before comparison. |
| `sort` | string | No | `"relevance"` | `relevance` or `date`. |
| `startUrls` | array | No | `[]` | Indeed search URLs to scrape directly (bypasses keyword building). |
| `deepSearch` | boolean | No | `false` | Adds Senior / Lead / Junior variants of your primary keyword. |
| `expandToCities` | boolean | No | `true` | If `location` matches a known region, auto-expands to top cities in that region. |
| `strictKeywordMatch` | boolean | No | `false` | Rejects jobs whose title + description don't contain **all** query terms. |
| `includeJobsWithNoSalary` | boolean | No | `true` | Set `false` to keep only jobs with a salary. |
| `oneJobPerCompany` | boolean | No | `false` | Keep only the first job per company. |
| `resolveExternalApplyUrl` | boolean | No | `false` | Charge an extra PPE event when an external apply URL is present. |
| `includeCompanyDetails` | boolean | No | `true` | Enrich with CEO, revenue, industry, website, employee count, founded year. |
| `resumeKeywords` | array | No | `[]` | Resume skills used to compute the `resumeMatchScore`. |
| `onlyExternalJobs` | boolean | No | `false` | Keep only jobs with an external apply URL. |
| `flattenOutput` | boolean | No | `true` | Flatten output JSON (single-level). |
| `maxJobs` | integer | No | `50` | Hard cap on the number of jobs pushed to the dataset. |
| `proxy` | object | No | `{"useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"]}` | Apify Proxy configuration. |

#### Example Input (Keyword + Regional auto-expansion)

```json
{
  "position": "Senior Full-Stack Developer",
  "keywords": ["React", "Python", "AWS"],
  "country": "United States",
  "location": "Texas",
  "radius": 25,
  "datePosted": "7",
  "jobType": ["full-time", "contract"],
  "remote": "remote",
  "deepSearch": true,
  "expandToCities": true,
  "includeCompanyDetails": true,
  "resumeKeywords": ["React", "Python", "AWS Amplify", "FastAPI", "TypeScript"],
  "maxJobs": 200
}
```

#### Example Input (Direct Indeed URLs)

```json
{
  "startUrls": [
    { "url": "https://www.indeed.com/jobs?q=python+developer&l=Remote" },
    { "url": "https://uk.indeed.com/jobs?q=data+engineer&l=London" }
  ],
  "maxJobs": 100,
  "includeCompanyDetails": true
}
```

#### Example Input (Minimum salary + external jobs only)

```json
{
  "position": "Backend Engineer",
  "country": "United States",
  "location": "Remote",
  "minSalary": 120000,
  "onlyExternalJobs": true,
  "includeJobsWithNoSalary": false,
  "maxJobs": 50
}
```

***

### 📤 Output Fields

Each **successful** job is pushed to the dataset as an object with the following fields:

| Field | Type | Description |
|-------|------|-------------|
| `jobKey` | string | Indeed's unique job ID (used to build canonical URLs). |
| `positionName` | string | Original job title as displayed by Indeed. |
| `normTitle` | string | Normalized title (Indeed's standardized title). |
| `company` | string | Company name (falls back to `"Confidential"`). |
| `salary` | string | Human-readable salary text (e.g., `"$135,000 - $165,000 a year"`). |
| `salaryMin` | number or null | Minimum salary parsed from Indeed. |
| `salaryMax` | number or null | Maximum salary (`-1` for "From $X" style). |
| `salaryType` | string | `yearly` or `hourly`. |
| `currency` | string | Currency code (e.g., `USD`, `GBP`, `EUR`). |
| `jobType` | string | `Full-time`, `Part-time`, `Contract`, `Internship`, `Temporary`. |
| `remote` | string | `Remote`, `Hybrid`, or `On-site`. |
| `location` | string | Formatted location string. |
| `city` | string | City. |
| `state` | string | State / province. |
| `countryCode` | string | ISO country code (e.g., `US`). |
| `postalCode` | string | Postal / ZIP code. |
| `latitude` | number or null | GPS latitude (when available). |
| `longitude` | number or null | GPS longitude (when available). |
| `datePublished` | string | ISO 8601 UTC publish timestamp. |
| `dateOnIndeed` | string | Relative date label (e.g., `"Just posted"`, `"2 days ago"`). |
| `jobDescription` | string | Full job description as clean plain text. |
| `jobDescriptionHtml` | string | Full job description as raw HTML. |
| `requirements` | array of strings | Bullet-point requirements extracted from the description. |
| `benefits` | array of strings | Bullet-point benefits extracted from the description. |
| `companyHeaderRating` | number or null | Indeed company rating (0–5). |
| `reviewsCount` | number or null | Number of company reviews on Indeed. |
| `companyOverviewLink` | string | Indeed company overview URL. |
| `companyDetailsCeoName` | string | CEO name (if matched in the enrichment DB). |
| `companyDetailsRevenue` | string | Revenue band (e.g., `"$10B+"`). |
| `companyDetailsIndustry` | string | Industry classification. |
| `companyDetailsWebsite` | string | Company careers / corporate website. |
| `companyDetailsEmployeesCount` | string | Employee count band (e.g., `"100,000+"`). |
| `companyDetailsFoundedYear` | number or null | Founding year. |
| `externalApplyUrl` | string | External / ATS apply URL (Indeed's `thirdPartyApplyUrl`). |
| `url` | string | Canonical Indeed job URL (`/viewjob?jk=...`). |
| `jobUrl` | string | Same as `url` (alias for convenience). |
| `resumeMatchScore` | number | Resume match score (0–100), only when `resumeKeywords` is set. |
| `resumeMatchedKeywords` | array of strings | Resume keywords found in the job. |
| `resumeMissingKeywords` | array of strings | Resume keywords missing from the job. |

Jobs that fail to scrape (not found, blocked, empty, or filtered out) are **not charged** and are logged as warnings rather than pushed to the dataset.

#### Example Output

```json
[
  {
    "jobKey": "a0a667a4adaa51d5",
    "positionName": "Senior Full-Stack Developer (AWS Amplify Gen2 / React / Python)",
    "normTitle": "Full Stack Developer",
    "company": "National Testing Network",
    "salary": "$135,000 - $165,000 a year",
    "salaryMin": 135000,
    "salaryMax": 165000,
    "salaryType": "yearly",
    "currency": "USD",
    "jobType": "Full-time",
    "remote": "Remote",
    "location": "Remote",
    "city": "Remote",
    "state": "",
    "countryCode": "US",
    "postalCode": "",
    "datePublished": "2026-09-13T16:19:55Z",
    "dateOnIndeed": "Just posted",
    "jobDescription": "...full text...",
    "jobDescriptionHtml": "<div>...full HTML...</div>",
    "requirements": ["5+ years of React experience", "Bachelor's degree in CS or equivalent"],
    "benefits": ["Health insurance", "401(k) matching", "Paid time off"],
    "companyHeaderRating": 0,
    "reviewsCount": 0,
    "companyOverviewLink": "https://www.indeed.com/cmp/National-Testing-Network",
    "companyDetailsCeoName": "",
    "companyDetailsRevenue": "$100M to $500M",
    "companyDetailsIndustry": "Corporate Services & Operations",
    "companyDetailsWebsite": "",
    "companyDetailsEmployeesCount": "1,000 to 5,000 employees",
    "companyDetailsFoundedYear": null,
    "externalApplyUrl": "http://www.indeed.com/applystart?jk=a0a667a4adaa51d5&...",
    "url": "https://www.indeed.com/viewjob?jk=a0a667a4adaa51d5",
    "jobUrl": "https://www.indeed.com/viewjob?jk=a0a667a4adaa51d5",
    "resumeMatchScore": 78,
    "resumeMatchedKeywords": ["React", "Python", "AWS"],
    "resumeMissingKeywords": ["FastAPI"]
  }
]
```

***

### 💰 Pricing

| Metric | Price |
|--------|-------|
| **Per successful job scraped** (`job-scraped`) | **$0.0014** |
| **Per 1,000 successful jobs scraped** | **$1.40** |
| **Per external apply URL resolved** (`external-apply-resolved`) | **$0.001** |
| **Per 1,000 external apply URLs resolved** | **$1.00** |
| **Per Actor start** (`apify-actor-start`) | **$0.03** |

- **Pay-per-event**: you are charged **one `job-scraped` event ($1.40 / 1,000)** per successfully scraped job (a job that passes all your filters and is pushed to the dataset).
- **Optional `external-apply-resolved` event ($1.00 / 1,000)** — triggered only if `resolveExternalApplyUrl = true` **and** the job has an external apply URL.
- **`apify-actor-start` event ($0.03)** — flat charge per run.
- Failed, blocked, empty, or filtered-out jobs are **free** — no charge.
- Example: 1,000 successful jobs = **$1.40**. 10,000 successful jobs = **$14.00**.
- **Spending limit protection**: the run automatically and gracefully stops as soon as your configured Apify spending limit for the `job-scraped` event is reached — no further jobs are processed or charged.

***

### 🛠 How to Use on Apify

1. **Create a task** with this actor.
2. Choose a **mode**:
   - **Keyword mode** — fill in `position`, `country`, and optionally `location`. Add `keywords` for extra searches.
   - **URL mode** — paste Indeed search URLs into `startUrls`.
3. **Optional tuning**:
   - Set `deepSearch = true` to add Senior / Lead / Junior variants.
   - Set `expandToCities = true` and give a state/region (`"Texas"`, `"California"`, `"United Kingdom"`, `"Canada"`) for auto multi-city expansion — this is the main way to **bypass the 25-job limit**.
   - Set `resumeKeywords` to enable the `resumeMatchScore`.
   - Set `onlyExternalJobs = true` to keep only jobs with a third-party apply URL.
4. **Proxies are configured automatically** — the actor requests Apify's `RESIDENTIAL` proxy group and uses stealth Playwright to avoid IP blocks.
5. **Run** — the actor scrapes each search page, batch-hydrates job descriptions, enriches company data, and pushes results to the Dataset.
6. **Export** — download as JSON, CSV, or Excel from the **Dataset** tab.

#### Running via API

```bash
curl -X POST "https://api.apify.com/v2/acts/your-username~indeed-jobs-scraper/runs" \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer YOUR_API_TOKEN" \
  -d '{
    "position": "Senior Full-Stack Developer",
    "country": "United States",
    "location": "Texas",
    "expandToCities": true,
    "deepSearch": true,
    "maxJobs": 200
  }'
```

***

### 🎯 Use Cases

| Industry / Use Case | How It Helps |
|---------------------|---------------|
| **Recruitment / Staffing** | Build pipelines of open roles by keyword, city, and seniority — matched automatically to candidate resumes. |
| **Job Boards** | Aggregate fresh Indeed listings across multiple regions into your own job board, refreshed daily. |
| **Salary Benchmarking** | Track salary ranges for a given role across cities and companies over time. |
| **Market Research** | Analyze hiring trends per industry, region, or company. |
| **Competitive Intelligence** | Monitor which companies are hiring for which roles and how often. |
| **Lead Generation** | Extract company names, ratings, and external apply URLs to build employer outreach lists. |
| **Sales Prospecting** | Trigger outreach when target companies post new roles in your niche. |
| **Academic Research** | Study hiring patterns, remote-work adoption, and salary distributions across countries. |
| **Career Coaching** | Feed `resumeKeywords` and get a ranked list of best-fit jobs with match scores. |
| **ATS / Apply-flow Automation** | Get the true external apply URL for each job to automate applications. |

***

### ❓ Frequently Asked Questions

**1. Do I need an Indeed account?**
No. The actor reads Indeed's public search pages and public job description RPC. No login, no cookies.

**2. How does it bypass Indeed's ~25-job limit?**
Two ways: (a) **regional auto-expansion** — a state/region search becomes 5–8 separate city searches, multiplying unique jobs; (b) **deep search** — seniority variants of your keyword each return their own result set.

**3. Why do I need residential proxies?**
Indeed blocks most datacenter IPs after moderate usage. The actor requests Apify's residential proxy group by default to reduce blocking.

**4. Can I scrape jobs across multiple countries in one run?**
Yes — pass multiple `startUrls` (e.g., `www.indeed.com` and `uk.indeed.com`) or run separate tasks per country. The `country` field controls the domain built for keyword mode.

**5. How are salaries parsed?**
The actor reads Indeed's `extractedSalary` and `salarySnippet` objects, producing `salaryMin`, `salaryMax`, `salaryType`, and `currency`. Hourly salaries are annualized (× 2080) only for the `minSalary` filter — the output preserves the original type.

**6. What is `resumeMatchScore`?**
A 0–100 score computed by comparing your `resumeKeywords` against the job's title + full description, plus matched/missing keyword lists.

**7. Am I charged for jobs that fail or are filtered out?**
No. You're only charged one `job-scraped` event per job that passes filters and is pushed to the dataset.

**8. What triggers the `external-apply-resolved` charge?**
Only when `resolveExternalApplyUrl = true` **and** the job has an external apply URL — a separate $1.00 / 1,000 PPE event.

**9. What happens when my spending limit is reached?**
The actor detects the pay-per-event spending limit and stops processing further jobs, preventing overspending.

**10. Can I export to CSV or Excel?**
Yes — every Apify dataset can be downloaded as JSON, CSV, Excel, or XML from the **Dataset** tab.

***

### 📝 Technical Notes

- **Targets**: `https://{domain}/jobs?q=...&l=...` (search) and `https://{domain}/rpc/jobdescs?jks=...` (descriptions).
- **Parsing strategies**: (1) `window.mosaic.providerData["mosaic-provider-jobcards"].metaData.mosaicProviderJobCardsModel.results` for search results, (2) `/rpc/jobdescs` for full descriptions, (3) BeautifulSoup for HTML → plain-text cleaning, (4) regex + section-header heuristics for requirements/benefits.
- **Anti-bot**: `playwright-stealth`, `--disable-blink-features=AutomationControlled`, Apify `RESIDENTIAL` proxy group, Chrome 124 user agent.
- **City expansion**: `REGION_CITY_EXPANSION` maps US states, UK regions, and Canadian provinces to their top cities (5–8 each).
- **Seniority expansion**: `SENIORITY_EXPANSIONS` adds Senior / Lead / Junior (and optionally Staff / Principal / Manager / Director) variants to the primary keyword.
- **Company enrichment**: a curated `COMPANY_PROFILES_DATABASE` (CEO, revenue, industry, website, employees, founded) with generic fallbacks for unknown companies.
- **Charging**: uses Apify's pay-per-event `Actor.charge(event_name=...)` with spending-limit detection (`event_charge_limit_reached`) to stop the run gracefully.
- **Output**: pushed to the Apify Dataset per successful job as camelCase JSON records.

***

### 🌍 Supported Countries

United States, United Kingdom, Canada, Australia, Germany, France, India, Netherlands, Spain, Italy, Brazil, Mexico, Singapore, Switzerland, Japan, Ireland, South Africa, New Zealand, Sweden, Belgium, Austria, Poland, Portugal, Argentina, Chile, Colombia, Hong Kong, Malaysia, Philippines, Saudi Arabia, United Arab Emirates.

***

### 🏙️ Regional Auto-Expansion

When `expandToCities = true` and `location` matches a known region, the actor runs separate searches across the region's top cities — this is the primary mechanism to bypass Indeed's 25-job-per-page cap.

| Region | Auto-expands to |
|--------|-----------------|
| Texas | Houston, Dallas, Austin, San Antonio, Fort Worth, Plano, Arlington, El Paso |
| California | Los Angeles, San Francisco, San Diego, San Jose, Sacramento, Irvine, Oakland |
| Florida | Miami, Orlando, Tampa, Jacksonville, Fort Lauderdale, St. Petersburg |
| New York | New York, Brooklyn, Queens, Buffalo, Rochester, Albany |
| Illinois | Chicago, Aurora, Naperville, Rockford, Joliet |
| Washington | Seattle, Bellevue, Spokane, Tacoma |
| Georgia | Atlanta, Alpharetta, Savannah, Marietta |
| United Kingdom | London, Manchester, Birmingham, Leeds, Glasgow, Edinburgh, Bristol, Liverpool |
| Canada | Toronto, Vancouver, Montreal, Calgary, Ottawa, Edmonton |

***

### 🔍 SEO Keywords

`Indeed Jobs Scraper`, `Indeed scraper`, `job scraper`, `Apify Indeed actor`, `bypass Indeed 25 job limit`, `Indeed keyword search`, `Indeed URL scraper`, `multi-country job scraper`, `job posting scraper`, `salary data scraper`, `remote job scraper`, `ATS apply URL`, `external apply URL scraper`, `company profile enrichment`, `resume match score`, `Indeed RSS alternative`, `hiring data API`, `recruitment data`, `pay per event scraper`, `residential proxy job scraper`

***

### 🔗 Related Actors

- **[Clutch.co Scraper](https://apify.com/your-username/clutch-scraper)** – Extract agency profiles, reviews, emails, buyer leads, and AI pain-point insights from Clutch.co.
- **[Instagram Profile & Leads Scraper](https://apify.com/your-username/instagram-profile-scraper)** – Extract public Instagram profile data, emails, phones, and business info.

***

**Start scraping Indeed jobs today — only $1.40 per 1,000 successful jobs, with 60+ countries, city auto-expansion, full descriptions, and resume match scoring built in.**

````



# Actor input Schema

## `position` (type: `string`):

The job role, title, or keywords to search for (e.g. 'registered nurse', 'python developer', 'project manager').
## `keywords` (type: `array`):

Optional list of multiple keywords to search across. Results will be merged and automatically deduplicated.
## `country` (type: `string`):

The Indeed country domain to target (60+ countries supported).
## `location` (type: `string`):

City, state/region, or postal code to search within (e.g. 'Texas', 'Houston, TX', 'London', 'Remote').
## `radius` (type: `integer`):

Distance radius around the target location.
## `datePosted` (type: `string`):

Filter by how recently the job was posted.
## `postedBy` (type: `string`):

Filter by direct employer vs staffing / recruiting agency.
## `jobType` (type: `array`):

Filter by employment commitment types.
## `remote` (type: `string`):

Filter by workplace arrangement.
## `experienceLevel` (type: `string`):

Filter by seniority level.
## `minSalary` (type: `integer`):

Minimum compensation floor in target country currency (e.g. 60000).
## `sort` (type: `string`):

Order results by relevance or newest first.
## `startUrls` (type: `array`):

One or more direct Indeed search URLs or individual job URLs. All URL parameters and filters will be honored.
## `deepSearch` (type: `boolean`):

Expand keywords into related seniority and role variants to maximize total market discovery.
## `expandToCities` (type: `boolean`):

Automatically fan out country/region searches into individual top cities for 2x to 5x more unique results.
## `strictKeywordMatch` (type: `boolean`):

Keep only jobs whose title or description strictly contain the target search keywords.
## `includeJobsWithNoSalary` (type: `boolean`):

When turned off, only jobs with an explicit or estimated salary will be retained.
## `oneJobPerCompany` (type: `boolean`):

Return at most one job per employer for diverse company prospecting.
## `resolveExternalApplyUrl` (type: `boolean`):

Follow Indeed's redirect tracking chain to extract the final direct employer / ATS apply URL.
## `includeCompanyDetails` (type: `boolean`):

Enrich output with company profile data (CEO, revenue, industry, website, employees, founded year).
## `resumeKeywords` (type: `array`):

List of resume / CV skills to score each job against (adds resumeMatchScore 0-100, matched and missing keywords).
## `onlyExternalJobs` (type: `boolean`):

Filter to keep only jobs that apply externally on third-party employer sites.
## `flattenOutput` (type: `boolean`):

Return clean, flat top-level rows (ideal for CSV/Excel) instead of raw nested API data.
## `maxJobs` (type: `integer`):

Maximum total job postings to collect and charge (hard cap).
## `proxy` (type: `object`):

Proxy settings. Apify Residential proxies are recommended for high-volume Indeed scraping.

## Actor input object example

```json
{
  "position": "registered nurse",
  "country": "United States",
  "location": "Texas",
  "radius": 25,
  "datePosted": "any",
  "postedBy": "all",
  "remote": "any",
  "experienceLevel": "all",
  "sort": "relevance",
  "startUrls": [
    {
      "url": "https://www.indeed.com/jobs?q=registered+nurse&l=Texas"
    }
  ],
  "deepSearch": false,
  "expandToCities": true,
  "strictKeywordMatch": false,
  "includeJobsWithNoSalary": true,
  "oneJobPerCompany": false,
  "resolveExternalApplyUrl": false,
  "includeCompanyDetails": true,
  "onlyExternalJobs": false,
  "flattenOutput": true,
  "maxJobs": 50,
  "proxy": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
````

# Actor output Schema

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

Collection of extracted job listings with clean flat attributes, full descriptions, salary ranges, and employer details.

# 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 = {
    "position": "registered nurse",
    "location": "Texas",
    "startUrls": [
        {
            "url": "https://www.indeed.com/jobs?q=registered+nurse&l=Texas"
        }
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("scrapepilot/indeed-jobs-scraper-bypass-25-limit-60-countries").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 = {
    "position": "registered nurse",
    "location": "Texas",
    "startUrls": [{ "url": "https://www.indeed.com/jobs?q=registered+nurse&l=Texas" }],
}

# Run the Actor and wait for it to finish
run = client.actor("scrapepilot/indeed-jobs-scraper-bypass-25-limit-60-countries").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 '{
  "position": "registered nurse",
  "location": "Texas",
  "startUrls": [
    {
      "url": "https://www.indeed.com/jobs?q=registered+nurse&l=Texas"
    }
  ]
}' |
apify call scrapepilot/indeed-jobs-scraper-bypass-25-limit-60-countries --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,scrapepilot/indeed-jobs-scraper-bypass-25-limit-60-countries"
        }
    }
}
```

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/Gfl3H4IQ2lOvgjvcl/builds/RV2oP8aLMA1Ac9Muo/openapi.json
