# 🚀 Indeed jobs scraper \[PPR] (`borderline/indeed-scraper`) Actor

Pay per result - Fast and reliable Indeed Job Scraper! 🚀 Extract job listings with company details effortlessly with advanced filters, avoid blocking, and enjoy lightning-speed execution. Build your analytics, automate searches, or benchmark salaries—all with seamless outputs. Try it now for free

- **URL**: https://apify.com/borderline/indeed-scraper.md
- **Developed by:** [borderline](https://apify.com/borderline) (community)
- **Categories:** Jobs, Automation
- **Features:** Limited permissions
- **Stats:** 29,227 total users, 2,341 monthly users, 97.9% runs succeeded, 275 bookmarks
- **User rating**: 4.63 out of 5 stars

## Pricing

$5.00 / 1,000 jobs

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 Job Scraper** | (PPR) Pay per results version

Feel free to open issues to suggest new features or report bugs!

Welcome to the **Indeed Job Scraper**! 🚀 Extract detailed job listing data from Indeed seamlessly and build your own job market analytics, databases, or even automate your job searches. Designed for ease-of-use and power, this tool will supercharge your data needs! 🔍

### 📦 **What Can You Extract?**

Jump directly to the fields you need:

1. [🚀 Job Essentials](#job-essentials)
2. [🏢 Company Info](#company-info)
3. [📍 Location & Geodata](#location-and-geodata)
4. [💰 Compensation & Benefits](#compensation-and-benefits)
5. [📃 Description & Requirements](#description-and-requirements)
6. [📝 Application & Hiring Details](#application-and-hiring-details)
7. [🌐 Language & Locale](#language-and-locale)
8. [🔎 Scraping Metadata](#scraping-metadata)

### 💻 **How to Use**

#### 1️⃣ **Input Requirements:**

You can now use two different approaches:

**Option A**: URL-based scraping

| **Parameter**     | **Description**                           | **Example**                                             | **Required?** |
|-------------------|-------------------------------------------|---------------------------------------------------------|---------------|
| `urls`            | Array of search / company URLs            | `["https://indeed.com/jobs?q=developer", "https://indeed.com/cmp/Google"]`               | Yes           |
| `maxRowsPerUrl`   | Maximum number of results to scrape per URL | `50`                                                    | No            |

- All parameters of **Option B** will be omitted if you chose this option.

**Option B**: Traditional search using parameters & filters (`query` and `country` are required unless you provide URLs):

The scraper accepts the following inputs and their respective enum options, indicating if they are required:

| **Parameter** | **Description**                                       | **Example**           | **Enum Options**                                                                                                                                                                                                                                                                                                                          | **Required?** |
| ------------- | ----------------------------------------------------- | --------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------- |
| `query`       | Job title or search keyword.                          | `"data analyst"`      | -                                                                                                                                                                                                                                                                                                                                         | Yes           |
| `country`     | Country code.                                         | `"us"`                | `"ar", "au", "at", "bh", "be", "br", "ca", "cl", "cn", "co", "cz", "dk", "fi", "fr", "de", "gr", "hk", "hu", "in", "id", "ie", "il", "it", "jp", "kw", "lu", "my", "mx", "ma", "nl", "nz", "no", "om", "pe", "ph", "pl", "pt", "qa", "ro", "sa", "sg", "za", "kr", "es", "se", "ch", "tw", "tr", "ua", "ae", "uk", "us", "ve", "vn", "cr", "ec", "eg", "ng", "pk", "pa", "th", "uy"` | Yes\
| `location`    | Search location.                                      | `"San Francisco, CA"` | -                                                                                                                                                                                                                                                                                                                                         | No            |
| `radius`      | Search radius (miles or km, per country).             | `"10"`                | `"0"`, `"5"`, `"10"`, `"15"`, `"25"`, `"35"`, `"50"`, `"100"`                                                                                                                                                                                                                                                                                            | No            |
| `jobType`     | Type of job (e.g., fulltime, parttime).               | `"fulltime"`          | `"fulltime"`, `"parttime"`, `"contract"`, `"internship"`, `"temporary"`, `"permanent"`, `"seasonal"`, `"freelance"`                                                                                                                                                                                                                                                   | No            |
| `level`       | Experience level (e.g., entry_level, senior_level).   | `"entry_level"`       | `"entry_level"`, `"mid_level"`, `"senior_level"` (US only)                                                                                                                                                                                                                                                                                          | No            |
| `sort`        | Sort results by relevance or date.                    | `"date"`              | `"relevance"`, `"date"`                                                                                                                                                                                                                                                                                                                   | No            |
| `fromDays`    | Limit to jobs posted within a certain number of days. | `"7"`                 | `"1"`, `"3"`, `"7"`, `"14"`                                                                                                                                                                                                                                                                                                               | No            |
| `remote`      | Filter for remote or hybrid jobs.                     | `"remote"`            | `"remote"`, `"hybrid"`                                                                                                                                                                                                                                                                                                                    | No            |
| `maxRows`     | Maximum number of jobs to scrape.                     | `100`                 | -   | No           |
| `enableUniqueJobs` | Save only unique jobs (skip duplicates).          | `false`               | `true`, `false`                                                                                                                                                                                                                                                                                                                            | No            |
| `includeSimilarJobs` | Include "View similar jobs" results.           | `true`                | `true`, `false`                                                                                                                                                                                                                                                                                                                            | No            |

##### **Input Example (URL-based):**

```json
{
    "urls": [
        "https://indeed.com/jobs?q=developer",
        "https://indeed.com/cmp/Google/jobs"
    ],
    "maxRowsPerUrl": 50
}
```

##### **Input Example (Traditional parameters & filters):**

```json
{
    "country": "us",
    "query": "data analyst",
    "location": "New York, NY",
    "maxRows": 50,
    "radius": "25",
    "jobType": "fulltime",
    "sort": "relevance",
    "fromDays": "7",
    "remote": "remote"
}
```

#### 2️⃣ **Run the Scraper:**

1. **Sign up** on [Apify](https://console.apify.com/actors/MXLpngmVpE8WTESQr?addFromActorId=MXLpngmVpE8WTESQr).
2. Add the scraper to your Apify account.
3. Configure your input JSON.
4. Click "Start" to begin scraping.

***

#### 3️⃣ **Output :**

Jump directly to the fields you need:

1. [🚀 Job Essentials](#job-essentials)
2. [🏢 Company Info](#company-info)
3. [📍 Location & Geodata](#location-and-geodata)
4. [💰 Compensation & Benefits](#compensation-and-benefits)
5. [📃 Description & Requirements](#description-and-requirements)
6. [📝 Application & Hiring Details](#application-and-hiring-details)
7. [🌐 Language & Locale](#language-and-locale)
8. [🔎 Scraping Metadata](#scraping-metadata)

#### 🛠 **Sample Output Data:**

```json
{
    "title": "Remote Customer Support Representative, Professional Services",
    "normalizedTitle": "customer support representative",
    "displayTitle": "Remote Customer Support Representative",
    "isRemote": true,
    "jobType": ["Full-time", "Remote"],
    "companyName": "American Heart Association",
    "companyUrl": "https://www.indeed.com/cmp/American-Heart-Association",
    "companyLogoUrl": "https://d2q79iu7y748jz.cloudfront.net/s/_squarelogo/256x256/2b22f028a31bec649682434b83dd2804",
    "companyHeaderUrl": "https://d2q79iu7y748jz.cloudfront.net/s/_headerimage/1960x400/1cf333dc972583d2e1c9df18c4f23d5e",
    "rating": {
        "rating": 3.9,
        "count": 885
    },
    "emails": ["hr@heart.jobs"],
    "companyAddresses": ["Dallas, TX"],
    "companyNumEmployees": "1,001 to 5,000",
    "companyRevenue": "$500M to $1B (USD)",
    "companySector": "Grantmaking & Charitable Foundations",
    "companyIndustry": "ASSOCIATION",
    "companyDescription": "The American Heart Association is a relentless force for a world of longer, healthier lives. Through collaboration ...",
    "companyFounded": {
        "year": 1924
    },
    "companyBriefDescription": "The American Heart Association is the nation’s oldest, largest voluntary organization devoted to ...",
    "companyLinks": {
        "facebook": "https://www.facebook.com/theahalife",
        "instagram": "https://www.instagram.com/theahalife",
        "twitter": "",
        "customLinks": [
            {
                "name": "AHA Careers Site",
                "url": "https://heart.jobs/"
            }
        ],
        "corporateWebsite": "http://www.heart.org"
    },
    "companyCeo": {
        "name": "Nancy A. Brown",
        "photoUrl": "https://d2q79iu7y748jz.cloudfront.net/s/_ceophoto/512x512/c79ae9f355378e5e78738e1ac5e7fee7",
        "startDate": null
    },
    "location": {
        "countryCode": "US",
        "country": "United States",
        "city": "Dallas",
        "formattedAddressShort": "Dallas, TX",
        "formattedAddressLong": " Dallas, Texas 75231-4596, US",
        "postalCode": "75231",
        "latitude": 32.814034,
        "longitude": -96.815,
        "streetAddress": "7272 Greenville Ave.",
        "fullAddress": "7272 Greenville Ave. Dallas, Texas 75231-4596, US"
    },
    "benefits": ["Health insurance", "Paid time off", "Retirement plan"],
    "occupation": [
        "Customer Support & Client Services Occupations",
        "Sales, Retail & Customer Support Occupations"
    ],
    "occupationMostLikely": ["Customer Support & Client Services Occupations"],
    "socialInsurance": ["Health insurance"],
    "attributes": [
        "Bilingual",
        "Microsoft Word",
        "Spanish",
        "Wellness program",
        "Microsoft Outlook",
        "Hourly pay"
    ],
    "employerProvidedAttributes": ["Full-time", "Work from home"],
    "requirements": [
        {
            "label": "Engineering",
            "requirementSeverity": "REQUIRED"
        },
        {
            "label": "Ability to lift 50 pounds",
            "requirementSeverity": "PREFERRED"
        },
        {
            "label": "Associate's degree",
            "requirementSeverity": "PREFERRED"
        }
    ],
    "shiftAndSchedule": ["Monday to Friday"],
    "workingSystem": ["Flextime"],
    "descriptionText": "Provide tier I technical support for inbound calls and emails...",
    "descriptionHtml": "<p>Provide tier I technical support for inbound calls and emails</p>",
    "salary": {
        "salaryText": "$20 - $22 an hour",
        "salaryType": "hourly",
        "salaryMax": 22,
        "salaryMin": 20,
        "salarySource": "EXTRACTION",
        "salaryCurrency": "USD"
    },
    "age": "Just posted",
    "postedToday": true,
    "isRepost": false,
    "isLatestPost": true,
    "datePublished": "2025-02-24",
    "hiringDemand": {
        "isUrgentHire": true,
        "isHighVolumeHiring": false
    },
    "organicApplyStarts": 11,
    "expired": false,
    "isSponsored": false,
    "scrapingInfo": {
        "page": 12,
        "index": 3
    },
    "source": "American Heart Association",
    "sourceEmployerName": "American Heart Association",
    "feedSourceType": "EMPLOYER",
    "jobUrl": "https://www.indeed.com/viewjob?jk=6ae7e4ae7ac60636",
    "applyUrl": "https://rr.jobsyn.org/9ECBB26665F341FCA3EAB747075CAA9B1554",
    "isEasyApply": true,
    "easyApplyUrl": "https://smartapply.indeed.com/beta/indeedapply/applybyapplyablejobid?indeedApplyableJobId=97daa076-c18b-423e-b388-077de41528c2",
    "campaignCount": 1,
    "jobKey": "1e6e49448374145b",
    "refNum": "c742e6fd-fc71-45e0-91aa-5c228697d339",
    "scrapedAt": "2026-09-19T08:42:11.204Z",
    "language": "en",
    "locale": "us"
}
```

***

#### 🚀 Job Essentials

- **title**\
  Example: `"Remote Customer Support Representative, Professional Services"`

- **normalizedTitle**\
  Indeed's normalized form of the title, useful to group postings that describe
  the same role under different wordings. Example: `"setter"`

- **displayTitle**\
  Title as Indeed renders it on the listing page, often shorter than the one the
  employer published. Example: `"Setter"`

- **isRemote**\
  Boolean: `true` / `false`

- **jobType**\
  Example: `["Full-time", "Remote"]`

- **age**\
  Example: `"Just posted"`, `"1 day ago"`, etc.

- **postedToday**\
  Boolean: `true` / `false`

- **isRepost**\
  Boolean: `true` / `false`. Whether the posting is a republication of an earlier
  one. Lets you separate genuinely new hiring demand from recycled listings.

- **isLatestPost**\
  Boolean: `true` / `false`. Whether this is the most recent version of the
  posting. `false` marks an older copy the employer has since republished.

- **isSponsored**\
  Boolean: `true` / `false`. Whether the posting appeared as a paid/sponsored
  placement in the search results (vs an organic listing). This reflects how the
  job appeared in **this** search — the same job can be sponsored in one query
  and organic in another. Useful to filter out promoted listings or to track ad
  placement.

- **datePublished**\
  Example: `"2025-02-24"`

***

#### 🏢 Company Info

- **companyName**\
  Example: `"American Heart Association"`

- **companyUrl**\
  Example: `"https://www.indeed.com/cmp/American-Heart-Association"`

- **companyLogoUrl**\
  Direct link to the company's logo

- **companyHeaderUrl**\
  Image or banner link shown on the company profile

- **rating**\
  Object containing rating info, e.g.:
  ```json
  {
    "rating": 3.9,
    "count": 885
  }
  ```

- **emails**\
  Array of any emails found in the posting text (e.g., `["hr@heart.jobs"]`)

- **contacts**\
  Contact details the employer attached to the posting. Often empty: each field
  is `null` when the employer did not provide it. Shape:
  ```json
  [{ "contactName": null, "contactEmail": null, "contactPhone": null, "contactTypes": [] }]
  ```

- **companyAddresses**\
  E.g., `["Dallas, TX"]`

- **companyNumEmployees**\
  Example: `"1,001 to 5,000"`

- **companyRevenue**\
  Example: `"$500M to $1B (USD)"`

- **companySector**\
  Sector shown on the company page, in the language of the country searched. Filled far more often than `companyIndustry`.\
  Example: `"Restaurants & Cafes"`

- **companyIndustry**\
  Example: `"ASSOCIATION"`

- **companyDescription**\
  Full text describing the company

- **companyFounded**\
  Object with founding year:
  ```json
  {
    "year": 1924
  }
  ```

- **companyBriefDescription**\
  Shorter summary of the company

- **companyLinks**\
  Social media links, official site, custom links, e.g.:
  ```json
  {
    "facebook": "https://facebook.com/... ",
    "instagram": "https://instagram.com/... ",
    "twitter": "",
    "customLinks": [
      {
        "name": "AHA Careers Site",
        "url": "https://heart.jobs/"
      }
    ],
    "corporateWebsite": "http://www.heart.org"
  }
  ```

- **companyCeo**\
  Object describing CEO (name, photo, etc.):
  ```json
  {
    "name": "Nancy A. Brown",
    "photoUrl": "https://...",
    "startDate": null
  }
  ```

***

#### 📍 Location & Geodata

- **location.admin1Code**\
  State in the United States (`"TX"`, `"CA"`), constituent country in the United
  Kingdom (`"ENG"`). Absent on fully remote postings, which have no physical
  location.

- **location.admin2Code**\
  FIPS county code in the United States (`"113"`), region in the United Kingdom
  (`"NW"`).

- **location.admin3Code**\
  The finest administrative division, where the country has one — county in the
  United Kingdom (`"LAN"`). Absent for United States postings, which stop at the
  county level.

Most of these fields will be under a `location` object, for instance:

- **countryCode** (e.g., `"US"`)
- **country** (e.g., `"United States"`)
- **city** (e.g., `"Dallas"`)
- **postalCode** (e.g., `"75231"`)
- **latitude** (e.g., `32.814034`)
- **longitude** (e.g., `-96.815`)
- **streetAddress** (e.g., `"7272 Greenville Ave."`)
- **formattedAddressShort** (e.g., `"Dallas, TX"`)
- **formattedAddressLong** (e.g., `"Dallas, Texas 75231-4596, US"`)
- **fullAddress** (combined street, city, state, postal code, etc.)

***

#### 💰 Compensation & Benefits

- **salary**\
  An object containing detailed pay data:
  ```json
  {
    "salaryText": "$20 - $22 an hour",
    "salaryType": "hourly",
    "salaryMax": 22,
    "salaryMin": 20,
    "salarySource": "EXTRACTION",
    "salaryCurrency": "USD"
  }
  ```
- **benefits**\
  Example: `["Health insurance", "Paid time off", "Retirement plan"]`
- **socialInsurance**\
  Example: `["Health insurance"]`

***

#### 📃 Description & Requirements

- **descriptionText**\
  Plain-text version of the job description
- **descriptionHtml**\
  HTML-rich version of the job description
- **occupation**\
  Example: `["Customer Support & Client Services Occupations"]`
- **occupationMostLikely**\
  The occupation Indeed considers most likely for this posting, from the same
  taxonomy as `occupation`. Usually one entry, occasionally more.
  Example: `["Sales Lead Generators & Telesales Executives"]`
- **attributes**\
  E.g., `["Bilingual", "Microsoft Word", "Wellness program"]`
- **employerProvidedAttributes**\
  The attributes the employer declared itself, as opposed to `attributes`, which
  Indeed infers from the posting text. Use it when you need to trust the contract
  type rather than a guess. E.g., `["Part-time", "Temp to perm", "Work from home"]`
- **requirements**\
  Array with `label` + `requirementSeverity`:
  ```json
  [
    { "label": "Engineering", "requirementSeverity": "REQUIRED" },
    { "label": "Ability to lift 50 pounds", "requirementSeverity": "PREFERRED" }
  ]
  ```
- **shiftAndSchedule**\
  Example: `["Monday to Friday"]`
- **workingSystem**\
  Example: `["Remote", "On-site", "Hybrid"]`

***

#### 📝 Application & Hiring Details

- **jobUrl**\
  Indeed listing link (e.g., `"https://www.indeed.com/viewjob?jk=... "`)

- **applyUrl**\
  Direct link for applying to the job (when available)

- **isEasyApply**\
  Boolean: `true` / `false`. Whether the posting accepts Indeed's one-click
  application. Absent — rather than `false` — when the information could not be
  retrieved, which includes expired postings, where no apply link exists at all.

- **easyApplyUrl**\
  The one-click application endpoint itself. Not the same thing as `applyUrl`,
  which points at the posting page.
  Example: `"https://smartapply.indeed.com/beta/indeedapply/applybyapplyablejobid?indeedApplyableJobId=97daa076"`

- **campaignCount**\
  Number of funded advertising campaigns attached to this posting. `0` means the
  employer is not paying to promote it. Unlike `isSponsored`, this does not
  depend on the search query that found the job — it is a property of the
  posting itself.

- **feedSourceType**\
  Who published the posting to Indeed: `"EMPLOYER"` for a direct employer
  posting, `"RECRUITER"` when it came through a staffing agency. The distinction
  most recruiters filter on first.

- **sourceEmployerName**\
  Employer name as declared by the source feed. It differs from `companyName`
  when an agency posts on a client's behalf.

- **hiringDemand**\
  Indicates urgency or volume:
  ```json
  {
    "isUrgentHire": true,
    "isHighVolumeHiring": false
  }
  ```

- **organicApplyStarts**\
  Number of applications started from organic (non-sponsored) traffic, as reported by
  Indeed. A direct read of how competitive the posting is. `0` means nobody has started
  one yet. Example: `11`

- **expired**\
  Boolean indicating if the job is no longer active

***

#### 🌐 Language & Locale

- **language** (e.g., `"en"`)
- **locale**
  Country domain the listing was scraped from, lowercased (e.g., `"us"`, `"fr"`, `"de"`) — not a POSIX locale.

***

#### 🔎 Scraping Metadata

- **jobKey**\
  Unique identifier for the job post (e.g., `"1e6e49448374145b"`)
- **refNum**\
  The employer's own reference for this posting, as carried by the job feed.
  Lets you match a posting against an applicant tracking system.
  Example: `"c742e6fd-fc71-45e0-91aa-5c228697d339"`
- **scrapedAt**\
  ISO 8601 timestamp of when this record was collected.
  Example: `"2026-09-19T08:42:11.204Z"`
- **source**\
  Where the listing originated (e.g., `"American Heart Association"`)
- **scrapingInfo**\
  Object containing:
  ```json
  {
    "page": 12,
    "index": 3,
    "inputUrl": "https://www.indeed.com/jobs?q=engineer&l=Austin%2C+TX"
  }
  ```
  `page` is the search page the listing came from and `index` its rank on that page, so you can
  rebuild Indeed's original ordering. `inputUrl` is only set in URL mode, and tells you which of
  your start URLs produced the row.

***

### 🤔 **Why Use This Scraper?**

- 🕵️ **Market Research**: Analyze job trends, salaries, and skills in demand.
- 📊 **Analytics**: Build custom dashboards for hiring trends.
- 📚 **Database Creation**: Organize and store job listings for internal use.
- 💸 **Salary Benchmarking**: Compare wages across regions and industries.
- 📩 **Job Search Automation**: Streamline your job hunting process with tailored searches.
- 🔎 **Competitive Insights**: Track competitor hiring practices.

***

#### 📊 **Output Options:**

Once scraping is complete, you can download results in multiple formats:

- JSON
- CSV
- Excel
- XML
- HTML

***

### 🌟 **Key Features**

- **💨 Fast Performance**: Handles large datasets efficiently.
- **📋 Flexible Outputs**: Multiple formats for seamless integration.
- **🔄 Up-to-Date Results**: Ensures the freshest job listings.
- **⚙️ API Integration**: Programmatically manage scrapes with the Apify API.
- **🛠 Customizable Filters**: Tailor searches to your exact needs.

***

### 📚 **Integration Options**

- **Zapier & Make**: Automate workflows with tools like Google Sheets or Slack.
- **Webhooks**: Get notified when a scrape is complete.
- **Apify API**: Manage scrapes, fetch results, and monitor performance with RESTful API endpoints.

***

### 💰 **Cost and Limitations**

- **Pricing**: Costs depend on the size of your scrape. Start with small batches to estimate.
- **Limits**: The scraper can typically return over 1,000 results per run but may vary depending on input complexity and Indeed’s restrictions.

***

### 🚀 **Start Scraping Today!**

Unleash the power of job data! 🎯 Click [here](https://console.apify.com/actors/MXLpngmVpE8WTESQr?addFromActorId=MXLpngmVpE8WTESQr) to begin.

For detailed documentation and tutorials, visit our [Apify Docs](https://docs.apify.com/).

***

### ℹ️ **Good to Know**

**Independent tool.** This Actor is not affiliated with, endorsed by, or connected to Indeed, Inc. "Indeed" and related marks belong to their respective owners, and appear here only to describe what the tool does.

**Public data only.** It reads the pages any visitor can see — public search results and public job postings. No account, no sign-in, no credentials, nothing behind a login or a paywall.

**Contact details.** When an employer publishes a hiring email or a name in its posting, you get it in `emails` and `contacts` — the usual privacy rules apply to how you use it.

# Actor input Schema

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

Select country (default is US based)
Enhance accuracy by selecting the associated country (e.g., 'fr' for French jobs on fr.indeed.com). Data is drawn directly from country-specific indeed.com platforms, ensuring relevant outcomes for your location.

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

Enter your query

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

Specify city, state, zip, or 'remote' positions. (For better accuracy, pair location with the relevant country. E.g., Paris, set country to 'France' for precise results.)

## `maxRows` (type: `integer`):

Enter max rows (listings) to get)

## `radius` (type: `string`):

Enter radius (km or miles depending on country)

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

Select if you want to get remote or hybrid work

## `level` (type: `string`):

Select job level. ⚠️ This parameter only works on the US domain (country: 'us'). For other countries or more custom filters, use URLs instead.

## `sort` (type: `string`):

Select sort

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

Select job type

## `fromDays` (type: `string`):

Number of days since a job was published

## `urls` (type: `array`):

List of URLs to start with

## `maxRowsPerUrl` (type: `integer`):

Maximum number of rows to extract per URL

## `enableUniqueJobs` (type: `boolean`):

- Set this to **true** to keep only unique jobs (duplicates will be skipped).
- Set this to **false** to save all jobs until the maximum number of rows is reached or the last page is scraped.

## `includeSimilarJobs` (type: `boolean`):

- Set this to **true** (default) to include "View similar jobs".
- Set this to **false** to exclude similar jobs.

## Actor input object example

```json
{
  "country": "us",
  "query": "Analyst",
  "location": "New York",
  "maxRows": 10000,
  "remote": "remote",
  "level": "entry_level",
  "sort": "relevance",
  "jobType": "fulltime",
  "fromDays": "14",
  "urls": [
    "https://indeed.com/cmp/google",
    "https://www.indeed.com/jobs?q=engineer&l=San+Francisco&sc=0kf%3Afcckey%28b1f359487c26ba41%29%3B"
  ],
  "maxRowsPerUrl": 100,
  "enableUniqueJobs": false,
  "includeSimilarJobs": true
}
```

# Actor output Schema

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

Every job found, one row per posting: title, company, location, salary, schedule, contract type, full description and apply link.

## `companies` (type: `string`):

The same results seen from the employer side: company name, description, sector, headcount, revenue, founding year, CEO, addresses, social links and Indeed rating. Turns a job search into a company list.

## `compensation` (type: `string`):

Pay-focused rows: structured minimum and maximum, currency, period, whether the figure is Indeed's estimate or the employer's own, plus benefits and contract type. Use it to build a compensation benchmark.

## `locationAndRemote` (type: `string`):

Every geographic field in one place: city, postal code, street, full and short addresses, latitude and longitude, plus the remote and on-site flags. Ready to map or to filter by commute.

## `contactsAndHiring` (type: `string`):

Who to reach and how urgently they are hiring: emails found in the posting, phone and contact details, apply links, whether the job came from the employer or a staffing agency, urgency and volume flags, and the number of candidates so far.

## `rawItems` (type: `string`):

The complete results with every field, including the nested details the lenses above leave out. Use this one to feed a database or an AI agent.

# 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 = {
    "country": "us",
    "query": "Analyst",
    "maxRows": 100
};

// Run the Actor and wait for it to finish
const run = await client.actor("borderline/indeed-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 = {
    "country": "us",
    "query": "Analyst",
    "maxRows": 100,
}

# Run the Actor and wait for it to finish
run = client.actor("borderline/indeed-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 '{
  "country": "us",
  "query": "Analyst",
  "maxRows": 100
}' |
apify call borderline/indeed-scraper --silent --output-dataset

```

## MCP server setup

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