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

Scrape Instahyre jobs: titles, companies, skills, locations, experience range, and descriptions. Filter by job function, skills, keywords, and location. Monitor new and changed roles. Optional employer email lookup.

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

## Pricing

from $0.69 / 1,000 job listings

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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

Scrape **jobs from [Instahyre](https://www.instahyre.com)** — India's invite-style hiring platform used by 10,000+ startups and MNCs — into clean, structured JSON. The Instahyre Jobs Scraper pulls role titles, hiring companies, skills, locations, experience ranges, and full descriptions straight from Instahyre's public job feed, with no login and no Instahyre API key.

<table><tr>
<td style="border-left:4px solid #4A55A2;padding:12px 16px;font-weight:600">
Filter the Instahyre feed by job function, job type, company size, skills, keywords, and location, optionally attach the full description and experience range, discover the employer's contact email, and monitor new, updated, and removed roles on a schedule.
</td>
</tr></table>

##### Copy to your AI assistant

Copy this block into ChatGPT, Claude, Cursor, or any LLM to start using this actor.

```
Actor: parsebird/instahyre-jobs-scraper (Apify). Scrapes jobs from instahyre.com. Call with ApifyClient.
Input JSON fields:
  jobFunctionSlugs: string[] of Instahyre job-function slugs, e.g. ["backend-development","data-science-machine-learning","product-management"] (numeric IDs also work; empty = all functions)
  jobType: "any" | "full-time" | "internship"  (default "any")
  companySize: "any" | "small" | "medium" | "large"  (default "any")
  skills: string[] e.g. ["Java","Python","SQL","React"]
  skillMatch: "any" | "all"  (default "any")
  keywords: string[] matched across title, skills, company context, and location
  keywordMatch: "any" | "all"  (default "any")
  locations: string[] e.g. ["Bangalore","Pune","Gurgaon"]
  remoteOnly: bool (default false)
  companyNames: string[] partial, case-insensitive employer allowlist
  excludeKeywords: string[] terms that drop a role
  includeDetails: bool (default false) — adds description, experienceMin/Max, jobCategory, jobFunctions
  enrichEmails: bool (default false) — looks up the hiring company's website for a contact email; billed only when found
  monitorMode: "snapshot" | "changes"  (default "snapshot")
  emitBaseline: bool (default true), includeUnchanged: bool (default false), stateName: string (default "default")
  maxItems: int (default 100, = billed rows), maxPages: int (default 10, ~35 jobs per page)
  proxyConfiguration: { "useApifyProxy": true }
Output: one dataset item per job — jobId, title, candidateTitle, companyName, companyId, companyLogoUrl, companyTagline, companyFounded, employeeCount, locations[], locationsRaw, isRemote, skills[], acceptOutstation, publicUrl, resourceUri, description, experienceMin, experienceMax, jobCategory, jobFunctions[], jobType, detailStatus, employerEmail, employerEmailKind, employerEmailDomain, emailEnrichmentStatus, changeType, firstSeenAt, lastSeenAt, scrapedAt, source. Fields are omit-empty.
Example: { "jobFunctionSlugs": ["backend-development"], "locations": ["Bangalore"], "maxItems": 50 }
API: https://api.apify.com/v2/acts/parsebird~instahyre-jobs-scraper  ·  Token: https://console.apify.com/account/integrations
```

### What does Instahyre Jobs Scraper do?

[Instahyre](https://www.instahyre.com) is an AI-driven hiring platform focused on the Indian tech market, listing thousands of software, data, product, design, and business roles at companies from early-stage startups to Google, Amazon, and Accenture. Instahyre has no public jobs API — this Instahyre scraper is the alternative. It extracts:

- 💼 **Job listings** — title, candidate-facing title, skill tags, published locations, and a remote flag, from the live Instahyre feed.
- 🏢 **Hiring company** — name, ID, logo, tagline, founding year, employee-count bucket, and Instahyre's short company blurb.
- 📄 **Full job details** — description, minimum and maximum years of experience, job category, and job functions, when `includeDetails` is on.
- 📧 **Employer contact email** — an opt-in add-on that checks the hiring company's own website for a published contact address (never sourced from Instahyre, and billed only when one is found).
- 🔁 **Change monitoring** — run on a schedule and get only the roles that are new, updated, or confirmed removed since the last run.
- 🎯 **Precise filtering** — combine job function, job type, company size, skills, free-text keywords, location, and an exclude list.

Common uses: recruitment-market research on Indian tech hiring, sourcing pipelines for staffing agencies, competitor hiring monitoring, salary and skills-demand analysis, and building job datasets for an LLM.

### Input parameters

| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| jobFunctionSlugs | array | No | — | Instahyre job-function slugs (or numeric IDs). Empty = the complete public feed. |
| jobType | string | No | `any` | `any`, `full-time`, or `internship`. |
| companySize | string | No | `any` | `any`, `small`, `medium`, or `large` (Instahyre's own bucketing). |
| skills | array | No | — | Skill tags such as `Java`, `Python`, `SQL`, `React`. |
| skillMatch | string | No | `any` | Match any requested skill, or require all of them. |
| keywords | array | No | — | Terms matched across the role title, skills, company context, and location. |
| keywordMatch | string | No | `any` | Match any keyword, or require all of them. |
| locations | array | No | — | Location terms such as `Bangalore`, `Pune`, `Gurgaon`. |
| remoteOnly | boolean | No | `false` | Keep only roles whose published location indicates remote work. |
| companyNames | array | No | — | Employer allowlist with partial, case-insensitive name matching. |
| excludeKeywords | array | No | — | Terms that exclude a role from the output. |
| includeDetails | boolean | No | `false` | Add the public description, experience range, category, and functions. |
| enrichEmails | boolean | No | `false` | Look up the hiring company's website for a contact email. Billed only when found. |
| monitorMode | string | No | `snapshot` | `snapshot` returns every match; `changes` returns only what changed since last run. |
| emitBaseline | boolean | No | `true` | In `changes` mode, emit the first run's roles as new rows. |
| includeUnchanged | boolean | No | `false` | In `changes` mode, also emit roles whose fields did not change. |
| stateName | string | No | `default` | Stable name that keeps one monitoring search separate from another. |
| maxItems | integer | No | `100` | Maximum job rows saved in one run. This is the number of billed rows. |
| maxPages | integer | No | `10` | Maximum source pages scanned. One page holds up to 35 jobs. |
| proxyConfiguration | object | No | Apify Proxy | Proxy settings. Instahyre's job feed works from datacenter IPs. |

#### Job functions

Pass any live Instahyre job-function slug. A few common ones:

| Slug | Function | Slug | Function |
|------|----------|------|----------|
| backend-development | Backend Development | frontend-development | Frontend Development |
| full-stack-development | Full-Stack Development | mobile-development | Mobile Development |
| data-science-machine-learning | Data Science / Machine Learning | data-analysis-business-intelligence | Data Analysis / BI |
| devops-cloud | DevOps / Cloud | qa-sdet | QA / SDET |
| engineering-management | Engineering Management | product-management | Product Management |
| ux-visual-design | UX / Visual Design | it-security | IT Security |
| sales-business-development | Sales / Business Development | online-marketing | Online Marketing |

The full, always-current list is at [instahyre.com/api/v1/job\_function/](https://www.instahyre.com/api/v1/job_function/).

#### Example inputs

Backend roles in Bangalore, listing data only:

```json
{ "jobFunctionSlugs": ["backend-development"], "locations": ["Bangalore"], "maxItems": 50 }
```

Senior data / ML roles at large companies, with full descriptions:

```json
{
  "jobFunctionSlugs": ["data-science-machine-learning"],
  "companySize": "large",
  "skills": ["Python", "PyTorch"],
  "skillMatch": "all",
  "includeDetails": true,
  "maxItems": 100
}
```

Remote product roles, excluding contract listings:

```json
{
  "jobFunctionSlugs": ["product-management"],
  "remoteOnly": true,
  "excludeKeywords": ["contract", "intern"],
  "maxItems": 100
}
```

Daily new-jobs feed for a saved search:

```json
{
  "jobFunctionSlugs": ["frontend-development", "full-stack-development"],
  "locations": ["Pune", "Hyderabad"],
  "monitorMode": "changes",
  "emitBaseline": false,
  "stateName": "fe-pune-hyd",
  "maxItems": 500,
  "maxPages": 40
}
```

### What data can you extract from Instahyre?

#### Job fields

| Field | Description |
|-------|-------------|
| jobId | Stable public Instahyre job ID |
| title / candidateTitle | Published role title fields |
| companyName / companyId | Public employer identity |
| companyResourceUri / companyLogoUrl | Employer source and logo links |
| companyTagline / companyFounded / employeeCount | Public employer context |
| companyContext | Instahyre's short company description |
| locations / locationsRaw / isRemote | Normalized locations, the raw string, and a remote flag |
| skills | Public role skill tags |
| acceptOutstation | Whether the role accepts outstation applicants |
| publicUrl / resourceUri | Public role page and source record links |
| source | Source label (`instahyre`) for downstream joins |

#### Detail fields (`includeDetails`)

| Field | Description |
|-------|-------------|
| description | Public role description, as plain text |
| experienceMin / experienceMax | Published experience range in years |
| jobCategory / jobFunctions | Public role classification |
| jobType | `full_time` or `internship`, from the public page |
| datePosted / addressRegion / addressCountry | Extra context when published |
| detailStatus / detailError | `fetched` or `failed`, with a short reason |

#### Email fields (`enrichEmails`)

| Field | Description |
|-------|-------------|
| employerEmail | Contact email found on the hiring company's own website |
| employerEmailKind | `role` (hr@, careers@…), `generic` (info@, contact@…), or `personal` |
| employerEmailDomain | Domain of that email |
| emailEnrichmentStatus | `found`, `not_found`, or `failed` |

#### Monitoring fields

| Field | Description |
|-------|-------------|
| changeType | `snapshot`, `new`, `updated`, `unchanged`, or `removed` |
| firstSeenAt / lastSeenAt | When the role was first and most recently seen by this monitor |
| scrapedAt | When this row was captured |

All output is **omit-empty** — a field that would be null or empty is left out.

### Output example

```json
{
  "jobId": "441116",
  "title": "Salesforce Developer",
  "candidateTitle": "Salesforce Developer",
  "companyName": "Samsung",
  "companyId": 1535,
  "companyLogoUrl": "https://media.instahyre.com/images/profile/base/employer/1535/98a3bb7e0d/Samsung-Logo.webp",
  "companyTagline": "Trailblazing for a better world with better technology",
  "companyFounded": 1973,
  "employeeCount": 200,
  "locations": ["Hyderabad"],
  "locationsRaw": "Hyderabad",
  "isRemote": false,
  "skills": ["Apex", "LWC", "Lightning Web Components", "Salesforce", "Visualforce"],
  "acceptOutstation": true,
  "publicUrl": "https://www.instahyre.com/job-441116-salesforce-developer-at-samsung-hyderabad/",
  "resourceUri": "/api/v1/job_search/441116",
  "description": "Responsibilities: Design, develop, and implement complex Salesforce solutions...",
  "experienceMin": 5,
  "experienceMax": 9,
  "jobCategory": "Software Engineering",
  "jobFunctions": ["Backend Development", "Full-Stack Development", "Other Software Development"],
  "jobType": "full_time",
  "detailStatus": "fetched",
  "changeType": "snapshot",
  "firstSeenAt": "2026-08-29T08:22:50.000Z",
  "lastSeenAt": "2026-08-29T08:22:50.000Z",
  "scrapedAt": "2026-08-29T08:22:50.000Z",
  "source": "instahyre"
}
```

Download the dataset as **JSON, CSV, Excel, HTML, or XML** from the Storage tab or the [Apify API](https://docs.apify.com/api/v2).

### Use cases

- **Recruitment-market research** — track which skills, functions, and cities are hiring hardest across the Indian tech market.
- **Agency sourcing** — build a filtered pipeline of live roles by function, company size, and location, refreshed daily.
- **Competitor hiring intelligence** — watch a company allowlist and see every role it opens or closes.
- **Salary and skills-demand analysis** — combine experience ranges, skills, and company size for compensation benchmarking.
- **Lead generation** — with `enrichEmails`, attach a hiring-company contact email to each role.
- **LLM training data** — assemble a structured corpus of job descriptions and requirements.

### How it works

1. **Resolve filters** — job-function slugs are resolved to IDs against Instahyre's live catalog; job type, company size, skills, and location are pushed to the source feed where supported.
2. **Paginate the feed** — the public job feed is read page by page (up to 35 jobs per page) until `maxItems` matches are collected or `maxPages` is reached.
3. **Local filtering** — keywords, `keywordMatch`, `skillMatch: all`, `remoteOnly`, the company allowlist, and `excludeKeywords` are applied to each row.
4. **Monitoring diff** — in `changes` mode each role is compared against the stored state for its `stateName` and tagged `new`, `updated`, `unchanged`, or `removed`.
5. **Detail** — for emitted rows, `includeDetails` fetches the public job page for the description, experience range, category, and functions.
6. **Email** — `enrichEmails` reads the hiring company's own website (home, contact, about pages) for a public contact address.
7. Rows stream to the dataset and stop at `maxItems`.

### How much does it cost to scrape Instahyre?

This actor uses **pay-per-event** pricing, tiered by your Apify plan.

| Event | What it is | Free / 1,000 | Gold / 1,000 |
|-------|-----------|--------------|--------------|
| `job-listing` | Each job row saved | **$0.99** | **$0.69** |
| `job-detail` | Each public job page fetched (`includeDetails`) | **$0.70** | **$0.70** |
| `employer-email` | Each row where an email was found (`enrichEmails`) | **$29.00** | **$19.00** |

A small platform **Actor start** fee also applies per run. `maxItems` is the exact number of `job-listing` rows you are billed for — set it to control spend. Scraping 1,000 listing-only jobs on the Free plan costs about **$0.99**; adding full descriptions makes it about **$1.69**. Apify's monthly free platform usage covers small runs.

### How to scrape Instahyre

1. Click **Try for free** and sign in to Apify.
2. Add one or more **job function slugs** (or leave empty for the whole feed).
3. Optionally set **skills**, **keywords**, **locations**, **job type**, or **company size**.
4. Turn on **Fetch job details** if you need descriptions and experience ranges.
5. Set **Max items** low for the first run (e.g. 20).
6. Click **Start**, then watch rows appear in the **Output** tab.
7. Export from **Storage**, or pull results via the API.

#### Run it via API

Python:

```python
from apify_client import ApifyClient

client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("parsebird/instahyre-jobs-scraper").call(run_input={
    "jobFunctionSlugs": ["backend-development"],
    "locations": ["Bangalore"],
    "includeDetails": True,
    "maxItems": 100,
})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item["title"], "-", item["companyName"])
```

JavaScript:

```javascript
import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: '<YOUR_APIFY_TOKEN>' });
const run = await client.actor('parsebird/instahyre-jobs-scraper').call({
    jobFunctionSlugs: ['data-science-machine-learning'],
    skills: ['Python'],
    monitorMode: 'changes',
    stateName: 'ds-watch',
    maxItems: 500,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);
```

Schedule recurring runs, add webhooks, or push results to Google Sheets, Slack, Zapier, and Make with [Apify integrations](https://docs.apify.com/platform/integrations).

### FAQ

**Do I need an Instahyre account or API key?**
No. The Instahyre Jobs Scraper reads Instahyre's public job feed and public job pages only. Instahyre has no official jobs API — this actor is the alternative.

**How current is the data?**
Live. Each run reads Instahyre at that moment. Use Apify's scheduler with `monitorMode: "changes"` to keep a new-jobs feed.

**How do I build a "new jobs only" feed?**
Set `monitorMode: "changes"`, give the search a unique `stateName`, and schedule it. The first run records a baseline (set `emitBaseline: false` to keep it silent); later runs return only `new`, `updated`, and `removed` roles.

**Why did a monitor report roles as `new` that I had seen before?**
Monitoring only tracks what it scans. If your filter matches thousands of roles but `maxPages` only covers a few hundred, the feed order shifts between runs. Raise `maxPages` so a run covers your whole filtered set.

**Does `enrichEmails` get emails from Instahyre?**
No. It independently visits the hiring company's own website and extracts a public contact email if one is published there. It is not found for every company, and you are billed only on rows where an email is actually found.

**What counts as a billed row?**
Every row saved to the dataset counts as one `job-listing` event, including `unchanged` and `removed` monitoring rows. `job-detail` and `employer-email` are billed only when those enrichments run and succeed.

**A run was slower than usual or some detail pages came back empty — why?**
Instahyre's edge occasionally rate-limits automated traffic. The scraper retries automatically; rows whose detail page could not be loaded are still returned from the feed with `detailStatus: "failed"`.

**Something's not working.**
Open an issue on the **Issues** tab with your input and the run link — we respond quickly.

### Is it legal to scrape Instahyre?

Scraping publicly available pages is legal in most jurisdictions, and this actor only accesses content any logged-out visitor can see. It does not collect candidate profiles, private data, or bypass any login. You are responsible for how you use the data — respect Instahyre's Terms of Use, do not use personal data (such as any contact email) in violation of applicable law, and consult a lawyer if you are unsure. See Apify's guide on [the legality of web scraping](https://blog.apify.com/is-web-scraping-legal/).

### Related actors

- [Hirist Jobs Scraper](https://apify.com/parsebird/hirist-jobs-scraper) — Indian tech jobs from Hirist.
- [Cutshort Jobs Scraper](https://apify.com/parsebird/cutshort-jobs-scraper) — startup roles from Cutshort.
- [Internshala Scraper](https://apify.com/parsebird/internshala-scraper) — internships and fresher jobs.
- [Indeed Jobs Scraper](https://apify.com/parsebird/indeed-jobs-scraper) — job listings from Indeed worldwide.
- [Website Contact Finder](https://apify.com/parsebird/website-contact-finder) — emails, phones, and socials from any website.

Browse all [ParseBird actors](https://apify.com/parsebird) on Apify Store.

# Actor input Schema

## `jobFunctionSlugs` (type: `array`):

Instahyre job-function slugs, e.g. "backend-development", "data-science-machine-learning", "product-management". Numeric IDs also work. Leave empty for every function. Full list: https://www.instahyre.com/api/v1/job\_function/

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

Restrict to full-time or internship roles.

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

Restrict to small, medium, or large employers (Instahyre's own bucketing).

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

Skill tags to match, e.g. "Java", "Python", "SQL", "React".

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

Match a role that has any requested skill, or require every requested skill.

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

Free-text terms matched across the role title, skills, company name, company context, and location.

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

Match a role containing any keyword, or require every keyword.

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

Location terms such as "Bangalore", "Pune", "Gurgaon". A role is kept if any term appears in its published location.

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

Keep only roles whose published location indicates remote work (Remote, Work From Home, Anywhere).

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

Optional list of employer names. Partial, case-insensitive match — "tech" keeps every company with "tech" in its name.

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

Terms that remove a role from the output when they appear in its title, skills, company, or location.

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

Open each role's public page to add the description, experience range, category, and job functions. Slower and billed per detail.

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

Optional add-on. Looks up the hiring company's own website and, if a contact email is published there, adds it to the row. Not sourced from Instahyre, not found for every company, and billed only on rows where an email is found.

## `monitorMode` (type: `string`):

"Current snapshot" returns every matching role. "Changes only" compares against the previous run and returns new, updated, and removed roles.

## `emitBaseline` (type: `boolean`):

In "Changes only" mode, emit every role on the first run as a new row. Turn off to silently record the baseline and only report changes from the second run on.

## `includeUnchanged` (type: `boolean`):

In "Changes only" mode, also emit roles whose published fields did not change since the last run.

## `stateName` (type: `string`):

A stable name that keeps one monitoring search separate from another. Use a different name per saved search.

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

Maximum job rows saved in one run. This is the number of rows billed.

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

Maximum source pages scanned. One page contains up to 35 jobs. Raise this for narrow local filters.

## `proxyConfiguration` (type: `object`):

Instahyre's job API works from datacenter IPs, so the default Apify Proxy is enough.

## Actor input object example

```json
{
  "jobFunctionSlugs": [
    "backend-development"
  ],
  "jobType": "any",
  "companySize": "any",
  "skills": [],
  "skillMatch": "any",
  "keywords": [],
  "keywordMatch": "any",
  "locations": [],
  "remoteOnly": false,
  "companyNames": [],
  "excludeKeywords": [],
  "includeDetails": false,
  "enrichEmails": false,
  "monitorMode": "snapshot",
  "emitBaseline": true,
  "includeUnchanged": false,
  "stateName": "default",
  "maxItems": 20,
  "maxPages": 5,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# 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 = {
    "jobFunctionSlugs": [
        "backend-development"
    ],
    "skills": [],
    "keywords": [],
    "locations": [],
    "companyNames": [],
    "excludeKeywords": [],
    "maxItems": 20,
    "maxPages": 5
};

// Run the Actor and wait for it to finish
const run = await client.actor("parsebird/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 = {
    "jobFunctionSlugs": ["backend-development"],
    "skills": [],
    "keywords": [],
    "locations": [],
    "companyNames": [],
    "excludeKeywords": [],
    "maxItems": 20,
    "maxPages": 5,
}

# Run the Actor and wait for it to finish
run = client.actor("parsebird/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 '{
  "jobFunctionSlugs": [
    "backend-development"
  ],
  "skills": [],
  "keywords": [],
  "locations": [],
  "companyNames": [],
  "excludeKeywords": [],
  "maxItems": 20,
  "maxPages": 5
}' |
apify call parsebird/instahyre-jobs-scraper --silent --output-dataset

```

## MCP server setup

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