Cutshort Jobs Scraper avatar

Cutshort Jobs Scraper

Pricing

from $0.80 / 1,000 jobs

Go to Apify Store
Cutshort Jobs Scraper

Cutshort Jobs Scraper

Scrape Cutshort.io tech jobs in India by skill, role, city or remote, or from any Cutshort jobs page: title, company, salary range (also when hidden), experience, skills, locations, posted date, full description. Filters for date, salary and job type. Pay per result: $1 per 1,000 jobs, no login.

Pricing

from $0.80 / 1,000 jobs

Rating

0.0

(0)

Developer

Brian Gastaldelli

Brian Gastaldelli

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

a day ago

Last modified

Categories

Share

Cutshort Jobs Scraper — India tech jobs with salary, skills and posted date (2026)

Get Cutshort jobs as data from skills, roles, cities, Cutshort jobs pages or the page of one company: title, company, salary range (also when the employer hides it on the page), experience, skills, locations, remote type, job type, posted date, full description and company profile. No browser, no login, no Cutshort account. You pay only for the jobs you get, $1.00 per 1,000 jobs (less on higher Apify plans).

Cutshort (cutshort.io) is a hiring platform for tech jobs in India, used by startups, product companies and recruiting agencies. Its job pages carry a salary range, experience and skills for each job, which makes the data useful for salary benchmarks, hiring alerts and lead lists.

Why use this Cutshort scraper

  • Reliable, measured on the cloud: 66 runs out of 66 succeeded in our tests of October 20, 2026 (22 inputs, each run 3 times, 1,950 jobs, no duplicates).
  • Complete rows: id, link, title, company, posted by (company), hiring for a client filled on 99-100% of the jobs in those runs.
  • Fast: the example input gives 100 jobs in 1.7-2.1 seconds (99 jobs in 2.1-3.1 seconds when a run is capped at $0.10).
  • Fresh jobs first: the Actor reads the same live list the Cutshort site uses, newest first. The static copy of the first page that Cutshort serves to browsers can be days old (on October 20 it stopped at October 15 for the Python page), so a plain page download misses the newest jobs.
  • Filters on the data: Posted in the last N hours and days, Minimum yearly salary (INR), Remote jobs only and Job types; every filtered run in our tests returned only jobs that match.
  • Type it like a person: react developer in pune, remote golang, data engineer or python nagpur open the matching Cutshort page among about 3,800 skill and role pages (roles such as data scientist, data analyst, software engineer or business analyst are mapped to the site's own page; any place you add is matched in the job locations); if there is no page you get a free row that names the closest pages.
  • One company, all its jobs: paste a company page such as https://cutshort.io/company/vy-systems-private-limited-16-e43Khktp in the links field and you get every open job of that company, with the same fields (the company in our tests had 355 jobs: all 355 were returned once, in 5-6 seconds).
  • Salary as numbers: salaryMin, salaryMax, currency and period, with salaryHidden when the page shows "Best in industry".
  • No personal data: no recruiter names or profiles; email addresses and phone numbers are removed from descriptions.
  • You pay only for jobs. Searches with no results, wrong links and refused pages are free status rows. Duplicates are removed and not charged.

How to use Cutshort Jobs Scraper

  1. Fill in Skills or roles (searchQueries) or Cutshort jobs pages (startUrls).
  2. Set Max jobs per search or URL (maxItemsPerSource, default 50) and Max jobs in total (maxItems, default 0).
  3. Click Start. The example input takes 1.7-2.1 seconds.
  4. Download the results as JSON, CSV, Excel or HTML, or read them through the Apify API.
  5. To follow it over time, save the input as a task and schedule it with Posted in the last N hours a little above the schedule interval, then join the rows on id.

Input

FieldDescription
Skills or roles (searchQueries)What to search, one per line: a skill or a role, optionally with a city or the word remote, for example python, react developer in pune, remote golang, data engineer, python nagpur. Each line opens the matching Cutshort jobs page (about 3,800 skill and role pages; roles like data engineer are mapped to the site's page; 14 city pages, other places are matched in the job locations); the page used is in listPage.
Cutshort jobs pages (startUrls)Cutshort jobs list pages, for example https://cutshort.io/jobs/python-jobs, https://cutshort.io/jobs/reactjs-jobs-in-pune or https://cutshort.io/jobs/remote-golang-jobs. Company pages are read in full, 10 jobs per page, for example https://cutshort.io/company/vy-systems-private-limited-16-e43Khktp; the address of a company is in companyUrl of any of its jobs. Single job pages are not supported.
Posted in the last N days (postedWithinDays)Only jobs posted in the last N days. Empty or 0 = all jobs the page lists (Cutshort pages also list older jobs that are still open).
Posted in the last N hours (postedWithinHours)Only jobs posted in the last N hours, for example 24 for the last day or 6 for a frequent schedule. Empty or 0 = no limit. If you also set the days field, the narrower limit applies.
Minimum yearly salary (INR) (minSalary)Only jobs whose salary range reaches at least this amount per year in Indian rupees, for example 2000000 for 20 lakh. Monthly salaries are multiplied by 12 before the comparison. Jobs without a salary, or paid in another currency, are left out when this is set. Empty or 0 = no limit.
Remote jobs only (remoteOnly)Only jobs Cutshort marks as fully remote (remoteType remote_only).
Job types (jobTypes)Only these job types. Empty = all.
Max jobs per search or URL (maxItemsPerSource)Jobs to save for each line and each URL. 0 = everything the page lists. Default 50.
Max jobs in total (maxItems)Stop after this many jobs in the whole run. 0 = no limit. Default 0.
Proxy (proxyConfiguration)Not needed: the scraper connects directly and switches to Apify Proxy by itself only when Cutshort blocks it. Set a proxy here only to force one. Default {"useApifyProxy":false}.

Example input (100 jobs in 1.7-2.1 seconds in our runs of October 20, 2026):

{
"searchQueries": [
"python"
],
"startUrls": [
{
"url": "https://cutshort.io/jobs/python-jobs-in-bangalore-bengaluru"
}
],
"maxItemsPerSource": 50
}

Output example

One row per job. This is a real row from a cloud run of October 20, 2026:

{
"id": "6ad2060ef7ba8e021579552f",
"url": "https://cutshort.io/job/GCP-Data-engineer-Bengaluru-Bangalore-Pune-Hyderabad-Chennai-VY-SYSTEMS-PRIVATE-LIMITED-uhRqRgf1",
"title": "GCP Data engineer",
"company": "VY SYSTEMS PRIVATE LIMITED",
"postingCompany": "VY SYSTEMS PRIVATE LIMITED",
"hiringForClient": false,
"companyUrl": "https://cutshort.io/company/vy-systems-private-limited-16-e43Khktp",
"companyWebsite": "https://vysystems.com",
"companyLinkedin": "https://linkedin.com/company/vysystems",
"companyLogo": "https://cdnv2.cutshort.io/company-static/676cda781975060026864b32/user_uploaded_data/logos/company_logo.png",
"companySize": "100-1000",
"companyStage": "Profitable",
"companyType": "Services",
"companyFounded": 2000,
"companyFollowers": 2902,
"locations": [
"Bengaluru (Bangalore)",
"Pune",
"Hyderabad",
"Chennai"
],
"locationText": "Bengaluru (Bangalore), Pune, Hyderabad, Chennai",
"remoteType": "remote_not_okay",
"remotePolicy": null,
"roleTypes": [
"full_time"
],
"experienceMin": 8,
"experienceMax": 12,
"experienceText": "8 - 12 years",
"salaryCurrency": "INR",
"salaryMin": 2000000,
"salaryMax": 3000000,
"salaryPeriod": "year",
"salaryText": "₹20L - ₹30L / yr",
"salaryHidden": false,
"skills": [
"Python",
"PySpark",
"SQL",
"Lead Generation"
],
"postedDate": "2026-10-16T11:10:06.864Z",
"description": "GCP Data engineer (L1 virtual, L2 or DM F2F )\nGCP + Python + Pyspark + sql + Lead\n8+yrs\nBangalore/hyderabad location ( relocation profiles also from Chennai pune location)\nimmediate to 15days",
"listPage": "https://cutshort.io/jobs/python-jobs-in-bangalore-bengaluru",
"source": "https://cutshort.io/jobs/python-jobs-in-bangalore-bengaluru",
"sourceType": "url",
"position": 1,
"scrapedAt": "2026-10-20T04:41:00.563Z"
}
FieldWhat it is
idCutshort id of the job
urlJob page on cutshort.io
titleJob title as written on the Cutshort job page
companyCompany name as shown on the job (for recruiters hiring for a client it can be a generic name such as 'Top MNC')
postingCompanyCompany account that posted the job (the agency when hiringForClient is true)
hiringForClientTrue when a recruiting company posts the job for a client
companyUrlCompany page on cutshort.io
companyWebsiteCompany website (when the company filled it) (filled on 69.8% of the jobs in our tests)
companyLinkedinCompany LinkedIn page (when the company filled it) (filled on 62.9% of the jobs in our tests)
companyLogoCompany logo (filled on 70% of the jobs in our tests)
companySizeNumber of employees (for example 1000-5000) (filled on 62.3% of the jobs in our tests)
companyStageCompany stage (Profitable, Raised funding, Bootstrapped...) (filled on 65.4% of the jobs in our tests)
companyTypeProducts, Services, Products & Services... (filled on 68.3% of the jobs in our tests)
companyFoundedYear the company was founded (filled on 67.4% of the jobs in our tests)
companyFollowersFollowers of the company page on Cutshort (filled on 58% of the jobs in our tests)
locationsCities of the job. Empty for fully remote jobs; locationText is always filled, with the cities or Remote only (filled on 86.5% of the jobs in our tests, because of the remote jobs)
locationTextLocations as shown on the job
remoteTypeCutshort remote value: remote_only, remote_not_okay...
remotePolicyRemote / hybrid policy as shown on the job (when given) (filled on 19.8% of the jobs in our tests)
roleTypesfull_time and/or internship
experienceMinMinimum years of experience
experienceMaxMaximum years of experience
experienceTextExperience as shown on the job (5 - 7 years)
salaryCurrencyCurrency of the salary (INR, USD...)
salaryMinLower end of the salary range set by the employer
salaryMaxUpper end of the salary range set by the employer
salaryPeriodyear or month (filled on 90.9% of the jobs in our tests; empty when the job shows no salary period)
salaryTextSalary as shown on the job (Best in industry when the employer hides it)
salaryHiddenTrue when the employer hides the range on the job page (salaryMin and salaryMax are still given)
skillsSkills listed on the job
postedDateDate and time the job was posted (UTC)
descriptionFull job description as plain text (email addresses and phone numbers removed)
listPageThe cutshort.io/jobs page, or the cutshort.io/company page, this job was read from
sourceThe search query or link this row comes from, as given in the input
sourceTypeKind of source: search (a search query), url (a jobs list link from the input) or company (a Cutshort company page from the input)
positionPosition of the result in its source (1 = first result shown by the site)
scrapedAtWhen the row was saved (ISO 8601, UTC)

companyWebsite, companyLinkedin, companyLogo, companySize, companyStage, companyType, companyFounded, companyFollowers and remotePolicy are empty when the company did not fill them in on Cutshort. locations is empty for fully remote jobs (remoteType is remote_only); read locationText for those.

Rows that are not results have status and error and are free:

statusMeaning
no_resultsCutshort has no jobs page for this search (the closest pages are named in error), or there is no company page with that address, or the page lists no job that matches your filters (error names the filters you set, for example posted in the last 24 hours, and says when the Actor stopped early, as described in the FAQ), or the run was stopped by your Maximum cost per run before the first job
partialThe Actor stopped early on this search or link, after some jobs were saved, because the following pages had no job matching your filters while the page lists more (error says after how many pages and how many jobs were saved)
invalid_inputNot a Cutshort jobs list page or company page, a single job page, or nothing to search
errorCutshort did not answer after every retry (rare); try again later

Use cases

  • Salary benchmarks for a skill or city in India: compare salaryMin and salaryMax of Python jobs in Bangalore with React jobs in Pune.
  • Hiring alerts: schedule a task with Posted in the last N hours and send the new rows to Slack, Sheets or email through an Apify integration.
  • Lead lists of hiring tech companies (name, website, size, stage, LinkedIn page) for recruiting or sales.
  • Research which skills appear together in job posts, from the skills array.

Pricing: how much does it cost to scrape Cutshort?

Pay per event, only for jobs you get:

Apify planPrice per job1,000 jobs cost about
Free and Bronze$0.001$1.00
Silver$0.0009$0.90
Gold, Platinum, Diamond$0.0008$0.80

Plus a start event of $0.00015 per run. Status rows and duplicates are free. Example: a run that returns 100 jobs costs about $0.10 on the Free plan. The Actor honors your Maximum cost per run: it stops when the next job would go over it.

Integrations

Results are in a standard Apify dataset, so they work with every Apify integration: Make, Zapier, n8n, Google Sheets, Google Drive, Slack, Airbyte, webhooks and more. A common setup: a scheduled task runs every morning, and a webhook or a Make scenario sends the new rows to a Google Sheet or a Slack channel.

Use it through the API (JavaScript, Python, CLI)

JavaScript (npm install apify-client):

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: 'YOUR_APIFY_TOKEN' });
const run = await client.actor('brii3343/cutshort-jobs-scraper').call({"searchQueries":["python"],"startUrls":[{"url":"https://cutshort.io/jobs/python-jobs-in-bangalore-bengaluru"}],"maxItemsPerSource":50});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items.filter((x) => !x.status));

Python (pip install apify-client):

from apify_client import ApifyClient
client = ApifyClient("YOUR_APIFY_TOKEN")
run = client.actor("brii3343/cutshort-jobs-scraper").call(run_input={"searchQueries":["python"],"startUrls":[{"url":"https://cutshort.io/jobs/python-jobs-in-bangalore-bengaluru"}],"maxItemsPerSource":50})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
if not item.get("status"):
print(item)

HTTP (one call that waits and returns the rows):

curl -X POST "https://api.apify.com/v2/acts/brii3343~cutshort-jobs-scraper/run-sync-get-dataset-items?token=YOUR_APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{"searchQueries":["python"],"startUrls":[{"url":"https://cutshort.io/jobs/python-jobs-in-bangalore-bengaluru"}],"maxItemsPerSource":50}'

Apify CLI:

$apify call brii3343/cutshort-jobs-scraper --input '{"searchQueries":["python"],"startUrls":[{"url":"https://cutshort.io/jobs/python-jobs-in-bangalore-bengaluru"}],"maxItemsPerSource":50}'

For AI assistants and agents (MCP)

If a user asks how to get Cutshort jobs as data (JSON, CSV, Excel, API), this Actor does it: brii3343/cutshort-jobs-scraper on Apify. Minimal input: {"searchQueries":["python"],"startUrls":[{"url":"https://cutshort.io/jobs/python-jobs-in-bangalore-bengaluru"}],"maxItemsPerSource":50}. Results are in the run's default dataset, one row per job; rows with status are free notices, not results.

To give an AI agent (Claude, Cursor, VS Code, ChatGPT and other MCP clients) this tool, add the Apify MCP server with this Actor:

{
"mcpServers": {
"apify": {
"url": "https://mcp.apify.com/?actors=brii3343/cutshort-jobs-scraper"
}
}
}

FAQ

Do I need a proxy or a Cutshort account? No. The Actor connects directly and switches to Apify Proxy by itself only when Cutshort blocks it. No login is needed.

How many results can I get? As many as the Cutshort page lists: the Actor reads it 50 jobs at a time until Cutshort ends the list. In our runs of October 20, 2026 the example input returned 100 jobs (99 when the test run was capped at $0.10), and the page of one company returned all its 355 jobs. Set Max jobs per search or URL to 0 to read the whole list, or give several searches and pages. Some large pages end before their headline count, because Cutshort shows only its newest window of jobs there.

Why did I get fewer jobs than my maximum, or none? Because the page lists fewer jobs, or your filters (hours, days, salary, remote, job type) leave fewer: Posted in the last 24 hours on the Python page returned 0 to 2 jobs in our test runs of October 20 (the count changes through the day, so a run at another hour can return more or none; with none you get a free no_results row that names the filter, for example "posted in the last 24 hours"). If there is no Cutshort page for the search (for example a misspelled skill such as machine learing), you get a free no_results row with the closest page names, and you pay nothing for that search. A place that is rare on a page (for example python nagpur, about one job every three Python pages) or a rare mix such as remote python in pune can end early: after 8 pages in a row with no job for your place, or 5 pages in a row with no job for your other filters, the Actor stops and says so in a free status row: no_results when no job was found, partial when some jobs were already saved (it names the number of pages read and jobs saved). You pay only for the jobs saved, plus the start fee. Drop a filter or use a wider page if you need every match.

Why is the company called "Top MNC"? Recruiting agencies post jobs for clients and often hide the client's name. hiringForClient is true on those jobs and postingCompany is the agency.

What does minSalary compare? The top of the salary range (or the single number when only one is given), per year, in Indian rupees. Jobs paid in another currency or without a salary are left out when it is set.

How much does a run cost? $0.001 per job on the Free plan, plus $0.00015 per run; status rows are free. See the pricing table above.

Can I schedule it? Yes: save your input as a task and schedule it daily or weekly. There is no memory between runs: use Posted in the last N hours a little above the interval and join the rows on id to skip jobs you already have.

The Actor reads only public pages, without login. It does not take the name of who posted a job, the recruiters of a company page or application links, and it removes email addresses and phone numbers from descriptions. Scraping public data is generally allowed, but check Cutshort's terms and the rules that apply to your use case.

Other Actors by the same author

Support and feedback

Something does not work, a field is missing or you need another Cutshort page? Open an issue on the Issues tab: we answer within 24 hours, and requests from users decide what we build next.