# CutShort Scraper (`maximedupre/cutshort-scraper`) Actor

Scrape public CutShort tech and startup jobs by skill or URL. Export titles, companies, locations, salary ranges, experience, skills, descriptions, apply URLs, and scrape metadata.

- **URL**: https://apify.com/maximedupre/cutshort-scraper.md
- **Developed by:** [Maxime Dupré](https://apify.com/maximedupre) (community)
- **Categories:** Lead generation, Integrations
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, NaN bookmarks
- **User rating**: No ratings yet

## Pricing

$1.60 / 1,000 job listings

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).


# README

### 🔎 CutShort Scraper for tech jobs

CutShort Scraper extracts public tech and startup job listings from [CutShort](https://cutshort.io/) and saves them as clean Apify dataset items. Search by skill terms such as `python`, `react`, or `devops`, paste CutShort job/search URLs, or use both in one run.

Use it when you need a focused CutShort scraper for hiring research, job-market monitoring, salary checks, startup job discovery, lead lists, or repeat exports. Each saved job can include the title, company, location, remote signal, salary range, USD salary estimates, experience range, skills, recruiter, company enrichment, job description, apply URL, source URL, and scrape metadata.

For a quick first run, keep one skill term and set `Job limit` to `25`. Open the dataset, check the returned jobs, then add more skills or CutShort URLs when the output matches your workflow.

### ✅ What this Actor does

- Searches public CutShort jobs by skill or role terms.
- Accepts CutShort job URLs and search URLs.
- Saves one dataset item per unique job listing.
- Extracts job title, company, company page, company logo, website, LinkedIn, founded year, tech stack, recruiter details, location, remote information, salary, USD salary estimates, experience, skills, job type, descriptions, apply URL, and source context when CutShort exposes them.
- De-duplicates matching jobs across all skills and URLs in the same run.
- Caps saved jobs with `Job limit` so you can test small and scale later.
- Works with Apify exports, schedules, webhooks, integrations, and API clients.

This Actor focuses on public CutShort job data. It does not log in to CutShort, submit applications, contact companies, scrape candidate profiles, or collect private account pages.

### 📦 Data you can extract

Each dataset item is one CutShort job. Some fields can be empty when CutShort does not show that value for a specific listing.

- `jobId`, `jobSlug`, `url`, and `applyUrl`
- `title`, `jobType`, `descriptionText`, and `descriptionHtml`
- `companyName`, `companyId`, `companySlug`, `companyUrl`, `companyLogo`, `companyWebsite`, `companyLinkedin`, `companyFounded`, `companyTechStack`, `companySize`, and `fundingStage`
- `location`, `locations`, `remote`, and `remoteType`
- `salaryMin`, `salaryMax`, `salaryCurrency`, `salaryPeriod`, `salaryRawText`, `salaryMinUsdEstimate`, and `salaryMaxUsdEstimate`
- `experienceRange`, `experienceMin`, and `experienceMax`
- `skills`, `matchedSkill`, and `matchedInputs`
- `recruiterName` and `recruiterPhoto`
- `sourceUrl`, `sourcePage`, `sourcePosition`, `dedupeKey`, and `scrapedAt`

### 🎯 Common use cases

- Monitor CutShort hiring demand for skills such as Python, React, Java, DevOps, data, product, or machine learning.
- Build repeatable exports of startup and tech jobs for recruiting research.
- Compare salary ranges, experience bands, remote signals, and required skills across CutShort listings.
- Save direct CutShort job pages into a consistent dataset for review or outreach workflows.
- Feed CutShort job data into spreadsheets, dashboards, CRMs, warehouses, alerts, or API workflows.

### 🚀 How to run it

1. Add one or more `Skills`, such as `python`, `react`, or `machine learning`.
2. Optionally paste CutShort job or search URLs into `CutShort URLs`.
3. Keep `Job limit` small for your first run.
4. Start the Actor and open the dataset.

You do not need CutShort cookies, a CutShort account, or a separate CutShort API key.

### ⚙️ Input

| Field | What it does |
| --- | --- |
| `skills` | Skill or role terms to search on CutShort. |
| `startUrls` | Optional CutShort job URLs or search URLs. |
| `maxItems` | Maximum jobs to save across all skills and URLs. |
| `outputMode` | `full`, `summary`, or `urls_only`. |

Example input:

```json
{
  "skills": ["python", "react"],
  "startUrls": [
    {
      "url": "https://cutshort.io/jobs/python-jobs"
    }
  ],
  "maxItems": 25,
  "outputMode": "full"
}
````

### 🧾 Output example

```json
{
  "jobId": "example-job-id",
  "jobSlug": "backend-engineer-python-example-startup",
  "url": "https://cutshort.io/job/backend-engineer-python-example-startup",
  "applyUrl": "https://cutshort.io/job/backend-engineer-python-example-startup",
  "title": "Backend Engineer - Python",
  "companyName": "Example Startup",
  "companyUrl": "https://cutshort.io/company/example-startup",
  "companyLogo": "https://cdnv2.cutshort.io/company-static/example/logo.png",
  "companyWebsite": "https://example.com",
  "companyLinkedin": "https://linkedin.com/company/example",
  "companyFounded": 2022,
  "companyTechStack": ["Python", "React.js", "AWS"],
  "companySize": "11-50",
  "fundingStage": "Seed",
  "location": "Bengaluru",
  "locations": ["Bengaluru", "Remote"],
  "remote": true,
  "remoteType": "remote",
  "salaryMin": 1200000,
  "salaryMax": 2500000,
  "salaryCurrency": "INR",
  "salaryPeriod": "year",
  "salaryRawText": "₹12L - ₹25L",
  "salaryMinUsdEstimate": 14400,
  "salaryMaxUsdEstimate": 30000,
  "experienceRange": "2-5 years",
  "experienceMin": 2,
  "experienceMax": 5,
  "skills": ["Python", "Django", "PostgreSQL"],
  "recruiterName": "Example Recruiter",
  "recruiterPhoto": "https://cdn.cutshort.io/public/users/example",
  "matchedSkill": "python",
  "matchedInputs": ["python"],
  "sourceUrl": "https://cutshort.io/jobs/python-jobs",
  "sourcePage": 1,
  "sourcePosition": 1,
  "dedupeKey": "example-job-id",
  "scrapedAt": "2026-06-09T00:00:00.000Z"
}
```

### 💳 Pricing

This Actor uses pay-per-event pricing. You are charged for each public job listing saved to the dataset. Runs that find no matching jobs do not create job-listing charge events.

Current pay-per-saved-job pricing:

- `$0.0016` per saved job listing

Use `Job limit` to keep the first run small, then raise it when the dataset fields match your workflow.

### ⚠️ Limits and caveats

- CutShort may omit fields such as salary, recruiter, company tech stack, funding stage, company size, remote type, or full description on some listings.
- Broad skill terms can return overlapping jobs. The Actor de-duplicates jobs within the run before saving them.
- Direct job URLs normally produce one job item each when the public page still exposes job data.
- The Actor is built for public job listings, not private dashboards, applicant data, or application submission.
- Invalid targets and no-result searches are reported in logs, not as placeholder dataset items.

### ❓ FAQ

#### 🔐 Do I need a CutShort login?

No. This Actor works with public CutShort job listings and does not ask for CutShort cookies, passwords, or API keys.

#### 🔗 Can I paste a CutShort job URL?

Yes. Add direct CutShort job URLs to `CutShort URLs`. Each valid direct job URL normally saves one job item.

#### 🧭 Can I scrape all CutShort jobs?

No. Start from skill terms or CutShort URLs. This keeps runs focused and avoids pretending the source has one complete all-jobs mode.

#### 💰 Why are some salary fields empty?

Some CutShort listings do not show salary details. When salary text is visible, the Actor saves the raw text and tries to parse numeric min and max values.

### 📝 Changelog

- 0.1: Added output detail modes, richer company and recruiter fields, USD salary estimates, and lower per-job pricing.
- 0.0: Initial release.

### 🆘 Support

For issues, questions, or feature requests, [file a ticket](https://console.apify.com/actors/maximedupre~cutshort-scraper/issues) and I'll fix or implement it in less than 24h 🫡

### 🔗 Other actors

- [CWjobs Scraper ↗](https://apify.com/maximedupre/cwjobs-scraper) - Export public UK tech jobs with employers, salaries, locations, and apply metadata.
- [Welcome to the Jungle Jobs Scraper ↗](https://apify.com/maximedupre/welcometothejungle-jobs-extractor) - Scrape public WTTJ jobs with companies, salaries, locations, and remote policy.
- [Goodmoves Jobs Scraper ↗](https://apify.com/maximedupre/goodmoves-jobs-scraper) - Export public charity-sector jobs with organisations, salaries, dates, and apply links.
- [Freelancer Scraper ↗](https://apify.com/maximedupre/freelancer-scraper) - Export public Freelancer.com projects and freelancer profiles.
- [TeamBlind Reviews Scraper ↗](https://apify.com/maximedupre/teamblind-reviews-scraper) - Collect public company reviews for employer and hiring-market research.

**Made with ❤️ by Maxime Dupré**

# Actor input Schema

## `skills` (type: `array`):

Search CutShort jobs by skill or role term.

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

Add CutShort job pages or search pages.

## `outputMode` (type: `string`):

Choose how much detail each saved job includes.

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

Maximum jobs to save across all skills and URLs.

## Actor input object example

```json
{
  "skills": [
    "python",
    "java",
    "react"
  ],
  "outputMode": "full",
  "maxItems": 25
}
```

# Actor output Schema

## `results` (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 = {
    "skills": [
        "python",
        "java",
        "react"
    ],
    "maxItems": 25
};

// Run the Actor and wait for it to finish
const run = await client.actor("maximedupre/cutshort-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 = {
    "skills": [
        "python",
        "java",
        "react",
    ],
    "maxItems": 25,
}

# Run the Actor and wait for it to finish
run = client.actor("maximedupre/cutshort-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "skills": [
    "python",
    "java",
    "react"
  ],
  "maxItems": 25
}' |
apify call maximedupre/cutshort-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=maximedupre/cutshort-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "CutShort Scraper",
        "description": "Scrape public CutShort tech and startup jobs by skill or URL. Export titles, companies, locations, salary ranges, experience, skills, descriptions, apply URLs, and scrape metadata.",
        "version": "0.1",
        "x-build-id": "5OKc1MNKqBdb0DmTg"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/maximedupre~cutshort-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-maximedupre-cutshort-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/maximedupre~cutshort-scraper/runs": {
            "post": {
                "operationId": "runs-sync-maximedupre-cutshort-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/maximedupre~cutshort-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-maximedupre-cutshort-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "properties": {
                    "skills": {
                        "title": "🔎 Skills",
                        "type": "array",
                        "description": "Search CutShort jobs by skill or role term.",
                        "items": {
                            "type": "string",
                            "minLength": 1
                        }
                    },
                    "startUrls": {
                        "title": "🔗 CutShort URLs",
                        "type": "array",
                        "description": "Add CutShort job pages or search pages.",
                        "items": {
                            "type": "object",
                            "required": [
                                "url"
                            ],
                            "properties": {
                                "url": {
                                    "title": "URL",
                                    "type": "string",
                                    "description": "CutShort job or search URL.",
                                    "pattern": "^https?://(www\\.)?cutshort\\.io/"
                                }
                            }
                        }
                    },
                    "outputMode": {
                        "title": "📦 Output detail",
                        "enum": [
                            "full",
                            "summary",
                            "urls_only"
                        ],
                        "type": "string",
                        "description": "Choose how much detail each saved job includes.",
                        "default": "full"
                    },
                    "maxItems": {
                        "title": "🎯 Job limit",
                        "minimum": 1,
                        "maximum": 5000,
                        "type": "integer",
                        "description": "Maximum jobs to save across all skills and URLs.",
                        "default": 50
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
