# Instahyre Jobs Scraper — India Tech Jobs & Hiring Monitor (`memo23/instahyre-jobs-scraper`) Actor

Search and monitor India tech jobs on Instahyre — title, skills, city, apply URL and the full hiring-company profile (headcount, founded year, tagline) on every row. Track only-new postings, filter by skill, city, company or size, and add employer emails. JSON, CSV or Excel.

- **URL**: https://apify.com/memo23/instahyre-jobs-scraper.md
- **Developed by:** [Muhamed Didovic](https://apify.com/memo23) (community)
- **Categories:** Jobs, Lead generation
- **Stats:** 34 total users, 30 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: 5.00 out of 5 stars

## Pricing

from $1.50 / 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?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — 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

## Instahyre Jobs Scraper — India Tech Jobs & Hiring Monitor

Search India's tech job market on Instahyre and watch it change over time. Every row carries the job (title, skills, locations, apply URL) plus the hiring company's full profile — name, tagline, founding year, employee count and description. Run it once for a clean dataset, or turn on monitor mode to get only the postings that are new since your last run, so you catch companies the moment they start hiring. Powered by Instahyre's own JSON API, so runs are fast and rows are exact — no HTML guesswork.

Search by skill and city, paste listing or job URLs, and optionally add employer contact emails to turn each hiring company into an outreach-ready lead.

#### How it works

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

#### ✨ Why use this scraper?

- **API-exact data** — rows come from Instahyre's JSON API, one request per 35 jobs. Fast, cheap, and immune to layout changes.
- **Company intelligence included** — founding year, headcount, tagline and company description ride along on every job row, which most job scrapers skip.
- **Skill search that actually filters** — the `skills` filter binds server-side (verified against row content, since Instahyre ignores several of its own documented parameters).
- **Honest city filtering** — Instahyre's API ignores location parameters, so the city and remote filters are applied to row content on our side; rows that miss the filter are skipped and never billed.
- **Employer emails on demand** — opt-in enrichment discovers the company's website and harvests a contact email, billed only per row where one is found.
- **Bulk-friendly and fail-safe** — paste many URLs or skills; failed requests retry direct then through residential, and produce no billed placeholder rows.

#### 🔁 Hiring monitor — track only what's new

Companies that just started hiring are the freshest lead of all. Turn on `monitoringMode` and the scraper remembers which jobs it has already seen, then on every later run emits only the postings that appeared since — new roles, new companies, new stacks. Point it at a skill (`react`) or a city (`bangalore`), put it on an Apify schedule, and you get a daily feed of who's newly hiring for what, with the company profile and optional email already attached.

- **First run** emits a baseline of current postings (or skip the baseline and start clean).
- **Later runs** emit only changes, so you pay for signal, not for re-scraping the same board.
- **State is per-actor**, and `resetMonitoringState` clears it when you want a fresh baseline.

This is the difference between a one-off export and a standing hiring-signal feed.

#### 🎯 Use cases

| Who | What they do with it |
|---|---|
| **Recruiters & sourcing teams** | Monitor which companies hire for which stacks across India's tech hubs. |
| **Lead generation** | Companies actively hiring are companies actively buying — enriched with emails, each row is an outreach-ready lead. |
| **Job boards & aggregators** | Clean structured rows with stable ids for deduplicated ingestion. |
| **Market & salary researchers** | Skill demand by city and company size over time. |
| **Founders & analysts** | Track competitor hiring as a growth signal, with founding year and headcount context built in. |

#### 📥 Supported inputs

| Input | Example |
|---|---|
| Skills / keywords | `python`, `react`, `data science` |
| City | `bangalore`, `gurgaon`, `hyderabad`, `mumbai` |
| Remote only | roles listed under Work From Home |
| Listing URLs | `https://www.instahyre.com/python-jobs-in-bangalore/` |
| Job detail URLs | `https://www.instahyre.com/job-439825-backend-engineer-at-biopeak-bangalore/` |

**Not supported:** candidate-side pages behind login, applying to jobs, and non-instahyre.com domains.

#### ⚙️ Input parameters

| Field | Type | Default | Notes |
|---|---|---|---|
| `searchQueries` | array | `["python"]` | One search walk per skill/keyword |
| `city` | string | — | Applied to row content (see FAQ) |
| `remoteOnly` | boolean | `false` | Work From Home roles only |
| `startUrls` | array | `[]` | Listing or job URLs; override the search fields |
| `enrichEmails` | boolean | `false` | Employer email discovery, billed per found email |
| `maxItems` | integer | `1000` | Hard cap on billed rows |
| `proxy` | object | direct | Direct works; residential fallback kicks in on retries automatically |

#### 📦 Output sample

Real row from a live run:

```json
{
    "type": "job",
    "source": "instahyre",
    "jobId": "439825",
    "jobUrl": "https://www.instahyre.com/job-439825-backend-engineer-at-biopeak-bangalore/",
    "title": "Backend Engineer",
    "companyName": "Biopeak",
    "location": "Bangalore",
    "remote": false,
    "skills": ["Java", "Python", "CI / CD", "Golang", "Microservices", "Node.js", "SQL"],
    "companyTagline": "Personalized longevity clinic",
    "companyFounded": 2024,
    "companyEmployeeCount": 10,
    "companyDescription": "Biopeak is a personalised longevity clinic…",
    "companyImage": "https://media.instahyre.com/images/profile/…",
    "acceptsOutstationCandidates": true,
    "applyType": "internal",
    "applyUrl": "https://www.instahyre.com/job-439825-backend-engineer-at-biopeak-bangalore/",
    "scrapedAt": "2026-08-22T12:07:41.512Z"
}
```

Rows follow the portfolio-wide canonical job shape (same field names as the CutShort, Naukri and RemoteOK scrapers), so multi-source pipelines map one column layout across all of them.

#### 🔑 Output fields

Every job row carries these fields (missing values come back `null`, never guessed):

| Field | What it is |
|---|---|
| `jobId` | Stable Instahyre job id — use it as the dedup key |
| `title` | Job title |
| `jobUrl` / `applyUrl` | Listing URL and where to apply |
| `applyType` | `internal` (apply on Instahyre) or `external` |
| `companyName` | Hiring company |
| `location` / `remote` | City, and whether the role is Work From Home |
| `skills` | Array of the stack the role asks for |
| `companyTagline` | One-line company positioning |
| `companyFounded` | Founding year — a maturity signal |
| `companyEmployeeCount` | Headcount — segment startups vs enterprises |
| `companyDescription` | Full company blurb |
| `companyImage` | Logo URL |
| `acceptsOutstationCandidates` | Whether non-local applicants are considered |
| `contactEmail` | Employer email (only when `enrichEmails` is on and one is found) |
| `scrapedAt` | ISO timestamp of the run |

The company fields are what most job scrapers drop — they turn a job feed into a company-intelligence feed you can segment by size, age and stack.

#### ❓ FAQ

**Can I get a daily feed of only new jobs?**
Yes — that's monitor mode. Turn on `monitoringMode`, put the actor on an Apify schedule, and each run returns only postings that appeared since the last one. See the Hiring Monitor section above.

**How does the city filter work if the API ignores location parameters?**
The skill filter narrows the walk server-side; the city/remote filters then keep only rows whose location matches, on our side. Skipped rows are never billed. The trade-off: a very narrow city in a broad skill can take a few extra unbilled pages to fill your `maxItems`.

**Does it include salary?**
Instahyre's public API does not expose salary on listings, so there is no salary column pretending otherwise.

**What does `enrichEmails` cost?**
It is billed as an additional-data event only on rows where an email was actually found — see the pricing tab. Discovery uses the company name plus a business-match guard, so unrelated domains are rejected rather than guessed.

**Do I need a proxy?**
No. Instahyre's Cloudflare passes browser-grade TLS from a direct connection; the retry ladder adds residential automatically if a request struggles.

#### 💬 Support

Open an issue on the actor's **Issues tab** in Apify Console — answered within 1–2 business days.

#### 🛠 Additional services

Scheduled hiring-signal feeds, multi-board merges (Instahyre + CutShort + Naukri), or delivery straight to your CRM — custom builds available, contact me through the actor page.

#### 🔎 Explore more scrapers

Same developer, same canonical row shape: [CutShort Jobs](https://apify.com/memo23/cutshort-jobs-scraper), [Naukri](https://apify.com/memo23/naukri-scraper), [RemoteOK](https://apify.com/memo23/remoteok-jobs-scraper), [Remote Jobs Aggregator](https://apify.com/memo23/remote-jobs-aggregator) — full portfolio at [memo23 on Apify Store](https://apify.com/memo23).

#### 🤖 For AI Agents & LLM Apps

Stable, typed JSON with a `type` discriminator and canonical field names shared across the whole jobs family — an agent that learns one scraper's shape can drive them all. Skill search maps cleanly to tool calls; keep `maxItems` low per call for cost control.

***

### ⚠️ Disclaimer

This Actor is an independent tool and is not affiliated with, endorsed by, or sponsored by Instahyre or its operators. All trademarks are the property of their respective owners. The scraper accesses only publicly available listing data — no login, no candidate profiles, no private information. Users are responsible for compliance with Instahyre's Terms of Service, applicable data-protection law (GDPR, DPDP Act, CCPA), and their own organisation's obligations, particularly when using contact enrichment for outreach.

***

### SEO Keywords

instahyre scraper, instahyre jobs scraper, india tech jobs scraper, india hiring monitor, hiring signals india, new job postings tracker india, instahyre jobs api, scrape instahyre, bangalore startup jobs data, india hiring data, instahyre company data, tech recruitment leads india, jobs api india, startup hiring signals india, who is hiring india, apify instahyre

# Actor input Schema

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

One search walk per entry — e.g. `python`, `react`, `data science`. Leave empty (with no URLs) to walk the whole board, newest first.

## `city` (type: `string`):

Optional city filter shared by every search — e.g. `bangalore`, `gurgaon`, `hyderabad`, `mumbai`.

## `remoteOnly` (type: `boolean`):

Only roles listed under Work From Home.

## `skills` (type: `array`):

Keep only jobs whose skill tags match, e.g. `react`, `python`, `sql`. Case-insensitive, partial match.

## `skillMatch` (type: `string`):

`Any` keeps a job when one listed skill matches; `All` requires every listed skill.

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

Keep only jobs matching these terms across title, skills, company and location. Case-insensitive.

## `keywordMatch` (type: `string`):

`Any` keeps a job when one keyword matches; `All` requires every keyword.

## `companyNames` (type: `array`):

Allowlist of employer names (case-insensitive, partial). Leave empty to keep all companies.

## `excludeKeywords` (type: `array`):

Skip any job containing one of these terms in its title, skills, company or location.

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

Filter by employer headcount band.

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

Filter by employment type. Job type only appears on the detail page, so this turns on 'Fetch job details' automatically (those detail fetches are billed).

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

Listing pages (`instahyre.com/python-jobs-in-bangalore/`) or job detail pages (`/job-{id}-…/`). When present, the search fields above are ignored.

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

Discover the hiring company's website and harvest a contact email from it. Billed per row with a found email — see the pricing tab.

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

Fetch each job's public page and add the full description, employment type, exact location and posting dates. One extra request per job.

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

When enabled, jobs whose Instahyre ID has already been delivered to you are silently skipped — the row is not fetched or billed. The first run after enabling monitoring returns every match and builds your baseline; every later run returns only new postings. Combine with Apify's scheduler for a 'jobs posted since last run' feed.

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

One-shot: clear the saved 'jobs already seen' record at the start of this run. Use after changing the search, to rebuild the baseline, or to recover from a missed delivery. No effect when monitoring mode is off.

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

Hard cap on billed rows for the run — your spend guard.

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

Parallel fetches (the API pages at 35 rows per request, so most runs need very few).

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

Retries per request before it is skipped.

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

The site answers a direct connection (the built-in retry ladder adds a residential fallback automatically). Configure a proxy only if you want all traffic through it.

## Actor input object example

```json
{
  "searchQueries": [
    "python"
  ],
  "remoteOnly": false,
  "skills": [],
  "skillMatch": "any",
  "keywords": [],
  "keywordMatch": "any",
  "companyNames": [],
  "excludeKeywords": [],
  "companySize": "any",
  "jobType": "any",
  "startUrls": [],
  "enrichEmails": false,
  "includeDetails": false,
  "monitoringMode": false,
  "resetMonitoringState": false,
  "maxItems": 1000,
  "maxConcurrency": 10,
  "maxRequestRetries": 5,
  "proxy": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

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

One row per job with title, company (including size, stage, funding and tech stack), location, salary band, experience range, skills and apply URL.

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

// Run the Actor and wait for it to finish
const run = await client.actor("memo23/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 = {
    "searchQueries": ["python"],
    "proxy": { "useApifyProxy": False },
}

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

```

## MCP server setup

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