# Instahyre Jobs Scraper: India Tech & Startup Jobs (`precious_bathmat/instahyre-job-scraper`) Actor

Scrape India tech and startup jobs from Instahyre: title, company, company size and founding year, cities, work from home and skills. Plus a hiring report per search with job counts by function, company size, top companies and cities over every matching job. No login.

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

## Pricing

from $1.00 / 1,000 jobs

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 & Startup Jobs

Scrape **tech and startup jobs in India from Instahyre** (instahyre.com), with no login and no API key, and get a **hiring report for every search**:

- **Every job**: title, company, company tagline, **founding year and age**, **company size band**, about the company, **cities**, **work from home**, **skills**, link
- **Filters**: keywords (skills or titles), companies, cities, your years of experience, company size (small, medium, large), full-time or internship
- **Report per search**, over **every matching job** (Instahyre's own counts): jobs by **job function**, by **company size**, **top companies**, **top cities** and the remote share; plus, over the jobs read: **top skills**, top titles, companies hiring, median company age and share of young companies

### What does this Instahyre scraper do?

```
Instahyre · "python" · 4,268 jobs
 Backend 47% · Full-stack 36% · Data science / ML 33% · DevOps 23%
 Large companies 56% · small 28% · medium 16%
 Bangalore 61% · Gurgaon 13% · Hyderabad 10% · remote 9%
 300 jobs read: 188 companies hiring, median company age 9 years
```

1. Enter **keywords** (one search each), optional **companies** and **cities**.
2. Pick filters: **experience**, **company size**, **job type**.
3. You get **one row per job** and **one report per search**.

```mermaid
flowchart LR
    A[Keywords,<br/>companies,<br/>filters] --> B[Instahyre<br/>job search<br/>35 per page]
    B --> C[Jobs<br/>company, size,<br/>cities, skills]
    B --> D[Counts over<br/>every match<br/>function, size,<br/>companies, cities]
    C --> E[Report<br/>skills, titles,<br/>company ages]
    D --> E
```

### Who is it for?

- **Tech recruiters and staffing agencies in India**: which companies are hiring for a stack right now, and where
- **Sales teams selling to tech companies**: a list of companies hiring engineers, with size band and founding year
- **Founders and HR teams**: how many companies compete for the same skills, and which skills appear together
- **Job seekers and bootcamps**: every open role for a skill with the other skills employers expect
- **Analysts**: demand by stack, city and company size across India's tech job market

### What data do you get?

**Jobs** (dataset, one row per job)

| Field | What it tells you |
|---|---|
| `id`, `title`, `url` | The job and its Instahyre page |
| `company`, `companyId`, `companyTagline`, `companyAbout`, `companyLogo` | The employer |
| `companyFounded`, `companyAgeYears`, `companySizeBand` | How old and how big (Instahyre's size band, not an exact headcount) |
| `featuredEmployer`, `diversityEmployer` | Instahyre's employer badges |
| `locations`, `workFromHome`, `acceptsOtherCities` | Cities, remote, and whether candidates from other cities are considered |
| `skills` | Skills the job lists |
| `search`, `keywords`, `companySearched` | Which search found it |

**Report** (`REPORTS`, one per search; `REPORTS_CSV` as a flat sheet)

| Field | What it tells you |
|---|---|
| `totalOnInstahyre`, `jobsScanned`, `jobsRead`, `allJobsRead` | How many jobs match and how many were read |
| `allJobsByJobFunction`, `allJobsByCompanySize`, `allJobsTopCompanies`, `allJobsTopLocations`, `allJobsByType` | Over **every** matching job, with shares |
| `topSkills`, `topTitles`, `topCompanies`, `topCities`, `workFromHomePercent`, `multiCityPercent` | Over the jobs read |
| `companiesHiring`, `medianCompanyAgeYears`, `companiesFoundedLast5YearsPercent`, `companiesBySizeBand` | Who is hiring |
| `broadMatch` | `true` when the keywords have several words (see Good to know) |

### Example: 24 October 2026

Five searches, 300 jobs read each (1,500 jobs in 3 minutes, no rate-limit errors):

| Search | Jobs on Instahyre | Main job function | Large companies | Bangalore | Top skills besides the keyword |
|---|---|---|---|---|---|
| python | 4,268 | Backend 47% | 56% | 61% | FastAPI, Java, Django, Golang |
| react | 1,641 | Full-stack 86% | 53% | 56% | TypeScript, React Native, JavaScript |
| devops | 2,149 | Backend 45%, DevOps 42% | 63% | 52% | Kubernetes, AWS, Terraform, GCP |

"java" with the city **Pune** (and remote jobs): 50 jobs found in the first 280 read, from 27 companies, 66% of all 2,608 Java jobs at large companies.

### Pricing

Pay per event:

| Event | Price |
|---|---|
| Job saved | $0.001 |
| Search report | $0.02 |

1,000 jobs with a report cost **$1.02**. Platform usage is small: 1,500 jobs used under $0.01 of compute.

### Good to know

- **Speed**: Instahyre answers 429 ("too many requests") after about 20 requests a minute, so the Actor reads one page of 35 jobs every 4 seconds, about **500 jobs a minute**, and waits when asked to slow down.
- **No salary, experience range or date**: the public search does not carry them. Use **experience** to see the jobs Instahyre shows someone with that many years.
- **Several words match broadly**: "data science" matched 7,952 jobs and "product manager" 11,117 of the ~12,700 on Instahyre. Results are ranked by relevance, so the jobs read first are the right ones (Data Scientist, Data Engineer ...), but the all-jobs counts include loosely related jobs; such searches carry `broadMatch: true`. Single words ("python", "devops") count cleanly.
- **Cities**: the API has no city filter, so with cities set the Actor reads jobs and keeps those in your cities (plus remote jobs unless turned off). For rare cities this reads more pages. `allJobsTopLocations` gives the city split over every matching job either way.
- **Job functions overlap**: a job can sit in several functions, so those shares add up to more than 100%.
- **No personal data**: recruiter names are not collected.

### Input

| Field | Default | What it does |
|---|---|---|
| `keywords` | `["python"]` | One search per skill or title; empty = every job |
| `companies` | – | One search per company (combined with each keyword) |
| `cities` | – | Keep only jobs in these cities |
| `includeWorkFromHome` | `true` | With cities, keep remote jobs too |
| `experienceYears` | – | Jobs for someone with this many years (0 to 30) |
| `companySize` | any | Small, medium or large |
| `jobType` | any | Full-time or internship |
| `maxJobsPerSearch` | `200` | Most jobs saved per search (up to 10,000) |
| `includeReports` | `true` | One report per search |

```json
{
  "keywords": ["python", "react", "devops"],
  "cities": ["Bangalore"],
  "experienceYears": 3,
  "companySize": "small",
  "maxJobsPerSearch": 500
}
```

### Integrations

Run it weekly to watch who is hiring for your stack, send the dataset to **Google Sheets**, **Airtable** or a CRM, or call it from **Make**, **Zapier**, **n8n** or the **Apify API**. The `REPORTS_CSV` record opens directly in any spreadsheet.

# Actor input Schema

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

Skills or job titles, one search each, e.g. "python", "react", "data science", "product manager", "devops". Empty = every job on Instahyre (with the filters below).

## `companies` (type: `array`):

Optional company names as Instahyre lists them, one search each (combined with every keyword), e.g. "Amazon", "Accenture".

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

Optional: keep only jobs in these cities, e.g. "Bangalore", "Gurgaon", "Hyderabad", "Pune". Instahyre has no city filter, so jobs are read and filtered (slower for rare cities).

## `includeWorkFromHome` (type: `boolean`):

With cities set, also keep work-from-home jobs.

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

Optional: only jobs Instahyre shows to someone with this many years of experience (0 to 30).

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

Instahyre's company size filter.

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

Full-time jobs or internships.

## `maxJobsPerSearch` (type: `integer`):

Most jobs to save per search (1 to 10,000). Instahyre allows about 500 jobs a minute.

## `includeReports` (type: `boolean`):

One report per search: every matching job by job function, company size, type, top companies and cities (Instahyre's own counts), plus top skills, titles, company ages and remote share of the jobs read.

## Actor input object example

```json
{
  "keywords": [
    "python"
  ],
  "includeWorkFromHome": true,
  "companySize": "any",
  "jobType": "any",
  "maxJobsPerSearch": 200,
  "includeReports": true
}
```

# Actor output Schema

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

One row per job: title, company, tagline, founding year and size band, about the company, cities, work from home, skills, link.

## `reports` (type: `string`):

Per search: every matching job by job function, company size, type, top companies and cities; top skills, titles and company ages of the jobs read.

## `reportsCsv` (type: `string`):

One flat row per search.

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

Requests, problems and the limits of the data.

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

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

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

```

## MCP server setup

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