# Instahyre Jobs Scraper: India Tech Jobs, Salary & Skills (`rjmacarthy/instahyre-jobs-scraper`) Actor

Scrape India tech jobs from Instahyre by skill, city, experience, job type and company size: skills, experience range, full descriptions, internship stipends and company info. Fast JSON API, no browser, no login. Only-new-jobs mode for alerts.

- **URL**: https://apify.com/rjmacarthy/instahyre-jobs-scraper.md
- **Developed by:** [rj](https://apify.com/rjmacarthy) (community)
- **Categories:** Jobs, Automation
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.20 / 1,000 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/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

## Instahyre Jobs Scraper: India Tech Jobs, Salary & Skills

Scrape public job listings from **Instahyre** (instahyre.com), India's tech hiring platform, by skill or job title, city, job type, company size and experience. You get clean JSON with **skills arrays, parsed experience ranges (min/max years), full descriptions, internship stipends in INR, company size and founding year**. It reads Instahyre's own public JSON API, so there's no browser, no login and no proxy needed. That makes it fast, cheap and reliable. There are no e-mail "enrichment" upsells: you pay per job, plus a small fee per job-details record if you turn details on. Built-in **only-new-jobs mode** turns it into a daily job alert.

### What data can you get?

| Field | Example | Notes |
|---|---|---|
| `title`, `url` | Python Developer, https://www.instahyre.com/job-447614-... | Public job page |
| `companyName`, `companyId`, `companyLogo` | TopDoc | |
| `companyTagline`, `companyDescription`, `companyFounded`, `companySize` | 2000, 200 | Size = Instahyre's employee band (1, 10, 50, 200, 500, 1000+) |
| `locations[]`, `location`, `isRemote` | \["Bangalore", "Work From Home"] | Remote = "Work From Home" listed |
| `jobType` | full_time / internship | |
| `skills[]` | \["Python", "FastAPI", "Backend"] | Instahyre's skill tags |
| `minExperience`, `maxExperience` | 4, 8 | Years. With job details |
| `jobCategory`, `jobFunctions[]` | Software Engineering, \["Backend Development"] | With job details |
| `descriptionText`, `descriptionHtml` | Full job description | With job details |
| `salaryText`, `salaryMin`, `salaryMax`, `salaryCurrency`, `salaryPeriod` | ₹35,000 per month (stipend) | Internship stipends, or an "LPA" salary found in the description |
| `internshipDurationMonths`, `isActive`, `acceptsOutstation` | 3, true, true | |
| `id`, `jobId`, `searchKeyword`, `scrapedAt` | instahyre:447614 | Stable ID for deduplication |

### Use cases

- **Job alerts:** schedule a daily run with "Only new jobs" for "react developer in Bangalore" and send new postings to Slack, e-mail or a Google Sheet.
- **Hiring-market research:** which skills, cities and experience levels Indian tech companies are hiring for, and how many openings each company has.
- **Recruiting and sales leads:** find startups and enterprises that are actively hiring engineers (company name, size, founding year, logo).
- **Internship boards:** collect paid internships with their monthly stipend and duration.
- **Job-board aggregation:** the same flat job schema as our other job scrapers (Dice, SEEK, Workday, ATS).

### How to use

1. Enter one or more **skills or job titles** (each is its own search), e.g. `python`, `react`, `data scientist`.
2. Optionally add **locations** (Bangalore, Mumbai, Hyderabad, Pune, Gurgaon, Delhi / NCR, Chennai, Remote...), job type, company size and your experience.
3. Set **Max jobs per search** and click Start.

Python developer jobs (the default example):

```json
{ "keywords": ["python"], "maxItems": 10 }
```

React jobs in Bangalore for 3 years of experience:

```json
{ "keywords": ["react"], "locations": ["Bangalore"], "experienceYears": 3, "maxItems": 50 }
```

Remote data scientist jobs, only the new ones since the last run (schedule it daily):

```json
{ "keywords": ["data scientist"], "locations": ["Remote"], "onlyNew": true, "stateKey": "ds-remote", "maxItems": 0 }
```

Paid internships, cheapest listing-only mode (no details):

```json
{ "jobType": "internship", "includeDetails": false, "maxItems": 0 }
```

Senior backend roles requiring 5-10 years (range filter, needs details):

```json
{ "keywords": ["java", "golang"], "minExperience": 5, "maxExperience": 10, "maxItems": 100 }
```

#### Which filters run on Instahyre's servers?

Skills/titles, locations, job type, company size and "Your experience (years)" are Instahyre's own search filters, so you only pay for matching jobs. The **min/max experience range** is applied by the Actor after it reads each job's details, because Instahyre's search only takes a single "years of experience" value. Jobs that the range removes are not output and not charged as "job" (their detail request is not charged either).

### Output example

A real item (description shortened):

```json
{
  "id": "instahyre:448872",
  "jobId": 448872,
  "source": "instahyre",
  "url": "https://www.instahyre.com/job-448872-software-engineer-intern-full-stack-internship-at-privado-pune/",
  "title": "Software Engineer Intern (Full - Stack)",
  "companyName": "privado.ai",
  "companyId": 34517,
  "companyLogo": "https://media.instahyre.com/images/profile/base/employer/34517/6a65742ff7/Privado_Logomark_01_W_on_P.webp",
  "companyTagline": "Sync privacy compliance with software development",
  "companyDescription": "Privado is a SaaS-based company that builds tools for developers to identify and fix privacy issues and automates and simplifies real-time data usage to ensure all development changes are privacy compliant.",
  "companyFounded": 2020,
  "companySize": 10,
  "location": "Pune",
  "locations": [
    "Pune"
  ],
  "isRemote": false,
  "acceptsOutstation": true,
  "jobType": "internship",
  "skills": [
    "Linux",
    "Python",
    "React"
  ],
  "jobCategory": "Software Engineering",
  "jobFunctions": [
    "Backend Development",
    "Frontend Development",
    "Full-Stack Development"
  ],
  "minExperience": 0,
  "maxExperience": 0,
  "salaryText": "₹35,000 per month (stipend)",
  "salaryMin": 35000,
  "salaryMax": 35000,
  "salaryCurrency": "INR",
  "salaryPeriod": "month",
  "internshipDurationMonths": 3,
  "isActive": true,
  "descriptionText": "We're hiring a hands-on Software Engineering Intern to build full-stack features, and exposure to AI-powered and agentic systems is a plus. You'll ship real code to production and work closely with senior engineers.\n\nResponsibilities:\n\n• Build and maintain backend services and APIs in Python (FastAP...",
  "descriptionHtml": "<p>We're hiring a hands-on Software Engineering Intern to build full-stack features, and exposure to AI-powered and agentic systems is a plus. You'll ship real code to production and work closely with...",
  "detailsFetched": true,
  "searchKeyword": null,
  "scrapedAt": "2026-11-04T12:32:39.359Z"
}
```

See `samples/sample-output.json` for five full items from a real run.

### Pricing

Pay per event, no start fee:

| Event | Price | When |
|---|---|---|
| `job` | **$0.0012** | Every job saved to the dataset |
| `job-details` | **$0.0005** | Every job whose detail record (description, experience, category, stipend) was read. Only when "Include job details" is on |

Examples:

- 1,000 jobs with details ≈ **$1.70** (1,000 × $0.0012 + 1,000 × $0.0005)
- 1,000 jobs listing-only (details off) ≈ **$1.20**
- A daily alert finding 20 new jobs with details ≈ **$0.034** per day

Jobs already seen in only-new mode, duplicates across your searches, and failed detail requests are never charged. The Actor respects your **Maximum cost per run**: it stops cleanly when the budget is reached.

### Tips and limits

- **Results are sorted by relevance, not date**, and Instahyre does not publish a posting date. To track fresh jobs, use **Only new jobs** on a schedule with **Max jobs per search = 0**: a new posting can rank anywhere in the results, and with only-new mode you pay only for new jobs anyway (listing pages are free).
- **Salary:** Instahyre doesn't show salaries for most full-time jobs. `salary*` fields are filled for internships (the stipend, per month) and when a description states a salary in LPA/lakhs (per year). Otherwise they are `null`.
- **Experience** (`minExperience`/`maxExperience`), **description**, job category and functions come from the job details. With "Include job details" off they are `null`.
- Skill searches are fuzzy, like on the site: "react" also returns React Native jobs, and deep pages are less relevant. Use `maxItems` to keep the most relevant results.
- Instahyre serves at most 10,000 results per search. Split very broad searches by location or skill.
- Locations must be Instahyre's city names. Common aliases (Bengaluru, Gurugram, Delhi NCR, Remote/WFH) are mapped automatically.
- Recruiter names, e-mails and phone numbers are **never** output. E-mail addresses and phone numbers inside descriptions are replaced with `[email removed]` / `[phone removed]`.

### FAQ

**Is it legal to scrape Instahyre?**
This Actor collects only publicly available job postings that anyone can see without logging in. It does not collect personal data such as recruiter names or contact details. You are responsible for using the data in line with Instahyre's terms, data-protection law (e.g. India's DPDP Act, GDPR) and your local regulations. If in doubt, consult a lawyer.

**Do I need a proxy?**
No. Instahyre's API answers Apify's servers directly. If a run ever reports HTTP 403/429, enable Apify Proxy (datacenter) in "Proxy configuration". Residential proxies are not supported: if you select the RESIDENTIAL group, the Actor logs a warning and uses datacenter proxy instead.

**How fast is it?**
About 35 jobs per listing request. With details, it reads up to 3 job records per second (the "Max requests per second" setting). 100 jobs with details take about 40 seconds.

**Can I get recruiter e-mails?**
No, by design. Other Instahyre scrapers sell "e-mail enrichment". We don't harvest personal contact data.

**Why is a field null?**
Fields from the job details are null when details are off or the detail request failed (`detailsFetched: false`). Salary is null when Instahyre doesn't publish one.

### Integrations

Use the results from the [Apify API](https://docs.apify.com/api/v2), the JavaScript/Python clients, or no-code tools: **Make**, **Zapier**, **n8n**, Google Sheets, Slack and webhooks. AI agents can call this Actor through the [Apify MCP server](https://mcp.apify.com). The run also writes a `RUN_SUMMARY` record (counts, per-search status, request statistics) to the key-value store.

### Changelog

- **0.1** (November 2026): first release. Skill/title, location, job type, company size and experience filters; job details (description, experience range, category, stipend); only-new-jobs mode; budget-aware pay-per-event billing.

### More scrapers by the same developer

- [ATS Jobs Scraper: Greenhouse, Lever, Ashby & Workday](https://apify.com/rjmacarthy/ats-jobs-scraper)
- [Dice Jobs Scraper](https://apify.com/rjmacarthy/dice-jobs-scraper)
- [Reed.co.uk Jobs Scraper - UK Job Listings with Salary](https://apify.com/rjmacarthy/reed-jobs-scraper)
- [SEEK Jobs Scraper](https://apify.com/rjmacarthy/seek-jobs-scraper)
- [Workday Jobs Scraper](https://apify.com/rjmacarthy/workday-jobs-scraper)
- [AI Visibility Tracker: ChatGPT, Perplexity, Gemini, Claude](https://apify.com/rjmacarthy/ai-search-visibility-tracker)

Browse all my Actors on [my Apify Store profile](https://apify.com/rjmacarthy).

### Support

Found a search that doesn't work, or need an extra field? Open an issue on the **Issues** tab with your input. Fixes are usually quick.

# Actor input Schema

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

What to search for: skills or designations, e.g. "python", "react", "data scientist", "devops". Each entry is a separate search (Instahyre's own skills filter, matched on the server). Leave empty to list all open jobs.

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

Indian cities as Instahyre names them, e.g. "Bangalore", "Mumbai", "Hyderabad", "Pune", "Gurgaon", "Delhi / NCR", "Chennai", or "Remote" (= Work From Home). Aliases such as Bengaluru and Gurugram work. Several locations match any of them. Leave empty for all of India and remote.

## `jobType` (type: `string`):

Full-time jobs, internships, or both.

## `companySize` (type: `string`):

Instahyre's company-size filter.

## `experienceYears` (type: `integer`):

Only jobs suitable for a candidate with this many years of experience (Instahyre's own experience filter, applied on the server). Leave empty for all.

## `minExperience` (type: `integer`):

Keep only jobs whose required experience range overlaps \[min, max]. Applied after reading each job's details, so it needs "Include job details". Leave empty for no lower bound.

## `maxExperience` (type: `integer`):

Upper bound of the experience range above. Leave empty for no upper bound.

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

Stop each search after this many jobs. 0 = no limit (Instahyre serves up to 10,000 results per search).

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

Read each job's public detail record for the full description, required experience (min/max years), job category and functions, internship stipend and duration. One extra request per job, charged as a "job-details" event. Turn off for the cheapest listing-only output.

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

Output (and pay for) only jobs not output by a previous run with the same "Monitor name". The first run outputs everything and becomes the baseline. Ideal for scheduled job alerts.

## `stateKey` (type: `string`):

Name of the "only new jobs" memory. Use a different name for each separate alert/schedule.

## `maxRequestsPerSecond` (type: `integer`):

Politeness limit for requests to Instahyre (at most 3 run in parallel).

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

Not needed: Instahyre's API answers Apify's IPs directly. If you get HTTP 403/429, enable Apify Proxy (datacenter). Residential proxies are not supported; a RESIDENTIAL group automatically falls back to datacenter proxy.

## Actor input object example

```json
{
  "keywords": [
    "python"
  ],
  "jobType": "any",
  "companySize": "any",
  "maxItems": 10,
  "includeDetails": true,
  "onlyNew": false,
  "stateKey": "default",
  "maxRequestsPerSecond": 3,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `jobs` (type: `string`):

One item per job: company, title, locations, remote flag, job type, experience range, skills and job URL.

## `jobsFull` (type: `string`):

Every field, including full description, job functions, salary/stipend and company details.

## `summary` (type: `string`):

Per-search status, counts, request statistics and warnings.

# 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"
    ],
    "maxItems": 10,
    "proxyConfiguration": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("rjmacarthy/instahyre-jobs-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"],
    "maxItems": 10,
    "proxyConfiguration": { "useApifyProxy": False },
}

# Run the Actor and wait for it to finish
run = client.actor("rjmacarthy/instahyre-jobs-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"
  ],
  "maxItems": 10,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}' |
apify call rjmacarthy/instahyre-jobs-scraper --silent --output-dataset

```

## MCP server setup

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