# Internshala Scraper - Internships & Jobs + Employer Emails (`memo23/internshala-scraper`) Actor

Internshala scraper — pull internships and jobs by keyword, category, city and filters (stipend, duration, work-from-home, part-time, PPO). Full details per posting: company, stipend, skills, openings, apply-by date. Optional employer-email enrichment + incremental monitoring. JSON/CSV

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

## Pricing

from $0.50 / 1,000 internship or job scrapeds

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

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).


# README

## Internshala Scraper

<p align="center">
  <img src="https://raw.githubusercontent.com/muhamed-didovic/muhamed-didovic.github.io/main/assets/internshala-logo.png" alt="Internshala Scraper logo" width="220" />
</p>

Scrape internships and fresher jobs from Internshala at scale — search by keyword, category, or city, pull every posting's full details (stipend, skills, duration, apply-by), and optionally enrich each employer with a contact email. Pure HTTP, no login, no browser.

### Why Use This Scraper?

- **Search the way recruiters do** — filter Internshala by keyword, category, and city, then narrow with work-from-home, part-time, minimum stipend, PPO (pre-placement offer), and women-only toggles. Or just paste any Internshala listing or posting URL.
- **Full posting details, not just titles** — every row carries the complete `JobPosting`: company, website, location, stipend range, duration, number of openings, perks, required skills, responsibilities, who-can-apply, apply-by date, and the direct apply URL.
- **UNIQUE employer-email enrichment** — flip one toggle and the scraper finds a contact email for the hiring company on top of every posting. No other Internshala scraper on the Store offers this — it turns a job feed into a ready-to-use B2B lead list.
- **Incremental monitoring** — schedule the actor and each re-run returns only postings you have not seen before, so you can watch a category or city for fresh internships without re-paying for old rows.
- **Pure HTTP — no login, no browser** — the scraper reads Internshala's own embedded structured data over plain HTTP (Cheerio/impit). No headless Chrome, no account, no captcha-solving service. That makes runs fast, cheap, and stable.
- **Clean, export-ready output** — one flat row per posting, ready to download as JSON, CSV, or Excel, or pipe straight into your ATS, CRM, or spreadsheet.

### Overview

[Internshala](https://internshala.com/) is India's largest internships and fresher-jobs platform, listing hundreds of thousands of internships and entry-level jobs across every category — from software development and data science to marketing, design, finance, and content writing.

This actor turns that public catalog into structured data. Point it at a search (keyword + category + city + filters), a listing page, or individual postings, and it walks the results, opens each internship or job, and reads the `JobPosting` structured data that Internshala embeds in every posting page. You get a consistent, fully-typed record per posting — the same fields whether you scraped one URL or fifty thousand.

Two things set this scraper apart from the field of competitors: it **matches the feature leader's filter set** (WFH, part-time, PPO, stipend, women-only, category, city) and then **adds employer-email enrichment that none of them offer**, at a lower price per result.

Typical uses: building internship and fresher-job aggregators, powering campus-hiring and career-platform dashboards, market research on stipends and demand by category or city, and B2B lead generation using the enriched employer emails.

### Supported Inputs

You can drive the scraper three ways — mix and match them freely in a single run:

**1. Keyword / category / city search (with filters)**

Set any combination of `searchQuery`, `category`, and `location`, then add filters (`workFromHome`, `partTime`, `withJobOffer`, `forWomen`, `minStipend`, `maxDurationMonths`). Choose `listingType` = `internship`, `job`, or `both`. The scraper builds the correct Internshala search, pages through all results, and scrapes each posting.

**2. Listing / search URLs (`startUrls`)**

Already have an Internshala URL from your browser? Paste it in and the scraper pages through it and scrapes every posting it finds. Examples:

- `https://internshala.com/internships/computer-science-internship-in-mumbai/`
- `https://internshala.com/internships/graphic-design-internship/`
- `https://internshala.com/internships/work-from-home-marketing-internship/`
- `https://internshala.com/jobs/`
- `https://internshala.com/jobs/data-science-jobs-in-bangalore/`

**3. Individual posting URLs (`startUrls`)**

Drop the URL of a single internship or job and the scraper extracts just that posting — useful for enriching a hand-picked shortlist. Example:

- `https://internshala.com/internship/detail/graphic-design-internship-in-jaipur-at-emiac-technologies`

Detail pages are auto-detected, so listing URLs and posting URLs can sit in the same `startUrls` list.

### Use Cases

| Who | What they use it for |
| --- | --- |
| **Recruiters & staffing agencies** | Pull fresh internships/fresher roles by skill, category, and city into an ATS; track which companies are hiring which skills, at what stipend. |
| **Ed-tech & career platforms** | Power an internship/job board or a "recommended for you" feed with live, structured Internshala data — skills, stipend, duration, apply-by. |
| **Student job-boards & communities** | Aggregate WFH, part-time, and PPO opportunities for a campus, cohort, or Telegram/WhatsApp community, refreshed on a schedule. |
| **B2B lead generation** | Turn "who's hiring on Internshala" into a contactable list — the employer-email enrichment attaches a company email to every posting. |
| **Hiring-market research** | Analyse stipend ranges, in-demand skills, WFH share, and category/city hiring volume over time for reports, dashboards, or investor decks. |

### How It Works

![How the Internshala Scraper works](https://raw.githubusercontent.com/muhamed-didovic/muhamed-didovic.github.io/main/assets/how-it-works-internshala.png)

1. **Input** — give the scraper a keyword/category/city search with filters, paste listing URLs, or drop individual posting URLs. Pick `listingType` = internships, jobs, or both.
2. **Fetch & parse** — over plain HTTP (no browser, no login), the scraper walks the listing page by page (`/page-2`, `/page-3`, …), opens each internship or job, and reads the `JobPosting` structured data embedded in the page. If `enrichEmails` is on, it then finds the employer's contact email. If `monitoringMode` is on, it skips postings seen in previous runs.
3. **Emit** — each posting becomes one flat row with all fields below, streamed to the dataset for download as JSON, CSV, or Excel, or via the API.

### Input Configuration

| Field | Type | Description |
| --- | --- | --- |
| `listingType` | enum | `internship`, `job`, or `both` — which catalog(s) to scrape. |
| `searchQuery` | string | Keyword to search, e.g. `graphic design`, `data science`, `content writing`. |
| `category` | string | Internshala category to filter by, e.g. `Marketing`, `Web Development`, `Finance`. |
| `location` | string | City to filter by, e.g. `Mumbai`, `Bangalore`, `Delhi`. |
| `workFromHome` | boolean | Only return work-from-home (remote) opportunities. |
| `partTime` | boolean | Only return part-time opportunities. |
| `withJobOffer` | boolean | Only return internships that come with a pre-placement job offer (PPO). |
| `forWomen` | boolean | Only return opportunities in the "internships for women" segment. |
| `maxDurationMonths` | integer | Cap internship duration at this many months. |
| `minStipend` | integer | Minimum monthly stipend in INR. |
| `startUrls` | array | Internshala listing/search URLs or individual posting URLs to scrape directly. Detail pages are auto-detected. |
| `includeDetails` | boolean | Open each posting to extract the full `JobPosting` (default). Turn off for a faster, shallower listing-only pass. |
| `maxItems` | integer | Hard cap on the number of postings to return (across all inputs). |
| `enrichEmails` | boolean | Opt-in — find a contact email for the hiring company on each posting. |
| `monitoringMode` | boolean | Incremental mode — return only postings not seen in previous runs. |
| `resetMonitoringState` | boolean | Forget previously-seen postings — the next monitoring run returns everything again. |
| `minConcurrency` / `maxConcurrency` | integer | Advanced — tune parallelism for very large runs. |
| `maxRequestRetries` | integer | Advanced — how many times a failed page is retried before being skipped. |
| `proxy` | object | Apify proxy configuration. Residential proxies recommended for large runs. |

### Output Overview

Every posting is emitted as one flat JSON object. All fields come straight from Internshala's own `JobPosting` structured data (plus the scraper's own `id`, `url`, `scrapedAt`, and — when enabled — the enriched employer email). Fields that a given posting doesn't publish come back empty rather than missing, so the schema stays consistent across the whole dataset. Download the result as JSON, CSV, or Excel, or pull it via the Apify API.

### Output Sample

A trimmed internship row (some text fields shortened for readability):

```json
{
  "type": "internship",
  "id": "graphic-design-internship-in-jaipur-at-emiac-technologies",
  "url": "https://internshala.com/internship/detail/graphic-design-internship-in-jaipur-at-emiac-technologies",
  "title": "Graphic Design - Internship",
  "companyName": "EMIAC Technologies",
  "companyWebsite": "https://emiactech.com/",
  "aboutCompany": "EMIAC Technologies is a digital marketing agency specialising in SEO, content, and outreach...",
  "location": "Jaipur, Rajasthan",
  "addressLocality": "Jaipur",
  "addressRegion": "Rajasthan",
  "country": "IN",
  "workFromHome": false,
  "partTime": false,
  "employmentType": "INTERN",
  "stipend": { "currency": "INR", "min": 5000, "max": 7000, "unit": "MONTH", "text": "₹5,000 - 7,000 /month" },
  "durationText": "6 months",
  "startDateText": "Immediately",
  "numberOfOpenings": 2,
  "withJobOffer": false,
  "perks": ["Certificate", "Letter of recommendation", "Flexible work hours"],
  "postedDate": "2026-06-25",
  "applyByDate": "2026-07-25",
  "category": ["Marketing"],
  "skills": ["Adobe Photoshop", "CorelDRAW", "Adobe Illustrator", "Graphic Design"],
  "responsibilities": "Design social media creatives, banners, and marketing collateral...",
  "whoCanApply": "Available for a full-time (in-office) internship, can start between the given dates...",
  "otherRequirements": "Portfolio of prior design work preferred.",
  "description": "Selected intern's day-to-day responsibilities include designing...",
  "applyUrl": "https://internshala.com/internship/detail/graphic-design-internship-in-jaipur-at-emiac-technologies",
  "employerEmail": "careers@emiactech.com",
  "scrapedAt": "2026-07-03T09:14:22.000Z"
}
````

> `employerEmail` appears only when `enrichEmails` is enabled.

### Key Output Fields

**Identity & links**

- `type` — `internship` or `job`
- `id` — stable Internshala posting slug/id
- `url` — canonical posting URL
- `applyUrl` — direct apply link
- `scrapedAt` — ISO timestamp of extraction

**Role**

- `title`, `employmentType`
- `category[]` — Internshala categories the posting belongs to
- `skills[]` — required skills
- `responsibilities`, `whoCanApply`, `otherRequirements`, `description`

**Company**

- `companyName`, `companyWebsite`, `aboutCompany`
- `employerEmail` — enriched contact email (only with `enrichEmails`)

**Location & mode**

- `location`, `addressLocality`, `addressRegion`, `country`
- `workFromHome`, `partTime`

**Compensation & terms**

- `stipend` — `{ currency, min, max, unit, text }`
- `durationText`, `startDateText`, `numberOfOpenings`
- `withJobOffer` — comes with a PPO
- `perks[]` — certificate, LoR, flexible hours, etc.

**Dates**

- `postedDate`, `applyByDate`

### FAQ

**Do I need an Internshala account or login?**
No. The scraper reads Internshala's public pages over plain HTTP and parses the structured data every posting already publishes. There is no login, no cookie, and no headless browser involved.

**Can it scrape both internships and jobs?**
Yes. Set `listingType` to `internship`, `job`, or `both`. Internshala lists fresher/entry-level jobs alongside internships, and each row is tagged with a `type` field so you always know which is which.

**How do the filters work — and can I just paste a URL instead?**
Both. You can set `searchQuery`, `category`, `location`, and the boolean/numeric filters (`workFromHome`, `partTime`, `withJobOffer`, `forWomen`, `minStipend`, `maxDurationMonths`) and the scraper builds the matching Internshala search. Or, if you already have an Internshala URL from your browser — a listing, a filtered search, or a single posting — paste it into `startUrls`. Listing and posting URLs can be mixed in the same list; detail pages are detected automatically.

**How does the employer-email enrichment work, and what's the coverage?**
It's an opt-in extra (`enrichEmails`). When enabled, the scraper takes the hiring company on each posting — using the company website Internshala publishes where available — and looks up a contact email for it, attaching `employerEmail` to the row. Coverage depends on whether the company has a discoverable public email; postings where none can be found simply come back without the field. This is the one capability no competing Internshala scraper offers, and it's what turns a job feed into a lead list.

**Can I run this on a schedule and only get new postings?**
Yes. Turn on `monitoringMode` and schedule the actor. Each run compares against postings seen in previous runs and returns only the new ones, so you can watch a category, city, or search for fresh internships without re-processing (or re-paying for) rows you already have.

**What format is the stipend in?**
`stipend` is a structured object: `{ currency, min, max, unit, text }` — e.g. `{ "INR", 5000, 7000, "MONTH", "₹5,000 - 7,000 /month" }`. The `min`/`max`/`unit` fields are numeric and machine-friendly for filtering and analysis, while `text` preserves Internshala's original human-readable string. Fixed (non-range) stipends come through with `min` equal to `max`; unpaid internships come through as zero.

**What export formats are supported?**
Every run writes to an Apify dataset you can download as JSON, CSV, Excel, XML, or JSONL, or fetch via the Apify API. It plugs into scheduling, webhooks, and integrations (Google Sheets, Zapier, Make, etc.) like any Apify actor.

**How fast is it, and how many postings can it handle?**
Because it's pure HTTP with no browser, throughput is high and cost per result is low. It scales from a single posting to tens of thousands across many searches; use `maxItems` to cap volume and Apify residential proxies for the largest runs. Enabling `enrichEmails` adds a lookup step per posting, so email-enriched runs take a little longer.

### Support

- **Found a bug or need a new field?** Open a ticket on the **Issues** tab of this actor — it's the fastest way to reach me and I actively maintain this scraper.
- **Email:** <muhamed.didovic@gmail.com>
- **Website:** [muhamed-didovic.github.io](https://muhamed-didovic.github.io/)

### Additional Services

Need something beyond the standard output? I build and maintain custom scrapers and data pipelines. Happy to help with:

- Custom fields, filters, or export formats tailored to your workflow
- Scheduled, incremental feeds wired into your ATS, CRM, or data warehouse
- Enrichment beyond employer email (company firmographics, social profiles, etc.)
- Private or dedicated actors for high-volume or compliance-sensitive use

Reach out via the Issues tab or email and describe what you need.

### Explore More Scrapers

Browse my other Apify actors — job boards, business directories, review sites, social platforms, and more — on my profile: [memo23 on Apify](https://apify.com/memo23).

### ⚠️ Disclaimer

Internshala is a trademark of Scholiverse Educare Pvt. Ltd. (Internshala). This actor is an independent tool and is **not** affiliated with, authorized by, endorsed by, or in any way officially connected to Internshala or Scholiverse Educare.

This scraper accesses only **publicly available** data — the same information any visitor can see in their browser without logging in. It does not bypass authentication, access private or gated data, or collect personal data beyond what companies voluntarily publish on public postings.

You are responsible for how you use the data you collect. Use it in compliance with Internshala's Terms of Service, applicable laws (including the GDPR, India's DPDP Act, and other data-protection and anti-spam regulations), and any contractual obligations you may have. In particular, when using enriched employer emails, ensure your outreach complies with applicable consent and marketing laws. Do not use scraped data to spam, harass, or violate anyone's privacy.

### SEO Keywords

internshala scraper, internshala api, internship scraper, internshala jobs scraper, india internships data, stipend data scraper, campus hiring data, fresher jobs scraper, internshala data extraction, employer email finder, internship data api, internshala internships crawler, work from home internships scraper, india jobs scraper, internship listings scraper, recruiter lead generation, hiring market research, job posting scraper, internshala email enrichment, student internships data, indian startups hiring data

# Actor input Schema

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

Scrape internships, jobs, or both. `both` uses Internshala's internships surface (the superset).

## `searchQuery` (type: `string`):

Free-text keyword to search for, e.g. `python`, `content writing`. Becomes the `keywords-...` segment of the search URL.

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

Field or stream to filter by, e.g. `computer science`, `marketing`, `graphic design`, `human resources`.

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

City to filter by, e.g. `mumbai`, `delhi`, `bangalore`. Ignored for work-from-home-only searches.

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

Only return work-from-home (remote) listings.

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

Only return part-time listings.

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

Only return listings that come with a job offer / pre-placement offer (PPO).

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

Only return listings from Internshala's `Internships for women` category.

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

Only return listings up to this duration, in months. Snapped to a supported value (1-6). Applied only when no category/city/keyword is set (Internshala can't combine the two).

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

Only return listings paying at least this monthly stipend, in INR. Snapped to a supported bracket (2000, 4000, 6000, 8000, 10000). Applied only when no category/city/keyword is set.

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

Full internshala.com search or detail URLs. Mix listing and detail URLs freely.

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

Fetch each listing's detail page to capture the complete JobPosting record (description, stipend, skills, company website, dates, etc.). Turn off to skip the extra requests.

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

If enabled, tries to find a contact email for each hiring company by using its on-page website (or discovering one via Clearbit) and reading its contact/about pages. Adds contactEmail + contactWebsite columns plus a detailed emailEnrichment object. Best-effort, billed per contact email found; only charged when an email is returned, never for misses.

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

Hard cap on the number of listings collected. Internshala pages return ~40-50 cards each; use this cap to limit billing.

## `monitoringMode` (type: `boolean`):

When enabled, listings whose Internshala numeric ID has already been delivered to you are silently skipped (the detail page is not fetched and no charge applies). The first run after enabling monitoring returns every match — that builds your baseline. Every subsequent run returns only new postings. Combine with Apify's scheduler for a 'posted since last run' feed.

## `resetMonitoringState` (type: `boolean`):

One-shot toggle: clear the saved 'already seen' record at the start of this run. Use this when you change the search, want to rebuild the baseline, or recover from a missed delivery. Has no effect when monitoring mode is off.

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

Maximum number of detail pages processed in parallel.

## `minConcurrency` (type: `integer`):

Minimum number of detail pages processed in parallel.

## `maxRequestRetries` (type: `integer`):

Number of retries before a failed request is given up.

## `proxy` (type: `object`):

Leave empty — the actor already routes all traffic through its own built-in residential proxy at no extra cost to you. Only set this if you want to use your own proxies.

## Actor input object example

```json
{
  "listingType": "both",
  "searchQuery": "python",
  "category": "computer science",
  "location": "mumbai",
  "workFromHome": false,
  "partTime": false,
  "withJobOffer": false,
  "forWomen": false,
  "maxDurationMonths": 3,
  "minStipend": 10000,
  "startUrls": [
    "https://internshala.com/internships/computer-science-internship-in-mumbai/"
  ],
  "includeDetails": true,
  "enrichEmails": false,
  "maxItems": 1000,
  "monitoringMode": false,
  "resetMonitoringState": false,
  "maxConcurrency": 10,
  "minConcurrency": 1,
  "maxRequestRetries": 5
}
```

# 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 = {
    "startUrls": [
        "https://internshala.com/internships/computer-science-internship-in-mumbai/"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("memo23/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 = { "startUrls": ["https://internshala.com/internships/computer-science-internship-in-mumbai/"] }

# Run the Actor and wait for it to finish
run = client.actor("memo23/internshala-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "startUrls": [
    "https://internshala.com/internships/computer-science-internship-in-mumbai/"
  ]
}' |
apify call memo23/internshala-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=memo23/internshala-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Internshala Scraper - Internships & Jobs + Employer Emails",
        "description": "Internshala scraper — pull internships and jobs by keyword, category, city and filters (stipend, duration, work-from-home, part-time, PPO). Full details per posting: company, stipend, skills, openings, apply-by date. Optional employer-email enrichment + incremental monitoring. JSON/CSV",
        "version": "0.0",
        "x-build-id": "cjyBrcpa616o9Wckb"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/memo23~internshala-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-memo23-internshala-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/memo23~internshala-scraper/runs": {
            "post": {
                "operationId": "runs-sync-memo23-internshala-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/memo23~internshala-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-memo23-internshala-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "properties": {
                    "listingType": {
                        "title": "Listing type",
                        "enum": [
                            "internship",
                            "job",
                            "both"
                        ],
                        "type": "string",
                        "description": "Scrape internships, jobs, or both. `both` uses Internshala's internships surface (the superset).",
                        "default": "both"
                    },
                    "searchQuery": {
                        "title": "Search keyword",
                        "type": "string",
                        "description": "Free-text keyword to search for, e.g. `python`, `content writing`. Becomes the `keywords-...` segment of the search URL."
                    },
                    "category": {
                        "title": "Category / stream",
                        "type": "string",
                        "description": "Field or stream to filter by, e.g. `computer science`, `marketing`, `graphic design`, `human resources`."
                    },
                    "location": {
                        "title": "Location (city)",
                        "type": "string",
                        "description": "City to filter by, e.g. `mumbai`, `delhi`, `bangalore`. Ignored for work-from-home-only searches."
                    },
                    "workFromHome": {
                        "title": "Work from home only",
                        "type": "boolean",
                        "description": "Only return work-from-home (remote) listings.",
                        "default": false
                    },
                    "partTime": {
                        "title": "Part-time only",
                        "type": "boolean",
                        "description": "Only return part-time listings.",
                        "default": false
                    },
                    "withJobOffer": {
                        "title": "With job offer (PPO) only",
                        "type": "boolean",
                        "description": "Only return listings that come with a job offer / pre-placement offer (PPO).",
                        "default": false
                    },
                    "forWomen": {
                        "title": "For women",
                        "type": "boolean",
                        "description": "Only return listings from Internshala's `Internships for women` category.",
                        "default": false
                    },
                    "maxDurationMonths": {
                        "title": "Maximum duration (months)",
                        "minimum": 1,
                        "maximum": 6,
                        "type": "integer",
                        "description": "Only return listings up to this duration, in months. Snapped to a supported value (1-6). Applied only when no category/city/keyword is set (Internshala can't combine the two)."
                    },
                    "minStipend": {
                        "title": "Minimum stipend (INR / month)",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Only return listings paying at least this monthly stipend, in INR. Snapped to a supported bracket (2000, 4000, 6000, 8000, 10000). Applied only when no category/city/keyword is set."
                    },
                    "startUrls": {
                        "title": "Internshala URLs",
                        "type": "array",
                        "description": "Full internshala.com search or detail URLs. Mix listing and detail URLs freely.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "includeDetails": {
                        "title": "Include full detail pages",
                        "type": "boolean",
                        "description": "Fetch each listing's detail page to capture the complete JobPosting record (description, stipend, skills, company website, dates, etc.). Turn off to skip the extra requests.",
                        "default": true
                    },
                    "enrichEmails": {
                        "title": "Enrich with employer contact emails (experimental, billed per email)",
                        "type": "boolean",
                        "description": "If enabled, tries to find a contact email for each hiring company by using its on-page website (or discovering one via Clearbit) and reading its contact/about pages. Adds contactEmail + contactWebsite columns plus a detailed emailEnrichment object. Best-effort, billed per contact email found; only charged when an email is returned, never for misses.",
                        "default": false
                    },
                    "maxItems": {
                        "title": "Maximum items to scrape",
                        "minimum": 1,
                        "type": "integer",
                        "description": "Hard cap on the number of listings collected. Internshala pages return ~40-50 cards each; use this cap to limit billing.",
                        "default": 1000
                    },
                    "monitoringMode": {
                        "title": "Monitoring mode (only return listings not seen on previous runs)",
                        "type": "boolean",
                        "description": "When enabled, listings whose Internshala numeric ID has already been delivered to you are silently skipped (the detail page is not fetched and no charge applies). The first run after enabling monitoring returns every match — that builds your baseline. Every subsequent run returns only new postings. Combine with Apify's scheduler for a 'posted since last run' feed.",
                        "default": false
                    },
                    "resetMonitoringState": {
                        "title": "Reset monitoring state (one-shot)",
                        "type": "boolean",
                        "description": "One-shot toggle: clear the saved 'already seen' record at the start of this run. Use this when you change the search, want to rebuild the baseline, or recover from a missed delivery. Has no effect when monitoring mode is off.",
                        "default": false
                    },
                    "maxConcurrency": {
                        "title": "Max concurrency",
                        "minimum": 1,
                        "type": "integer",
                        "description": "Maximum number of detail pages processed in parallel.",
                        "default": 10
                    },
                    "minConcurrency": {
                        "title": "Min concurrency",
                        "minimum": 1,
                        "type": "integer",
                        "description": "Minimum number of detail pages processed in parallel.",
                        "default": 1
                    },
                    "maxRequestRetries": {
                        "title": "Max request retries",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Number of retries before a failed request is given up.",
                        "default": 5
                    },
                    "proxy": {
                        "title": "Proxy configuration (optional override)",
                        "type": "object",
                        "description": "Leave empty — the actor already routes all traffic through its own built-in residential proxy at no extra cost to you. Only set this if you want to use your own proxies."
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
