# India Jobs Scraper - Shine, Hirist, Internshala & 3 more (`upendra_11/india-jobs-aggregator`) Actor

Search 6 Indian job boards at once (Shine, Hirist, iimjobs, Internshala, Cutshort, Unstop). Get jobs and internships with salary, experience, skills, location and posted date in one clean format, with duplicates merged and a monitoring mode for new jobs only.

- **URL**: https://apify.com/upendra_11/india-jobs-aggregator.md
- **Developed by:** [Upendra Kumar](https://apify.com/upendra_11) (community)
- **Categories:** Jobs, Automation, AI
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per event

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

## India Jobs Scraper: Shine, Hirist, iimjobs, Internshala, Cutshort & Unstop in one run

Search **6 Indian job boards at once** and get every job in **one clean, consistent format**, with duplicates merged across boards:

| Board | Best for |
|---|---|
| **Shine.com** | All sectors, all experience levels |
| **Hirist** | Tech / IT jobs |
| **iimjobs** | Management, finance, sales, consulting, business roles |
| **Internshala** | Fresher jobs and internships |
| **Cutshort** | Startup and product-company jobs (with company size and stage) |
| **Unstop** | Graduate, fresher and campus jobs and internships |

**Why use this instead of 6 separate scrapers:**

- ✅ **One input, one output:** the same fields for every board. No more cleaning six different formats.
- ✅ **Normalized data:** salary in ₹ as numbers (lakh labels converted), experience in years, ISO posted dates, skill lists.
- ✅ **Duplicate merging:** the same role at the same company in the same city is returned once, with the other boards in `alsoListedOn`.
- ✅ **Relevance filter:** a "python developer" search drops the loosely related results that some boards return.
- ✅ **Monitoring mode:** schedule it daily and receive **only new jobs**. Ideal for job alerts, recruiters and job portals.
- ✅ **Fast and light:** no browser, no login, no personal data. Recruiter names and contact details are never collected.

### Who uses it

- 🧑‍💼 **Recruiters and staffing agencies:** see who is hiring for which skills, where, and at what salary.
- 📣 **Job alert channels and job portals:** auto-post fresh jobs to Telegram, WhatsApp, Discord, Slack or your website every day.
- 🎓 **Colleges and placement cells:** daily feeds of fresher jobs and internships for students.
- 📊 **HR-tech and market research:** salary benchmarks, in-demand skills, and hiring trends by city.
- 🤖 **AI agents and job-search assistants:** a single reliable tool for "find remote data-analyst jobs in India posted this week".

### How to use

1. Enter one or more **keywords** (e.g. `python developer`, `data analyst`, `digital marketing`, `accountant`).
2. Optionally add **locations** (`Bangalore`, `Pune`, `Delhi NCR`, `remote`, …). Common spellings like Bengaluru and Gurugram are understood.
3. Choose **job boards** (all by default) and **job types** (jobs and/or internships).
4. Click **Start**, then download the results as JSON, CSV or Excel, or use the API.

#### Daily "new jobs only" alerts

1. Turn on **Only new since last run** and set a **Monitor name** (e.g. `python-bangalore`).
2. In Apify Console, add a **Schedule** (e.g. every morning at 8:00).
3. Add an integration (Slack, Google Sheets, email or a webhook). Each run then sends only jobs you haven't seen before.

### Input example

```json
{
  "keywords": ["data analyst", "business analyst"],
  "locations": ["Bangalore", "remote"],
  "jobTypes": ["jobs"],
  "maxResultsPerSource": 50,
  "postedWithinDays": 7,
  "maxExperienceYears": 3
}
```

| Field | What it does | Default |
|---|---|---|
| `keywords` | Job titles or skills to search | `["python developer"]` |
| `locations` | Cities, or `remote`; empty means all of India | all |
| `sources` | `shine`, `hirist`, `iimjobs`, `internshala`, `cutshort`, `unstop` | all six |
| `jobTypes` | `jobs` and/or `internships` | `["jobs"]` |
| `maxResultsPerSource` | Max jobs per board for each keyword/location | `50` |
| `postedWithinDays` | Only jobs posted in the last N days (0 = any) | `0` |
| `maxExperienceYears` | Skip jobs needing more experience (0 = freshers) | none |
| `deduplicate` | Merge the same job across boards | `true` |
| `strictKeywordMatch` | Drop loosely related results | `true` |
| `includeDescription` | Add a short description where available | `false` |
| `onlyNewSinceLastRun` / `monitorName` | Monitoring mode | `false` |

### Output example

```json
{
  "id": "hirist:1678260",
  "source": "hirist",
  "title": "Python Developer",
  "company": "Infrrd Pvt Ltd",
  "jobType": "job",
  "locations": ["Bangalore"],
  "isRemote": false,
  "experienceMinYears": 4,
  "experienceMaxYears": 6,
  "salaryMin": null,
  "salaryMax": null,
  "skills": ["Generative AI", "Python", "LangChain"],
  "postedAt": "2026-10-14T04:47:42+00:00",
  "applicants": 120,
  "url": "https://www.hirist.tech/j/infrrd-ai-python-developer-generative-ai-1678260",
  "alsoListedOn": [],
  "searchKeyword": "python developer",
  "scrapedAt": "2026-10-15T14:00:00+00:00"
}
```

Example with a disclosed salary (Shine): `"salaryMin": 150000, "salaryMax": 500000, "salaryPeriod": "year", "salaryText": "1.5 - 5 Lakh/Yr"`.

**All output fields:**

- **Identity and source:** `id`, `source`, `sourceJobId`, `url`, `alsoListedOn`
- **Role and company:** `title`, `company`, `companyLogo`, `jobType`, `employmentType`, `companySize`, `companyStage`
- **Location and experience:** `locations`, `isRemote`, `experienceMinYears`, `experienceMaxYears`
- **Salary:** `salaryMin`, `salaryMax`, `salaryCurrency`, `salaryPeriod`, `salaryText`
- **Details:** `skills`, `postedAt`, `postedText`, `applicants`, `description`
- **Search context:** `searchKeyword`, `searchLocation`, `scrapedAt`

**Notes:**

- Not every board shows every field. Missing values are `null`; for example, many employers hide salaries.
- Dates from "x days ago" labels (Internshala) are approximate.

### Pricing

**Pay per result: $3.00 per 1,000 jobs**, plus a tiny per-run start fee. No monthly rental.

- 100 jobs ≈ $0.30
- A daily monitor returning ~50 new jobs ≈ $4.50/month

That's one price for six boards, deduplicated, often cheaper than running one single-board scraper. You can set a **maximum cost per run** in the run options, and the Actor stops cleanly when it's reached.

### FAQ

**Is it legal?**
The Actor reads only publicly available job listings (company and job information), respects each site's robots.txt, uses polite request rates, and never collects personal data such as recruiter names, emails or phone numbers. Please use the data in line with each site's terms and applicable law.

**Why isn't Naukri, Indeed or Foundit included?**
They block automated access, or their robots.txt disallows it. This Actor sticks to boards that can be read reliably and responsibly.

**Why do some boards return fewer jobs?**
Board inventory varies by keyword and city. The strict keyword filter also removes unrelated results; turn it off for broader matching. Cutshort shows at most 50 jobs per search page.

**Need another board, field or filter?**
Open an issue on the **Issues** tab.

# Actor input Schema

## `keywords` (type: `array`):

What to search for, one per line: job titles or skills, e.g. 'python developer', 'data analyst', 'digital marketing', 'accountant'. Each keyword is searched on every selected board.

## `locations` (type: `array`):

Optional cities, e.g. 'Bangalore', 'Pune', 'Delhi NCR', 'Mumbai'. Common spellings are understood (Bengaluru = Bangalore, Gurugram = Gurgaon). Use 'remote' for work-from-home jobs. Leave empty for all of India.

## `sources` (type: `array`):

Which job boards to search. All are selected by default.

## `jobTypes` (type: `array`):

Full-time jobs, internships, or both. Internships come from Internshala and Unstop.

## `maxResultsPerSource` (type: `integer`):

Maximum jobs collected from each board for each keyword/location. Cutshort shows at most 50 per search.

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

Only jobs posted in the last N days (where the board shows a date). 0 = any date.

## `maxExperienceYears` (type: `integer`):

Skip jobs whose minimum required experience is above this. Use 0 for fresher jobs only. Leave empty for no limit.

## `deduplicate` (type: `boolean`):

When the same role at the same company appears on several boards, return it once and list the other boards in 'alsoListedOn'.

## `strictKeywordMatch` (type: `boolean`):

Keep only jobs whose title, skills or description contain your keyword's main terms (e.g. 'python' for 'python developer'). Removes loosely related results some boards return.

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

Add a short description snippet (up to 500 characters) where the board provides one.

## `onlyNewSinceLastRun` (type: `boolean`):

Monitoring mode: return only jobs this Actor has not returned before in your account. Perfect for scheduled daily runs feeding job alerts, Slack, Telegram, Google Sheets or a database.

## `monitorName` (type: `string`):

Use a different name for each separate monitor (e.g. 'python-bangalore', 'marketing-remote') so they track seen jobs independently.

## Actor input object example

```json
{
  "keywords": [
    "python developer"
  ],
  "locations": [],
  "sources": [
    "shine",
    "hirist",
    "iimjobs",
    "internshala",
    "cutshort",
    "unstop"
  ],
  "jobTypes": [
    "jobs"
  ],
  "maxResultsPerSource": 50,
  "postedWithinDays": 0,
  "deduplicate": true,
  "strictKeywordMatch": true,
  "includeDescription": false,
  "onlyNewSinceLastRun": false,
  "monitorName": "default"
}
```

# 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 = {
    "keywords": [
        "python developer"
    ],
    "locations": []
};

// Run the Actor and wait for it to finish
const run = await client.actor("upendra_11/india-jobs-aggregator").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 = {
    "keywords": ["python developer"],
    "locations": [],
}

# Run the Actor and wait for it to finish
run = client.actor("upendra_11/india-jobs-aggregator").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 '{
  "keywords": [
    "python developer"
  ],
  "locations": []
}' |
apify call upendra_11/india-jobs-aggregator --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,upendra_11/india-jobs-aggregator"
        }
    }
}
```

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/Y2STq61Mq7UqKlbjh/builds/ndsTEsurcGoILHajJ/openapi.json
