CutShort Jobs Scraper · Salary & skills · $1/1K avatar

CutShort Jobs Scraper · Salary & skills · $1/1K

Pricing

$1.00 / 1,000 results

Go to Apify Store
CutShort Jobs Scraper · Salary & skills · $1/1K

CutShort Jobs Scraper · Salary & skills · $1/1K

Collect CutShort job listings by skill, category URL or job URL for recruiting research, salary benchmarking and job-market tracking. Returns salary, experience, skills, locations, remote status, company details and posting dates, with change tracking. $1/1K jobs.

Pricing

$1.00 / 1,000 results

Rating

0.0

(0)

Developer

MLG Data

MLG Data

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

2 days ago

Last modified

Categories

Share

CutShort Scraper

Scrape CutShort public job listings by skill, category URL, or direct job URL. Export CutShort jobs to JSON, CSV, or a spreadsheet with salary ranges, experience, skills, locations, remote status, posting dates, and public company details. This actor is a practical CutShort API alternative for teams that need a repeatable job feed without maintaining their own collection process.

Each result represents one unique public job. The actor combines overlapping categories, keeps the source's displayed pay separate from internal numeric bounds, and can mark jobs as new, updated, or unchanged across scheduled runs. It reads public job data only; applying for a role may still require a site account.

What data can you extract from CutShort?

The default output contains the core job fields below. Optional fields appear when the relevant input switch is enabled. Empty source values remain null or empty arrays; the actor does not invent a location, salary, employer, or posting date.

FieldDescriptionExample
jobIdStable source identifier for the posting6ab22a15b2a99f741b0afe28
jobUrlCanonical public job pagePublic /job/ URL
applyUrlSource application link, which may require an accountPublic link or null
titlePosted role titleData Engineer
descriptionTextJob description converted to readable plain textRole duties and requirements
descriptionHtmlSource-sanitized markup, when enabledParagraph markup
skillsSkills attached to the postingSource skill labels
locationsStructured source locations[] for some remote roles
locationsTextDisplayed location labelRemote only
roleTypesSource role categoriesfull_time
remoteTypeExact source remote settingremote_only
remoteConservative remote-only normalizationtrue, false, or null
hiringForClientWhether the poster is hiring for a clientfalse
experienceMinDisplayed lower experience bound, in years3
experienceMaxDisplayed upper experience bound, in years10
salaryMinDisplayed lower pay bound in source currency1100000
salaryMaxDisplayed upper pay bound in source currency1500000
salaryInternalMinSeparate numeric lower bound in the public payloadNumber or null
salaryInternalMaxSeparate numeric upper bound in the public payloadNumber or null
salaryCurrencySource currency codeINR
salaryPeriodPeriod explicitly present in source pay textyear
salaryTextOriginal displayed pay label₹11L - ₹15L / yr
postedAtSource posting timestampISO timestamp
validThroughExpiration date from a direct public job pageISO date or null
companyNameSource employer nameSource value or null
companyIdSource employer identifierIdentifier or null
companyUrlPublic employer profile URLPublic /company/ URL
companyWebsiteEmployer website, when company details are enabledURL or null
companyLinkedinEmployer profile link, when details are enabledURL or null
companyLogoUrlPublic employer logo, when details are enabledImage URL or null
companyTypeSource employer type, when details are enabledSource label
companySizeSource employer size, when details are enabledSource range
companyStageSource employer stage, when details are enabledSource label
companyFoundedSource founding year, when details are enabledYear or null
companyTechStackSource technology labels, when details are enabledArray of labels
sourceUrlsCategory or direct URLs that returned the jobArray of URLs
matchedSearchTermsRequested terms whose pages contained the jobpython
dedupeKeyStable identity for combining overlapping resultsSource job ID
contentHashDigest of normalized job contentHexadecimal digest
changeStatusRecurring-run comparison, when monitoring is enabledNEW

remote is true only when the source says remote_only. It is false when the source says remote_not_okay. The source value remote_okay means remote work is permitted but does not establish a remote-only role, so the normalized field is null. Keep remoteType when that distinction matters to your analysis.

The visible salary fields use the source's displayed or vanity bounds. If the source labels pay as hidden or “Best in industry,” salaryMin and salaryMax stay empty. The separate salaryInternalMin and salaryInternalMax fields preserve numeric bounds present in the public payload; they are not presented as the displayed offer. No currency conversion is made. A yearly or monthly period appears only when the source pay label says so.

How to scrape CutShort

  1. Enter one or more skill or role terms, such as python, or paste public /jobs/ category URLs into startUrls. A direct public /job/ URL also works for a specific vacancy.
  2. Choose the number of pages to read per category. Each page currently carries up to 50 jobs. Set maxItems to the number of unique rows you want in the final dataset.
  3. Add location, role type, remote-only, or posting-age filters if needed. Enable public company details when your export needs website, profile, size, stage, or technology fields.
  4. Run the actor. The run collects each requested source, combines records with the same job ID, applies filters, and writes results to the default dataset.
  5. Download the dataset as JSON, CSV, or a spreadsheet file. For repeated collection, schedule the same input and enable monitoring to label changes.

If both skills and startUrls are empty, the actor uses the public Python jobs category. This default makes a first run useful without building a URL by hand. Category slugs must exist on the site; a term that does not map to a public category returns a source error rather than a misleading empty dataset.

Input

NameTypeDefaultDescription
skillsString array[]Skill or role terms converted into public category paths; combine several terms to broaden coverage.
startUrlsURL list[]Public CutShort /jobs/ categories or /job/ pages.
locationsString array[]Keep jobs containing any requested location text, ignoring letter case.
roleTypesString array[]Keep jobs with any exact source role type, such as full_time.
remoteOnlyBooleanfalseKeep only remote_only jobs.
postedWithinHoursIntegerUnsetKeep dated jobs within the requested age; retain undated jobs.
maxItemsInteger50Maximum unique results emitted after filters.
maxPagesPerSourceInteger2Category pages to fetch, from 1 through 9.
includeCompanyDetailsBooleanfalseAdd the public employer detail fields in the table above.
includeDescriptionHtmlBooleanfalseAdd sanitized HTML as well as plain description text.
monitoringModeBooleanfalseCompare jobs against the previous successful run for the same scope.
includeUnchangedBooleanfalseAlso emit unchanged jobs while monitoring.
stateNameStringdefaultSeparate independent recurring monitors.
proxyConfigurationObjectProxy enabledNetwork configuration for source requests.

A focused input for a single category looks like this:

{
"skills": ["python"],
"maxPagesPerSource": 1,
"maxItems": 40,
"includeCompanyDetails": true
}

For multiple categories, list several terms or paste verified category URLs. Terms and URLs are combined. startUrls accepts URL strings and standard request-list entries containing a url key. Query parameters on an input category URL are not used as filters; use the actor's input filters and page limit instead. Direct job URLs are read once and can provide an expiry date that category records do not include.

Output example

This excerpt is from a successful run of the input above. It shows actual source values; the long description, employer identity, links, and other output fields are omitted here for readability.

{
"jobId": "6ab22a15b2a99f741b0afe28",
"title": "Data Engineer",
"locations": [],
"locationsText": "Remote only",
"roleTypes": ["full_time"],
"remoteType": "remote_only",
"remote": true,
"experienceMin": 3,
"experienceMax": 10,
"salaryText": "₹11L - ₹15L / yr",
"salaryMin": 1100000,
"salaryMax": 1500000,
"salaryCurrency": "INR",
"salaryPeriod": "year",
"postedAt": "2026-09-22T07:11:17.478Z",
"hiringForClient": false,
"matchedSearchTerms": ["python"]
}

That run returned 40 jobs. All 40 had a job ID, public URL, title, listed skills, displayed location, remote type, posting timestamp, employer name, and content hash. A record can still have an empty structured locations array while the displayed locationsText says “Remote only”; both fields are retained rather than forcing one representation into the other.

Use cases

  • Hiring market tracking: Compare public role counts, skill labels, locations, and posted pay across repeated category runs. Use the source timestamp and stable ID to distinguish newly seen listings from older inventory.
  • Salary research: Export displayed ranges along with currency and period. Keep internal bounds separate so calculations do not accidentally treat them as the advertised compensation.
  • Remote opportunity feeds: Filter remote_only roles and retain the exact remote setting so downstream readers can distinguish remote-only from remote-permitted vacancies.
  • Talent demand analysis: Combine several skill categories, deduplicate jobs appearing in more than one result set, and inspect the matched terms for each role.
  • Public employer research: Enable company details to attach a public website, size, stage, and technology labels where the source supplies them.
  • Recurring alerts: Schedule the same source and filters, then use changeStatus to process new or changed records without handling every unchanged row again.

How much does it cost to scrape CutShort?

The configured result price is $1.00 per 1,000 emitted jobs, or $0.001 per dataset row. This is a per-result charge, so an empty result set does not add result charges. Platform usage for ordinary runs is covered by the configured result price. Check the current Store pricing panel before a large scheduled workload, since pricing can change.

At this rate, 40 emitted jobs cost $0.04, 500 cost $0.50, and 5,000 cost $5.00. These examples count delivered rows, not source pages requested. If monitoring is set to omit unchanged jobs, only the new and updated rows emitted in that run count toward the result charge. Setting a smaller maxItems also limits the number of chargeable results.

The actor stops writing when the platform reports a per-run charge limit. Category requests are still needed to find and compare results, so use a focused set of categories and a sensible page limit. Large descriptions and optional public company fields can increase dataset size, even though the per-result price stays the same.

Tips for best results

Start with a known public category URL if you are unsure how the site spells a role slug. The actor's skill input creates a hyphenated <term>-jobs path; some categories use specialized spelling. A public category URL removes that ambiguity. The sitemap and visible category links on the site are useful places to find valid category paths.

Use several related categories when you need more than one category's visible ranking window. Each category currently allows nine pages of 50 jobs, and related categories can reveal different vacancies. A job that appears in two categories is emitted once by source job ID. sourceUrls records each category page that returned it, and matchedSearchTerms records the input terms associated with those pages.

Set maxPagesPerSource to 1 for a quick current snapshot or to 2 for a wider default sample. Raise it toward 9 when the category is broad enough to justify additional requests. The actor ends early if a page contains fewer than 50 jobs. maxItems caps the final unique rows; it does not change the number of jobs the site exposes per page.

For a location filter, enter a distinctive city or region string. The actor checks the source's structured locations and displayed location label, ignoring letter case. For role type filters, use the site's exact role type labels. remoteOnly is intentionally strict: it selects only remote_only, not remote_okay.

Enable includeDescriptionHtml only when markup matters to your workflow. Plain description text is present by default and is easier to search. Enable includeCompanyDetails when you need employer metadata. Both switches change the content hash because they change the normalized record; keep these choices stable across monitored runs.

Limits

A category may report thousands of live jobs while exposing only a bounded ranking window to public requests. In observed public responses, pages 1 through 9 returned up to 50 jobs each and page 10 returned “jobs not found.” The actor stops at page 9 and does not claim to collect every historical vacancy in a large category. Category overlap helps extend coverage, but it does not guarantee a complete inventory.

Public pages can change ranking or disappear. A job missing from a later category run is not labeled closed, because it may simply have moved outside that ranking window. Monitoring labels only records that are present in the current collection. A row can reappear and be labeled new if it was outside the previous stored snapshot.

Fields vary by posting. Employers may omit a website, founding year, or technology stack. Some salary labels conceal the displayed range even when separate numbers are present in the public payload. An application link can require a site account. No private application data, candidate records, or account-only details are requested. Direct job pages may provide a validThrough date; category pages generally do not.

The actor accepts public /jobs/ and /job/ URLs on the target domain. Unsupported URL shapes fail early. A source response that fails or lacks the expected JSON structure fails the run, so a partial result set is not presented as a complete success. Successful monitoring snapshots are written after dataset output, and a budget stop does not advance that snapshot.

Use with AI agents (MCP)

Add this actor to any MCP client (Claude, Cursor, VS Code, n8n and others) with one URL:

https://mcp.apify.com?tools=mlg14/cutshort-scraper

The actor returns one dataset item per CutShort job (title, salary, experience, skills, locations, remote status, posting date). Keep maxItems small so a run finishes quickly.

Prompt 1: "Find 20 recent Python jobs on CutShort and show salary and location."

{
"skills": ["python"],
"maxItems": 20,
"maxPagesPerSource": 1
}

Prompt 2: "Get remote-only jobs from the CutShort Python category with company details."

{
"startUrls": [{"url": "https://cutshort.io/jobs/python-jobs"}],
"remoteOnly": true,
"includeCompanyDetails": true,
"maxItems": 25,
"maxPagesPerSource": 1
}

Prompt 3: "Which Python jobs on CutShort were posted in the last 48 hours?"

{
"skills": ["python"],
"postedWithinHours": 48,
"maxItems": 30,
"maxPagesPerSource": 1
}

Use with connected workflows

A connected workflow can run this actor with an input object and read the resulting dataset. Two practical requests are:

  • “Collect the first two pages of public Python job listings, keep remote-only roles, and return title, pay label, location, and posting date.”
  • “Run the same public job categories each morning, include company details, and show only jobs marked new or updated.”

Keep the input scope stable for recurring comparisons. Changing categories, filters, page limit, or result limit produces a different snapshot scope. Use a distinct stateName for independent feeds so their histories stay separate.

FAQ

The actor reads public job-listing data. You are responsible for using it in line with the site's terms, applicable law, and privacy rules. Do not use job data to profile candidates or attempt to access private accounts.

Do I need to configure a proxy?

The default configuration enables the platform proxy. Public JSON requests succeeded during development without a challenge. If the site later changes its access controls, the shared fetch layer can rotate sessions and escalate its network route. A custom proxy configuration is available when needed.

How fast is a run?

The observed one-page, 40-result golden run completed successfully in seconds after its build. Longer runs depend on the number of category pages, source response time, and the number of rows written. Company details are embedded in the public response, so enabling them does not add one request per job.

Can I schedule and monitor it?

Yes. Schedule a run with stable inputs and enable monitoringMode. The first successful monitored run marks current jobs NEW. Later runs compare content hashes and mark NEW, UPDATED, or UNCHANGED. By default unchanged rows are skipped; set includeUnchanged to keep them. Monitoring does not infer that a missing job has closed.

Can I export to a spreadsheet?

Yes. The default dataset can be downloaded as JSON, CSV, or a spreadsheet file. Arrays such as skills, locations, and sourceUrls remain arrays in JSON; a tabular export may represent them as serialized values.

Why is a field empty?

The site may omit it, or an optional field group may be disabled. validThrough generally needs a direct job URL. A hidden salary label leaves the displayed numeric fields empty. A remote-only posting can have no structured city even while the displayed location label is present.

Can this collect every job in a broad category?

No. The public category endpoint exposes a finite page window. Use several relevant categories and deduplication for broader coverage, and treat the result as the visible public slice at collection time.

Integrations

Use the dataset endpoint in a data pipeline, trigger a webhook after a run, schedule recurring collection, or route the export into a spreadsheet or database. Stable job IDs and content hashes support joins and updates; sourceUrls keeps the origin of each record visible. When combining runs, key records by dedupeKey and compare contentHash rather than relying on row order, because category rankings can shift.

Support

Open an issue on the Issues tab; we reply within 24h and add fields on request.