# Internshala Scraper: Applicants per Opening & Deadline Alerts (`getascraper/internshala-scraper`) Actor

Scrape Internshala internships and fresher jobs with applicants per opening, stipend, deadline and employer hiring history. Find low-competition openings, then schedule runs to catch new posts, changed stipends, closing deadlines, applicant surges and closed openings.

- **URL**: https://apify.com/getascraper/internshala-scraper.md
- **Developed by:** [GetAScraper](https://apify.com/getascraper) (community)
- **Categories:** Jobs, Lead generation, Automation
- **Features:** Limited permissions
- **Stats:** 379 total users, 145 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.29 / 1,000 job leads

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?

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

## 🎓 Internshala Scraper: Applicants per Opening & Deadline Alerts

<table width="100%" style="display:table;width:100%;border-collapse:separate;border-spacing:0;table-layout:fixed;margin-bottom:0">
<tr>
<td colspan="4" style="padding:10px 14px;background:#0F766E;border:none;border-top:3px solid #0F766E;border-left:1px solid #D6D3D1;border-right:1px solid #D6D3D1;color:#FFFFFF;border-radius:10px 10px 0 0">
<span style="color:#FFFFFF;font-size:14px;font-weight:700;letter-spacing:0.5px">INDIA JOBS SUITE</span>
<span style="color:#FFFFFF;font-size:13px">&nbsp;&nbsp;&bull;&nbsp;&nbsp;Public job-listing data for recurring hiring research.</span>
</td>
</tr>
<tr>
<td style="padding:10px 12px;border:none;border-left:1px solid #D6D3D1;border-bottom:1px solid #D6D3D1;vertical-align:top;width:25.0%;background:#FFFFFF;color:#1C1917">
<span style="overflow-wrap:break-word;word-break:break-word"><img src="https://apify-image-uploads-prod.s3.us-east-1.amazonaws.com/jNDbFabbVxMhnQNb4-actor-Bqf3sZlaZvWnVZbe1-X4r5SBrUub-CompressJPEG.Online_img%28512x512%29_%2813%29.jpg" width="20" height="20" style="vertical-align:middle;border-radius:4px">&nbsp;<a href="https://apify.com/getascraper/apna-co-scraper" style="color:#1C1917;text-decoration:none;font-weight:700;font-size:13px">Apna.co Jobs</a></span><br>
<span style="color:#57534E;font-size:11px">Blue and grey collar roles</span>
</td>
<td style="padding:10px 12px;border:none;border-left:1px solid #D6D3D1;border-bottom:1px solid #D6D3D1;vertical-align:top;width:25.0%;background:#F0FDFA;color:#1C1917">
<span style="overflow-wrap:break-word;word-break:break-word"><img src="https://apify-image-uploads-prod.s3.us-east-1.amazonaws.com/jNDbFabbVxMhnQNb4-actor-4dMyE80KpfCIKroD4-AeB3jBrmgG-ChatGPT_Image_Sep_10__2026__08_22_23_PM.png" width="20" height="20" style="vertical-align:middle;border-radius:4px">&nbsp;<a href="https://apify.com/getascraper/internshala-scraper" style="color:#0F766E;text-decoration:none;font-weight:700;font-size:13px">Internshala Scraper</a></span><br>
<span style="color:#0F766E;font-size:11px;font-weight:700">&#10148; You are here</span>
</td>
<td style="padding:10px 12px;border:none;border-left:1px solid #D6D3D1;border-bottom:1px solid #D6D3D1;vertical-align:top;width:25.0%;background:#FFFFFF;color:#1C1917">
<span style="overflow-wrap:break-word;word-break:break-word"><img src="https://apify-image-uploads-prod.s3.us-east-1.amazonaws.com/jNDbFabbVxMhnQNb4-actor-M5Myh7i6WMTmfwMlw-NCEUGam6gM-logo_200_200.webp" width="20" height="20" style="vertical-align:middle;border-radius:4px">&nbsp;<a href="https://apify.com/getascraper/instahyre-jobs-scraper" style="color:#1C1917;text-decoration:none;font-weight:700;font-size:13px">Instahyre Jobs</a></span><br>
<span style="color:#57534E;font-size:11px">Tech jobs and hiring alerts</span>
</td>
<td style="padding:10px 12px;border:none;border-left:1px solid #D6D3D1;border-right:1px solid #D6D3D1;border-bottom:1px solid #D6D3D1;vertical-align:top;width:25.0%;background:#FFFFFF;color:#1C1917">
<span style="overflow-wrap:break-word;word-break:break-word"><img src="https://apify-image-uploads-prod.s3.us-east-1.amazonaws.com/jNDbFabbVxMhnQNb4-actor-8hG15V7QtjKUpwAt3-GucaVgd5Jo-s11728_indian_flag_logo_isolated_on_white_background_-styliz_104" width="20" height="20" style="vertical-align:middle;border-radius:4px">&nbsp;<a href="https://apify.com/getascraper/india-job-inventory-feed" style="color:#1C1917;text-decoration:none;font-weight:700;font-size:13px">India Job Feed</a></span><br>
<span style="color:#57534E;font-size:11px">Combined multi-source job inventory</span>
</td>
</tr>
</table>
<table width="100%" style="display:table;width:100%;border-collapse:separate;border-spacing:0;margin-top:0;margin-bottom:0">
<tr>
<td style="padding:24px 28px;background:#F0FDFA;border:1px solid #99F6E4;border-top:none;color:#1C1917">
<span style="font-size:23px;font-weight:800;color:#1C1917;line-height:1.3">Apply where your odds are good, and never miss a closing deadline</span><br>
<span style="font-size:15px;color:#57534E;line-height:1.6">Collect public Internshala internships and fresher jobs with applicants per opening, an applicant pressure label, parsed stipends, deadlines and employer hiring history. Then schedule the same search to be alerted about new posts, stipend changes, closing deadlines, applicant surges and closed openings.</span>
</td>
</tr>
</table>
<table width="100%" style="display:table;width:100%;border-collapse:separate;border-spacing:0;margin-top:0"><tr>
<td style="padding:14px 12px;width:25%;background:#FFFFFF;border:1px solid #99F6E4;vertical-align:top;border-top:none;color:#1C1917;border-radius:0 0 0 10px"><span style="font-size:15px;font-weight:800;color:#115E59">&#247; Real competition</span><br><span style="font-size:12px;color:#57534E">Applicants per opening, a pressure label from very low to extreme, and a 0 to 100 score.</span></td>
<td style="padding:14px 12px;width:25%;background:#FFFFFF;border:1px solid #99F6E4;border-left:none;vertical-align:top;border-top:none;color:#1C1917"><span style="font-size:15px;font-weight:800;color:#115E59">&#128197; Deadline radar</span><br><span style="font-size:12px;color:#57534E">Deadline date, days left and a closing-soon status on every detailed listing.</span></td>
<td style="padding:14px 12px;width:25%;background:#FFFFFF;border:1px solid #99F6E4;border-left:none;vertical-align:top;border-top:none;color:#1C1917"><span style="font-size:15px;font-weight:800;color:#115E59">&#128276; Monitor mode</span><br><span style="font-size:12px;color:#57534E">Schedule a named monitor and get only what is new, changed, surging or closed.</span></td>
<td style="padding:14px 12px;width:25%;background:#FFFFFF;border:1px solid #99F6E4;border-left:none;vertical-align:top;border-top:none;color:#1C1917;border-radius:0 0 10px 0"><span style="font-size:15px;font-weight:800;color:#115E59">&#10003; Honest fields</span><br><span style="font-size:12px;color:#57534E">Missing values stay missing. No guessed or padded data.</span></td>
</tr></table>

### 🔍 What does Internshala Scraper do?

**Internshala Scraper** collects public internship and fresher job listings from [Internshala](https://internshala.com/) and turns them into a decision-ready dataset. Every row has the role, company, location, parsed stipend or salary range, duration or experience, skills and posting age. Switch on **Fetch applicants and deadlines** and each row also gets how many people applied, how many openings exist, the ratio between them, an applicant pressure label, the application deadline, the start date and the employer's hiring history.

A listing with 40 applicants and 40 openings is a far better bet than one with 40 applicants and 2 openings. Raw counts do not show that, so the ratio and the pressure label are computed for you. Filters can then keep only the roles worth applying to, for example remote data internships with at most 15 applicants per opening that close in the next week.

For recurring tracking, give the run a **monitor name** and schedule it. Each run remembers what it saw before and reports only new listings, changed stipends, deadlines that are about to pass, applicant surges and openings that disappeared.

### 🎯 Who is this for?

**Students and fresh graduates.** You can only apply carefully to a handful of roles. Sorting by applicants per opening and filtering on deadline shows which listings still have room and which are already crowded.

**Placement cells and career platforms.** Build a daily digest of low-competition, well-paid and closing-soon opportunities for your students or users, including employer history so you know who actually hires.

**Recruiters, hiring researchers and market analysts.** Track which companies post, how stipends and salaries move, which skills are in demand and how fast applicant counts grow, without opening listings one by one. Turn on the employer contact email add-on to reach the companies that are hiring right now.

### 🚀 How to collect Internshala listings

<table width="100%" style="display:table;width:100%;border-collapse:separate;border-spacing:0;margin-top:0;margin-bottom:0"><tr>
<td style="padding:16px 14px;width:33%;background:#F0FDFA;border:1px solid #99F6E4;border-radius:10px 0 0 10px;vertical-align:top;color:#1C1917"><span style="font-size:12px;font-weight:800;color:#0F766E;letter-spacing:1px">STEP 1</span><br><span style="font-size:14px;font-weight:700;color:#1C1917">Choose what to search</span><br><span style="font-size:12px;color:#57534E">Pick internships, jobs or both. Add keywords, cities, skills, stipend, duration and badge filters.</span></td>
<td style="padding:16px 14px;width:33%;background:#F0FDFA;border:1px solid #99F6E4;border-left:none;vertical-align:top;color:#1C1917"><span style="font-size:12px;font-weight:800;color:#0F766E;letter-spacing:1px">STEP 2</span><br><span style="font-size:14px;font-weight:700;color:#1C1917">Add the competition filter</span><br><span style="font-size:12px;color:#57534E">Set <strong>Max applicants per opening</strong> or <strong>Closing within days</strong>. Applicant and deadline data is fetched automatically.</span></td>
<td style="padding:16px 14px;width:33%;background:#F0FDFA;border:1px solid #99F6E4;border-left:none;border-radius:0 10px 10px 0;vertical-align:top;color:#1C1917"><span style="font-size:12px;font-weight:800;color:#0F766E;letter-spacing:1px">STEP 3</span><br><span style="font-size:14px;font-weight:700;color:#1C1917">Run once or schedule it</span><br><span style="font-size:12px;color:#57534E">Download the dataset, or add a <strong>monitor name</strong> and schedule the run for alerts.</span></td>
</tr></table>

To start in seconds, leave the default input and press Start: you get the 25 newest matching internships with stipend, skills and location. To see competition, turn on **Fetch applicants and deadlines**.

### ⚙️ Input

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `mode` | enum | No | `internships`, `jobs` or `both`. With `both`, the result limit is shared between the two feeds. Public `startUrls` derive their mode from the URL. Default: `internships`. |
| `startUrls` | array of URLs | No | Public Internshala internships, jobs or fresher-jobs listing pages. They replace automatic source construction; record-level filters still apply. |
| `keyword` | string | No | Role or keyword matched against title, company, summary and skills. Also selects the matching Internshala keyword results. |
| `keywords` | array of strings | No | More roles searched in the same run, for example Python, React, Marketing. Results are de-duplicated across keywords. |
| `locations` | array of strings | No | Keep only listings whose location contains one of these cities. Work from home does not count as a city match. |
| `category` | string | No | Internship category, for example `Computer Science`. Internships mode only; cannot be combined with `startUrls`. |
| `workFromHome` | boolean | No | Keep only listings marked as work from home. Default: `false`. |
| `partTime` | boolean | No | Keep only listings marked as part time. Default: `false`. |
| `datePosted` | enum | No | Posted within `all`, `24h`, `3d`, `7d` or `30d`. Default: `all`. |
| `specialFilters` | array | No | Keep only listings with every selected badge: `actively_hiring`, `early_applicant`, `job_offer`. |
| `skills` | array of strings | No | Keep listings that list at least one of these skills, for example SQL or Figma. |
| `excludeKeywords` | array of strings | No | Drop listings whose title, company, summary or skills contain any of these words. |
| `minStipend` | integer | No | Minimum monthly internship stipend in INR. Unpaid or undisclosed stipends do not pass a positive minimum. |
| `minSalary` | integer | No | Minimum annual job salary in INR. |
| `maxDurationMonths` | integer | No | Maximum internship duration in months. `0` disables the filter. |
| `maxExperienceYears` | integer | No | Maximum required experience in years for jobs. `0` disables the filter. |
| `includeDetails` | boolean | No | Fetch applicants and deadlines: applicants per opening, pressure, deadline, openings, description, eligibility, perks, start date and employer history. Turns on by itself when you use a filter below that needs it. Default: `false`. |
| `maxApplicantsPerOpening` | integer | No | Keep listings with at most this many applicants per opening. Early applicant listings always pass. `0` disables the filter. |
| `maxApplicants` | integer | No | Keep listings with at most this many applicants so far. `0` disables the filter. |
| `minOpenings` | integer | No | Keep listings with at least this many open positions, useful for bulk hiring. `0` disables the filter. |
| `closingWithinDays` | integer | No | Keep listings whose deadline falls within this many days. In monitor mode it sets the closing-soon window (default 3 days). `0` disables the filter. |
| `monitorName` | string | No | Name of a recurring monitor, for example `data-internships-daily`. Runs with the same name and search share memory. Leave empty for a normal run. |
| `onlyChanges` | boolean | No | In monitor mode, return only new, changed, closing, surging or closed listings. Turn off to return every listing with its status. Default: `true`. |
| `surgePercent` | integer | No | In monitor mode, flag a listing when its applicants grew by at least this percent since the previous run. Default: `50`. |
| `enrichEmails` | boolean | No | Find employer contact email: looks for a public contact email on each employer's own website and adds it to every listing of that employer. Optional add-on, billed only when an email is found, once per company per run. Default: `false`. |
| `maxResults` | integer | No | Maximum listings returned. With several sources the limit is shared fairly between them. Default: `25`. |
| `sortBy` | enum | No | `relevance` (source order) or `newest`. Default: `relevance`. |
| `monitoringMode`, `monitoringStoreName`, `monitorScope` | various | No | Older change detection that keeps working for existing schedules. New schedules should use `monitorName`. |
| `maxConcurrency` | integer | No | Maximum parallel page requests. Default: `10`. |
| `proxyConfiguration` | object | Yes | Leave the default. The Actor picks the best connection by itself. |

Automatic source URLs use verified path-based Internshala patterns. Multi-category and multi-city listing URLs copied from Internshala (they contain commas) work as `startUrls`. URLs with query parameters or fragments, detail pages and login pages are rejected.

### 📊 Output

Each record contains only fields present on the public page or derived from them. The Actor does not fill missing values with `"Unknown"`, `"N/A"` or generic placeholders.

This example is a real public listing with applicants and deadlines turned on:

```json
{
    "id": "3316222",
    "dedupeId": "internshala:internships:3316222",
    "mode": "internships",
    "title": "Artificial Intelligence (AI)",
    "company": "Simpli Intern",
    "url": "https://internshala.com/internship/detail/work-from-home-part-time-artificial-intelligence-ai-internship-at-simpli-intern1791881325",
    "location": "Tamil Nadu",
    "isWorkFromHome": true,
    "isPartTime": true,
    "workMode": "remote",
    "skills": ["Python", "Artificial intelligence", "Effective Communication"],
    "stipendText": "₹ 20,000 - 35,000 /month",
    "stipendMin": 20000,
    "stipendMax": 35000,
    "durationMonths": 3,
    "postedAgo": "1 week ago",
    "postedDate": "2026-10-13",
    "startsImmediately": true,
    "openings": 250,
    "applicantCount": 94,
    "applicantsPerOpening": 0.38,
    "applicantPressure": "very_low",
    "competitionScore": 6,
    "avgApplicantsPerDay": 13.43,
    "applicationDeadlineDate": "2026-11-12",
    "daysToDeadline": 21,
    "deadlineStatus": "open",
    "employerHiringSince": "August 2026",
    "employerOpportunitiesPosted": 18,
    "detailsFetched": true
}
```

You can download the dataset in JSON, CSV, HTML or Excel format from Apify Console or via the API.

### 🗂️ Data fields

| Field | Type | Description |
| --- | --- | --- |
| `id`, `dedupeId`, `mode` | string | Internshala's listing ID, a stable `internshala:<mode>:<id>` key for deduplication, and `internships` or `jobs`. |
| `title`, `company`, `url` | string | Published listing identity and the public listing URL. |
| `companyLogo`, `location`, `summary` | string | Public card values when present. Placeholder logos are omitted. |
| `isWorkFromHome`, `isPartTime`, `workMode` | boolean / string | Work-from-home and part-time markers, plus `remote`, `hybrid` or `onsite`. |
| `stipendText`, `stipendMin`, `stipendMax`, `isUnpaid` | string / integer / boolean | Published monthly internship stipend and the parsed INR range. |
| `salaryText`, `salaryMin`, `salaryMax` | string / integer | Published annual job salary and the parsed INR range, including LPA notation. |
| `durationMonths`, `experienceMin`, `experienceMax` | integer | Published duration or required experience when parseable. |
| `skills`, `badges`, `isActivelyHiring` | array / boolean | Public skills list and card badges. |
| `postedAgo`, `postedDate`, `scrapedAt` | string | Relative posting age, exact posting date when available, and extraction time. |
| `description`, `eligibility`, `perks`, `aboutCompany`, `category`, `industry`, `employmentType` | various | Public listing-page details. Present when applicants and deadlines are fetched. |
| `openings`, `startDate`, `startsImmediately` | integer / string / boolean | Number of open positions and the start date. |
| `applicantCount`, `applicantCountIsLowerBound`, `isEarlyApplicant` | integer / boolean | Applicants so far. Absent when the listing shows "Be an early applicant" (genuinely low competition). The lower-bound flag marks capped counts such as 1000+. |
| `applicantsPerOpening` | number | Applicants divided by openings, rounded to 2 decimals. |
| `applicantPressure` | string | `very_low`, `low`, `moderate`, `high` or `extreme`, from the applicants per opening ratio. |
| `competitionScore`, `avgApplicantsPerDay` | number | A 0 to 100 competition score and the average applicants gained per day since posting. |
| `applicationDeadline`, `applicationDeadlineDate`, `daysToDeadline`, `deadlineStatus` | string / integer | Deadline as published, as an ISO date, days left, and `open`, `closing_soon` or `expired`. |
| `employerHiringSince`, `employerOpportunitiesPosted`, `employerCandidatesHired` | string / integer | Employer history shown on the listing page. Hired count appears on some listings only. |
| `employerEmail`, `employerEmailDomain` | string | Employer email add-on only: a public contact email published on the company's own website, and its domain. Left out when none is published. |
| `employerEmailKind` | string | Employer email add-on only: `generic` for a team address such as info@ or hr@, `named` for a person's address published by the company. |
| `employerEmailSourceUrl` | string | Employer email add-on only: the page of the company's website where the email was found. |
| `emailEnrichmentStatus` | string | Employer email add-on only: `found`, `not_found` (the company publishes no email we could confirm), `skipped` (not checked, for example a confidential employer or the run's spending limit) or `failed` (the company's website did not answer). |
| `changeType`, `alerts`, `changes`, `firstSeenAt` | string / array / object | Monitor mode only: `new`, `changed`, `unchanged`, `reopened` or `closed`, the alert list (`new`, `reopened`, `changed`, `closing_soon`, `applicant_surge`, `closed`), what changed, and first-seen time. |
| `applicantCountPrevious`, `applicantCountDelta`, `applicantTrend`, `applicantsPerDay` | integer / string / number | Monitor mode only: applicants at the last run, growth since, `rising`, `flat` or `falling`, and growth per day. |
| `daysTracked`, `closedAt`, `lastDeadline` | integer / string | Monitor mode only: how long the listing has been tracked, when it was seen closing, and its last known deadline. |

The default key-value store also holds a `run-summary` record, a `MARKET_PULSE` record (median stipend or salary, remote share, top skills and cities, pressure mix), an `EMPLOYER_ROLLUP` record (top employers with openings and average applicants per opening) and, in monitor mode, an `ALERT_SUMMARY` record with the counts per alert type.

### 🔔 How monitor mode works

Set `monitorName` to any name, for example `remote-data-internships`, and schedule the run daily. The first run saves a baseline and returns the matching listings. Every later run with the same name and the same search compares against it and returns only what matters:

- **New**: listings that were not there before.
- **Changed**: title, location, stipend, salary, duration, openings or deadline changed.
- **Closing soon**: the deadline is within your window (3 days by default, or `closingWithinDays`).
- **Applicant surge**: applicants grew by at least `surgePercent` since the last run.
- **Closed**: an opening that disappeared from the board on two consecutive full scans.

Different names and different searches never share state, so you can run several monitors side by side. Two monitor runs with the same name that overlap in time do not block each other. A partial run never overwrites the saved baseline. Turn off `onlyChanges` to get every listing with its status instead.

Applicant surge and closing-soon alerts need **Fetch applicants and deadlines**, so turn it on for monitors that should watch competition and deadlines (setting `closingWithinDays` turns it on automatically).

### 📧 Employer contact email (optional add-on)

Turn on **Find employer contact email** to get a public contact email for the companies behind your listings. For each employer, the Actor finds the company's own website and looks for a contact email it publishes there, such as info@, hr@ or careers@. When it finds one, every listing from that employer carries the same email.

- **Only real, published addresses.** Every email comes from a page on the company's own website, and `employerEmailSourceUrl` shows which page. Nothing is guessed, built from a name or taken from a job board or directory.
- **Not every employer has one.** Many companies, especially small ones, publish no email on their website. Those listings get `emailEnrichmentStatus: not_found` and no email field.
- **Privacy first.** When an employer name looks like a private person, only a general company address such as info@ is returned, never a personal mailbox.
- **Fair billing.** You pay only when an email is found, once per company per run, however many of its listings you collect. Lookups that find nothing cost nothing extra.
- **Off by default.** Leave it off and the run is exactly the same as before, with the same fields and the same price.

It works with every search, filter and monitor. In monitor mode with `onlyChanges` on (the default), unchanged listings are not returned, so they are not looked up or billed again. An email never counts as a change on its own.

### 💰 Pricing

Pricing is pay per result with no subscription. Empty runs and runs that match no listings cost nothing. Fetching applicants and deadlines, and the competition fields it unlocks, are billed as small separate events per listing, so a plain collection run stays the cheapest option. Check the Store pricing panel before a large run, and use `maxResults` to cap spend. The optional employer contact email is billed separately, only when an email is found and once per company per run.

### ⭐ Enjoying Internshala Scraper?

<table width="100%" style="display:table;width:100%;border-collapse:separate;border-spacing:0;margin-top:0;margin-bottom:0"><tr><td style="padding:20px 24px 14px;background:#F0FDFA;border:1px solid #99F6E4;border-left:5px solid #0F766E;border-radius:10px 10px 0 0;color:#1C1917"><span style="font-size:20px;letter-spacing:4px">⭐ ⭐ ⭐ ⭐ ⭐</span><br><span style="font-size:17px;font-weight:800;color:#1C1917">A review helps students and hiring teams find a smarter way to read the Internshala market.</span><br><span style="font-size:14px;color:#57534E">Tell us which field or workflow you found most useful.</span></td></tr><tr><td style="padding:0;background:#0F766E;border:1px solid #0F766E;border-left:5px solid #0F766E;border-top:none;border-radius:0 0 10px 10px;text-align:center;color:#FFFFFF"><a href="https://apify.com/getascraper/internshala-scraper/reviews" style="display:block;padding:13px 16px;color:#FFFFFF;text-decoration:none;font-weight:800;font-size:15px">&#9733;&nbsp;&nbsp;Rate this Actor on Apify</a></td></tr></table>

### 💡 Tips and advanced options

- Start with the default `maxResults: 25` while you validate a new filter combination, then raise it.
- To find low-competition roles, set `maxApplicantsPerOpening` to 10 or 15 and sort the dataset by `competitionScore`.
- To catch deadlines, set `closingWithinDays` and schedule the run daily with a `monitorName`.
- Use `keywords`, `skills` and `excludeKeywords` together to define a precise role, for example Python or SQL but not sales.
- Large detail runs are limited by compute, not by the website. If a run with hundreds of detail pages feels slow, raise the run memory to 1024 MB.
- Inspect the `run-summary` record when results look short. It reports pages read, filtered listings, warnings and monitor status.

### ❓ FAQ, disclaimer, and support

#### Does the Actor access private Internshala data?

No. It reads only public, logged-out listing pages. It does not log in, submit applications, or collect candidate or employer account data.

#### What does "Be an early applicant" mean in the data?

It means the listing shows no applicant count yet, which is the lowest competition signal available. The Actor sets `isEarlyApplicant: true` and leaves out `applicantCount` instead of recording a zero, and listings like this always pass applicant filters.

#### How should I read applicants per opening and the pressure label?

Lower is better for you. A ratio of 2.5 means about 2.5 people applied per open seat. The labels are `very_low` below 5, `low` below 15, `moderate` below 40, `high` below 100 and `extreme` above that. Some counts are capped by the website at 1000+, which is why `applicantCountIsLowerBound` exists. Fields that cannot be computed are left out.

#### Where do the employer emails come from?

Only from the company's own public website. The Actor confirms the website belongs to the employer before it reads it, and returns an address only when the company prints it there. `employerEmailSourceUrl` links to the exact page. It never guesses addresses, never builds them from names and never takes them from job boards or directories.

#### Why do some listings have no employer email?

Many companies do not publish a contact email on their website, and some websites do not answer. Those listings show `emailEnrichmentStatus: not_found` or `failed` and cost nothing extra. Listings from the same company always share the same result.

#### How is the employer email billed?

Once per company per run, and only when an email is found. If you collect 20 listings from one company, you pay for its email once. If your run reaches the spending limit you set, emails that no longer fit are left out rather than charged.

#### Why did a run return fewer listings than maxResults?

Filters are strict: all selected filters must match, and a listing missing a field that you filter on is excluded rather than guessed. Check `run-summary` to see how many listings each stage removed. Monitor runs with `onlyChanges` on also return only changed listings, so an empty result can simply mean nothing changed.

Use the Actor's **Issues** tab to report a reproducible input and run ID. Internshala is a trademark of Scholiverse Educare Private Limited. You are responsible for using public data in accordance with applicable laws and the website's terms.

### 🔗 Other actors

- [Apna.co Jobs Scraper](https://apify.com/getascraper/apna-co-scraper) ↗ - collects public blue and grey collar job listings in India.
- [Instahyre Jobs Scraper](https://apify.com/getascraper/instahyre-jobs-scraper) ↗ - collects public Indian tech jobs with hiring alerts.
- [India Jobs Feed](https://apify.com/getascraper/india-job-inventory-feed) ↗ - one combined feed across several Indian job boards.
- [CutShort Jobs Scraper](https://apify.com/getascraper/cutshort-scraper) ↗ - collects public Indian technology and startup jobs.
- [MyCareersFuture Singapore Scraper](https://apify.com/getascraper/mycareersfuture-jobs-scraper) ↗ - collects public Singapore job listings.
- [Job Bank Scraper](https://apify.com/getascraper/jobbank-scraper) ↗ - collects public Canadian job listings.

# Changelog

This Actor's version history is a separate document: https://apify.com/getascraper/internshala-scraper/changelog.md

# Actor input Schema

## `mode` (type: `string`):

Choose public internship listings, public job listings, or both in one run. With both, the result limit is shared between the two feeds.

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

Public Internshala internships, jobs, or fresher-jobs listing pages. These URLs replace automatic source URL construction, but the search filters below still apply. Multi-category and multi-city listing URLs (with commas) are supported. Query parameters, fragments, detail pages, login pages, and non-Internshala URLs are rejected. Pagination follows each page's public Next link.

## `keyword` (type: `string`):

Search public title, company, summary, and skill text. With automatic sources, this also selects Internshala keyword results. Use the list below to search several keywords in one run.

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

Extra roles or keywords searched in the same run, for example Python, React, Marketing. Each one opens its own results page and listings are de-duplicated across them.

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

Only keep listings whose public location contains one of these cities. Multiple cities create separate source pages when the URL pattern supports it. Work-from-home does not automatically match a city.

## `category` (type: `string`):

Select an Internshala internship category source, for example 'Computer Science' or 'Marketing'. Supported only in internships mode and cannot be combined with startUrls.

## `workFromHome` (type: `boolean`):

Only keep listings explicitly marked as work from home.

## `partTime` (type: `boolean`):

Only keep listings explicitly marked as part time.

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

Filter using the public relative posting age shown on the listing card. Records without a parseable age do not pass a selected window.

## `specialFilters` (type: `array`):

Only keep listings carrying every selected public card badge.

## `skills` (type: `array`):

Only keep listings that list at least one of these skills on the card, for example SQL or Figma. Matching ignores case.

## `excludeKeywords` (type: `array`):

Drop listings whose title, company, summary, or skills contain any of these words, for example sales or telecalling.

## `minStipend` (type: `integer`):

Only keep internships whose published minimum monthly stipend is at least this amount. Unpaid or undisclosed stipends do not pass a positive minimum.

## `minSalary` (type: `integer`):

Only keep jobs whose published minimum annual salary is at least this amount. Undisclosed salaries do not pass a positive minimum.

## `maxDurationMonths` (type: `integer`):

Only keep listings with a published duration at or below this number of months. 0 disables the filter.

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

Only keep jobs whose published minimum experience requirement is at or below this number of years. 0 disables the filter.

## `includeDetails` (type: `boolean`):

Open each selected listing page to add applicants per opening, applicant pressure, application deadline, openings, description, eligibility, perks, employer hiring history, and start date. Turns on by itself when you use an applicant or deadline filter below. If a page cannot be read, the listing is still returned with detailsFetched set to false.

## `maxApplicantsPerOpening` (type: `integer`):

Only keep listings with at most this many applicants per opening, the quickest way to find low-competition roles. Early applicant listings always pass. 0 disables the filter. Opens detail pages automatically.

## `maxApplicants` (type: `integer`):

Only keep listings with at most this many applicants so far. Early applicant listings always pass. 0 disables the filter. Opens detail pages automatically.

## `minOpenings` (type: `integer`):

Only keep listings with at least this many open positions, useful for bulk hiring. 0 disables the filter. Opens detail pages automatically.

## `closingWithinDays` (type: `integer`):

Only keep listings whose application deadline falls within this many days. In monitor mode this sets the closing-soon alert window instead (default 3 days). 0 disables it. Opens detail pages automatically.

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

Name of a recurring monitor, for example data-internships-daily. Runs with the same name and search share memory and report only new listings, changes, closing deadlines, applicant surges, and closed openings. Leave empty to scrape without a monitor.

## `onlyChanges` (type: `boolean`):

In monitor mode, return only listings that are new, changed, closing soon, surging, or closed. Turn off to return every listing with its status.

## `surgePercent` (type: `integer`):

In monitor mode, flag a listing when its applicant count grew by at least this percent since the previous run (and by at least 5 applicants). Needs fetched applicants and deadlines turned on.

## `monitoringMode` (type: `string`):

Older change detection that keeps working for existing schedules: it compares stable listing fingerprints with earlier runs in the store named below. New schedules should use the monitor name instead, which also covers closing deadlines, applicant surges, and closed openings.

## `monitoringStoreName` (type: `string`):

Persistent named key-value store shared by recurring runs. Change this to isolate environments or workflows.

## `monitorScope` (type: `string`):

Use 'auto' to derive a deterministic scope from the effective source, filters, and detail setting. Set an explicit scope to control which recurring runs share history.

## `enrichEmails` (type: `boolean`):

Optional add-on. For each employer, looks for a contact email on the company's own public website (for example info@ or hr@) and adds it to every listing of that employer. Many employers publish no email, so not every listing gets one. Charged once per employer whose email is returned in the run, not once per listing. Leave off for a normal scrape.

## `maxResults` (type: `integer`):

Maximum number of listings to return in this run. With several sources (cities, keywords, both feeds) the limit is shared fairly between them. Applicant and deadline filters count only listings that pass them. Monitor runs can return fewer rows because unchanged listings are skipped.

## `sortBy` (type: `string`):

Keep source relevance order or sort the collected matching window by the public relative posting age. Records with an unknown age sort last.

## `maxConcurrency` (type: `integer`):

Maximum parallel public page requests. The default is fast and polite; raise it only for very large detail runs.

## `proxyConfiguration` (type: `object`):

Optional Apify proxy configuration. Leave the default: the Actor connects directly first and switches to datacenter proxy by itself if Internshala refuses the connection. Choose specific proxy groups or your own proxy URLs only if you need them.

## `debugLogging` (type: `boolean`):

Enable additional page and parser diagnostics.

## Actor input object example

```json
{
  "mode": "internships",
  "startUrls": [],
  "keyword": "",
  "keywords": [],
  "locations": [],
  "category": "",
  "workFromHome": false,
  "partTime": false,
  "datePosted": "all",
  "specialFilters": [],
  "skills": [],
  "excludeKeywords": [],
  "minStipend": 0,
  "minSalary": 0,
  "maxDurationMonths": 0,
  "maxExperienceYears": 0,
  "includeDetails": false,
  "maxApplicantsPerOpening": 0,
  "maxApplicants": 0,
  "minOpenings": 0,
  "closingWithinDays": 0,
  "monitorName": "",
  "onlyChanges": true,
  "surgePercent": 50,
  "monitoringMode": "off",
  "monitoringStoreName": "internshala-monitor-state",
  "monitorScope": "auto",
  "enrichEmails": false,
  "maxResults": 25,
  "sortBy": "relevance",
  "maxConcurrency": 10,
  "proxyConfiguration": {
    "useApifyProxy": true
  },
  "debugLogging": false
}
```

# Actor output Schema

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

No description

## `marketPulse` (type: `string`):

No description

## `employerRollup` (type: `string`):

No description

## `runSummary` (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 = {
    "mode": "internships",
    "startUrls": [],
    "keyword": "",
    "keywords": [],
    "locations": [],
    "category": "",
    "workFromHome": false,
    "partTime": false,
    "datePosted": "all",
    "specialFilters": [],
    "skills": [],
    "excludeKeywords": [],
    "minStipend": 0,
    "minSalary": 0,
    "maxDurationMonths": 0,
    "maxExperienceYears": 0,
    "includeDetails": false,
    "maxApplicantsPerOpening": 0,
    "maxApplicants": 0,
    "minOpenings": 0,
    "closingWithinDays": 0,
    "monitorName": "",
    "onlyChanges": true,
    "surgePercent": 50,
    "monitoringMode": "off",
    "monitoringStoreName": "internshala-monitor-state",
    "monitorScope": "auto",
    "enrichEmails": false,
    "maxResults": 25,
    "sortBy": "relevance",
    "maxConcurrency": 10,
    "proxyConfiguration": {
        "useApifyProxy": true
    },
    "debugLogging": false
};

// Run the Actor and wait for it to finish
const run = await client.actor("getascraper/internshala-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 = {
    "mode": "internships",
    "startUrls": [],
    "keyword": "",
    "keywords": [],
    "locations": [],
    "category": "",
    "workFromHome": False,
    "partTime": False,
    "datePosted": "all",
    "specialFilters": [],
    "skills": [],
    "excludeKeywords": [],
    "minStipend": 0,
    "minSalary": 0,
    "maxDurationMonths": 0,
    "maxExperienceYears": 0,
    "includeDetails": False,
    "maxApplicantsPerOpening": 0,
    "maxApplicants": 0,
    "minOpenings": 0,
    "closingWithinDays": 0,
    "monitorName": "",
    "onlyChanges": True,
    "surgePercent": 50,
    "monitoringMode": "off",
    "monitoringStoreName": "internshala-monitor-state",
    "monitorScope": "auto",
    "enrichEmails": False,
    "maxResults": 25,
    "sortBy": "relevance",
    "maxConcurrency": 10,
    "proxyConfiguration": { "useApifyProxy": True },
    "debugLogging": False,
}

# Run the Actor and wait for it to finish
run = client.actor("getascraper/internshala-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 '{
  "mode": "internships",
  "startUrls": [],
  "keyword": "",
  "keywords": [],
  "locations": [],
  "category": "",
  "workFromHome": false,
  "partTime": false,
  "datePosted": "all",
  "specialFilters": [],
  "skills": [],
  "excludeKeywords": [],
  "minStipend": 0,
  "minSalary": 0,
  "maxDurationMonths": 0,
  "maxExperienceYears": 0,
  "includeDetails": false,
  "maxApplicantsPerOpening": 0,
  "maxApplicants": 0,
  "minOpenings": 0,
  "closingWithinDays": 0,
  "monitorName": "",
  "onlyChanges": true,
  "surgePercent": 50,
  "monitoringMode": "off",
  "monitoringStoreName": "internshala-monitor-state",
  "monitorScope": "auto",
  "enrichEmails": false,
  "maxResults": 25,
  "sortBy": "relevance",
  "maxConcurrency": 10,
  "proxyConfiguration": {
    "useApifyProxy": true
  },
  "debugLogging": false
}' |
apify call getascraper/internshala-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,getascraper/internshala-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/4dMyE80KpfCIKroD4/builds/buuGiRm4ClxG8CyI7/openapi.json
