# Cutshort Jobs Scraper & API: Real or Ghost Jobs, Salary (`s_actors/cutshort-jobs-scraper`) Actor

Scrape Cutshort (cutshort.io) India tech and startup jobs live: posted date, recruiter's last activity (ghost jobs open for years hidden), company or agency, salary in INR and lakhs, experience, skills, remote, red flags. More than 450 jobs a category. Job alerts.

- **URL**: https://apify.com/s_actors/cutshort-jobs-scraper.md
- **Developed by:** [Superior Actors](https://apify.com/s_actors) (community)
- **Categories:** Jobs, Lead generation, AI
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 1 bookmarks
- **User rating**: No ratings yet

## Pricing

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

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

### Cutshort Jobs Scraper & API: Real or Ghost Jobs, Salary

Scrape **Cutshort jobs** (cutshort.io, India's tech and startup job board) to Excel, CSV or JSON **without login**, and know **which jobs are still alive**. What sets it apart:

- **Ghost jobs hidden.** Cutshort keeps jobs "open" for years: their expiry date moves forward by itself, so a job posted in 2016 still shows as valid. Every job has a hidden date of the recruiter's **last hiring activity**, and the Actor reads it. In our test of 1 October 2026, **2,191 of 2,720 Python jobs (81%)**, **617 of 664 Golang jobs (93%)** and **398 of 444 Flutter jobs (90%)** had no recruiter activity for over 90 days, many since 2019-2022. Other scrapers return them all and charge for each. Here every row has `lastRecruiterActivity`, `daysSinceRecruiterActive` and `ghostJob`; ghosts are skipped by default and **free**.
- **Live data, not a days-old copy.** Cloudflare caches Cutshort's job pages for days (we saw copies 4.9 days old) and the cached pages overlap: 450 jobs read from them gave only 420 different ones. The Actor reads the live pages, so a job posted this morning is there.
- **Posted date on every job, newest first.** "Posted within the last 24 hours / week / month" is fast and cheap. No paid "details" step for the date.
- **More than one page of jobs.** A Cutshort category shows only its newest 300-600 jobs (python: 450 of 4,201). When that runs out, the Actor also reads the same category per city and remote: **python goes from 450 to 2,616 different jobs**.
- **Company or recruitment agency?** `postedByType` and `hiringForClient` tell if an agency posted the job for a client, and `clientNameHidden` when the client is only described ("MNC", "Leading provider of Capital Market solutions"). Filter on it.
- **Is this Cutshort job real or fake?** `redFlags` with the reason: no recruiter activity for months, a fee or deposit asked, contact on WhatsApp or a phone number in the text, a Gmail address, "earn daily" promises, a salary range 4x wide, a client not named. Skip them in one click.
- **Salary as numbers**, in INR a year and in lakhs (`salaryLakhsMin` 10, `salaryLakhsMax` 25). "Best in industry" salaries are marked `salaryHidden`, not filled with Cutshort's placeholder numbers.
- **Any skill or role**: type "react", "data analyst", "hr" or "product manager"; the Actor finds Cutshort's category (React.js, Data Analytics, Human Resources) and logs it. 14 cities and remote.
- **Alerts, no copies.** Schedule it and get only jobs you have not seen.

```json
{ "keywords": ["python"], "locations": ["Bangalore"], "postedWithin": "pastWeek", "maxJobsPerSearch": 100 }
```

Remote jobs for freshers from product companies, with the ghosts and agencies left out:

```json
{ "keywords": ["react", "data analytics"], "locations": ["Remote"], "experienceMaxYears": 1, "companyType": "product", "postedBy": "company" }
```

No Cutshort account, no cookies. Use it as a **Cutshort jobs API**: one call returns clean JSON with the fields below.

#### What you get

**One row per job.** Real examples, 1 October 2026:

| job | company | posted | recruiter last active | posted by | salary (yearly) | red flags |
|---|---|---|---|---|---|---|
| Python Developer + GenAI (Bangalore) | VY Systems | 1 Oct 2026 | 1 Oct 2026 | agency | ₹2 - 13 L | salary range 4x |
| Forward Deployed Engineer (Bangalore) | MindBridge | 30 Sep 2026 | 30 Sep 2026 | company | ₹8 - 12 L | none |
| AI Developer (Bangalore) | Wissen Technology | 29 Sep 2026 | 30 Sep 2026 | company | Best in industry (hidden) | none |
| Fullstack Developer (Bangalore) | "Open source software company, funded startup" | 5 Oct 2021 | 1 Mar 2022 | agency | ₹15 - 30 L | ghost job, client not named |
| Golang developer (Ahmedabad) | Genius Placement Service | 7 Oct 2021 | 24 Jan 2022 | agency | ₹3 - 6 L | ghost job |
| Programmer (Delhi NCR) | 203 Days Private Limited | 12 Feb 2016 | 12 Feb 2016 | company | ₹4 - 10 L | ghost job |

The last three are still listed on Cutshort as open jobs.

| Field | Description |
|---|---|
| `jobId`, `jobUrl`, `title`, `companyName`, `location`, `locations` | The job, its Cutshort page, all its cities |
| `postedDate`, `postedAt`, `daysSincePosted` | When the job was posted |
| `lastRecruiterActivity`, `daysSinceRecruiterActive`, `ghostJob` | The recruiter's last hiring activity on the job and whether it is a ghost (none for **Ghost after** days, 90 by default) |
| `postedByType`, `hiringForClient`, `clientNameHidden`, `recruiterName` | Company or recruitment agency, posting for a client, client not named, the recruiter who posted it |
| `redFlags`, `redFlagCount` | Warning signs with reasons |
| `salaryText`, `salaryMin`, `salaryMax`, `salaryCurrency`, `salaryPeriod`, `salaryYearlyMin`, `salaryYearlyMax`, `salaryLakhsMin`, `salaryLakhsMax`, `salaryHidden` | Salary as numbers (INR; a few in USD), in lakhs, hidden salaries marked |
| `experienceMinYears`, `experienceMaxYears`, `experienceLevel`, `employmentType` | Experience asked (Fresher, 2-5 years...), full time or internship |
| `skills`, `remoteType`, `workplaceType`, `easyApply` | Skills of the job, Cutshort's remote type (remote / remote allowed / on-site), apply on Cutshort |
| `companyStage`, `companyType`, `companySize`, `companyFounded`, `companyFollowers`, `companyWebsite`, `companyLinkedin`, `companyTechStack`, `companyAbout` | Company profile: bootstrapped / raised funding / profitable, product or services, size |
| `companyId`, `companyUrl`, `companyLogo` | The company's Cutshort page |
| `description`, `descriptionHtml` | Full description as text or HTML |
| `category`, `searchKeyword`, `searchLocation`, `searchUrl`, `isNew`, `scrapedAt` | Which Cutshort category and search found the job; alerts |

Five table views: **Jobs**, **Real or ghost**, **Salary**, **Company** and **Details**.

#### How it works

| Step | What happens |
|---|---|
| 1. Category | Each skill or role is matched to Cutshort's job category (python-jobs, reactjs-jobs-in-pune, remote-golang-jobs); a city or "Remote" picks its page |
| 2. Live pages | The category's pages are read live, 50 jobs a page, newest posted first; when the category runs out, its city and remote pages too |
| 3. Job page | For each job: its page, for the recruiter's last hiring activity, the agency flag and the company profile |
| 4. Ghosts, red flags, filters | Ghost jobs skipped, warning signs checked, your filters applied. Ghosts, removed jobs, copies (same title, company and city) and jobs seen by an alert are not charged |

#### Why this Actor

| | This Actor | Typical Cutshort scraper |
|---|---|---|
| Recruiter's last activity, ghost jobs hidden | ✅ Free when hidden | ❌ Ghost jobs returned and charged |
| Live pages | ✅ | ❌ Cloudflare copies up to days old, overlapping pages |
| Posted date | ✅ On every job, included | ⚠️ Paid detail step, or none |
| Jobs per category | ✅ Category + its city and remote pages (python 2,616) | ⚠️ The first 300-600 |
| Company or agency, client not named | ✅ Filter | ⚠️ Agency flag only |
| Red flags of fake jobs | ✅ With reasons, one-click skip | ❌ |
| Hidden salaries | ✅ Marked, left empty | ⚠️ Placeholder numbers as salary |
| Any skill or role → category | ✅ Cutshort's own skill index | ⚠️ Exact slug or fuzzy match |
| Alerts (only new jobs) | ✅ Seen jobs not charged | ⚠️ Some |
| Price per 1,000 jobs | **$1.18** with the job page, platform included | $1.19-2.00 + platform |

#### Pricing

Pay per event, no subscription needed. Apify Scale and Business plans pay less:

| Event | Free and Starter plans | Scale plan | Business plan |
|---|---|---|---|
| Run start | $0.001 | $0.001 | $0.001 |
| Job (all fields: posted date, recruiter's last activity, company or agency, salary, company profile, red flags, full description) | $0.00118 | $0.001062 | $0.000944 |

**1,000 live jobs = $1.18.** Free: ghost jobs, jobs removed by your filters, copies, closed jobs, jobs already seen by an alert. Platform usage is included. Set a maximum cost per run in the run options: the Actor stops there.

#### Ready-made tasks

| Task | What it does |
|---|---|
| [Cutshort Jobs: Real or Ghost Check](https://apify.com/s_actors/cutshort-jobs-scraper/examples/cutshort-jobs-real-or-ghost-check) | Python jobs in Bangalore with the recruiter's last activity, who posted them and red flags; ghost jobs marked, not hidden |

#### Alerts

1. Set your skills, locations and filters, turn on **Only new jobs**, give the alert a name.
2. Save it as a task and add a **schedule** (every morning, with "Posted within: Last 3 days").
3. Send the results by email, Slack, Google Sheets, Make, Zapier or **n8n** with Apify integrations.

The first run returns the current live jobs, newest first; next runs return only jobs not seen before.

#### Other job tools

| Actor | What it does |
|---|---|
| [LinkedIn Jobs Scraper](https://apify.com/s_actors/linkedin-jobs-scraper) | LinkedIn jobs without login: a remote filter that works, salaries from descriptions, job alerts |
| [Glassdoor Jobs Scraper](https://apify.com/s_actors/glassdoor-jobs-scraper) | Glassdoor jobs with salary ranges and all company ratings, filter by work-life balance, job alerts |
| [Wellfound Jobs Scraper](https://apify.com/s_actors/wellfound-jobs-scraper) | Startup jobs from Wellfound (AngelList): salary and equity as numbers, stage, YC, visa sponsorship, job alerts |
| [StepStone Jobs Scraper](https://apify.com/s_actors/stepstone-jobs-scraper) | StepStone.de and .at jobs with salary estimates for most jobs, exact matches only, English jobs in Germany |
| [XING Jobs Scraper](https://apify.com/s_actors/xing-jobs-scraper) | XING jobs in Germany, Austria and Switzerland: salaries per year, English-only jobs, more than 1,000 jobs per search |
| [Instahyre Jobs Scraper](https://apify.com/s_actors/instahyre-jobs-scraper) | Instahyre jobs in India with posting dates (newest first), company Glassdoor ratings, jobs for freshers and remote jobs |
| [Hirist Jobs Scraper](https://apify.com/s_actors/hirist-jobs-scraper) | Hirist tech jobs in India with recruiter activity (applications, recruiter actions, last active), every job of a skill, AmbitionBox ratings |
| [Dice Jobs Scraper](https://apify.com/s_actors/dice-jobs-scraper) | Dice.com tech jobs with W2, C2C and 1099 contract types, recruiter apply emails, visa sponsorship and reposts |
| [Internshala Scraper](https://apify.com/s_actors/internshala-scraper) | Internshala internships and fresher jobs in India with the guaranteed stipend split from incentives, red flags of fake listings and applicants per opening |
| [Foundit Jobs Scraper](https://apify.com/s_actors/foundit-jobs-scraper) | Foundit (Monster India) jobs in India, the Gulf and SEA: posted on Foundit or reposted from LinkedIn, original link, salary, red flags |
| [Shine Jobs Scraper](https://apify.com/s_actors/shine-jobs-scraper) | Shine.com jobs in India with a real-or-fake verdict: imported feed jobs, hidden employers and jobs abroad flagged, company or agency, salary in lakhs, applicants |
| [iimjobs Scraper](https://apify.com/s_actors/iimjobs-scraper) | iimjobs management, finance and MBA jobs in India with recruiter actions and applicants (what iimjobs Pro sells), exact keyword matches, AmbitionBox ratings |

#### FAQ

**Is Cutshort real or fake?** Cutshort is a real hiring platform for tech and startup jobs in India, founded in 2015 in Pune. Jobs there are posted by companies and by recruitment agencies. The catch is age: Cutshort keeps jobs listed long after anyone hires for them, so many jobs you can apply to are ghosts. `lastRecruiterActivity` shows when the recruiter last acted on the job; apply where it is recent. Never pay a fee to get a job.

**What is a ghost job?** A job still listed but no longer filled: on Cutshort, one whose recruiter has shown no hiring activity for more than **Ghost after** days (90 by default; set 30 for a stricter cut). Turn **Hide ghost jobs** off to get them too, marked `ghostJob: true`, for example to study how long jobs stay listed.

**Which red flags are checked?** No recruiter activity for months; a registration, training or joining fee or a deposit mentioned; contact on WhatsApp; a phone number in the job text; a personal email address (Gmail, Yahoo...); "earn daily", "no interview" promises; a salary range where the top is 4x the bottom or more; an agency's client described instead of named. A red flag is a reason to look closer, not a verdict.

**Why only 300-600 jobs on a Cutshort category page?** Cutshort shows only the newest jobs of a category page and stops there. The Actor then reads the same category for each of the 14 cities and remote, which list their own jobs. Turn **Read city and remote pages** off for the category page only.

**What about the "internal salary" other scrapers sell?** Cutshort stores a second, lower salary floor next to the one it shows. In 450 python jobs it was half of the shown minimum (240) or zero (156) in 88% of cases: a value filled in by the site, not a real offer. The Actor returns the salary candidates see.

**Do I need a Cutshort account?** No. No login is used and candidate profiles are not collected.

#### Use with the API and AI agents

Run it from the Apify API, the JavaScript or Python client, **n8n**, Make or Zapier, or from AI agents through the [Apify MCP server](https://mcp.apify.com) (Claude, ChatGPT, Cursor). One call: `POST https://api.apify.com/v2/acts/s_actors~cutshort-jobs-scraper/run-sync-get-dataset-items` with the input above returns the jobs as JSON. Set **Description format** to "None" for smaller answers.

#### Is it legal?

The Actor reads public Cutshort job listings that anyone can open without an account, as a visitor does. It does not log in or collect candidate profiles. Recruiter names come with the public job; company names and job details are public. Use such data according to the laws that apply to you (India's DPDP Act, GDPR and similar) and Cutshort's terms.

# Actor input Schema

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

Skill or role, one per line: "python", "react", "data analytics", "product manager", "devops", "sales", "hr". Each is its own search; the Actor maps it to Cutshort's job category (react = React.js) and logs which. Empty = every job on Cutshort (about 44,000) in the locations below.

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

City or "Remote", one per line: Bangalore, Mumbai, Delhi NCR (Gurgaon, Noida), Hyderabad, Pune, Chennai, Ahmedabad, Kolkata, Jaipur, Indore, Coimbatore, Kochi, Chandigarh, Bhubaneswar. Each location is its own search. Empty = all of India and remote.

## `maxJobsPerSearch` (type: `integer`):

Cap for each skill × location and each link. One Cutshort category page shows only its newest 300-600 jobs; for more, the Actor also reads the city and remote pages of the same category.

## `hideGhostJobs` (type: `boolean`):

Skip jobs whose recruiter has shown no hiring activity for the number of days below (lastRecruiterActivity). Hidden jobs are free. Turn off to get them with ghostJob = true.

## `ghostAfterDays` (type: `integer`):

A job is a ghost when its recruiter's last hiring activity (or the posting date) is older than this.

## `skipJobsWithRedFlags` (type: `boolean`):

Drop jobs whose text asks for a fee or deposit, sends you to WhatsApp, a phone number or a Gmail address, promises easy earnings, has a salary range 4x wide, or hides the client company. Every row lists its redFlags either way. Removed jobs are free.

## `postedBy` (type: `string`):

Agencies post for clients, often under a hidden name ("Service Co"). Every row says postedByType and hiringForClient.

## `postedWithin` (type: `string`):

By the posting date. Jobs are read newest first, so a short window is fast and cheap.

## `workplace` (type: `string`):

Cutshort's own remote type of each job (remoteType: remote_only, remote_okay, remote_not_okay).

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

Keeps jobs whose experience range reaches this many years.

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

Keeps jobs open to candidates with at most this many years. 0 = jobs for freshers.

## `minYearlySalary` (type: `integer`):

Keeps jobs whose salary range reaches this much a year, e.g. 1000000 = ₹10 L. Almost every Cutshort job shows a salary.

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

Cutshort's role type.

## `companyStages` (type: `array`):

Keep only companies at these stages (as the company states on Cutshort). Empty = any.

## `companyType` (type: `string`):

"Products & Services" companies count as both.

## `titleMustMatchKeyword` (type: `boolean`):

A category also holds jobs that only list the skill (a Java job with Python in its skills). On = only titles with every word of the keyword.

## `titleInclude` (type: `array`):

e.g. senior, lead, intern.

## `titleExclude` (type: `array`):

e.g. manager, sales.

## `companyExclude` (type: `array`):

Company names (or parts) to skip.

## `skipDuplicates` (type: `boolean`):

Same title, company and city = one job (companies post one job many times). Copies are free.

## `readCityPages` (type: `boolean`):

When a category's own page runs out (Cutshort shows its newest 300-600 jobs), also read the same category per city and remote: python goes from 450 to 2,600 jobs.

## `searchUrls` (type: `array`):

One per line: https://cutshort.io/jobs/python-jobs, https://cutshort.io/jobs/reactjs-jobs-in-pune, https://cutshort.io/jobs/remote-golang-jobs, https://cutshort.io/jobs/startup-jobs.

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

Single jobs: https://cutshort.io/job/<title>-<company>-<id>. Each comes back with the recruiter's last activity and red flags.

## `descriptionFormat` (type: `string`):

Plain text keeps paragraphs and bullet points.

## `onlyNewJobs` (type: `boolean`):

Remembers the jobs of earlier runs with the same alert name and returns only new ones, newest first. Schedule the Actor hourly or daily for a Cutshort job alert to Slack, email or a sheet. Jobs already seen are free.

## `monitorName` (type: `string`):

Separate memory per alert, e.g. "python-pune". Empty = "default".

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

How many Cutshort requests run at once.

## `debugLog` (type: `boolean`):

Log every retry.

## Actor input object example

```json
{
  "keywords": [
    "python"
  ],
  "locations": [
    "Bangalore"
  ],
  "maxJobsPerSearch": 30,
  "hideGhostJobs": true,
  "ghostAfterDays": 90,
  "skipJobsWithRedFlags": false,
  "postedBy": "any",
  "postedWithin": "anyTime",
  "workplace": "any",
  "jobType": "any",
  "companyType": "any",
  "titleMustMatchKeyword": false,
  "skipDuplicates": true,
  "readCityPages": true,
  "descriptionFormat": "text",
  "onlyNewJobs": false,
  "maxConcurrency": 10,
  "debugLog": false
}
```

# Actor output Schema

## `overview` (type: `string`):

The main fields: posted, recruiter last active, who posted, salary, red flags.

## `trust` (type: `string`):

Days since posted and since the recruiter was last active, agency, hidden client, red flags.

## `pay` (type: `string`):

Salary in INR a year and in lakhs, hidden salaries, experience.

## `company` (type: `string`):

Stage, type, size, founded, followers, website and LinkedIn.

## `details` (type: `string`):

Skills, remote type, job type, Cutshort category.

## `all` (type: `string`):

Every field of every 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 = {
    "keywords": [
        "python"
    ],
    "locations": [
        "Bangalore"
    ],
    "maxJobsPerSearch": 30
};

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

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

```

## MCP server setup

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