We found no public Internshala API or developer documentation. To get internships and jobs as data, use our Internshala API; the script below saves a search to CSV.
What we checked on Internshala
Internshala is India's internship platform. When we checked, internshala.com/api returned a 404, internshala.com/developers redirected to a page about hiring software developers, and none of the 4,804 links on its HTML sitemap pointed to API documentation. A private or partner programme wouldn't show up in those checks.
Internshala data with ToolzerHub
We make ToolzerHub. Our Internshala API has two routes, each a GET with the x-api-key header at 1 credit a call:
/v1/internshala/search?query=...returns one page of postings: 40 to 57 on the full pages we saw, fewer on a last page. Optional filters:kind(internshipsorjobs),location,arrangement(work_from_homeorpart_time),min_stipend,max_duration_months,min_salary_lakh,experienceandpage./v1/internshala/job?job_id_or_url=...takes ajob_idfrom a search or a posting link and returns the full description, every skill, perks, openings, applicants and closing date. A removed posting returnsdata: null.
export TOOLZERHUB_API_KEY=your_key
curl -G -H "x-api-key: $TOOLZERHUB_API_KEY" \
--data-urlencode "query=python" \
"https://api.toolzerhub.com/v1/internshala/search"
The first internship in data.results, trimmed:
{
"job_id": "robotics-internship-in-surat-at-shree-durga-syntex-private-limited1793678158",
"title": "Robotics",
"company": "Shree Durga Syntex Private Limited",
"locations": ["Surat"],
"is_remote": false,
"is_hybrid": false,
"pay": { "min": 18000, "max": 18000, "currency": "INR", "period": "month", "label": "₹ 18,000 /month" },
"duration": "6 Months",
"skills": ["AutoCAD", "Python", "Robotics", "Raspberry Pi", "Embedded Systems", "Arduino", "C Programming"],
"posted": "2 days ago"
}
An unpaid internship has pay.label "Unpaid" and no figures, so check the label before you average. Work-from-home roles have an empty locations and is_remote: true.
Save Internshala internships to CSV
The script pages through one search for paid internships, skips jobs it has already written, and saves one row per posting with the company, locations, stipend range, duration, skills and posting age. Save it as internshala_internships.py and install requests (pip install requests).
import csv
import os
import sys
import requests
API = "https://api.toolzerhub.com/v1/internshala/search"
HEADERS = {"x-api-key": os.environ["TOOLZERHUB_API_KEY"]}
def search(query, location=None, pages=3, min_stipend=2000):
seen = set()
for page in range(1, pages + 1):
params = {"query": query, "page": page, "min_stipend": min_stipend}
if location:
params["location"] = location
response = requests.get(API, headers=HEADERS, params=params, timeout=60)
response.raise_for_status()
body = response.json()["data"]
for job in body["results"]:
if job["job_id"] not in seen:
seen.add(job["job_id"])
yield job
if not body["has_more"]:
break
def main():
query = sys.argv[1]
location = sys.argv[2] if len(sys.argv) > 2 else None
fields = ["job_id", "title", "company", "locations", "stipend_min",
"stipend_max", "duration", "skills", "posted", "url"]
with open("internshala_internships.csv", "w", newline="", encoding="utf-8") as out:
writer = csv.DictWriter(out, fieldnames=fields)
writer.writeheader()
count = 0
for job in search(query, location):
writer.writerow({
"job_id": job["job_id"],
"title": job["title"],
"company": job["company"],
"locations": "; ".join(job["locations"]) or "Work from home",
"stipend_min": job["pay"]["min"],
"stipend_max": job["pay"]["max"],
"duration": job["duration"],
"skills": "; ".join(job["skills"]),
"posted": job["posted"],
"url": job["url"],
})
count += 1
print(f"saved {count} internships to internshala_internships.csv")
if __name__ == "__main__":
main()
python internshala_internships.py python saved 120 internships from 88 companies, and python internshala_internships.py marketing Pune saved 120 from 109 companies. Each took 3 calls and under 20 seconds.
What the searches showed
- A page's title count can be far from its result count. Internshala's page for Python internships in Bangalore was titled "167 Intern Jobs" and showed 17, and our search for the same city and word returned 17 with
has_more: false. We checked this for one city, and we don't know what the title counts. Followhas_more, not the title. - Unpaid roles clustered in remote work. 35 of the first 80 internships for "python" were unpaid, all of them work from home, against 3 of 273 in the Pune, Mumbai and Delhi lists.
min_stipend=2000removed them: all 120 rows in the Python CSV have a stipend, with a median midpoint of ₹14,250 a month and midpoints from ₹2,000 to ₹90,000. - The 364 different internships on the 11 pages we saved, from 7 searches, included 324 with a monthly stipend, 38 unpaid, one lump sum, one with no pay label and none priced in dollars. These counts describe those pages, not all of Internshala, and dollar pay did turn up on job searches.
- About a quarter of the internships in each city list are filed under multiple locations, which their
job_idsays. Of the 66 different ones, 41 name three or more cities, 24 name two and one names just one. 53 of the 364 were hybrid.
| City, first pages | Unique internships | Filed under multiple locations | Hybrid |
|---|---|---|---|
| Pune (3 pages) | 124 | 27 | 27 |
| Mumbai (2 pages) | 96 | 25 | 10 |
| Delhi (1 page) | 54 | 15 | 12 |
The first page of these city lists held 50 to 57 postings, more than the page_size of 40 says, while a narrower search can hold far fewer. Pune's three pages returned 130 postings of which 124 were different, so the script keeps each job_id once. A posting filed under multiple locations has no publication date, industry or category on its page, so /v1/internshala/job returns those as null.
What it costs
The Python CSV took 3 credits for 120 internships, and a full posting is 1 more credit each. The 100 free credits a month cover 33 such exports; $19 buys 10,000 credits that never expire, and plans for higher volume cover more searches. Set your key and the first search is a CSV in under a minute.
For other job boards, see the Naukri API and the Indeed API.
We are not affiliated with Internshala.