# Internshala Scraper - Internships & Jobs in India (`scrapewise/internshala-scraper`) Actor

Scrape Internshala internships and jobs by keyword, category, city, work from home, part time, stipend or salary: title, company, stipend or CTC, duration, experience, skills, perks, openings, applicants, start date, deadline and the full description. onlyNew for daily alerts. Error rows are free.

- **URL**: https://apify.com/scrapewise/internshala-scraper.md
- **Developed by:** [Scrapewise Data](https://apify.com/scrapewise) (community)
- **Categories:** Jobs, Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.43 / 1,000 internship or job delivereds

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: internships and jobs in India with stipend, salary, skills and applicants

Internshala Scraper collects **internships and jobs from internshala.com**, India's largest internship platform,
without an account, cookies or a browser. Search by keyword, category, city, work from home, part time, minimum
stipend or minimum salary, or paste any Internshala listing link, and get one clean row per opportunity: title,
company, locations, stipend or CTC with the numbers already parsed, duration or experience, skills, perks, number of
openings, number of applicants, start date, deadline, posted date and the full description.

It is used to track the Indian entry-level and fresher job market, to build job boards and alert feeds, to research
which skills and stipends companies offer by city and category, to find companies that are actively hiring, and to
feed career, edtech and HR analytics tools.

### At a glance

| What | Price |
|---|---|
| Internship or job delivered | **US$ 0.50 per 1,000 rows** (US$ 0.0005 each) |
| Run start | US$ 0.005 per run |

- 50 internships with full details = **US$ 0.03**. 1,000 jobs = **US$ 0.505**.
- The full description, openings, applicants, perks and company info are included in the price (no extra event).
- Error rows, duplicates and opportunities skipped by `onlyNew` are never charged. `maxItems` is a hard cap, and a
  spending limit set on the run stops it cleanly with everything delivered so far.

### Quick start

Python internships, with every detail:

```json
{
  "searchQueries": ["python"],
  "opportunityType": "internships",
  "maxItems": 50
}
```

Remote data science internships and jobs paying at least INR 10,000 a month (internships):

```json
{
  "categories": ["data science"],
  "opportunityType": "both",
  "workFromHome": true,
  "minStipend": 10000,
  "maxItems": 200
}
```

Sales jobs in Mumbai with a CTC of at least 3 lakhs, new ones only (for a daily schedule):

```json
{
  "searchQueries": ["sales"],
  "opportunityType": "jobs",
  "city": ["Mumbai"],
  "minSalaryLakhs": 3,
  "onlyNew": true,
  "maxItems": 100
}
```

Any link copied from internshala.com after setting filters on the site also works:

```json
{
  "startUrls": [
    "https://internshala.com/internships/python-internship-in-bangalore/",
    "https://internshala.com/jobs/keywords-sales/"
  ]
}
```

### Input

| Field | What it does |
|---|---|
| `searchQueries` | Keywords, one per line (python, data science, sales, graphic design...). Each keyword is one search. |
| `opportunityType` | `internships` (default), `jobs` (fresher and experienced jobs) or `both`. |
| `categories` | Internshala categories as the site writes them: web development, data science, marketing, hr, finance, content writing, graphic design... Each category is one search. |
| `city` | Indian cities (Bangalore, Mumbai, Delhi, Pune, Hyderabad...). Several cities are searched together. |
| `workFromHome` | Only remote (work from home) opportunities. |
| `partTime` | Only part-time internships (Internshala offers this filter only without city, category and work from home). |
| `minStipend` | Minimum monthly stipend in INR for internships. The site offers 2,000, 4,000, 6,000, 8,000 and 10,000; other values are rounded down. |
| `minSalaryLakhs` | Minimum yearly CTC in lakhs for jobs (5 = INR 5,00,000). |
| `startUrls` | Internshala listing links (any filters) or links to single internships or jobs. |
| `includeDetails` | Open each opportunity page for the full description and detail fields (default on). Off = faster, listing fields only. |
| `maxItems` | Cap for the whole run, across all searches (default 50; 0 = no cap). |
| `onlyNew` | Remember what earlier runs of the same search delivered and return only new opportunities. |
| `proxyConfiguration` | Apify datacenter proxy by default. |

With no keyword, category, city or link, the Actor runs the example search `python` so you can see the output.
`query`, `keyword`, `keywords`, `searchTerms`, `urls`, `maxResults`, `limit`, `remote` and `type` are accepted too, so
inputs written for other Internshala tools keep working.

### Output

One row per internship or job (`type: internship` or `type: job`):

| Field | What it is |
|---|---|
| `id`, `url`, `applyUrl` | Internshala id, opportunity page and apply page |
| `title`, `category`, `industry` | Role title, Internshala category and the company's industry |
| `companyName`, `companyLogo`, `companyWebsite`, `aboutCompany` | Company as shown on the page |
| `companyHiringSince`, `companyOpportunitiesPosted` | Company activity on Internshala (for example "May 2020", 560) |
| `locations`, `state` | Cities and state of the opportunity |
| `isWorkFromHome`, `isHybrid`, `isPartTime`, `employmentTypes` | Work mode and contract (INTERN, FULL_TIME, PART_TIME, CONTRACTOR) |
| `salaryText` | Stipend or CTC exactly as Internshala shows it |
| `salaryMin`, `salaryMax`, `salaryCurrency`, `salaryPeriod` | The same, parsed into numbers (INR, `month` for stipends, `year` for CTC) |
| `isUnpaid` | Unpaid internships |
| `duration` | Internship duration (for example "6 Months") |
| `experience`, `minExperienceMonths` | Experience asked for jobs |
| `startDate`, `applyBy`, `postedDate`, `postedAgo` | Start, deadline (YYYY-MM-DD), publication date and the site's "posted N days ago" |
| `openings`, `applicants` | Number of openings and of applicants so far ("1000+" when the site caps it) |
| `skills`, `perks` | Skills required and perks (certificate, letter of recommendation, flexible hours...) |
| `jobOfferAfterInternship`, `activelyHiring` | Pre-placement offer flag and the "Actively hiring" badge |
| `snippet`, `description`, `descriptionHtml` | Listing excerpt, full description as text and as HTML |
| `sourceQuery`, `scrapedAt` | Which search found it and when |

One real row (description shortened):

```json
{
  "type": "job",
  "id": "3311716",
  "title": "Pre-sales Executive",
  "companyName": "UniAcco",
  "companyWebsite": "https://uniacco.com/",
  "industry": "Education",
  "category": "Business Development (Sales)",
  "locations": ["Mumbai"],
  "state": "Maharashtra",
  "isWorkFromHome": false,
  "employmentTypes": ["FULL_TIME"],
  "salaryText": "₹ 3,50,000 - 4,10,000 /year",
  "salaryMin": 350000,
  "salaryMax": 410000,
  "salaryCurrency": "INR",
  "salaryPeriod": "year",
  "experience": "1 year(s)",
  "minExperienceMonths": 12,
  "startDate": "Immediately",
  "applyBy": "2026-11-05",
  "postedDate": "2026-10-06",
  "postedAgo": "1 week ago",
  "openings": 6,
  "applicants": "44",
  "skills": ["Negotiation", "Problem Solving", "English Proficiency (Spoken)", "Sales"],
  "perks": ["Informal dress code", "Health Insurance"],
  "activelyHiring": true,
  "companyHiringSince": "May 2020",
  "companyOpportunitiesPosted": 560,
  "description": "About the job:\nKey Responsibilities:\n\n1. Connect with incoming leads...",
  "url": "https://internshala.com/job/detail/pre-sales-executive-job-in-mumbai-at-uniacco1791280874",
  "sourceQuery": "jobs: sales"
}
```

Some opportunities listed in many cities at once come without the site's structured data; the Actor still fills
description, skills, openings, deadline, applicants and company from the page, and `postedDate` stays empty
(`postedAgo` is there).

### Errors you may see

Every error is a row with `errorCode` and is never charged:

| errorCode | Meaning |
|---|---|
| `INVALID_URL` | Not an Internshala listing or opportunity link |
| `INVALID_INPUT` | A field has a wrong value (for example an unknown `opportunityType`) |
| `FILTER_NOT_FOUND` | Internshala does not know this category or city spelling; nothing is delivered for it |
| `NO_RESULTS` | The search and filters have no opportunity right now |
| `NOT_FOUND` | The single internship or job link is closed or removed |
| `BLOCKED` | Internshala refused every attempt; run it again in a few minutes |
| `UNEXPECTED` | Something else went wrong; the run still ends cleanly |

When the site silently drops a filter it cannot combine (for example city together with work from home), the log
says so and the search goes on with the filters it accepted.

### Integrations, scheduling and AI agents

- **Schedule** a daily run with `onlyNew` in [Apify schedules](https://docs.apify.com/platform/schedules) to get an
  alert feed of new internships or jobs for your keywords, categories and cities.
- **Export** as JSON, CSV, Excel or XML, or read the dataset from the [Apify API](https://docs.apify.com/api/v2).
- **Connect** it to Make, n8n, Zapier, Slack or Google Sheets through
  [Apify integrations](https://docs.apify.com/platform/integrations).
- **AI agents:** call it as a tool through the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp)
  in Claude, ChatGPT, Cursor or any MCP client, for example "list remote data science internships on Internshala
  paying at least 10,000 a month and group them by skill".

### FAQ

**Do I need an Internshala account?** No. Everything comes from public listing and opportunity pages.

**How many results can I get?** Each search pages through Internshala until the end (40 to 50 per page). A broad
keyword such as "marketing" has hundreds of internships; the whole internship section has about 7,000 live listings
and the job section about 6,700. Set `maxItems` to 0 for no cap.

**Internships and jobs together?** Set `opportunityType` to `both`: every keyword and category runs on both sections,
and `type` tells them apart.

**Are recruiter names, emails or phones included?** No. Only the opportunity and the company. Any email or phone
number written inside a description is replaced with "\[contact removed]".

**Is it legal?** The Actor reads public pages only. You are responsible for how you use the data under the laws that
apply to you.

**Something broke or a field is missing?** Open an issue on the Actor page; issues are answered within a day.

### Limitations

- Internshala combines some filters only in certain ways (part time only alone, city or work from home but not
  both); the Actor follows the site and logs any filter it had to drop.
- `applicants` is a text field because Internshala shows "1000+" above that number.
- Counts and dates are the ones Internshala shows at the moment of the run.

### Changelog

- **16 Oct 2026:** first version: internships and jobs by keyword, category, city, work from home, part time, stipend
  and salary; listing links; full details with openings, applicants, perks and company; onlyNew for schedules.

# Actor input Schema

## `searchQueries` (type: `array`):

Keywords, one per line, for example python, data science or sales. Each keyword is one search on Internshala. Leave empty to list a category, a city or work from home on their own.

## `opportunityType` (type: `string`):

Which Internshala section to search. Both = every search runs on internships and on jobs.

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

Internshala categories as the site names them, for example web development, data science, marketing, graphic design, hr, finance. Each category is one search (on top of the keywords).

## `city` (type: `array`):

Indian cities, for example Bangalore, Mumbai, Delhi. Several cities are searched together. Ignored when Work from home is on.

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

On: only remote (work from home) internships or jobs.

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

On: only part-time internships. The site does not combine it with Work from home.

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

Only internships paying at least this stipend per month, for example 10000.

## `minSalaryLakhs` (type: `integer`):

Only jobs with a CTC of at least this many lakhs per year, for example 5 = INR 5,00,000.

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

Optional: listing links copied from internshala.com after setting filters (for example https://internshala.com/internships/python-internship-in-bangalore/) or links to single internships or jobs.

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

On: opens each internship or job page for the full description, posted date, deadline, openings, applicants, perks, structured stipend or salary and company info. Off: faster, listing fields only.

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

Hard cap for the whole run, across all searches. 0 = no cap.

## `onlyNew` (type: `boolean`):

On: remembers what earlier runs of the same search delivered (in your account) and delivers only new internships or jobs. Skipped ones are free.

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

Apify datacenter proxy by default. If Internshala refuses it, the Actor moves to residential IPs on its own.

## Actor input object example

```json
{
  "searchQueries": [
    "python"
  ],
  "opportunityType": "internships",
  "workFromHome": false,
  "partTime": false,
  "includeDetails": true,
  "maxItems": 50,
  "onlyNew": false,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

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

No description

## `resultsCsv` (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 = {
    "searchQueries": [
        "python"
    ],
    "maxItems": 50,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("scrapewise/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 = {
    "searchQueries": ["python"],
    "maxItems": 50,
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("scrapewise/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 '{
  "searchQueries": [
    "python"
  ],
  "maxItems": 50,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call scrapewise/internshala-scraper --silent --output-dataset

```

## MCP server setup

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