# IIMJobs Job Listings Scraper (`automation-lab/iimjobs-job-listings-scraper`) Actor

Search and export public IIMJobs specialist vacancies with employer, location, experience, disclosed salary, descriptions, posting metadata, and canonical URLs.

- **URL**: https://apify.com/automation-lab/iimjobs-job-listings-scraper.md
- **Developed by:** [Stas Persiianenko](https://apify.com/automation-lab) (community)
- **Categories:** Jobs
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.06 / 1,000 item extracteds

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/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — 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

## IIMJobs Job Listings Scraper

Search and export public **IIMJobs job listings** as structured vacancy data.
Collect job titles, employers, locations, experience ranges, disclosed salary or
CTC, skills, posting dates, descriptions, recruiter metadata, and canonical URLs.

The Actor is designed for recurring India recruiting feeds, specialist vacancy
research, and labor-market analysis. It uses IIMJobs' anonymous public data
surfaces: no account, login, browser, or proxy configuration is required.

### What can you do with this IIMJobs scraper?

- Search public vacancies by role, skill, employer, or qualification.
- Restrict a search to one or more specialist IIMJobs categories.
- Keep jobs matching a location or experience range.
- collect recently posted jobs for a scheduled recruiting feed.
- Extract one or more known public IIMJobs job URLs.
- Include full public descriptions and posting metadata when needed.
- Export results to JSON, CSV, Excel, Google Sheets, a database, or an ATS.
- Compare scheduled datasets downstream to identify new or changed listings.

The Actor returns normalized records rather than raw pages. Each row has a
stable source job ID and URL, which makes deduplication straightforward.

### Who is it for?

#### Recruiters and talent teams

Build focused shortlists for finance, consulting, sales, HR, operations, legal,
IT, BPO, and GenAI roles without copying vacancy cards manually.

#### Recruiting operations teams

Feed public IIMJobs vacancies into spreadsheets, ATS staging tables, n8n, Make,
Zapier, or an internal data warehouse on a schedule.

#### Labor-market analysts

Track public role demand, requested experience, locations, skills, and disclosed
compensation over time. Store each run as a dated snapshot and compare outside
the Actor.

#### Developers and AI agents

Call one predictable Actor endpoint instead of maintaining page selectors. Use
the stable `jobId`, typed fields, and canonical `url` in downstream automation.

### Why use this Actor?

- **Source-specific output:** fields are mapped to IIMJobs vacancy concepts.
- **Two input routes:** search the job board or enrich exact public job URLs.
- **Optional detail enrichment:** avoid detail requests when summary fields are
  enough, or enable them for descriptions and richer metadata.
- **Bounded execution:** `maxItems` controls output and work performed.
- **Fail-closed behavior:** invalid input and unexpected upstream response shapes
  produce a failed run instead of a misleading empty success.
- **No automatic paid proxy:** the current public HTTP route works directly.

No scraper can guarantee historical completeness or permanent source uptime.
This Actor reports what IIMJobs exposes publicly when the run executes.

### What data does it extract?

| Field | Meaning |
| --- | --- |
| `jobId` | Stable IIMJobs vacancy identifier |
| `title` | Public job title |
| `designation` | Role designation when provided |
| `employer`, `employerId` | Public employer name and source identifier |
| `locations` | All displayed vacancy locations |
| `experienceMinYears`, `experienceMaxYears` | Requested experience range |
| `salaryMinLakh`, `salaryMaxLakh` | Annual lakh-INR range when disclosed |
| `salaryDisclosed` | Whether a salary range is public |
| `skills` | Public skills and tags |
| `descriptionText` | Cleaned full description when enrichment is enabled |
| `descriptionHtml` | Original public description markup |
| `postedAt` | Posting timestamp in ISO 8601 format |
| `category` | Normalized IIMJobs specialist category |
| `workFromHome`, `premium` | Public source flags |
| `applications`, `views` | Public counters when available |
| `recruiterName`, `recruiterDesignation` | Public recruiter fields when displayed |
| `url` | Canonical public job URL |
| `source`, `scrapedAt` | Source attribution and collection timestamp |

Fields unavailable or hidden by IIMJobs are returned as `null`; hidden salary is
never guessed. Detail-only fields are `null` when `includeDescription` is false.

### How to get started

1. Open the Actor in Apify Console.
2. Enter a `query`, such as `investment banking` or `financial analysis`.
3. Optionally choose categories, location, experience, and posting-age filters.
4. Keep `includeDescription` enabled for full job records, or disable it for a
   faster summary feed.
5. Set `maxItems` to the maximum number of unique jobs you need.
6. Click **Start**.
7. Open the **Dataset** tab and export the result in your preferred format.

For one known vacancy, omit `query` and place the public job page in `startUrls`.
You can also combine exact URLs with a search in one run.

### Input parameters

| Input | Type | Default | Description |
| --- | --- | --- | --- |
| `query` | string | — | Role, skill, employer, or qualification keywords |
| `categories` | string\[] | all | IIMJobs specialist categories to search |
| `location` | string | — | Case-insensitive text contained in a public location |
| `minExperience` | integer | — | Minimum acceptable experience overlap |
| `maxExperience` | integer | — | Maximum acceptable experience overlap |
| `postedWithinDays` | integer | — | Keep jobs posted within 1–365 days |
| `startUrls` | URL\[] | `[]` | Specific public `iimjobs.com` job pages |
| `includeDescription` | boolean | `true` | Fetch full detail data for each accepted job |
| `maxItems` | integer | `50` | Save at most 1–1,000 unique jobs |

Provide at least one non-empty `query` or one `startUrls` entry. Unsupported
domains and URLs without a terminal numeric IIMJobs job ID are rejected.

### Search example

```json
{
  "query": "investment banking",
  "categories": ["banking-finance"],
  "includeDescription": false,
  "maxItems": 10
}
```

This mode is useful for a low-transfer vacancy snapshot. Summary records still
include employer, locations, experience, disclosed salary, skills, and URL.

### Exact URL example

```json
{
  "startUrls": [
    {
      "url": "https://www.iimjobs.com/j/fis-global-business-solutions-analystsenior-lead-financial-planning-analysis-1729810"
    }
  ],
  "includeDescription": true,
  "maxItems": 1
}
```

Search filters also apply to explicit URLs when both routes are combined.
Duplicate job IDs are saved once.

### Recurring recruiting-feed example

```json
{
  "query": "financial analysis",
  "categories": ["banking-finance"],
  "postedWithinDays": 30,
  "includeDescription": true,
  "maxItems": 100
}
```

Schedule this input daily or weekly in Apify. Keep each run dataset, then compare
`jobId` and selected fields in your destination to identify additions or edits.
The Actor itself does not send alerts or maintain a cross-run change database.

### Output example

A current enriched run returns records shaped like this (long description fields
are shortened here):

```json
{
  "jobId": 1729810,
  "title": "FIS Global Business Solutions - Analyst/Senior Lead - Financial Planning & Analysis",
  "designation": "Analyst/Senior Lead - Financial Planning & Analysis",
  "employer": "FIS",
  "employerId": 3437,
  "locations": ["Gurgaon/Gurugram"],
  "experienceMinYears": 10,
  "experienceMaxYears": 20,
  "salaryMinLakh": null,
  "salaryMaxLakh": null,
  "salaryDisclosed": false,
  "skills": ["Financial Analysis", "Financial Planning", "Budgeting"],
  "descriptionText": "Analyst Sr Lead, Financial Planning & Analysis…",
  "postedAt": "2026-09-03T06:30:00.000Z",
  "category": "banking-finance",
  "workFromHome": false,
  "premium": true,
  "url": "https://www.iimjobs.com/j/fis-global-business-solutions-analystsenior-lead-financial-planning-analysis-1729810",
  "source": "iimjobs.com",
  "scrapedAt": "2026-09-03T14:30:00.000Z"
}
```

Use the dataset schema's `overview` view for the most useful columns. The full
JSON export retains every documented field.

### How much does it cost to export IIMJobs vacancies?

The Actor uses pay-per-event pricing: one small `start` event per run and one
`item` event for each vacancy saved. Rejected, duplicate, or failed records do
not create an item event. Tier prices decrease automatically at larger account
usage levels; Console shows your applicable tier before the run.

At the BRONZE rate, the start event is **$0.005** and each saved job is
**$0.003428**. Example totals are approximately:

- 1 job: **$0.008428**
- 10 jobs: **$0.03928**
- 100 jobs: **$0.34780**

Apify platform usage is included in this pricing model. Final billed totals can
vary by the pricing tier applicable to your account. Set `maxItems` to create a
clear upper bound on result-event charges.

### Performance and cost tips

- Set `includeDescription: false` when listing-card fields are sufficient.
- Use a focused query and categories to avoid irrelevant candidates.
- Apply `location`, experience, and posting-age filters before increasing limits.
- Start with 10–50 items when testing a new pipeline.
- Prefer one scheduled run with the required limit over many tiny runs because
  each run has one start event.
- The direct HTTP implementation normally fits the configured 256 MB memory.

### Integrations and workflows

#### Google Sheets or Excel

Run the Actor, open the dataset, and export CSV or XLSX. For recurring work,
connect the dataset API to an automation that upserts by `jobId`.

#### ATS or recruiting database

Map `jobId` to the external source ID, `title` to role, `employer` to company,
`locations` to workplace, and `url` to source link. Review source data before
moving any person or vacancy into an automated decision process.

#### n8n, Make, and Zapier

Trigger the Actor on a schedule, wait for completion, retrieve default dataset
items, then filter or route rows downstream. Use `jobId` for deduplication.

#### Data warehouse

Append each run with `scrapedAt` as snapshot time. This supports vacancy counts,
skill trends, location distributions, experience demand, and disclosed-salary
analysis without asking the Actor to infer missing values.

### Run with the Apify API using cURL

Replace `YOUR_APIFY_TOKEN` with a secret or environment variable:

```bash
curl -X POST \
  "https://api.apify.com/v2/acts/automation-lab~iimjobs-job-listings-scraper/run-sync-get-dataset-items?token=YOUR_APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"query":"investment banking","categories":["banking-finance"],"includeDescription":false,"maxItems":10}'
```

Do not commit tokens to source control or include them in public task inputs.

### Run with JavaScript

```javascript
import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('automation-lab/iimjobs-job-listings-scraper').call({
    query: 'financial analysis',
    categories: ['banking-finance'],
    postedWithinDays: 30,
    includeDescription: true,
    maxItems: 50,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);
```

### Run with Python

```python
import os
from apify_client import ApifyClient

client = ApifyClient(os.environ["APIFY_TOKEN"])
run = client.actor("automation-lab/iimjobs-job-listings-scraper").call(run_input={
    "query": "financial analysis",
    "categories": ["banking-finance"],
    "includeDescription": True,
    "maxItems": 50,
})
items = client.dataset(run["defaultDatasetId"]).list_items().items
print(items)
```

### Use with MCP and AI agents

Add the Apify MCP server to Claude Code:

```bash
claude mcp add --transport http apify \
  "https://mcp.apify.com?tools=automation-lab/iimjobs-job-listings-scraper"
```

#### Claude Desktop setup

Add the following MCP server configuration in Claude Desktop.

#### Cursor setup

Use the same JSON in Cursor's MCP settings.

#### VS Code setup

Use the same server URL in your VS Code MCP configuration.

```json
{
  "mcpServers": {
    "apify": {
      "url": "https://mcp.apify.com?tools=automation-lab/iimjobs-job-listings-scraper"
    }
  }
}
```

Example prompts:

- “Find 20 public IIMJobs investment banking vacancies and return employer,
  location, experience, skills, and URL.”
- “Extract this public IIMJobs job URL and summarize its required experience.”
- “Create a dataset of recent financial analysis roles for my recruiting feed.”

Treat model-generated summaries as derived content and retain the source URL for
verification.

### Scheduling and change monitoring

Use an Apify schedule to run a stable input daily or weekly. Send each completed
dataset to your own spreadsheet, database, or automation. Compare records by
`jobId`; use `postedAt` and selected field values to decide what changed.

A listing can disappear, expire, or be edited between runs. The Actor does not
claim that absence proves a role was filled, and it does not preserve deleted
pages unless you retain prior datasets.

### Limitations

- Only public anonymous IIMJobs data is collected.
- The Actor does not log in, apply to jobs, download resumes, or contact people.
- Salary fields are `null` when the source hides or omits compensation.
- Public counters and recruiter fields may be absent.
- Search relevance and vacancy order are controlled by IIMJobs.
- Large all-category searches can require several source requests.
- Source API or field changes can temporarily require Actor maintenance.
- No residential or browser fallback is enabled; unexpected blocks fail clearly.
- This is a data extraction tool, not a guarantee that a vacancy remains open.

### Responsible use and legality

IIMJobs and the displayed vacancies belong to their respective owners. Collect
only public data you are authorized to use. Follow applicable website terms,
robots guidance, database rights, privacy law, employment law, and contractual
obligations. Do not use public recruiter information for spam or harassment.

You are responsible for retention, sharing, automated-decision, and outreach
practices in downstream systems. Avoid inferring sensitive traits or making
employment decisions solely from scraped data.

### Troubleshooting

#### The run fails before making requests

Provide a non-empty `query` or at least one supported public job URL. Check that
experience values are integers from 0 to 50 and that the minimum is not greater
than the maximum.

#### A specific URL is rejected

Use a public `https://www.iimjobs.com/j/...-NUMERIC_ID` URL. Search pages,
category pages, other domains, and URLs without a terminal job ID are not exact
job inputs.

#### The dataset is empty

The query and filters may have no current public matches. Remove optional
filters, broaden the category set, or test a known current role. A valid natural
no-result search succeeds with an empty dataset.

#### Some descriptions are null

Set `includeDescription` to true. If it is already true, the source may not
publish a description for that record.

#### The source returns an error

Transient network, rate-limit, and server errors are retried up to three times.
A persistent block or unexpected response fails the run so a scheduled workflow
can alert on the failure rather than ingesting false empty data.

### Frequently asked questions

#### Does it need an IIMJobs account?

No. It uses anonymous public vacancy data and does not access user accounts.

#### Does it use a proxy?

No automatic proxy is configured. The current direct public HTTP route is both
simpler and less expensive.

#### Can I scrape one job page?

Yes. Put one or more supported public job URLs in `startUrls`.

#### Can I filter by city?

Yes. `location` performs case-insensitive containment against locations shown by
IIMJobs. For example, `Bengaluru` keeps records with that displayed location.

#### Can it disclose hidden salary?

No. Hidden or unavailable compensation remains `null`, and
`salaryDisclosed` is false.

#### Can it send alerts for new jobs?

Schedule the Actor and compare datasets in your destination. Alerting and
cross-run state are intentionally left to the integration layer.

#### How do I avoid duplicates?

The Actor deduplicates jobs by `jobId` within a run. Use the same field as an
upsert key across scheduled runs.

### Related Automation Lab Actors

- [Instahyre Jobs Scraper](https://apify.com/automation-lab/instahyre-jobs-scraper)
  for public India technology-job search feeds.
- [Cutshort Jobs Scraper](https://apify.com/automation-lab/cutshort-jobs-scraper)
  for another India-focused recruiting source.
- [HiringCafe Jobs Scraper](https://apify.com/automation-lab/hiringcafe-jobs)
  for normalized public vacancy search across HiringCafe.

Use separate source Actors when you need source attribution and field fidelity.
Combine their datasets downstream only after defining your own normalization and
deduplication rules.

### Support

For a reproducible problem, include the Actor run URL, redacted input, expected
result, and the first relevant log error. Never include Apify tokens, private
credentials, or personal data in a support message.

# Actor input Schema

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

Role, skill, employer, or other vacancy keywords, for example financial planning or MBA.

## `categories` (type: `array`):

Search only these IIMJobs specialist categories. By default all categories are searched.

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

Keep jobs whose public location contains this text, for example Bengaluru or Gurgaon.

## `minExperience` (type: `integer`):

Keep jobs whose experience range reaches at least this many years.

## `maxExperience` (type: `integer`):

Keep jobs whose experience range starts at no more than this many years.

## `postedWithinDays` (type: `integer`):

Keep vacancies posted within this many days.

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

Optional public iimjobs.com job pages to extract. These can be combined with a search query.

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

Fetch each public job detail and include description, applications, views, and recruiter fields.

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

Maximum unique vacancy records saved to the dataset.

## Actor input object example

```json
{
  "query": "financial analyst",
  "categories": [
    "banking-finance",
    "sales-marketing",
    "consulting",
    "hr-ir",
    "it-systems",
    "scm-operations",
    "legal",
    "bpo",
    "genai"
  ],
  "startUrls": [],
  "includeDescription": true,
  "maxItems": 10
}
```

# Actor output Schema

## `dataset` (type: `string`):

All vacancy records saved by this run.

# 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 = {
    "query": "financial analyst",
    "startUrls": [],
    "includeDescription": true,
    "maxItems": 10
};

// Run the Actor and wait for it to finish
const run = await client.actor("automation-lab/iimjobs-job-listings-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 = {
    "query": "financial analyst",
    "startUrls": [],
    "includeDescription": True,
    "maxItems": 10,
}

# Run the Actor and wait for it to finish
run = client.actor("automation-lab/iimjobs-job-listings-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 '{
  "query": "financial analyst",
  "startUrls": [],
  "includeDescription": true,
  "maxItems": 10
}' |
apify call automation-lab/iimjobs-job-listings-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,automation-lab/iimjobs-job-listings-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/ovEel8uStC1dGg40p/builds/qyTI6wVE0sHpKL5ic/openapi.json
