# Instahyre Jobs Search Scraper (`jobsapi/instahyre-jobs-search-scraper`) Actor

Scrape job listings from Instahyre.com, India's AI-driven tech hiring platform. Extract job titles, companies, locations, salary ranges, skills, and experience requirements for technology recruitment in India.

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

## Pricing

from $2.99 / 1,000 instahyre job records

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.

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 Search Scraper

This local-only Apify Actor extracts public Instahyre job records through the existing official JSON API at `https://www.instahyre.com/api/v1`. Requests use ordinary direct access, one at a time, with no custom headers, proxy, fingerprinting, retries, or automatic redirects. The platform `status` is separate from dataset `resultStatus`. HTTP 401/403/429/451 or a visible source-authored denial/challenge stops the run as `SUCCEEDED`/`SKIPPED` and discards buffered rows; generic HTTP/transport failures are `SUCCEEDED`/`DEFERRED` when no complete rows exist, or `SUCCEEDED`/`LIMITED` when complete rows were retained. A fatal error with no stored complete row is `FAILED`/`FAILED`; a clean empty search is `SUCCEEDED`/`NO_DATA`. Receipts and diagnostics stay in key-value storage and are never emitted as dataset rows. No Cloud calls or publishing are performed.

### Modes

- `search`: bounded public API search with optional location, remote, internship, and experience filters.
- `searchMultiple`: runs up to three independent public API queries.
- `single`: fetches one verified public job URL.
- `multiple`: fetches up to ten verified public job URLs.

Every job record is enriched through the existing `employer_public_jobs/{id}` endpoint and admitted to the dataset only after title, company, location, description, ID, public URL, detail identity, and the 21-meaningful-source-fact threshold pass. A later non-barrier failure does not erase already verified rows. Unavailable optional values are omitted; employment type is never inferred from a non-internship flag, and no application URL is fabricated because the public API does not expose one.

### Local commands

```powershell
npm install --ignore-scripts --no-package-lock
npm test
npm run lint
apify validate-schema .actor/input_schema.json
$env:APIFY_LOCAL_STORAGE_DIR = ".\storage-instahyre-local-validation"
if (Test-Path $env:APIFY_LOCAL_STORAGE_DIR) { throw "Choose a new, nonexistent actor-relative storage directory before running." }
apify run --resurrect --input-file INPUT.json
npm run validate
```

Use `INPUT-single.json`, `INPUT-multiple.json`, or `INPUT-search-multiple.json` to exercise the other modes. Before each local run, select a fresh relative storage directory and confirm it does not exist; never use `--purge` or reuse a dataset directory. The validator reads that same `APIFY_LOCAL_STORAGE_DIR`, reconciles the actual dataset with `OUTPUT`, `OUTPUT_SUMMARY`, and `REQUEST_RECEIPTS`, and rejects sparse, duplicate, unverified, or sub-threshold records. No dataset files should be edited by hand.

### Output highlights

Records include the source API payloads, canonical public URL, readable description and sections, company facts and source-published links, locations, remote status, experience range, skills, job functions, category, recruiter details, explicitly supplied employment/internship flags, sectioned responsibilities and qualifications, structured job-posting data, request receipts, field coverage, and data-quality flags. Each emitted record has at least 21 distinct meaningful source facts; salary, date, review, industry, and other values are included only if the public API response actually provides them.

# Changelog

This Actor's version history is a separate document: https://apify.com/jobsapi/instahyre-jobs-search-scraper/changelog.md

# Actor input Schema

## `mode` (type: `string`):

Search the public API, run several searches, or fetch one or more public job URLs.

## `query` (type: `string`):

Job title, skill, or keyword sent to the official Instahyre search API.

## `queries` (type: `array`):

Used by searchMultiple mode; each query returns up to maxItems records.

## `location` (type: `string`):

Optional city or region filter applied to public search results.

## `directUrls` (type: `array`):

Official Instahyre public job URLs for single or multiple mode.

## `jobUrl` (type: `string`):

Alias for one public job URL.

## `directUrl` (type: `string`):

Alias for one official public job URL.

## `jobUrls` (type: `array`):

Alias for official public job URLs in single or multiple mode.

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

Alias for public Instahyre job URLs; search-page URLs are not accepted as detail records.

## `startUrl` (type: `string`):

Alias for one official public job URL.

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

Maximum complete job records to emit, bounded locally to 1–10.

## `maxPages` (type: `integer`):

Maximum official API pages to inspect in search modes, bounded locally to 1–3.

## `requestTimeoutSecs` (type: `integer`):

Timeout for each official public API request, bounded locally to 5–30 seconds.

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

Keep only listings whose public location indicates remote work.

## `internshipOnly` (type: `boolean`):

Keep only public detail records marked as internships.

## `experienceMin` (type: `number`):

Optional minimum experience threshold applied after public detail enrichment.

## Actor input object example

```json
{
  "mode": "search",
  "query": "software engineer",
  "maxItems": 3,
  "maxPages": 1,
  "requestTimeoutSecs": 15,
  "remoteOnly": false,
  "internshipOnly": false
}
```

# Actor output Schema

## `dataset` (type: `string`):

No description

# 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 = {};

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

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

```

## MCP server setup

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