# Cutshort Scraper - India Tech Jobs, Salaries & Skills (`scrapewise/cutshort-jobs-scraper`) Actor

Scrape Cutshort.io tech jobs in India without login: title, company (size, stage, website, LinkedIn), city, remote, salary in INR, experience range, skills, posted date and full description. Search by skill or role, city and work mode. Error rows are free.

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

## Pricing

from $1.06 / 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.
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 Scraper: India tech jobs with salaries, skills and company data

Cutshort Scraper collects **job posts from Cutshort.io**, the Indian job board for tech, product and startup roles,
without an account, cookies or a browser. Give it skills or roles such as `python`, `react`, `devops` or
`product manager`, and each job comes back as one clean row: title, company (size, stage, founding year, website and
LinkedIn), city, remote policy, salary range in INR, experience range in years, required skills, posting date and the
full job description.

It is used to track hiring demand for a skill across Indian cities, to benchmark tech salaries by role and
experience, to find startups and product companies that are hiring right now (for sales and recruiting outreach),
and to feed job alerts, newsletters and job aggregators with fresh posts every day.

### At a glance

| What | Price |
|---|---|
| Job delivered | **US$ 1.25 per 1,000 jobs** on the Free plan (US$ 0.00125 each) |
| Bronze / Silver / Gold and above | US$ 1.19 / 1.13 / 1.06 per 1,000 jobs |
| Run start | US$ 0.005 per run |

- 3 skills with 100 jobs each = 300 jobs = **US$ 0.38** on the Free plan, start included.
- Error rows, duplicates and jobs removed by your filters are never charged. `maxItems` is a hard cap, and a
  spending limit set on the run stops it cleanly with everything delivered so far.
- Runs on the default Apify datacenter proxy, which is enough for Cutshort. No residential proxy cost.

### Quick start

```json
{
  "searchTerms": ["python"],
  "maxItems": 30
}
```

Remote React and Node.js jobs posted in the last 7 days:

```json
{
  "searchTerms": ["react", "node.js"],
  "workMode": "remote",
  "postedWithinDays": 7,
  "maxItems": 200
}
```

Data science jobs in Bangalore for someone with 3 years of experience and at least 20 lakh per year:

```json
{
  "searchTerms": ["data science"],
  "location": "bangalore",
  "experienceYears": 3,
  "minSalary": 2000000,
  "maxItems": 100
}
```

You can also paste Cutshort links in `startUrls`: a category page such as
`https://cutshort.io/jobs/java-jobs-in-pune` or a single job page `https://cutshort.io/job/<job-slug>`.

### How the search works

Cutshort has no free-text search for visitors. It organizes every job under **skill and role pages** (more than
3,600 of them, from Python and Java to Product Manager, Sales and UX Designer), each with city pages for 14 Indian
cities and remote pages for the most popular skills. The Actor maps every term you type to the right page:

- `python`, `java`, `devops`, `product manager` go straight to their page.
- Close spellings are matched too: `react` opens React.js, `machine learning` opens Machine Learning (ML),
  `data science` opens Data Science. The log shows which page was used.
- A term with no page of its own (for example a long phrase) scans the newest startup jobs and keeps the ones whose
  title or skills contain it.
- With a `location`, the Actor uses the city page when it exists (`python` + `pune` opens Python Jobs in Pune);
  otherwise it filters by the job location.
- With `workMode: remote`, it uses the remote page when it exists (remote Python, remote Java, remote React.js...).

Cutshort lists jobs **newest first**, so `postedWithinDays` stops reading at the first older job and keeps daily
runs short.

### Input

| Field | What it does |
|---|---|
| `searchTerms` | Skills or roles, one per line (default `python`). |
| `location` | One of 14 cities: Bangalore, Mumbai, Delhi NCR (Gurgaon, Noida), Hyderabad, Pune, Chennai, Ahmedabad, Kolkata, Jaipur, Indore, Coimbatore, Kochi, Chandigarh, Bhubaneswar. Default: all of India. |
| `workMode` | `any` (default), `remote` (remote only or remote allowed) or `onsite`. |
| `jobTypes` | Keep only `full_time`, `internship`, `contract`, `part_time` or `freelance`. |
| `experienceYears` | Keep jobs whose experience range includes this number of years. |
| `minSalary` | Keep jobs with a published salary whose top of the range reaches this yearly amount in INR. |
| `postedWithinDays` | Only jobs posted in the last N days (0 = any date). |
| `startUrls` | Cutshort category or job links. |
| `maxItems` | Cap for the whole run (default 30; 0 = no cap). |
| `proxyConfiguration` | Apify datacenter proxy by default. |

`searchQuery`, `keyword`, `keywords`, `query`, `skills`, `maxResults`, `limit`, `city` and `remoteOnly` are accepted
too, so inputs written for other job tools keep working.

### Output

| Field | What it is |
|---|---|
| `jobId`, `url` | Cutshort job id and public job link |
| `title` | Job title as posted |
| `companyName`, `companyUrl` | Hiring company and its Cutshort company page |
| `companyWebsite`, `companyLinkedin`, `companyLogo` | Company website, LinkedIn page and logo, when the company filled them in |
| `companyType`, `companySize`, `companyStage`, `companyFounded`, `companyFollowers` | Product or services, headcount band, funding stage (Bootstrapped, Raised funding, Profitable), founding year and Cutshort followers |
| `companyDescription` | The company's own description, as plain text |
| `hiringForClient` | `true` when an agency or consultancy posts on behalf of a client |
| `locations`, `locationText` | Cities listed on the job, and the location line as Cutshort shows it |
| `workMode`, `isRemote`, `remotePolicy` | `remote`, `remote_or_onsite` or `onsite`, a simple remote flag, and Cutshort's label |
| `jobTypes` | `full_time`, `internship`... |
| `experienceMin`, `experienceMax`, `experienceText` | Experience range in years |
| `salaryMin`, `salaryMax`, `salaryCurrency`, `salaryPeriod` | Published yearly salary range (null when the employer hides it) |
| `salaryHidden`, `salaryText` | Whether the salary is hidden, and the salary line as shown (`₹22L - ₹30L / yr`, `Best in industry`) |
| `skills` | Required skills as tagged by the employer |
| `postedAt`, `postedLabel` | Posting date (UTC) and Cutshort's label |
| `description`, `descriptionHtml` | Full job description as plain text and as the original HTML |
| `applyUrl` | Cutshort apply link (applying needs a Cutshort account) |
| `category`, `relatedCategories` | Cutshort page the job came from, and related pages |
| `sourceUrl`, `scrapedAt` | The term or link you sent, and when the row was collected |

One real row (descriptions shortened):

```json
{
  "type": "job",
  "jobId": "6aa28b01369e1cd8f328d7ac",
  "title": "Data Scientist",
  "url": "https://cutshort.io/job/Data-Scientist-Noida-Insurity-Solutions-India-Private-Limited-4f2K3Jjz",
  "companyName": "Insurity Solutions India Private Limited",
  "companyWebsite": "https://insurity.com",
  "companyType": "Product",
  "companySize": "1000-5000",
  "companyStage": "Profitable",
  "companyFounded": 1985,
  "locationText": "Remote, Noida",
  "workMode": "remote_or_onsite",
  "isRemote": true,
  "jobTypes": ["full_time"],
  "experienceMin": 2,
  "experienceMax": 5,
  "salaryMin": 2200000,
  "salaryMax": 3000000,
  "salaryCurrency": "INR",
  "salaryText": "₹22L - ₹30L / yr",
  "skills": ["Data Science", "GLM", "Predictive modelling", "Python", "Linear regression", "Statistical Analysis"],
  "postedAt": "2026-09-10T10:48:33.969Z",
  "description": "We are seeking a Data Scientist to join our Predict team, focused on building and maintaining predictive models...",
  "category": "remote-python-jobs"
}
```

### Errors you may see

Every error is a row with `errorCode` and is never charged:

| errorCode | Meaning |
|---|---|
| `INVALID_URL` | Not a Cutshort category or job link |
| `INVALID_INPUT` | A number field has a wrong value |
| `NOT_FOUND` | The category page or the job does not exist (or the job was closed) |
| `TIMEOUT`, `NETWORK`, `HTTP_5xx` | Cutshort did not answer after 4 tries with fresh connections; run it again |
| `NOT_REACHED` | The run timeout or the cost guard arrived before this search |

### Integrations, scheduling and AI agents

- **Daily job alerts:** schedule the same search every morning with `postedWithinDays: 1` in
  [Apify schedules](https://docs.apify.com/platform/schedules).
- **Export** as JSON, CSV, Excel or XML, or read the dataset from the [Apify API](https://docs.apify.com/api/v2).
- **Connect** it to Make, n8n, Zapier, Slack or Google Sheets through
  [Apify integrations](https://docs.apify.com/platform/integrations).
- **AI agents:** call it as a tool through the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp)
  in Claude, ChatGPT, Cursor or any MCP client, for example "list the remote Golang jobs on Cutshort posted this week
  with a salary above 25 lakh and group them by company stage".

### FAQ

**Do I need a Cutshort account?** No. Everything comes from public Cutshort pages, without login or cookies.

**How many jobs can I get?** A popular skill has thousands of live jobs (Python had more than 4,000 on 16 Oct 2026).
Set `maxItems` to 0 to read them all; the Actor reads 50 jobs per request.

**Why is the salary empty on some jobs?** The employer chose to hide it. Those rows have `salaryHidden: true` and
`salaryText: "Best in industry"`; the hidden numbers are never exported.

**Does it return recruiter names or contacts?** No. Only job and company data. Emails and phone numbers written inside
descriptions are replaced with `[contact removed]`.

**Is it legal?** The Actor reads public pages only. You are responsible for how you use the data under the laws that
apply to you.

**Something broke or a field is missing?** Open an issue on the Actor page; issues are answered within a day.

### Limitations

- Search goes through Cutshort's skill and role pages; free-text phrases with no page of their own scan the newest
  startup jobs only (up to about 1,200 jobs).
- City pages exist for 14 cities. Other cities are filtered from the job location, within the newest 600 jobs.
- Applying to jobs needs a Cutshort account and is not done by the Actor.

### Changelog

- **16 Oct 2026:** first version: search by skill or role, city, work mode, job type, experience, salary and date,
  company profile fields, full descriptions.

# Actor input Schema

## `searchTerms` (type: `array`):

One skill or role per line, for example python, react, devops, data science, product manager. Each one maps to its Cutshort job category (3,600+ skills and roles); a term with no category scans the newest startup jobs for it.

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

Only jobs in this city. Uses Cutshort's own city page when the category has one, otherwise filters by the job location.

## `workMode` (type: `string`):

Remote keeps jobs that are remote only or allow remote work, and uses Cutshort's remote pages when they exist (for example remote Python jobs). On-site keeps jobs that do not allow remote.

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

Keep only these job types. Empty = all.

## `experienceYears` (type: `integer`):

Keep only jobs whose experience range includes this number of years (for example 3 keeps 2-5 years and 3-8 years). Empty = any.

## `minSalary` (type: `integer`):

Keep only jobs with a published salary whose top of the range reaches this amount per year, for example 2000000 for 20 lakh. Jobs with a hidden salary are dropped when this is set.

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

Only jobs posted in the last N days. Cutshort lists newest first, so the run stops at the first older job. 0 = any date.

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

Optional. Cutshort category pages such as https://cutshort.io/jobs/python-jobs-in-pune or job pages such as https://cutshort.io/job/<job-slug>.

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

Hard cap for the whole run, across all searches. 0 = no cap (a popular skill has thousands of jobs).

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

The default Apify Proxy (datacenter) works for Cutshort. Keep the default.

## Actor input object example

```json
{
  "searchTerms": [
    "python"
  ],
  "location": "all",
  "workMode": "any",
  "postedWithinDays": 0,
  "maxItems": 30,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

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

No description

## `resultsCsv` (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 = {
    "searchTerms": [
        "python"
    ],
    "maxItems": 30,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("scrapewise/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 = {
    "searchTerms": ["python"],
    "maxItems": 30,
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("scrapewise/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 '{
  "searchTerms": [
    "python"
  ],
  "maxItems": 30,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call scrapewise/cutshort-jobs-scraper --silent --output-dataset

```

## MCP server setup

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