# Cutshort Jobs Scraper | India Tech & Startup Jobs (cutshort.io) (`data_daemon/cutshort-jobs-scraper`) Actor

$0.80 per 1,000 jobs | Scrape Cutshort (cutshort.io) startup and tech jobs: title, company profile, locations, remote policy, skills, experience range, salary range, posting date, full description. Filter by skill, city, keyword, remote, experience, salary, date. Only-new mode. No login.

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

## Pricing

from $0.56 / 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** returns **jobs from [Cutshort](https://cutshort.io)**, India's startup and tech hiring platform (about 45,000 live jobs in October 2026), as JSON, CSV or Excel: job title, company with type, size, stage and website, locations, remote policy, skills, **experience range**, **salary range as shown on the page**, posting date and the full description. Filter by skill or role, city, keyword, remote policy, experience, salary and posting date; an **only-new mode** turns it into a daily feed. **$0.80 per 1,000 jobs**, no login, no proxy. Recruiter names are not collected.

### What can you do with Cutshort job data?

| Who | What they get | Typical run |
|---|---|---|
| Recruitment agencies and sourcers | Every new Python, React, DevOps or data job in their cities, each morning, with the salary band and experience range | `categories` + `locations` + `onlyNewSinceLastRun` |
| Job boards and alert apps | A whole-board daily feed of Indian startup and tech jobs (the newest 2,000+ jobs, 50 per request) | `{}` with `maxResults: 0`, daily |
| Sales teams selling to startups | Companies hiring right now, with stage, size, funding status and website (hiring = budget) | `categories: ["Sales", "DevOps"]`, `postedWithinDays: 7` |
| Salary and labour-market analysts | Shown salary ranges by skill, city and experience, in INR per year | export to Sheets / BigQuery |
| Job seekers and career tools | Remote-only or remote-okay jobs for a skill, with experience bands | `remote: "remote"`, `minExperience`, `maxExperience` |

### How to scrape Cutshort jobs

1. Open the **Input** tab and add skills, roles or Cutshort page names under `categories` (`Python`, `React.js`, `Data Science`, `python-jobs-in-mumbai`), optionally `locations` and `keywords`.
2. Click **Start**. Jobs appear in the **Output** tab; download them as JSON, CSV, Excel or HTML, or read them through the API.
3. For a daily feed, turn on **Only new jobs since the last run** and add a schedule.

An empty input `{}` returns the 50 newest jobs on Cutshort's whole board (its `startup-jobs` page).

### Input

| Field | What it does |
|---|---|
| `categories` | Cutshort job pages, read newest first. Give a skill or role (`Python`, `Node.js`, `DevOps`, `Product Management`, `Sales`), a page name (`python-jobs`, `remote-python-jobs`, `python-jobs-in-mumbai`) or a page URL. Names are resolved against Cutshort's own page index (about 3,800 skill and role pages); unknown ones are reported in the status message. Empty = the whole board. |
| `locations` | City names (`Bengaluru`/`Bangalore`, `Mumbai`, `Delhi`, `Hyderabad`, `Pune`, `Chennai`, `Kolkata`, `Ahmedabad`, `Jaipur`, `Indore`, `Coimbatore`, `Kochi`, `Chandigarh`, `Bhubaneswar`). For these 14 cities the city page is read directly; every job is also checked against its own location list, so `Noida` or `Gurgaon` work too (`Delhi` includes the NCR). `Remote` matches remote jobs. |
| `keywords` | Words in the job title or skills, e.g. `senior`, `django`, `intern`. |
| `remote` | `remote` keeps remote-only and remote-okay jobs; `onsite` keeps office-only jobs. |
| `roleType` | `full_time` or `internship`. |
| `minExperience`, `maxExperience` | Years; a job is kept when its experience range overlaps yours. |
| `minSalary` | Annual INR; compared with the top of the shown range. Jobs that hide their salary are left out when this is set. |
| `postedWithinDays` | Only jobs posted in the last N days; reading stops once a page is older than the window. |
| `includeDescription`, `includeCompany` | Full description text and the company profile (default on; no extra requests). |
| `maxResults` | Stop after N jobs (0 = everything the pages serve). |
| `onlyNewSinceLastRun`, `stateName` | Remember delivered job ids in the `cutshort-jobs-state` key-value store and skip them next time (not charged). |
| `skipIds` | Job ids you already have (not charged). |

```json
{
    "categories": ["Python", "Data Engineering"],
    "locations": ["Bengaluru", "Pune"],
    "minExperience": 3,
    "postedWithinDays": 7,
    "onlyNewSinceLastRun": true,
    "maxResults": 0
}
```

### Output

```json
{
    "id": "6ae577c062269960ba5d222d",
    "url": "https://cutshort.io/job/Python-Data-Engineer-Pune-Bengaluru-Bangalore-Mumbai-Wissen-Technology-d8AP43hz",
    "title": "Python Data Engineer",
    "company": "Wissen Technology",
    "companyUrl": "https://cutshort.io/company/wissen-technology-79-09J2iH1M",
    "hiringForClient": false,
    "locations": ["Pune", "Bengaluru (Bangalore)", "Mumbai"],
    "locationsText": "Pune, Bengaluru (Bangalore), Mumbai",
    "remotePolicy": "remote_not_okay",
    "remote": "onsite",
    "roleType": "full_time",
    "skills": ["Python", "databricks", "Apache Airflow", "PySpark", "Delta Lake", "Kubernetes"],
    "experienceMin": 4,
    "experienceMax": 8,
    "experienceText": "4 - 8 years",
    "salaryMin": null,
    "salaryMax": null,
    "salaryText": "Best in industry",
    "salaryHidden": true,
    "datePosted": "2026-10-31T05:08:16.521Z",
    "companyType": "Products & Services",
    "companySize": "1000-5000",
    "companyStage": "Profitable",
    "companyFounded": 2015,
    "companyWebsite": "https://wissen.com",
    "companyLinkedin": "https://linkedin.com/company/wissen-technology",
    "category": "python-jobs-in-bangalore-bengaluru"
}
```

| Field | Meaning |
|---|---|
| `id`, `url`, `title`, `company`, `companyUrl` | Job id (stable, 24 characters), job page, title, hiring company and its Cutshort profile. `hiringForClient` is true when an agency posts for a client. |
| `locations`, `locationsText`, `remotePolicy`, `remote` | Cities as listed on the job; Cutshort's remote policy (`remote_only`, `remote_okay`, `remote_not_okay`) and its plain label (`remote`, `remote okay`, `onsite`). Remote-only jobs have an empty `locations` list. |
| `roleType` | `full_time` or `internship`. |
| `skills` | Skills tagged on the job. |
| `experienceMin`, `experienceMax`, `experienceText` | Years of experience asked for. |
| `salaryMin`, `salaryMax`, `salaryCurrency`, `salaryPeriod`, `salaryText`, `salaryHidden` | The range **as shown on the page** (`₹15L - ₹25L / yr` = 1,500,000 to 2,500,000 INR per year). `Upto ₹30L / yr` gives only `salaryMax`. When the employer hides it (`Best in industry`), `salaryHidden` is true and the numbers are null. |
| `datePosted` | When the job was posted (ISO 8601). |
| `companyType`, `companySize`, `companyStage`, `companyFounded`, `companyWebsite`, `companyLinkedin`, `companyLogo`, `companyDescription` | Company profile as published on Cutshort (`Product`, `Products & Services`, `Services`; size bands; `Bootstrapped`, `Raised funding`, `Profitable`). |
| `description` | Full job description as text. |
| `category` | The Cutshort page the job came from. |

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

**$0.80 per 1,000 jobs** plus $0.001 per run, on Apify's pay-per-event pricing (SILVER $0.68, GOLD and above $0.56 per 1,000). The default run (50 jobs) costs about $0.04 and takes a few seconds; a whole-board daily feed of 2,000 new jobs about $1.60. Jobs left out by the filters, by only-new mode or by `skipIds` are never charged. One request returns 50 jobs with their full descriptions, so there is no per-job page cost.

### Tips

- **Whole board, daily:** `{}` with `onlyNewSinceLastRun: true` and `maxResults: 0` once a day delivers every new job (Cutshort's whole-board page serves its newest ~2,400 jobs, about two months of postings in October 2026).
- **Depth per page:** each Cutshort page serves a limited number of its newest jobs (about 450 on a busy skill page such as `python-jobs`, 2,400 on the whole-board page). To go deeper into one skill, add city pages (`Python jobs in Mumbai`) or related skills.
- **City pages are cheaper:** for the 14 cities Cutshort has pages for, `locations` reads the city page, so only matching jobs are fetched. Other cities (`Noida`, `Gurgaon`, `Mysore`) are checked on each job of the skill page.
- **Remote plus cities:** `remote: "remote"` with `locations` keeps remote-okay jobs that list those cities; remote-only jobs carry no city, so leave `locations` empty (or add `Remote`) to get them.
- **Experience filters** use overlap: `minExperience: 3` keeps `2 - 5 years`, `maxExperience: 2` keeps `0 - 2` and `1 - 4`.
- **Salary** is only compared when the page shows an annual INR range; `Best in industry` jobs are left out of `minSalary` runs (set `minSalary` to 0 to keep them).

### FAQ

**Is there a Cutshort API?** Cutshort sells programmatic access to employers. This Actor reads the public JSON that renders Cutshort's own job-listing pages (the same jobs any visitor sees, without logging in) and returns it as clean rows through Apify's API, with filters and a daily only-new mode.

**Does it include recruiter names or contact details?** No. The row is the job, the hiring company's public profile (type, size, stage, website, LinkedIn page) and the job's own fields. Names of the posting recruiter and the company's team members are not stored.

**How many jobs does Cutshort have?** Its whole-board page reported 44,814 live jobs on 31 October 2026, most in Bengaluru, Mumbai, Delhi NCR, Hyderabad, Pune and Chennai, plus about 5,700 remote jobs.

**Why does a job appear in several categories?** A job is tagged with many skills and appears on each skill's page; within one run every job is saved once.

**Is it legal to scrape Cutshort?** The Actor reads publicly shown listing pages without logging in. You are responsible for how you use the data and for compliance with Cutshort's terms and India's data-protection law.

Questions or a field you need? Use the **Issues** tab.

### Related Actors

- [Instahyre Jobs Scraper](https://apify.com/data_daemon/instahyre-jobs-scraper): Instahyre tech and product jobs with company size and skills.
- [Hirist Jobs Scraper](https://apify.com/data_daemon/hirist-jobs-scraper): Hirist.tech IT and engineering jobs, daily feed.
- [IIMJobs Scraper](https://apify.com/data_daemon/iimjobs-jobs-scraper): management, finance and MBA jobs.
- [Foundit Jobs Scraper](https://apify.com/data_daemon/foundit-jobs-scraper): foundit.in (Monster India) jobs, daily feed.
- [Unstop Scraper](https://apify.com/data_daemon/unstop-scraper): jobs, internships and hackathons for students.
- All Actors by [Daemon Data](https://apify.com/data_daemon).

# Actor input Schema

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

Cutshort job pages to read, newest first: a skill or role (`Python`, `React.js`, `DevOps`, `Data Science`, `Sales`, `Product Management`), a page name (`python-jobs`, `remote-python-jobs`, `python-jobs-in-mumbai`) or a page URL. `Python jobs in Mumbai` reads the city page. Empty = the whole board (`startup-jobs`, about 45,000 live jobs).

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

City names, e.g. `Bengaluru` (or `Bangalore`), `Mumbai`, `Delhi`, `Hyderabad`, `Pune`, `Chennai`, `Noida`, `Gurgaon`, `Kochi`. For the 14 cities Cutshort has pages for, the city page is read directly; every job is also checked against its own location list. `Delhi` includes the NCR (Gurgaon, Noida, Ghaziabad, Faridabad). Empty = all of India and remote.

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

Words matched against the job title and skills, e.g. `senior`, `django`, `lead`, `intern`. Empty = all jobs. Jobs without a match are not charged.

## `remote` (type: `string`):

`remote` keeps jobs marked remote-only or remote-okay; `onsite` keeps office-only jobs. With no categories, `remote` reads Cutshort's remote-jobs page.

## `roleType` (type: `string`):

Full-time jobs, internships or both.

## `minExperience` (type: `integer`):

Keep jobs whose experience range reaches this many years (e.g. 3 keeps `2 - 5 years`, drops `0 - 2 years`).

## `maxExperience` (type: `integer`):

Keep jobs whose experience range starts at or below this many years (e.g. 2 keeps `0 - 2` and `1 - 4`, drops `5 - 8`).

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

Keep jobs whose shown annual salary range reaches this amount, e.g. `1500000` for 15 LPA. Jobs that hide their salary (`Best in industry`) or show a monthly figure are left out when this is set.

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

Keep jobs posted in the last N days (`datePosted`). Pages are newest first, so reading stops once a page is older than the window.

## `includeDescription` (type: `boolean`):

Full job description as text (no extra request; it comes with the listing).

## `includeCompany` (type: `boolean`):

Company type, size, stage, founding year, website, LinkedIn page, logo and description.

## `maxResults` (type: `integer`):

Stop after this many saved jobs (default 50, about $0.04). 0 = no cap: each Cutshort page serves its newest few hundred to few thousand jobs (about 2,400 on the whole-board page, Oct 2026).

## `onlyNewSinceLastRun` (type: `boolean`):

Remember delivered job ids in a key-value store named `cutshort-jobs-state` and skip them next time (not charged).

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

Name of the only-new memory. By default it follows categories, locations, keywords and the remote setting.

## `skipIds` (type: `array`):

Cutshort job ids you already have (the 24-character `id`). Neither saved nor charged.

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

Not needed: cutshort.io answers Apify's servers directly.

## Actor input object example

```json
{
  "categories": [
    "Python"
  ],
  "locations": [],
  "keywords": [],
  "remote": "any",
  "roleType": "any",
  "includeDescription": true,
  "includeCompany": true,
  "maxResults": 50,
  "onlyNewSinceLastRun": false,
  "skipIds": [],
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

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

Cutshort jobs as JSON items in the default dataset (also CSV, Excel, XML).

## `runSummary` (type: `string`):

RUN-SUMMARY record: counts of jobs found, saved, filtered, skipped and charged.

# 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 = {
    "categories": [
        "Python"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("data_daemon/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 = { "categories": ["Python"] }

# Run the Actor and wait for it to finish
run = client.actor("data_daemon/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 '{
  "categories": [
    "Python"
  ]
}' |
apify call data_daemon/cutshort-jobs-scraper --silent --output-dataset

```

## MCP server setup

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