# Internshala Scraper - India Internships & Jobs with Stipends (`steadyscrape/internshala-scraper`) Actor

Scrape internships and jobs from Internshala, India's largest internship site: title, company, cities, stipend or salary with figures, duration, skills, perks, openings, applicants, apply-by date and description. Search by keyword, category and city with the site's filters. Monitor mode. No login.

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

## Pricing

from $1.00 / 1,000 listings

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

## Internshala Scraper — India internships and jobs with stipends, skills and full details

Scrape internships and jobs from **Internshala**, India's largest internship platform (around 7,000 live internships
and 6,500 jobs at any time). Search by **keyword**, **category** and **city**, use Internshala's own filters (**work
from home**, **part time**, **minimum stipend**, **maximum duration**, **with job offer**, **for women**, **fast
response**, **early applicant**, **minimum salary**, **fresher jobs**), or paste any Internshala results link. Every
listing comes with its **title**, **company**, **cities**, **stipend or salary as text and as figures**, **duration**
or **experience**, **skills**, **badges** (part time, job offer, actively hiring, early applicant) and **posted** time.

Turn on the listing page (on by default) to also get the **full description**, every **skill**, the **perks**, **who
can apply**, **number of openings**, **start date**, **apply-by date**, **posted date**, the **number of applicants**,
the **category** and **employment type**, and the **company's profile**: website, description, hiring since, how many
opportunities it posted and how many candidates it hired on Internshala.

No login, no API key, no browser. Internshala lets you page through every listing of a search, so a run returns
everything a search holds, up to the maximum you set.

### What you can use it for

- **Internship and fresher job market research**: which skills, stipends and durations employers offer, by city and field.
- **Lead generation for campus, training and staffing businesses**: companies hiring interns right now, with their website and hiring activity.
- **Job boards, newsletters and alerts**: run on a schedule with **only new listings** to receive just what was posted since the last run.
- **Stipend and salary benchmarking**: monthly stipends and yearly salaries in rupees, by role, city and duration.
- **Competition for applicants**: how many people applied to each listing, and how many openings it has.

### Input

| Field | What it does |
|---|---|
| **Internships or jobs** | Internships, jobs, or both (every search runs once for each). |
| **Keywords** | What you would type in Internshala's search box: `python`, `data science`, `content writing`. Each is its own search. |
| **Categories** | Internshala's own categories: `Web Development`, `Python/Django`, `Marketing`, `Graphic Design`… Each is its own search. |
| **Cities** | `Bangalore`, `Delhi`, `Mumbai`, `Gurgaon`, `Pune`… (`Bengaluru` and `Gurugram` are followed to the site's page). Each keyword and category is searched in each city; empty = all of India. |
| **Internshala search links** | Any results link copied from internshala.com, with the filters it carries. Read from its first page. |
| **Work from home** / **Part time** | Internshala's filters, for internships and jobs. |
| **Internships: minimum stipend, maximum duration, with job offer, for women, fast response, early applicant** | Internshala's internship filters. |
| **Jobs: minimum salary (lakh a year), fresher jobs only** | Internshala's job filters. |
| **Include full details** | One extra page per listing for the description, perks, openings, dates, applicants and company (priced as a listing with details). |
| **Max listings per search** | Stops each search after this many listings (default 100; 0 = every page). |
| **Only new listings since the last run** | Skips, for free, every listing an earlier run with the same searches delivered. |

```json
{
    "listingType": "internships",
    "keywords": ["data science", "react"],
    "locations": ["Bangalore", "Pune"],
    "minStipend": "10000",
    "withJobOffer": true,
    "includeDetails": true,
    "maxListingsPerSearch": 200
}
```

### Output

One row per listing. Example (with the listing page, shortened):

```json
{
    "status": "ok",
    "search": "Internships: python",
    "position": 1,
    "listingId": "3301227",
    "type": "internship",
    "title": "Software Development",
    "url": "https://internshala.com/internship/detail/work-from-home-software-development-internship-at-ten1790309126",
    "companyName": "TEN",
    "logoUrl": null,
    "locations": [],
    "workFromHome": true,
    "hybrid": false,
    "compensation": { "text": "₹ 2,000 /month", "currency": "INR", "min": 2000, "max": 2000, "period": "month", "unpaid": false },
    "duration": "1 Month",
    "experience": null,
    "partTime": true,
    "jobOffer": null,
    "fresherJob": false,
    "international": false,
    "activelyHiring": true,
    "earlyApplicant": false,
    "postedText": "3 weeks ago",
    "skills": ["Java", "Python", "Node.js", "React"],
    "moreSkills": 0,
    "snippet": "We are seeking a driven and talented software development intern to join our innovative team a",
    "scrapedAt": "2026-10-19T18:18:43.261Z",
    "details": {
        "description": "We are seeking a driven and talented software development intern to join our innovative team at TEN company…",
        "descriptionHtml": "We are seeking a driven and talented software development intern…",
        "skills": ["Java", "Node.js", "Python", "React"],
        "perks": ["Certificate", "Letter of recommendation", "Flexible work hours", "5 days a week"],
        "whoCanApply": ["are available for the work from home job/internship", "are available for duration of 1 month", "have relevant skills and interests"],
        "otherRequirements": null,
        "additionalInformation": "Stipend Structure:\nFixed pay: ₹ 1,000 /month\nIncentive pay: ₹ 1,000 /month",
        "openings": 100,
        "startDate": "Immediately",
        "applyBy": "2026-11-16",
        "postedDate": "2026-09-25",
        "applicants": 1000,
        "applicantsText": "1000+ applicants",
        "category": "Software Development",
        "industry": "Education",
        "employmentTypes": ["INTERN", "PART_TIME"],
        "jobLocations": [{ "city": "Delhi NCR", "region": "Haryana" }],
        "experienceMonths": null,
        "company": {
            "name": "TEN",
            "profileUrl": "https://internshala.com/company/ten-1756391852",
            "website": "http://entrepreneurshipnetwork.net",
            "description": "Welcome to The Entrepreneurship Network, also known as TEN…",
            "hiringSince": "April 2026",
            "opportunitiesPosted": 4,
            "candidatesHired": null
        }
    }
}
```

| Field | Meaning |
|---|---|
| `search` / `position` | The search the row came from, and its place in Internshala's results for it, from 1. |
| `type` | `internship` or `job`. A search only delivers its own type (some city pages mix the other one in; those are skipped). |
| `compensation` | The stipend or salary as printed, with `currency`, `min`, `max` and `period` (`month`, `week`, `year`, `lump-sum`). `unpaid` is `true` for unpaid internships; texts such as "Performance Based" keep only the text. |
| `duration` / `experience` | Internships show a duration, jobs an experience requirement. |
| `jobOffer` | The pre-placement offer badge, e.g. "Job offer upto ₹ 6LPA post internship". |
| `earlyApplicant` | Internshala's "Be an early applicant" badge: few applications so far. |
| `postedText` | As the results page shows it ("Few hours ago", "2 weeks ago"); `details.postedDate` is the exact date. |
| `details` | `null` without the listing page, or when that page could not be read (the row is then charged as a plain listing). |
| `details.applicants` | The lower bound of what the page shows: "1000+ applicants" is 1000; `null` while it shows "Be an early applicant". |
| `details.applyBy` / `postedDate` | YYYY-MM-DD (India dates). About one job page in five has no posted date in its markup: `postedDate` and `category` are then `null`. |

A search or link that gives no listing produces one **free** row with `status` and `reason`: `no_results`,
`not_found` (a category or city Internshala does not know: it sends such searches to all internships), `invalid` (a
link that is not an Internshala results page, a link combining several categories with commas, or a keyword whose own
Internshala page loops), `blocked` (Internshala refused to answer) or `unreadable`. The run's `SUMMARY` record lists
every search with Internshala's count, pages read, listings delivered, duplicates and listings skipped.

### Pricing

Pay per result, nothing per run:

- **US$0.001 per listing** as the results page shows it (US$1 per 1,000).
- **US$0.002 per listing with its full page** (US$2 per 1,000).

A listing found by several of your searches is charged once. Free rows, duplicates, listings of the other type and
listings skipped by "only new listings" are never charged. Set a maximum cost per run in Apify and the Actor stops
before reading pages it cannot charge for.

### Limits and notes

- Internshala's own paths are used, so a category or city must be one Internshala knows; otherwise you get a free
  `not_found` row instead of unrelated listings.
- The count in Internshala's heading (kept in `SUMMARY`) is not always what its pages list: for a city it also counts
  the work-from-home listings, and for jobs it counts internships the page appends. The rows are what the pages show.
- Keywords with symbols such as `c++` make Internshala's own search page redirect to itself; such a keyword gets a free
  `invalid` row. Write it without the symbols.
- The Actor reads at about one page a second, so 1,000 listings with their pages take about 15 minutes (without them,
  about half a minute).
- If Internshala refuses requests, the run stops asking and returns what it has; nothing undelivered is charged.

### Is it legal?

This Actor reads only public listings that Internshala shows to any visitor without an account: no login, no
applicant data, nothing behind a sign-in. It honours Internshala's robots.txt: it never reads the paths it disallows
(search URLs with query strings or commas, `/internship/search/`, `/api/`…) and reads results and listing pages at a
gentle pace. Check that your use of the data complies with Internshala's terms and the laws that apply to you (such as
India's DPDP Act or the GDPR) before using it commercially.

# Actor input Schema

## `listingType` (type: `string`):

Internshala lists internships and fresher-friendly jobs separately. <b>Both</b> runs every search below twice, once for each.

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

Words as you would type them in Internshala's search box: <code>python</code>, <code>data science</code>, <code>react native</code>, <code>content writing</code>. Leave empty (with no category either) to list everything.

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

Internshala's own categories (profiles), as its filter names them: <code>Web Development</code>, <code>Python/Django</code>, <code>Data Science</code>, <code>Marketing</code>, <code>Digital Marketing</code>, <code>Graphic Design</code>, <code>Content Writing</code>, <code>Finance</code>, <code>Human Resources (HR)</code>, <code>Sales</code>. A category the site does not know gives a free row explaining why.

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

Cities as Internshala names them: <code>Bangalore</code>, <code>Delhi</code>, <code>Mumbai</code>, <code>Gurgaon</code>, <code>Hyderabad</code>, <code>Pune</code>, <code>Chennai</code>, <code>Kolkata</code>, <code>Noida</code>, <code>Jaipur</code>. Spellings such as <code>Bengaluru</code> or <code>Gurugram</code> are followed to the site's own page. A city the site does not know gives a free row. Leave empty for all of India.

## `searchUrls` (type: `array`):

Results links copied from internshala.com after setting any filters, e.g. <code>https://internshala.com/internships/work-from-home-python-internships/stipend-10000/</code> or <code>https://internshala.com/fresher-jobs/jobs-in-pune/</code>. Each is read from its first page with its own filters; the filters below do not apply to links. Links that pick several categories or cities at once (with commas) are refused, as Internshala's robots.txt asks.

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

Internshala's work-from-home filter, for internships and jobs.

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

Internshala's part-time filter, for internships and jobs.

## `minStipend` (type: `string`):

The stops of Internshala's stipend slider, in rupees a month.

## `maxDurationMonths` (type: `string`):

Internshala's maximum-duration filter.

## `withJobOffer` (type: `boolean`):

Internships that may turn into a job (pre-placement offer).

## `forWomen` (type: `boolean`):

Internshala's "internships for women" listing.

## `fastResponse` (type: `boolean`):

Employers who answer applications quickly, as Internshala marks them.

## `earlyApplicant` (type: `boolean`):

Internships with few applications so far.

## `minSalaryLpa` (type: `integer`):

Internshala's salary slider for jobs, in lakh rupees a year. 0 means any.

## `freshersOnly` (type: `boolean`):

Internshala's fresher jobs listing.

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

Open each listing's own page for the full description, every skill, perks, who can apply, openings, start date, apply-by and posted dates, applicant count and the company's profile and hiring activity. One extra request per listing, priced as a listing with details; turn off for the results-page fields at the lower price.

## `maxListingsPerSearch` (type: `integer`):

Stop each search after this many listings. 0 means all of them.

## `onlyNewListings` (type: `boolean`):

Deliver, and charge, only listings that an earlier run with the same searches has not delivered. Made for scheduled runs.

## Actor input object example

```json
{
  "listingType": "internships",
  "keywords": [
    "python"
  ],
  "categories": [],
  "locations": [],
  "workFromHome": false,
  "partTime": false,
  "minStipend": "0",
  "maxDurationMonths": "any",
  "withJobOffer": false,
  "forWomen": false,
  "fastResponse": false,
  "earlyApplicant": false,
  "minSalaryLpa": 0,
  "freshersOnly": false,
  "includeDetails": true,
  "maxListingsPerSearch": 20,
  "onlyNewListings": false
}
```

# Actor output Schema

## `listings` (type: `string`):

No description

## `summary` (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"
    ],
    "maxListingsPerSearch": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("steadyscrape/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 = {
    "keywords": ["python"],
    "maxListingsPerSearch": 20,
}

# Run the Actor and wait for it to finish
run = client.actor("steadyscrape/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 '{
  "keywords": [
    "python"
  ],
  "maxListingsPerSearch": 20
}' |
apify call steadyscrape/internshala-scraper --silent --output-dataset

```

## MCP server setup

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