# Internshala Scraper (`dami_studio/internshala-scraper`) Actor

Internshala scraper API for internships and fresher jobs in India by keyword, category or city. Each row has the role, company, city, skills, stipend or salary typed as monthly, yearly or unpaid, duration, apply-by and posted dates, and openings. $0.34 per 1,000 postings.

- **URL**: https://apify.com/dami_studio/internshala-scraper.md
- **Developed by:** [Dami's Studio](https://apify.com/dami_studio) (community)
- **Categories:** Jobs, Lead generation
- **Features:** Limited permissions
- **Stats:** 8 total users, 3 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.33 / 1,000 postings

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 for internships and fresher jobs in India, with stipend, duration and apply-by dates**:
search by keyword, category, city or filter, and every posting comes back as a row with the role,
company, city, skills, stipend or salary, duration, posted and apply-by dates, openings and the full
description. No Internshala account, nothing to install.

A misspelled category or city quietly gets you the unfiltered board, which you then
pay for. Write categories and cities the way Internshala writes them, and check `searchUrl` on the
first few rows before you run anything large.

| | |
|---|---|
| **Input** | Keywords, categories, cities and filters, or Internshala URLs |
| **Output** | One row per internship or job: role, company, city, skills, typed stipend or salary, duration, dates, openings |
| **Ceiling** | 20,000 postings per run, or Internshala's own last page, whichever comes first |
| **Account needed** | None, and nothing to install |
| **Price** | $0.34 per 1,000 postings on the Free plan, a little less on paid plans. The free plan's $5 a month covers about 14,700 |

### 🔍 What Internshala Scraper does

**Internshala runs two boards and you pick which.** Internships are short placements with a monthly
stipend. Jobs are full-time fresher and early-career roles with an annual salary. Set **What to
scrape** to `both` and each row is tagged with its `type`.

Which filters apply depends on the board. Stipend, duration, part-time, the pre-placement-offer
filter, the women-only board, the international board, early applicant and fast response are all
internships. Annual salary, experience level and fresher-only are jobs. Keywords, categories and
cities work on either.

Every keyword is walked separately, so two keywords means two searches sharing one budget.

**`includeDetails` is on by default**, and it is where the apply-by date, the number of openings,
the exact posted date instead of "2 days ago", the start date, the perks, the eligibility rules, the
company's profile and website and the full description come from. Turn it off for a listing-only
sweep and you keep the title, company, city, stipend, duration, skills and a description snippet.

Two things to watch if you paste URLs. Changing **What to scrape** away from its default counts as a
filter, so the run walks the board as well as reading your links. And a posting that is both pasted
and found by a search comes back twice and is billed twice, because the two routes read its id from
different places. Use one route or the other for the same posting.

### 📋 What data you get from each Internshala posting

| What you get | Field |
|---|---|
| The posting's id, board, title and link | `id`, `type`, `title`, `url` |
| The company, its Internshala page, website and logo | `companyName`, `companyUrl`, `companyWebsite`, `companyLogo` |
| Where it is, and remote, hybrid or part-time | `locations`, `locationLabel`, `region`, `countryCode`, `isWorkFromHome`, `isHybrid`, `isPartTime` |
| The stipend or salary, parsed and typed | `stipendText`, `stipendMin`, `stipendMax`, `stipendCurrency`, `stipendPeriod`, `stipendType`, `stipendIsEstimate` |
| Duration and experience | `durationText`, `durationMonths`, `experienceText`, `experienceYears` |
| Skills | `skills` |
| Posted date, and whether it is exact | `postedRelative`, `postedAt`, `postedAtIsExact` |
| Apply-by date, openings, start date | `applyByText`, `applyBy`, `openings`, `startDateText`, `startsImmediately` |
| Hiring flags and a pre-placement offer | `isActivelyHiring`, `isEarlyApplicant`, `hasJobOfferAfterInternship`, `jobOfferText` |
| Industry, perks, eligibility, the company blurb, the description | `industry`, `employmentType`, `perks`, `eligibility`, `aboutCompany`, `descriptionText` |
| Where the row came from | `searchQuery`, `searchUrl`, `page`, `position`, `scrapedAt` |

### ▶️ How to scrape Internshala

1. Open [Internshala Scraper](https://apify.com/dami_studio/internshala-scraper) and click
   **Try for free**.
2. Type a skill or role into **Keywords**, and pick **What to scrape**.
3. Add a **Category** or **City** if you want, spelled the way Internshala spells it.
4. Set **Maximum postings**. Start around 25 to see what the rows look like.
5. Click **Start**, then download the dataset as JSON, CSV or Excel, or read it from the Apify API.

### 💰 How much does it cost to scrape Internshala?

**$0.34 per 1,000 postings** on the Free plan. Paid plans pay a little less: $0.335 on Starter, $0.33 on Scale and $0.325 on Business. On the free plan, the
$5 Apify gives you each month covers about 14,700 postings.

One billed row per posting delivered. The sample row is not billed and diagnostic rows are not
billed. A posting whose own page failed is still delivered and still billed, with a `detailNote` on
it saying so.

### 📥 What you give it

```json
{
  "searchQueries": ["python"],
  "listing": "internships",
  "cities": ["bangalore"],
  "workFromHome": true,
  "minStipend": 10000,
  "maxItems": 200
}
```

| Field | Default | What it is |
|---|---|---|
| `searchQueries` | box starts at `python` | Searches as you would type them into Internshala's box. A skill, a role or a company. |
| `listing` | `internships` | Also `jobs`, or `both` to walk each in turn. |
| `categories` | none | Internshala's own categories, spelled its way: `computer science`, `graphic design`, `human resources`. Several are combined with OR. |
| `cities` | whole country | Indian cities like `bangalore`, `pune`, `hyderabad`. Several are combined with OR. |
| `startUrls` | none | Internshala listing pages or single postings, pasted from the site. |
| `workFromHome`, `partTime`, `withJobOffer` | off | Remote only, part-time only, and internships that come with a job offer afterwards. |
| `minStipend` | none | Monthly stipend floor in rupees. Postings that pay less are left out and not charged. A range counts by its midpoint, the way Internshala's own filter reads it, and weekly or lump-sum pay is turned into a monthly figure first. Unpaid and performance-based postings are left out, and so are stipends in another currency unless Internshala's own filter kept them. |
| `maxDurationMonths` | none | Longest internship to keep, in months. |
| `minSalary`, `experience`, `fresherOnly` | none | Annual salary floor in rupees (600000 is 6 lakh), experience cap and fresher-only, all on the jobs board. A salary value under 100 is read as lakhs, so 6 also means 6 lakh. A job whose salary range starts below the floor is left out and not charged. |
| `includeInternshipsInJobs` | off | Internshala's "also show internships" toggle on the jobs board. |
| `internationalOnly`, `forWomen` | off | The international board, and the women-only board. |
| `earlyApplicant`, `fastResponse` | off | Few applications so far, and employers who reply quickly. |
| `startingAfter` | none | `YYYY-MM-DD`. Internships starting on or after that day. |
| `includeDetails` | on | Open each posting's own page for the full record. |
| `detailConcurrency` | `10` | Posting pages read at once, 1 to 16. |
| `maxItems` | `50` | Total postings for the run, up to 20,000. |
| `egressMode` | `auto` | Leave it alone. |
| `proxyConfiguration` | leave it alone | Optional. Only if you want the run to go out through a particular network of your own. |

### 📤 What you get back

A real row from a run on 20 September 2026:

```json
{
  "id": "3293620",
  "type": "internship",
  "title": "Machine Learning",
  "url": "https://internshala.com/internship/detail/machine-learning-internship-in-multiple-locations-at-innoknowvex1789836401",
  "companyName": "Innoknowvex",
  "companyUrl": "https://internshala.com/company/innoknowvex-1739944702",
  "companyWebsite": null,
  "companyLogo": "/static/images/search/placeholder_logo.svg",
  "locations": ["Chennai, Coimbatore, Madurai, Tirunelveli, Thanjavur, Tiruppur, Tiruchirappalli, Salem, Vellore"],
  "locationLabel": "Chennai, Coimbatore, Madurai, Tirunelveli, ...",
  "region": null,
  "countryCode": "IN",
  "isWorkFromHome": false,
  "isHybrid": false,
  "isPartTime": null,
  "stipendText": "₹ 11,000 - 23,000 /month",
  "stipendMin": 11000,
  "stipendMax": 23000,
  "stipendCurrency": "INR",
  "stipendPeriod": "MONTH",
  "stipendType": "range",
  "stipendIsEstimate": false,
  "durationText": "3 Months",
  "durationMonths": 3,
  "experienceText": null,
  "experienceYears": null,
  "skills": ["Data Analytics", "Machine Learning", "Natural Language Processing (NLP)", "Python", "R Programming", "..."],
  "postedRelative": "Today",
  "postedAt": "2026-09-20",
  "postedAtIsExact": false,
  "applyByText": "19 Oct' 26",
  "applyBy": "2026-10-19",
  "openings": 100,
  "startDateText": "Immediately",
  "startsImmediately": true,
  "isActivelyHiring": true,
  "isEarlyApplicant": true,
  "hasJobOfferAfterInternship": true,
  "jobOfferText": "Job offer upto ₹ 4.6LPA post internship",
  "industry": null,
  "employmentType": null,
  "perks": [],
  "eligibility": [],
  "aboutCompany": null,
  "descriptionText": "Selected intern's day-to-day responsibilites include: 1. Assist in collecting and cleaning datasets for ML projects...",
  "searchQuery": "python",
  "searchUrl": "https://internshala.com/internships_ajax/keywords-python/",
  "page": 1,
  "position": 1,
  "scrapedAt": "2026-09-20T07:04:31.833Z"
}
```

The `locationLabel`, `skills` and `descriptionText` above are cut short. A real row carries them in
full.

| Field | How to read it |
|---|---|
| `stipendMin` / `stipendMax` / `stipendPeriod` / `stipendType` | The employer's own pay figure, parsed. `stipendType` says whether it is a `range`, `fixed`, `unpaid`, `lump-sum`, `performance-based`, `negotiable` or `not-stated`, so an unpaid posting cannot be mistaken for a missing number. Weekly and daily stipends are real and are marked as such. |
| `postedAt` / `postedAtIsExact` | The date, and whether it is Internshala's exact posted date or one worked back from "2 days ago". Check the flag before you filter on the date. |
| `applyBy`, `openings`, `startDateText` | From the posting's own page, so they need `includeDetails` on. |
| `region`, `industry`, `aboutCompany` | Come from the posting's structured data, which multi-city postings do not carry. Expect these `null` on roughly one row in six. |
| `hasJobOfferAfterInternship` / `jobOfferText` | Whether a pre-placement offer is attached, and Internshala's own wording for it. |
| `searchUrl` | The exact URL used. Check it if a filter looks like it was ignored. |
| `detailNote` | Present when the posting's own page could not be read. The row still arrives, and is still billed, with the listing-level fields only. |

### 🧾 Reading the output

| Row | How to spot it | Billed |
|---|---|---|
| A posting | It has an `id` and no `_sample` or `_diagnostic` key | yes |
| The sample row | `_sample: true` and `charged: false` | no |
| A diagnostic | `_diagnostic: true`, `charged: false` and an `errorCode` | no |

Posting rows carry no `charged` field. The flag is only on the sample and diagnostic rows, to mark
them as not real results.

| Code | What it means |
|---|---|
| `NO_RESULTS` | That search matched nothing. |
| `BAD_URL` | A link that is not an Internshala listing or posting page. |
| `DETAIL_FAILED` | A pasted posting could not be read, usually because it has expired. |
| `HTTP_ERROR` | Internshala answered with an error status. |
| `NOT_JSON` | Internshala answered with something this run could not read. |
| `TIME_LIMIT` | The run got close to its time limit and stopped on its own. The postings delivered before that are complete and charged. Give the run more time, or ask for fewer postings, to get the rest. |
| `UNEXPECTED_ERROR` | The run stopped early on an unexpected error. The results before this row are kept. |

The run ends as succeeded either way. When the time limit stopped it before any posting came back, you get a `TIME_LIMIT` row and an amber status message; otherwise you get what it delivered.

### 💡 What people use it for

- Hiring research in India: what stipends and salaries employers are actually advertising, by
  category and city.
- Building a company list from `companyName` and `companyUrl` across a category.
- Watching one city or skill daily with a small `maxItems`, and diffing on `id`, which is stable for
  postings found by a search.
- Pay benchmarking, because `stipendMin`, `stipendMax` and `stipendPeriod` are parsed rather than
  left as text.
- Finding postings with a pre-placement offer attached, which is its own filter.

### 🚧 What it does not do

- **India, plus a small international board.**
- **A filter Internshala does not recognise is ignored, not refused.** You get the whole board and
  you pay for it. Check `searchUrl` on the first rows.
- **No applicant counts.** The early-applicant flag is the only signal of competition.
- **`postedAt` is often approximate.** Read `postedAtIsExact` before filtering on dates.
- **Multi-city postings have no structured data**, so `region`, `industry` and `aboutCompany` come
  back `null` on roughly one row in six.
- **Pasting a URL and searching for the same posting bills it twice.** The two routes read its id
  differently, so the duplicate check does not catch it.
- **Changing What to scrape turns a URL-only run into a board walk.** Leave it on its default if
  you only want your pasted links.
- **One search runs out at Internshala's own last page.** Use several keywords, cities or
  categories to go wider rather than raising the cap.
- It is not an official Internshala tool. Dami's Studio is independent and is not affiliated with or endorsed by Internshala, or by any other company named on this page.

### 🧭 Which job scraper do you need?

| If you want | Use |
|---|---|
| Internships and fresher jobs in India, with typed stipends | This one |
| Hackathons, competitions, internships and jobs from Unstop | [Unstop Scraper](https://apify.com/dami_studio/unstop-scraper) |
| Jobs in India by keyword and city, from Naukri | [Naukri Jobs Scraper](https://apify.com/dami_studio/naukri-jobs-scraper) |
| Public LinkedIn jobs by keyword and location | [LinkedIn Jobs Scraper](https://apify.com/dami_studio/linkedin-jobs-scraper) |
| Every open job at companies you name, read from their own hiring system | [Career Site Jobs Scraper](https://apify.com/dami_studio/career-site-jobs-scraper) |
| Startup jobs with salary and equity | [Wellfound Jobs Scraper](https://apify.com/dami_studio/wellfound-jobs-scraper) |

### ❓ Questions people ask

#### Do I need an Internshala account?

No. Everything here is on public listing and posting pages.

#### What is the difference between the two boards?

Internships are short placements paid by the month. Jobs are full-time fresher and early-career
roles paid by the year. Pick one, or take both and read the `type` field.

#### Why did my category filter return everything?

Internshala ignored it. Spell it the way the site does, then check `searchUrl` on the first row.

#### Can I get the apply-by date without opening every posting?

No. For that, the openings count and the exact posted date, leave
**Open each posting for the full record** on.

#### Are unpaid internships included?

Yes, and they are marked. `stipendType` reads `unpaid` rather than leaving the number blank.

#### Can I call it from code or connect it to an AI assistant?

The [API tab](https://apify.com/dami_studio/internshala-scraper/api/python) has code for Python, JavaScript and the
CLI. MCP clients like Claude and ChatGPT use
`https://mcp.apify.com/?tools=fetch-actor-details,dami_studio/internshala-scraper`; coding assistants can load [our
skill file](https://api.apify.com/v2/key-value-stores/BTBHU3DdiuoF4JOsK/records/apify-jobs-SKILL.md). All three bill
your Apify account at the same price.

#### Is scraping Internshala legal?

These are public job postings. Company and contact details are personal data in some
jurisdictions, so have a reason for collecting them. Apify's write-up on
[the legality of web scraping](https://blog.apify.com/is-web-scraping-legal/) is a good starting
point, and we are not lawyers.

### 🆘 If something breaks

Open the **Issues** tab on the actor page. Send the keyword or URL you used and the run ID. The
`errorCode` on the diagnostic row usually names the problem on its own.

# Actor input Schema

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

One or more searches, exactly as you would type them into Internshala's search box: a skill ("python"), a role ("graphic design"), or a company name ("Infosys"). Each keyword is walked separately, so \["python", "data science"] runs two searches. Leave empty to take everything that matches the filters below.

## `listing` (type: `string`):

Internshala runs two boards. Internships (7,007 live on 2026-08-08) are short placements with a monthly stipend. Jobs (8,663 live) are full-time fresher and early-career roles with an annual salary. "Both" walks the two in turn and tags every row with a "type" field.

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

Internshala's own categories, written the way the site writes them: "marketing", "computer science", "human resources", "content writing", "data science", "finance", "graphic design", "web development". Several categories are combined with OR.

## `cities` (type: `array`):

Indian cities, for example "bangalore", "delhi", "mumbai", "pune", "hyderabad", "chennai", "kolkata", "gurgaon". Several cities are combined with OR. Leave empty for the whole country.

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

Only remote postings. Measured on 2026-08-08: 2,154 of 7,007 internships and 1,456 of 8,663 jobs are work-from-home.

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

Only part-time internships, 1,449 of 7,007 on 2026-08-08. Ignored on the jobs board.

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

Internshala's PPO filter: internships with a pre-placement offer. 1,223 of 7,007 on 2026-08-08. Those rows also carry the offer text, for example "Job offer upto ₹ 2.4LPA post internship".

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

Only internships paying at least this much a month, in rupees. Any amount up to 12,000 works. For a range, the midpoint has to reach it, and weekly or lump-sum pay is turned into a monthly figure first. Unpaid and performance-based internships are left out, and so are stipends in another currency unless Internshala's own filter keeps them. Nothing left out is charged. Every row also carries stipendMin, so you can filter harder afterwards.

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

Only internships that last at most this many months. It is cumulative: 1 gave 610 results, 2 gave 1,319, 6 gave 6,975 on 2026-08-08.

## `minSalary` (type: `number`):

Only jobs paying at least this much a year, in rupees: 600000 means 6 lakh. A value under 100 is read as lakhs, so 6 also means 6 lakh and 7.5 means 7.5 lakh. The low end of the salary range has to reach it. Jobs with no yearly figure in rupees, such as "Competitive salary" or pay in another currency, are left out unless Internshala's own filter keeps them. Nothing left out is charged. Ignored on the internships board.

## `experience` (type: `string`):

Internshala's own experience filter for the jobs board. The numbered options are cumulative caps ("1 year" returned 6,092 jobs, "2 years" 6,648); "more than 5 years" is a separate senior bucket and returned 146.

## `fresherOnly` (type: `boolean`):

Only jobs open to candidates with no work experience, 4,179 of 8,663 on 2026-08-08. Ignored on the internships board.

## `includeInternshipsInJobs` (type: `boolean`):

Internshala's "also show internships" toggle on the jobs board. It merges the two corpora into one walk, 14,447 rows on 2026-08-08 instead of 8,663. Ignored on the internships board.

## `internationalOnly` (type: `boolean`):

Internshala's international board: internships based outside India. It is small, 85 live on 2026-08-08.

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

Internshala's women-only board: 3,379 internships on 2026-08-08. Combines with the category and city filters.

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

Only internships with few applications so far, 1,924 of 7,007 on 2026-08-08.

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

Internshala's fast-response badge: employers who review applications quickly. 4,061 of 7,007 on 2026-08-08.

## `startingAfter` (type: `string`):

Only internships whose start date is on or after this day, written as YYYY-MM-DD.

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

Paste Internshala URLs instead of building a search. Works with a listing page (https://internshala.com/internships/computer-science-internship-in-bangalore/) and with a single posting (https://internshala.com/internship/detail/...). Listing URLs are walked page by page.

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

Reads each posting's own page. That is where the apply-by date, the number of openings, the exact posted date (instead of "2 days ago"), the start date, the perks, the eligibility rules, the company's Internshala profile and website, the state, and the full description come from. Measured at 84 ms per posting at concurrency 10. Turn it off for a listing-only run: you keep title, company, city, stipend, duration, skills, the description snippet and an approximate posted date.

## `detailConcurrency` (type: `integer`):

How many posting pages to read at once when "Open each posting" is on.

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

Stop after this many postings. One search runs out at Internshala's own last page, the unfiltered internships board ends at page 176 (7,007 rows) and returns nothing beyond it, so use several keywords, cities or categories to go wider.

## `egressMode` (type: `string`):

Leave this on Automatic. If a search stops with an HTTP_ERROR or NOT_JSON row, run it again in a few minutes.

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

Leave as is. Internshala needs no proxy, supply your own servers here only if you have a reason to.

## Actor input object example

```json
{
  "searchQueries": [
    "python",
    "data science"
  ],
  "listing": "internships",
  "categories": [
    "computer science",
    "data science"
  ],
  "cities": [
    "bangalore",
    "mumbai"
  ],
  "workFromHome": false,
  "partTime": false,
  "withJobOffer": false,
  "minStipend": 10000,
  "maxDurationMonths": 3,
  "minSalary": 600000,
  "experience": "",
  "fresherOnly": false,
  "includeInternshipsInJobs": false,
  "internationalOnly": false,
  "forWomen": false,
  "earlyApplicant": false,
  "fastResponse": false,
  "startingAfter": "2026-09-01",
  "startUrls": [
    {
      "url": "https://internshala.com/internships/work-from-home-computer-science-internships/"
    }
  ],
  "includeDetails": true,
  "detailConcurrency": 10,
  "maxItems": 50,
  "egressMode": "auto"
}
```

# Actor output Schema

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

One dataset row per internship or fresher job: role, company, location, stipend or salary with the period it is quoted in, duration, posted date, apply-by date, openings, work-from-home flag, skills and perks. Empty input, an unrecognised URL or a search that matches nothing writes an uncharged sample or diagnostic row instead.

# 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"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("dami_studio/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"] }

# Run the Actor and wait for it to finish
run = client.actor("dami_studio/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"
  ]
}' |
apify call dami_studio/internshala-scraper --silent --output-dataset

```

## MCP server setup

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