# Instahyre Jobs Scraper (`seemuapps/instahyre-jobs-scraper`) Actor

Scrape Instahyre India tech job listings by function, skill, location, company size and job type, with descriptions and new/updated/removed tracking.

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

## Pricing

$2.00 / 1,000 job listing results

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

Search and monitor public Instahyre job listings across India — filter by job function, skill, location, company size, job type and seniority, optionally pull full descriptions and experience ranges, and flag which jobs are new, updated or removed since your last run. No login required.

### What you get

- Job title, company, company tagline, founding year, logo and employee-count bucket (small / medium / large) for every listing
- Location(s), full skills list, job type (full-time or internship), and whether outstation candidates are accepted
- Direct application URL on Instahyre for each job
- With **Enrich details**: full job description (plain text), posted date, required experience range (min-max years), job function and employer website
- With **Track changes**: a `changeStatus` of `new`, `updated`, `unchanged` or `removed` on every record, so scheduled runs become a job-alert feed
- Export to JSON, CSV, Excel or Google Sheets straight from the Apify console

### Use cases

- Job-alert automation — schedule the actor and act only on `new` and `updated` listings
- Talent-market research — track which companies are hiring for which skills, functions and seniority levels
- Competitive hiring intelligence — monitor a competitor's open roles with the **Companies** filter and get notified when roles are removed
- Recruiter and staffing lead generation — find employers actively hiring for the skills you place
- Salary and experience benchmarking by role, city and company size

### How to use

1. Add **Keywords** (matched against title, skills and company) and/or **Locations** (e.g. `Bangalore`, `Hyderabad`, `Work From Home`)
2. Narrow further with **Job functions** (e.g. `Backend Development`), **Skills** (exact names such as `React.js`, `Python`), **Companies**, **Industries**, **Job types**, **Company sizes** or **Experience levels**
3. Optionally set **Min / Max years of experience** — this reads each job page, so enrichment turns on automatically
4. Set **Max items** (default 200; `0` returns the full filtered feed)
5. Turn on **Enrich details** to add descriptions, posted dates and experience ranges
6. Turn on **Track changes** and pick a **Monitor key** to flag new / updated / removed jobs across runs
7. Run the actor — results appear in the **Dataset** tab

#### How the filters work

Instahyre's public feed applies **Job functions, Skills, Companies, Industries, Job types, Company sizes and Experience levels** at the source, so those narrow the feed before anything is downloaded. **Keywords, Locations and experience years** are not supported by the feed, so the actor pages through the filtered feed and matches them itself — combine them with a source-side filter (a function or skill) to keep runs fast.

Skills are matched by exact name, so `React` and `React.js` are different skills. Use **Keywords** when you want fuzzy matching.

#### Change tracking

When **Track changes** is on, the actor keeps a snapshot of every job it returned in the named key-value store **`instahyre-job-snapshots`**, under a record named after your **Monitor key**. On the next run with the same Monitor key and the same filters it compares each job against that snapshot:

- `new` — the job was not in the previous snapshot
- `updated` — the job existed but its title, company, location, skills, experience range or description changed
- `unchanged` — identical to last time
- `removed` — the job was in the previous snapshot but is no longer in the feed (emitted as an extra record with the job id, title, company and URL)

Use a different Monitor key for each saved search you monitor. Removed jobs are only reported when the run scanned the whole filtered feed; if the run stopped at **Max items** or the actor timeout, unseen jobs are carried over to the next snapshot instead. Turning enrichment on or off changes what is hashed, so the first run after switching will report everything as `updated`.

### Output format

Each dataset record:

```json
{
  "jobId": 441499,
  "title": "Frontend Engineer",
  "candidateTitle": "Frontend Engineer",
  "company": "Soulside AI",
  "companyTagline": "Personalised mental health support",
  "companyFounded": 2023,
  "companyLogo": "https://media.instahyre.com/images/profile/base/employer/....webp",
  "companyUrl": "https://www.soulside.ai/",
  "employeeCount": 10,
  "companySize": "small",
  "location": "Bangalore, Work From Home",
  "locations": ["Bangalore", "Work From Home"],
  "skills": ["JavaScript", "Next.js", "React.js", "TypeScript"],
  "function": "Frontend Development",
  "jobType": "full_time",
  "experienceMin": 2,
  "experienceMax": 5,
  "acceptsOutstation": true,
  "url": "https://www.instahyre.com/job-441499-frontend-engineer-at-soulside-ai-bangalore/",
  "postedAt": "2026-09-01",
  "description": "We are looking for a Frontend Engineer to ...",
  "changeStatus": "new",
  "scrapedAt": "2026-09-06T04:12:33.000Z"
}
```

`description`, `postedAt`, `experienceMin`, `experienceMax` and `companyUrl` are filled only when **Enrich details** is on (`function` is filled by enrichment too, or when you filter by a single job function). `changeStatus` is present only when **Track changes** is on.

### Notes and limitations

- Instahyre does not publish salary ranges on public listings, so there is no salary field.
- Experience-year filters need enrichment, and jobs whose page cannot be read are dropped by those filters.
- Employer contact emails are not part of this actor.

# Actor input Schema

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

Words or phrases to look for in the job title, skills list or company name (case-insensitive, any match). Leave empty to skip keyword matching.

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

Cities to keep, e.g. Bangalore, Gurgaon, Hyderabad, Pune, Work From Home (or 'remote'). A job matches when any of these appears in its location list. Leave empty for all of India.

## `functions` (type: `array`):

Instahyre job functions to include, by name or numeric id, e.g. Backend Development, Full-Stack Development, Data Science / Machine Learning, DevOps / Cloud, Product Management. Partial names match every function containing them (e.g. 'development').

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

Exact skill names as they appear on Instahyre listings, e.g. React.js, Node.js, Python, AWS. Matching is case-insensitive and a job needs any one of them. Partial names do not match — use Keywords for fuzzy matching.

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

Only return jobs from these employers (exact company names as shown on Instahyre, e.g. Amazon, Accenture).

## `industries` (type: `array`):

Employer industries to include, by name or numeric id, e.g. Software / IT, Banking / Financial Services, E-Commerce. Partial names match every industry containing them.

## `jobTypes` (type: `array`):

Employment type to include. Leave empty (or select both) for all jobs.

## `companySizes` (type: `array`):

Employer size buckets to include: small (under 50 employees), medium (50-199) or large (200+). Leave empty for all sizes.

## `experienceLevels` (type: `array`):

Seniority buckets to include, as classified by Instahyre. Leave empty for all levels.

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

Keep jobs whose required experience range reaches at least this many years. Needs the per-job page, so it automatically turns on 'Enrich details'.

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

Keep jobs whose required experience range starts at or below this many years. Needs the per-job page, so it automatically turns on 'Enrich details'.

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

Maximum number of job records to return in this run. Set 0 for unlimited (the full filtered feed).

## `enrichDetails` (type: `boolean`):

Fetch each job's public page to add the full description, posted date, required experience range, job function and employer website. Slower (one extra request per job).

## `trackChanges` (type: `boolean`):

Compare this run against the previous snapshot stored under the Monitor key and flag every record as new, updated, unchanged or removed.

## `monitorKey` (type: `string`):

Name of the change-tracking snapshot (stored in the 'instahyre-job-snapshots' key-value store). Use a different key for each saved search you monitor.

## Actor input object example

```json
{
  "keywords": [
    "react",
    "node"
  ],
  "locations": [
    "Bangalore"
  ],
  "maxItems": 200,
  "enrichDetails": false,
  "trackChanges": false,
  "monitorKey": "default"
}
```

# Actor output Schema

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

One job per record with title, company, location(s), skills, job type, company size and URL; plus description, posted date and experience range when enrichment is on, and changeStatus (new | updated | unchanged | removed) when change tracking is on.

## `snapshots` (type: `string`):

Named key-value store 'instahyre-job-snapshots' holding one record per Monitor key with the content hashes used to flag new, updated and removed jobs on the next run.

# 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": [
        "react",
        "node"
    ],
    "locations": [
        "Bangalore"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("seemuapps/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": [
        "react",
        "node",
    ],
    "locations": ["Bangalore"],
}

# Run the Actor and wait for it to finish
run = client.actor("seemuapps/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": [
    "react",
    "node"
  ],
  "locations": [
    "Bangalore"
  ]
}' |
apify call seemuapps/instahyre-jobs-scraper --silent --output-dataset

```

## MCP server setup

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