# Hirist Jobs Scraper | Full Descriptions & Salary (`cauldo/hirist-jobs-scraper`) Actor

Scrape tech and IT jobs from Hirist.tech with full descriptions, disclosed salaries, skills and recruiter details. Filter by city, category, experience and posting date. Export CSV, Excel or JSON, or use the API. $3 per 1,000 jobs, including descriptions.

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

## Pricing

$3.00 / 1,000 job delivereds

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

## Hirist Jobs Scraper

Get tech and IT job listings from Hirist.tech as a table you can download or use through the Apify API. Each result includes the job link, employer, locations and available hiring details. Full descriptions are included by default.

Search by keyword, then narrow the results by location, category, experience, posting date, company or work-from-home status. You don't need a Hirist account or any proxy settings.

Use the data to compare disclosed salaries across cities, research which skills employers ask for, or add Hirist listings to a job-board feed. For research into India's tech hiring market, the output keeps the source links and collection timestamps alongside the job details.

### Try it

1. Enter a keyword, such as `python`, `java developer` or `data engineer`.
2. Add any filters you need. Start with a limit of 10 jobs.
3. Run the Actor and open **Output**. Download the results as JSON, CSV or Excel, or retrieve them through the API.

This example looks for Python jobs in Bangalore, in Backend Development, posted within the last seven days and with experience requirements that overlap 3–8 years:

```json
{
  "keyword": "python",
  "locations": ["Bangalore"],
  "categories": ["Backend Development"],
  "experienceMinYears": 3,
  "experienceMaxYears": 8,
  "postedWithinDays": 7,
  "maxJobs": 10,
  "includeDescriptions": true,
  "maxPages": 5
}
```

### Pricing

**$3 per 1,000 jobs ($0.003 per job).** Descriptions are included in that price.

A job is charged when it's saved to the output dataset. There is no start fee or separate description fee. Duplicate jobs within a run, filtered-out listings and the run summary aren't charged. An empty result produces no job charge.

You can set a maximum spend for each run. A smaller budget may return fewer jobs than your requested limit. Scheduled runs are separate snapshots, so a job collected yesterday can appear and be charged again today.

### What's in the output

| Data | Fields |
| --- | --- |
| Job | ID, title, designation, source URL, application URL when supplied |
| Employer | Name, logo, industry, company type, headquarters, founding year, employee-count band |
| Location and category | All listed locations, location IDs, Hirist category and category ID |
| Description | Full source HTML and plain text, with no 4,000-character cutoff |
| Requirements | Skill tags, mandatory and optional skills, minimum and maximum years of experience |
| Salary | Disclosed minimum and maximum in lakh rupees per year (LPA) |
| Company rating | The AmbitionBox rating, review count and rating URL supplied by Hirist |
| Recruiter | Name, designation and last-active date when available |
| Other details | Posting timestamp, application and view counts, work-from-home and listing-status flags |

Each record also includes `scrapedAt` and `descriptionStatus`. The output has five views: **Jobs**, **Companies & hiring**, **Recruiters**, **Descriptions & skills**, and **All fields**.

Some listings have more detail than others. Missing optional values are left as `null`, and hidden salaries stay hidden. Company ratings come from Hirist's response; the Actor doesn't fetch a fresh rating from AmbitionBox. Recruiter activity dates generally require descriptions to be enabled. They don't establish whether a specific vacancy is still open.

If the source doesn't supply a requested description, `descriptionStatus` is `not_provided_by_source`. Turning descriptions off gives `not_requested` and can also leave some recruiter details unavailable. Sanitize the returned HTML before displaying it in your own application.

### Example output

Selected fields from a real test result are shown below. This is a saved example, not a guarantee that the vacancy is still open. The full record also contains the descriptions, skills and other fields listed above.

```json
{
  "jobId": "1670338",
  "title": "66degrees - Python Full Stack Developer - Django/React.js ",
  "company": "66degrees",
  "url": "https://www.hirist.tech/j/66degrees-python-full-stack-developer-djangoreact-js-1670338",
  "locations": [
    "Mumbai"
  ],
  "category": "Full Stack",
  "experienceMinYears": 4,
  "experienceMaxYears": 9,
  "salaryDisclosed": true,
  "salaryMinLpa": 20,
  "salaryMaxLpa": 35,
  "companyRating": 3.2,
  "recruiterLastActiveDate": "2026-09-10",
  "descriptionStatus": "available",
  "scrapedAt": "2026-09-14T00:10:43.466Z"
}
```

### Inputs and filters

| Input | How it works |
| --- | --- |
| `keyword` | Required. One keyword or phrase, up to 200 characters. |
| `locations` | Choose from 164 location options. A job must match at least one selection. Empty means all locations. |
| `categories` | Choose from 17 Hirist categories. A job must match at least one selection. Empty means all categories. |
| `experienceMinYears` | Optional lower bound, from 0 to 50 years. |
| `experienceMaxYears` | Optional upper bound, from 0 to 50 years. Must be at least the lower bound when both are set. |
| `postedWithinDays` | Optional, from 1 to 365. Uses the source posting timestamp and counts back from the start of the run in 24-hour periods. |
| `companyName` | Optional text match within the employer's name, ignoring capitalization. |
| `workFromHome` | Set to `true` to require Hirist's work-from-home flag. Default: `false`, which applies no restriction. |
| `includeDescriptions` | Fetch complete descriptions and additional detail fields. Default: `true`. |
| `maxJobs` | Maximum unique matching jobs to return, from 1 to 500. Default: 10. |
| `maxPages` | Maximum source search pages to check, from 1 to 200. Default: 100. |

Use the exact dropdown names in JSON. Different filter types work together: Bangalore or Pune plus Backend Development means the job must match either city **and** that category. A job may also list other cities; those stay in the output.

Experience filters use overlapping ranges. A search for 3–5 years includes a job asking for 2–7 years. Either bound can be left unset. Jobs without enough information to confirm an active experience, date, company or work-from-home filter are skipped.

**Remote and work from home are separate filters.** The Remote location option checks the location tag; `workFromHome` checks a different source flag. Selecting both requires both to match.

Delhi NCR includes Delhi, Faridabad, Ghaziabad, Gurgaon/Gurugram, Noida, Greater Noida and the source's Delhi NCR tag. Metros, Anywhere in India and Overseas/International use Hirist's own groups of locations. Other selections match their source location IDs directly.

### Run limits and repeat searches

The default timeout is 15 minutes. Larger runs with descriptions can take several minutes. The Actor reserves time to save a final summary, so a short custom timeout may return only a few jobs.

Open **Run summary** in Output to see the filters used, pages checked, duplicates, skipped listings, delivered count and stop reason. It distinguishes an empty search from reaching a result, page, spending or time limit. Hirist's reported total may be larger than the number that passes all your filters.

Invalid input is rejected. If Hirist returns a job that disagrees with a selected location or category, the run stops before exporting it. Other filter mismatches are skipped. Access denials and failed detail requests stop the run with an error; saved results remain available.

Jobs are deduplicated within each run. A resurrected run also checks its existing dataset before delivering jobs again. Hirist's listings can change during extraction, so the results aren't a guaranteed complete archive.

This version takes one keyword or phrase per run. It doesn't accept pasted search URLs, scrape IIMJobs or track which jobs are new since a previous run. You can schedule repeated searches in Apify; each produces a fresh snapshot.

### Questions or problems

Open an issue on this Actor with your run link, the input you used and what looks wrong. Please leave out passwords and API tokens.

This is an independent tool and is not affiliated with Hirist.

# Actor input Schema

## `keyword` (type: `string`):

Search Hirist's public job feed, for example python or java developer.

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

Optional. Match at least one selected location. Delhi NCR, Metros, Anywhere in India and Overseas/International include Hirist's listed sublocations. Remote matches Hirist's Remote location tag. Leave empty for all locations.

## `categories` (type: `array`):

Optional. Match at least one selected Hirist category, such as Backend Development or AI/ML. If locations are also selected, each job must match both filters. Leave empty for all categories.

## `experienceMinYears` (type: `integer`):

Keep jobs whose required experience range overlaps your selected range. For 3–5 years, a job asking for 2–7 years qualifies. Leave blank for no lower bound.

## `experienceMaxYears` (type: `integer`):

Upper bound of your experience range. A job qualifies when its required range overlaps yours. Leave blank for no upper bound.

## `postedWithinDays` (type: `integer`):

Keep jobs with a source posting timestamp within this many 24-hour periods before the run starts. Leave blank for all dates.

## `companyName` (type: `string`):

Optional case-insensitive match on the employer name, for example Infosys. Jobs without a matching employer name are skipped.

## `workFromHome` (type: `boolean`):

Require Hirist’s work-from-home flag. This is separate from selecting Remote under Locations. Leave off for all work arrangements.

## `maxJobs` (type: `integer`):

Maximum unique matching jobs delivered in this run, up to 500. Start with 10. Default run timeout is 15 minutes; large description runs can take several minutes.

## `includeDescriptions` (type: `boolean`):

Fetch the public detail endpoint for every delivered job. Returns plain text and the original source HTML without a 4,000-character cap. Adds one request per job.

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

Safety limit on the number of search pages fetched. The summary states when this limit stops the search.

## Actor input object example

```json
{
  "keyword": "python",
  "locations": [],
  "categories": [],
  "companyName": "",
  "workFromHome": false,
  "maxJobs": 10,
  "includeDescriptions": true,
  "maxPages": 100
}
```

# Actor output Schema

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

Unique matching jobs, complete source descriptions when requested, company and recruiter information, and disclosed salaries. Optional unavailable fields are null.

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

Requested filters, delivered count, exclusions, pagination, duplicates and stop reason. This summary is not a billable job.

# 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 = {
    "keyword": "python"
};

// Run the Actor and wait for it to finish
const run = await client.actor("cauldo/hirist-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 = { "keyword": "python" }

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

```

## MCP server setup

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