# Indeed Jobs Scraper (`calm_builder/indeed-jobs-scraper`) Actor

Scrape Indeed job listings from search URLs or keyword searches across 32 countries. Export structured JSON with job title, company, location, salary, description, skills, benefits, remote/hybrid flags, apply links, and posting dates — ideal for recruiting, HR analytics, and job market research.

- **URL**: https://apify.com/calm\_builder/indeed-jobs-scraper.md
- **Developed by:** [Coder](https://apify.com/calm_builder) (community)
- **Categories:** Jobs, Automation, Developer tools
- **Stats:** 3 total users, 2 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.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.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).


# README

## Indeed Jobs Scraper

Collect structured job listing data from [Indeed](https://www.indeed.com) using direct search URLs or keyword-based searches. Paste the same links you use on the site — keywords, location, country, and filters — or build searches in the input form, and receive clean JSON records in your Apify dataset.

Use it for **job market research**, **recruitment pipelines**, **competitive hiring analysis**, **salary benchmarking**, and **lead generation** — without copying listings manually from search results.

---

### What you get

Each saved row is **one job listing**, organized into clear sections:

| Section            | What it contains                                                                                       |
| ------------------ | ------------------------------------------------------------------------------------------------------ |
| **Identity**       | Job ID, title, reference number, language, and links to the Indeed posting                             |
| **`company`**      | Employer name, industry, size, rating, review count, logo, and profile link when Indeed publishes them |
| **`location`**     | Formatted location plus city, region, state, country, postal code, and coordinates when available      |
| **`salary`**       | Display text, min/max range, currency, pay period, and whether the figure is estimated                 |
| **Job details**    | Job types, shifts, skills, occupations, benefits, remote/hybrid/in-person flags                        |
| **Hiring signals** | Urgently hiring, high-volume hiring, apply counts, sponsored and new-job flags                         |
| **Application**    | Apply URL (external employer site or Indeed apply flow when shown)                                     |
| **Description**    | Plain-text summary, full description, and HTML description when available                              |
| **Timeline**       | Posted, listed-on-Indeed, and expiration dates                                                         |
| **`inputUrl`**     | The search URL or keyword-built search that produced this job                                          |

Results stream to the dataset as jobs are collected, so you can preview progress before the run finishes.

---

### Quick start on Apify

1. Open the Actor in the Apify Console.
2. Choose **one or both** input modes:
   - **Indeed search URLs** — paste links copied from Indeed after setting filters in your browser, **or**
   - **Keyword searches** — enter job title/keywords, country, and optional location (or enable remote jobs).
3. Set **Maximum jobs** (default `10`) — this limit applies **per search URL or keyword search**.
4. For keyword searches only, adjust **Sort jobs by** and **Date posted** under search filters.
5. Click **Start** and open the **Dataset** tab when the run finishes.

**How to get a search URL:** Run a job search on Indeed (set keywords, location, country site, and any filters), then copy the URL from your browser address bar.

**Example input (direct URL):**

```json
{
  "startUrls": [
    {
      "url": "https://ca.indeed.com/jobs?q=full+stack+developer&l=Toronto%2C+ON&sort=date"
    }
  ],
  "maxJobs": 25
}
````

**Example input (keyword search):**

```json
{
  "keywordSearches": [
    {
      "keywords": "software engineer",
      "country": "us",
      "location": "San Francisco, CA",
      "remoteJobs": false
    }
  ],
  "sort": "date",
  "datePosted": "7",
  "maxJobs": 50
}
```

***

### Input parameters

Provide **at least one** Indeed search URL **or** one keyword search.

#### Indeed search URLs

|            |                                                                                                   |
| ---------- | ------------------------------------------------------------------------------------------------- |
| **Type**   | List of URLs                                                                                      |
| **Format** | Indeed job search pages (`indeed.com/jobs?...` or country sites such as `ca.indeed.com/jobs?...`) |
| **Tip**    | Copy the URL directly from your browser after configuring filters on the site                     |

URLs are processed **exactly as provided** — existing query parameters, filters, and sort order in the link are preserved. Search filters in the input form (sort, date posted) do **not** modify direct URLs.

Invalid or malformed URLs are skipped with a warning; other URLs in the same run can still succeed.

#### Keyword searches

|                     |                                                                                                |
| ------------------- | ---------------------------------------------------------------------------------------------- |
| **Type**            | List of search rows                                                                            |
| **Required fields** | **Job title or keywords**, **Country**                                                         |
| **Optional fields** | **Location** (city, region, state/province, or postal code)                                    |
| **Remote jobs**     | When enabled, searches for remote roles in the selected country and ignores the location field |

Supported countries include United States, Canada, United Kingdom, Australia, Germany, France, Spain, Italy, Netherlands, Belgium, Switzerland, Austria, Ireland, India, Singapore, New Zealand, Mexico, Brazil, Poland, Sweden, Norway, Denmark, Finland, Portugal, Japan, South Korea, South Africa, United Arab Emirates, Saudi Arabia, Philippines, Malaysia, and Pakistan.

#### Sort jobs by

|                |                                   |
| -------------- | --------------------------------- |
| **Type**       | Select                            |
| **Options**    | **Date** (default), **Relevance** |
| **Applies to** | Keyword searches only             |

#### Date posted

|                |                                                                            |
| -------------- | -------------------------------------------------------------------------- |
| **Type**       | Select                                                                     |
| **Options**    | All dates (default), Last 24 hours, Last 3 days, Last 7 days, Last 14 days |
| **Applies to** | Keyword searches only                                                      |

#### Maximum jobs

|             |                |
| ----------- | -------------- |
| **Type**    | Integer        |
| **Range**   | `1` – `10,000` |
| **Default** | `10`           |

Controls how many unique jobs are collected **per search URL or keyword search**. With multiple searches, total results can be up to this value multiplied by the number of searches.

For example, 3 searches with a limit of `50` can yield up to **150** jobs.

***

### What you will see during a run

The run log is written for end users — progress messages describe collection activity only.

Typical messages:

- `Starting scrape for N search URL(s) in parallel, up to M job(s) each.`
- `Collected 25 job(s).` (after each search completes)
- `Finished. Saved N job listing(s) to the dataset.`

If a search returns no jobs or cannot be processed, you will see a warning for that search; other searches in the same run can still succeed.

On the Apify **free plan**, you may also see a short notice when free-tier limits apply (see [Free plan limits](#free-plan-limits)).

***

### Output overview

#### Dataset structure

- Results are saved to a **single Apify dataset**
- Each row is one job object with nested sections (`company`, `location`, `salary`, etc.)
- Use **`inputUrl`** on each row to see which search produced it

Field presence varies by listing: not every job includes salary, full description, employer ratings, or apply links to external sites. Empty arrays (`[]`) or `null` mean no data was published for that job — not necessarily an error.

If optional fields could not be retrieved for a job, check **`scrapeErrors`** for user-safe labels.

***

### Output fields

#### Top-level identity

| Field             | Description                                                             |
| ----------------- | ----------------------------------------------------------------------- |
| `scrapedAt`       | ISO timestamp when the job was collected                                |
| `inputUrl`        | The search URL that produced this job                                   |
| `id`              | Indeed job key (unique identifier for the listing)                      |
| `title`           | Job title                                                               |
| `normalizedTitle` | Normalized title when Indeed provides one                               |
| `referenceNumber` | Employer or Indeed reference number when available                      |
| `language`        | Job posting language code when available                                |
| `indeedUrl`       | Direct link to the job on Indeed                                        |
| `applyUrl`        | Application link — external employer URL or Indeed apply URL when shown |
| `summary`         | Short snippet from search results or truncated description              |
| `description`     | Full job description as plain text                                      |
| `descriptionHtml` | Full job description as HTML when available                             |

#### `company` — employer

| Field          | Description                                               |
| -------------- | --------------------------------------------------------- |
| `name`         | Company or employer name                                  |
| `industry`     | Industry label when published                             |
| `size`         | Company size range when published                         |
| `revenue`      | Revenue range when published                              |
| `founded`      | Year founded when published                               |
| `headquarters` | Headquarters location when published                      |
| `website`      | Company website when published                            |
| `description`  | Company summary when published                            |
| `rating`       | Indeed employer rating when available                     |
| `reviewCount`  | Number of Indeed employer reviews when available          |
| `logoUrl`      | Employer logo URL when available                          |
| `profileUrl`   | Link to the employer's Indeed company page when available |

#### `location`

| Field                    | Description                   |
| ------------------------ | ----------------------------- |
| `formatted`              | Display location string       |
| `city`                   | City name                     |
| `state`                  | State or province name        |
| `stateCode`              | State or province code        |
| `region`                 | Region label                  |
| `postalCode`             | Postal or ZIP code            |
| `country`                | Country name                  |
| `countryCode`            | Country code                  |
| `address`                | Street address when available |
| `latitude` / `longitude` | Coordinates when available    |

#### `salary`

| Field         | Description                                                           |
| ------------- | --------------------------------------------------------------------- |
| `display`     | Human-readable salary text (for example `$120,000 - $150,000 a year`) |
| `min` / `max` | Numeric range when parsed                                             |
| `currency`    | Currency code when available                                          |
| `period`      | Pay period (for example hourly, monthly, yearly)                      |
| `estimated`   | Whether the salary is marked as estimated                             |

#### Job details and hiring

| Field              | Description                                                     |
| ------------------ | --------------------------------------------------------------- |
| `jobTypes`         | Employment types (for example Full-time, Part-time, Contract)   |
| `shifts`           | Shift labels when listed                                        |
| `skills`           | Skills and attributes associated with the role                  |
| `occupations`      | Occupation categories when listed                               |
| `benefits`         | Benefits mentioned in the posting                               |
| `workLocationType` | Work arrangement label (for example Remote, Hybrid, In-person)  |
| `workLocationCode` | Work arrangement code when available                            |
| `remote`           | Whether the role is remote                                      |
| `urgentlyHiring`   | Urgent hiring flag when shown                                   |
| `highVolumeHiring` | High-volume hiring flag when shown                              |
| `applyCount`       | Organic apply-start count when Indeed publishes it              |
| `applyViaIndeed`   | Whether applications go through Indeed                          |
| `sponsored`        | Sponsored listing flag when shown                               |
| `newJob`           | Whether the listing appears newly posted (based on listed date) |

#### Timeline and status

| Field       | Description                           |
| ----------- | ------------------------------------- |
| `postedAt`  | Original publish date when available  |
| `listedAt`  | Date the job appeared on Indeed       |
| `expiresAt` | Expiration date when available        |
| `expired`   | Whether the listing is marked expired |
| `reposted`  | Whether the job is a repost           |

#### `scrapeErrors`

| Field            | Description                                                                                                 |
| ---------------- | ----------------------------------------------------------------------------------------------------------- |
| `jobDetails`     | Present when full job details could not be retrieved; summary fields from search results may still be saved |
| `companyProfile` | Present when extended company profile data could not be retrieved                                           |

***

### Example output

The excerpts below come from a real run searching for **"full stack developer"** in **Toronto, ON** on **ca.indeed.com** (`maxJobs: 10`). Full output is available in the run dataset.

#### Example input

```json
{
  "startUrls": [
    {
      "url": "https://ca.indeed.com/jobs?q=full+stack+developer&l=Toronto%2C+ON&sort=date"
    }
  ],
  "maxJobs": 10
}
```

#### Excerpt — management role with salary range and external apply link

```json
{
  "scrapedAt": "2026-06-18T07:38:01.055Z",
  "inputUrl": "https://ca.indeed.com/jobs?q=full+stack+developer&l=Toronto%2C+ON&sort=date",
  "id": "4fd53ccc8ee9fa5f",
  "title": "Software Engineering Manager - Fintech",
  "normalizedTitle": "software engineering manager",
  "referenceNumber": "7568537003",
  "language": "en",
  "company": {
    "name": "autoTRADER.ca",
    "industry": null,
    "size": null,
    "revenue": null,
    "founded": null,
    "headquarters": null,
    "website": null,
    "description": null,
    "rating": 3.5,
    "reviewCount": 133,
    "logoUrl": "https://d2q79iu7y748jz.cloudfront.net/s/_squarelogo/256x256/e78596e17eeeeeeea340a328f70ff80b",
    "profileUrl": "https://ca.indeed.com/cmp/Trader-Corporation"
  },
  "location": {
    "formatted": "Toronto, ON",
    "city": "Toronto",
    "state": "Ontario",
    "stateCode": "ON",
    "region": "York District",
    "postalCode": null,
    "country": "Canada",
    "countryCode": "CA",
    "address": null,
    "latitude": 43.70011,
    "longitude": -79.4163
  },
  "salary": {
    "display": "$140,000 - $190,000",
    "min": 140000,
    "max": 190000,
    "currency": "CAD",
    "period": "yearly",
    "estimated": null
  },
  "jobTypes": [],
  "shifts": [],
  "skills": [
    "Full-stack development",
    ".NET",
    "Microservices",
    "AWS",
    "Distributed systems",
    "Employee assistance program"
  ],
  "occupations": [
    "Technology Occupations",
    "Software Development & Architecture Occupations"
  ],
  "benefits": ["Employee assistance program"],
  "workLocationType": null,
  "workLocationCode": null,
  "remote": false,
  "urgentlyHiring": false,
  "highVolumeHiring": false,
  "applyCount": 25,
  "applyViaIndeed": false,
  "sponsored": false,
  "newJob": false,
  "indeedUrl": "https://ca.indeed.com/viewjob?jk=4fd53ccc8ee9fa5f",
  "applyUrl": "https://job-boards.greenhouse.io/autotradercanada/jobs/7568537003",
  "summary": "We are TRADER, a Canadian leader in digital automotive solutions. Our flagship brands — AutoTrader.ca, AutoSync, Dealertrack Canada and CMS — help Canadians buy, sell, and finance vehicles with confidence. As part of AutoScout24 group, Eur…",
  "description": "We are TRADER, a Canadian leader in digital automotive solutions. Our flagship brands — AutoTrader.ca, AutoSync, Dealertrack Canada and CMS — help Canadians buy, sell, and finance vehicles with confidence.\n\nAs part of AutoScout24 group, Europe’s largest online car marketplace, we’re shaping the future of automotive retail in Canada and beyond.\n\nThis role will be within our Collateral Management (CMS) team…",
  "descriptionHtml": "<div>...</div>",
  "postedAt": "2026-01-14T06:00:00.000Z",
  "listedAt": "2026-03-04T18:54:11.748Z",
  "expiresAt": null,
  "expired": false,
  "reposted": true,
  "scrapeErrors": {
    "jobDetails": null,
    "companyProfile": null
  }
}
```

#### Excerpt — hybrid role with Indeed apply flow

```json
{
  "scrapedAt": "2026-06-18T07:38:01.102Z",
  "inputUrl": "https://ca.indeed.com/jobs?q=full+stack+developer&l=Toronto%2C+ON&sort=date",
  "id": "229f45d699743656",
  "title": "Full-Stack Developer (C# / Angular)",
  "normalizedTitle": "full stack developer",
  "referenceNumber": "2bc8caf3-6e88-489e-928c-5a4bdda44252",
  "language": "en",
  "company": {
    "name": "AKITU Inc.",
    "industry": null,
    "size": null,
    "revenue": null,
    "founded": null,
    "headquarters": null,
    "website": null,
    "description": null,
    "rating": null,
    "reviewCount": null,
    "logoUrl": null,
    "profileUrl": "https://ca.indeed.com/cmp/Akitu-Inc."
  },
  "location": {
    "formatted": "Oakville, ON",
    "city": "Oakville",
    "state": "Ontario",
    "stateCode": "ON",
    "region": "Halton District",
    "postalCode": null,
    "country": "Canada",
    "countryCode": "CA",
    "address": "Oakville, ON",
    "latitude": 43.507385,
    "longitude": -79.66769
  },
  "salary": {
    "display": "80,000 - -1 CAD",
    "min": 80000,
    "max": -1,
    "currency": "CAD",
    "period": null,
    "estimated": null
  },
  "jobTypes": ["Permanent", "Full-time", "Full-time +1"],
  "shifts": [],
  "skills": [
    "Full-stack development",
    "Relational databases",
    "C#",
    "Microsoft SQL Server",
    ".NET",
    "Angular",
    "Hybrid work",
    "SaaS",
    "Flexible schedule"
  ],
  "occupations": [
    "Software Development Occupations",
    "Technology Occupations",
    "Software Development & Architecture Occupations"
  ],
  "benefits": ["Flexible schedule"],
  "workLocationType": "Hybrid work",
  "workLocationCode": "REMOTE_HYBRID",
  "remote": true,
  "urgentlyHiring": false,
  "highVolumeHiring": false,
  "applyCount": 325,
  "applyViaIndeed": true,
  "sponsored": false,
  "newJob": true,
  "indeedUrl": "https://ca.indeed.com/viewjob?jk=229f45d699743656",
  "applyUrl": "http://ca.indeed.com/job/full-stack-developer-c-angular-229f45d699743656",
  "summary": "*Full-Stack Developer (C# / Angular) * *Build scalable software that powers modern dental practices * *About Us * Akitu Inc is a fast-growing SaaS company transforming how dental clinics operate across Canada. Our platform, Akitu One, is b…",
  "description": "*Full-Stack Developer (C# / Angular) *\n\n*Build scalable software that powers modern dental practices *\n\n*About Us *\n\nAkitu Inc is a fast-growing SaaS company transforming how dental clinics operate across Canada…",
  "descriptionHtml": "<p>...</p>",
  "postedAt": "2026-06-16T20:58:58.770Z",
  "listedAt": "2026-06-16T20:58:58.770Z",
  "expiresAt": null,
  "expired": false,
  "reposted": true,
  "scrapeErrors": {
    "jobDetails": null,
    "companyProfile": null
  }
}
```

#### Excerpt — external apply link (Job Bank) and hourly-style pay

```json
{
  "scrapedAt": "2026-06-18T07:38:01.024Z",
  "inputUrl": "https://ca.indeed.com/jobs?q=full+stack+developer&l=Toronto%2C+ON&sort=date",
  "id": "525fb4f913fcfe3e",
  "title": "software engineer",
  "normalizedTitle": "software engineer",
  "referenceNumber": "49628288",
  "language": "en",
  "company": {
    "name": "Tamanna Technology",
    "industry": null,
    "size": null,
    "revenue": null,
    "founded": null,
    "headquarters": null,
    "website": null,
    "description": null,
    "rating": null,
    "reviewCount": null,
    "logoUrl": null,
    "profileUrl": "https://ca.indeed.com/cmp/Tamanna-Technology"
  },
  "location": {
    "formatted": "Toronto, ON",
    "city": "Toronto",
    "state": "Ontario",
    "stateCode": "ON",
    "region": "Toronto District",
    "postalCode": "M5J",
    "country": "Canada",
    "countryCode": "CA",
    "address": null,
    "latitude": 43.616,
    "longitude": -79.383
  },
  "salary": {
    "display": "57.69 - 57.69 CAD",
    "min": 57.69,
    "max": 57.69,
    "currency": "CAD",
    "period": null,
    "estimated": null
  },
  "jobTypes": ["Permanent", "Full-time", "Full-time +1"],
  "benefits": ["Dental care", "Extended health care", "RRSP"],
  "remote": false,
  "applyCount": 73,
  "applyViaIndeed": false,
  "indeedUrl": "https://ca.indeed.com/viewjob?jk=525fb4f913fcfe3e",
  "applyUrl": "https://www.jobbank.gc.ca/jobsearch/jobposting/49628288",
  "summary": "Durée de l'emploi: Permanent Langue de travail: Anglais Heures de travail: 40 hours per week Education: Expérience: Education Bachelor's degree Work setting Consulting firm Software company Information technology (IT) service provider Task…",
  "postedAt": "2026-06-01T05:00:00.000Z",
  "listedAt": "2026-06-01T23:59:50.415Z",
  "scrapeErrors": {
    "jobDetails": null,
    "companyProfile": null
  }
}
```

***

### Combining direct URLs and keyword searches

You can use **both** input modes in a single run.

```json
{
  "startUrls": [
    {
      "url": "https://ca.indeed.com/jobs?q=data+analyst&l=Vancouver%2C+BC&sort=date"
    }
  ],
  "keywordSearches": [
    {
      "keywords": "machine learning engineer",
      "country": "ca",
      "location": "Toronto, ON",
      "remoteJobs": false
    },
    {
      "keywords": "product manager",
      "country": "us",
      "remoteJobs": true
    }
  ],
  "sort": "date",
  "datePosted": "3",
  "maxJobs": 25
}
```

- Each search URL and keyword search is processed independently, up to **Maximum jobs** each
- The same job may appear more than once if it matches multiple searches
- Use `inputUrl` on each row to see which search produced it
- If one search fails or returns no results, others can still complete

***

### Free plan limits

On the Apify **free plan**, the Actor may automatically apply:

| Limit                      | Value                                        |
| -------------------------- | -------------------------------------------- |
| Direct search URLs per run | **2** (only the first URLs in your list)     |
| Keyword searches per run   | **2** (only the first searches in your list) |
| Maximum jobs per search    | **20**                                       |

Paid Apify plans can use the full input without these caps. If limits apply, the run log will include a short notice.

***

### Data quality and limitations

**Public job listing data**\
The Actor reads the same job data shown on Indeed search results and job detail pages. It does not access private employer accounts or unpublished listings.

**Coverage varies by listing and country**\
Salary, benefits, skills, employer ratings, and apply links are not always published. Some fields may be `null` or empty even when the job is live on Indeed.

**Direct URLs vs keyword searches**\
Filters in the input form (sort, date posted) apply only to **keyword searches**. Direct URLs keep whatever filters are already in the link.

**Active listings change**\
Jobs are posted, updated, filled, and removed on the live site. Re-run on a schedule to track changes over time.

**Apply links**\
`applyUrl` points to the application destination when Indeed exposes it — either on Indeed or on an external employer site. Some listings only link to the Indeed job page.

**Compliance**\
You are responsible for using collected data in line with applicable laws and [Indeed's terms of service](https://www.indeed.com/legal).

***

### Tips for best results

1. **Copy URLs from the site** — Use real Indeed search URLs after setting keywords, location, and filters in the browser.
2. **Use keyword searches for quick setup** — Enter title, country, and location without building URLs manually.
3. **Start with a small `maxJobs`** — Test your search with 10–20 jobs before large exports.
4. **Use multiple searches for coverage** — Run separate keyword or URL searches in one job to compare roles, cities, or countries.
5. **Filter in the dataset** — Export to JSON, CSV, or Excel, then filter on `title`, `company.name`, `location.formatted`, `salary.display`, or `remote`.
6. **Schedule recurring runs** — Use Apify schedules to monitor new postings or track hiring trends over time.
7. **Join on `inputUrl`** — When combining results from multiple searches, keep the search URL to avoid confusion.
8. **Deduplicate on `id`** — The same job can appear in multiple searches; use the Indeed job `id` to deduplicate if needed.

***

### Frequently asked questions

**Why was my search URL skipped?**\
The URL may not be a valid Indeed job search page, or it could not be processed in that run. Check the run log for warnings.

**Why do sort and date posted not affect my direct URL?**\
Direct URLs are scraped exactly as provided. Use **Keyword searches** if you want to control sort and date posted from the input form.

**Why is salary `null`?**\
Many employers do not publish salary on Indeed. When a range is shown on the site, it appears in `salary.display` and structured min/max fields when available.

**Why is `description` empty but `summary` has text?**\
The search snippet may be available even when the full job page could not be loaded. Check `scrapeErrors.jobDetails` for context.

**Why are company rating and website `null`?**\
Employer profile fields depend on what Indeed publishes for that employer on the job listing. Not every company has a full Indeed profile.

**What does `remote: true` mean?**\
The listing is marked as a remote role on Indeed. Hybrid and in-person roles use `workLocationType` instead.

**Will the same job appear twice?**\
Yes, if you use multiple search URLs or keyword searches that both return the same listing. Deduplicate using `id` if needed.

**Can I scrape a single job by URL?**\
This Actor is built for **search URLs and keyword searches**. Use a search that returns the jobs you need, or include a direct search URL filtered to your target role and location.

**Which Indeed country sites are supported?**\
Keyword searches support 32 countries listed in the input form. Direct URLs work on any Indeed country site that uses standard `/jobs` search pages.

***

### Support

For Actor-specific issues, use the **Issues** tab on the Apify store listing or contact the publisher through Apify.

For platform questions (runs, billing, API, schedules), see [Apify documentation](https://docs.apify.com) and Apify support.

# Actor input Schema

## `startUrls` (type: `array`):

Add one Indeed job search URL per row. URLs are scraped exactly as provided, including any filters already in the link.

## `keywordSearches` (type: `array`):

Add one row per search with a job title or keywords, a country, and optionally a location.

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

How to order results for keyword searches.

## `datePosted` (type: `string`):

Filter keyword search results by posting date.

## `maxJobs` (type: `integer`):

Maximum number of unique jobs to collect per search URL or keyword search.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://ca.indeed.com/jobs?q=full+stack+developer&l=Toronto%2C+ON&sort=date"
    }
  ],
  "keywordSearches": [
    {
      "keywords": "full stack developer",
      "country": "us",
      "remoteJobs": false,
      "location": "Toronto, ON"
    }
  ],
  "sort": "date",
  "datePosted": "all",
  "maxJobs": 10
}
```

# Actor output Schema

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

No description

# 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 = {
    "startUrls": [
        {
            "url": "https://ca.indeed.com/jobs?q=full+stack+developer&l=Toronto%2C+ON&sort=date"
        }
    ],
    "keywordSearches": [
        {
            "keywords": "full stack developer",
            "country": "us",
            "remoteJobs": false,
            "location": "Toronto, ON"
        }
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("calm_builder/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 = {
    "startUrls": [{ "url": "https://ca.indeed.com/jobs?q=full+stack+developer&l=Toronto%2C+ON&sort=date" }],
    "keywordSearches": [{
            "keywords": "full stack developer",
            "country": "us",
            "remoteJobs": False,
            "location": "Toronto, ON",
        }],
}

# Run the Actor and wait for it to finish
run = client.actor("calm_builder/indeed-jobs-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "startUrls": [
    {
      "url": "https://ca.indeed.com/jobs?q=full+stack+developer&l=Toronto%2C+ON&sort=date"
    }
  ],
  "keywordSearches": [
    {
      "keywords": "full stack developer",
      "country": "us",
      "remoteJobs": false,
      "location": "Toronto, ON"
    }
  ]
}' |
apify call calm_builder/indeed-jobs-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=calm_builder/indeed-jobs-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Indeed Jobs Scraper",
        "description": "Scrape Indeed job listings from search URLs or keyword searches across 32 countries. Export structured JSON with job title, company, location, salary, description, skills, benefits, remote/hybrid flags, apply links, and posting dates — ideal for recruiting, HR analytics, and job market research.",
        "version": "0.0",
        "x-build-id": "ycShGwSmKc9HFZCvc"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/calm_builder~indeed-jobs-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-calm_builder-indeed-jobs-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/calm_builder~indeed-jobs-scraper/runs": {
            "post": {
                "operationId": "runs-sync-calm_builder-indeed-jobs-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/calm_builder~indeed-jobs-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-calm_builder-indeed-jobs-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "properties": {
                    "startUrls": {
                        "title": "Indeed search URLs",
                        "type": "array",
                        "description": "Add one Indeed job search URL per row. URLs are scraped exactly as provided, including any filters already in the link.",
                        "items": {
                            "type": "object",
                            "required": [
                                "url"
                            ],
                            "properties": {
                                "url": {
                                    "type": "string",
                                    "title": "URL of a web page",
                                    "format": "uri"
                                }
                            }
                        }
                    },
                    "keywordSearches": {
                        "title": "Keyword searches",
                        "type": "array",
                        "description": "Add one row per search with a job title or keywords, a country, and optionally a location.",
                        "items": {
                            "type": "object",
                            "properties": {
                                "keywords": {
                                    "title": "Job title or keywords",
                                    "type": "string",
                                    "description": "The job title, role, or keywords to search for.",
                                    "minLength": 1,
                                    "prefill": "software engineer"
                                },
                                "country": {
                                    "title": "Country",
                                    "type": "string",
                                    "description": "The Indeed country site to search. Required for each keyword search.",
                                    "editor": "select",
                                    "default": "us",
                                    "enum": [
                                        "us",
                                        "ca",
                                        "uk",
                                        "au",
                                        "de",
                                        "fr",
                                        "es",
                                        "it",
                                        "nl",
                                        "be",
                                        "ch",
                                        "at",
                                        "ie",
                                        "in",
                                        "sg",
                                        "nz",
                                        "mx",
                                        "br",
                                        "pl",
                                        "se",
                                        "no",
                                        "dk",
                                        "fi",
                                        "pt",
                                        "jp",
                                        "kr",
                                        "za",
                                        "ae",
                                        "sa",
                                        "ph",
                                        "my",
                                        "pk"
                                    ],
                                    "enumTitles": [
                                        "United States",
                                        "Canada",
                                        "United Kingdom",
                                        "Australia",
                                        "Germany",
                                        "France",
                                        "Spain",
                                        "Italy",
                                        "Netherlands",
                                        "Belgium",
                                        "Switzerland",
                                        "Austria",
                                        "Ireland",
                                        "India",
                                        "Singapore",
                                        "New Zealand",
                                        "Mexico",
                                        "Brazil",
                                        "Poland",
                                        "Sweden",
                                        "Norway",
                                        "Denmark",
                                        "Finland",
                                        "Portugal",
                                        "Japan",
                                        "South Korea",
                                        "South Africa",
                                        "United Arab Emirates",
                                        "Saudi Arabia",
                                        "Philippines",
                                        "Malaysia",
                                        "Pakistan"
                                    ]
                                },
                                "remoteJobs": {
                                    "title": "Remote jobs",
                                    "type": "boolean",
                                    "description": "Search for remote jobs within the selected country. When enabled, the location below is ignored.",
                                    "default": false
                                },
                                "location": {
                                    "title": "Location",
                                    "type": "string",
                                    "description": "City, region, state or province, or postal code. Ignored when remote jobs is enabled.",
                                    "prefill": "Toronto, ON"
                                }
                            },
                            "required": [
                                "keywords",
                                "country"
                            ]
                        }
                    },
                    "sort": {
                        "title": "Sort jobs by",
                        "enum": [
                            "date",
                            "relevance"
                        ],
                        "type": "string",
                        "description": "How to order results for keyword searches.",
                        "default": "date"
                    },
                    "datePosted": {
                        "title": "Date posted",
                        "enum": [
                            "all",
                            "1",
                            "3",
                            "7",
                            "14"
                        ],
                        "type": "string",
                        "description": "Filter keyword search results by posting date.",
                        "default": "all"
                    },
                    "maxJobs": {
                        "title": "Maximum jobs",
                        "minimum": 1,
                        "maximum": 10000,
                        "type": "integer",
                        "description": "Maximum number of unique jobs to collect per search URL or keyword search.",
                        "default": 10
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
