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

Scrape public CutShort tech and startup jobs by skill or URL. Export titles, company details, salary ranges, experience, skills, recruiter info, and matched inputs for API, CSV, Excel, schedules, and integrations.

- **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, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.02 / 1,000 scraped 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/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — 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 and startup jobs

CutShort Scraper extracts public tech and startup job listings from [CutShort](https://cutshort.io/) and saves them as clean Apify dataset rows. Use this CutShort scraper to search by skills such as `python`, `react`, or `devops`, paste CutShort job/search URLs, or combine both in one run.

Use it for recruiting research, India startup job discovery, salary checks, job-market monitoring, and repeat CutShort job data exports. Each saved job can include title, company details, locations, remote type, salary, USD salary estimates, experience, skills, recruiter details, company tech stack, job description, and the matched input that produced the row.

For an easy first run, keep the prefilled `python` skill and `Job limit` of `60`, start the Actor, and open the dataset. When the rows match your workflow, change the skills, raise the limit, or add CutShort URLs.

### ✅ What this CutShort jobs scraper does

- Searches public CutShort jobs by skill or role term.
- Accepts CutShort job URLs and CutShort search URLs.
- Saves one dataset row per unique job listing.
- De-duplicates matching jobs across all skills and URLs in the same run.
- Extracts job title, company, locations, remote type, salary, experience, skills, job type, recruiter details, descriptions, and company profile fields when CutShort exposes them.
- Adds USD salary estimates when INR salary values are visible.
- Keeps `matchedInputs` so you can link each output row back to the skill or URL that found it.
- Lets you choose full, summary, or job-identity output.
- Works with Apify exports, schedules, webhooks, integrations, and API clients, so it can act as a practical CutShort API for public job listings.

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.

### 📦 CutShort job data you can extract

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

| Data group | Fields |
| --- | --- |
| Job identity | `jobId`, `jobSlug`, `title`, `jobType` |
| Job content | `descriptionText`, `descriptionHtml`, `skills`, `locations`, `remoteType` |
| Company | `company.name`, `company.id`, `company.slug`, `company.logo`, `company.website`, `company.linkedin`, `company.founded`, `company.techStack`, `company.size`, `company.fundingStage` |
| Salary | `salary.min`, `salary.max`, `salary.currency`, `salary.period`, `salary.rawText`, `salary.minUsdEstimate`, `salary.maxUsdEstimate` |
| Experience | `experience.min`, `experience.max` |
| Recruiter | `recruiter.name`, `recruiter.photo` |
| Input matching | `matchedInputs` |

### 🎯 Common use cases

- Monitor CutShort hiring demand for Python, React, Java, DevOps, data, product, or machine learning roles.
- Build repeatable CutShort jobs scraper exports for recruiting research or market mapping.
- Compare salary ranges, experience bands, remote signals, and required skills across public CutShort listings.
- Track startup hiring and company tech stacks from a focused CutShort search.
- 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 or roles`, such as `python`, `react`, or `machine learning`.
2. Optionally paste CutShort job or search URLs into `CutShort URLs`.
3. Keep `Job limit` at `60` for the first run, or raise it when you want a broader export.
4. Choose `Output detail`.
5. 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. |
| `outputMode` | `full`, `summary`, or `urls_only` for job identity only. |
| `maxItems` | Maximum jobs to save across all skills and URLs. |

Example input:

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

### 🧾 Output example

```json
{
  "jobId": "6a2bf99d308c1234359cc547",
  "jobSlug": "backend-engineer-python-example-startup",
  "title": "Backend Engineer - Python",
  "company": {
    "name": "Example Startup",
    "id": "6a2bf0d8b550804212f62c2f",
    "slug": "jobs-at-example-startup",
    "logo": "https://cdnv2.cutshort.io/company-static/example/logo.png",
    "website": "https://example.com",
    "linkedin": "https://linkedin.com/company/example",
    "founded": 2022,
    "techStack": ["Python", "React.js", "AWS"],
    "size": "11-50",
    "fundingStage": "Seed"
  },
  "locations": ["Bengaluru", "Remote"],
  "remoteType": "remote",
  "salary": {
    "min": 1200000,
    "max": 2500000,
    "currency": "INR",
    "period": "year",
    "rawText": "Rs. 12L - Rs. 25L",
    "minUsdEstimate": 14400,
    "maxUsdEstimate": 30000
  },
  "experience": {
    "min": 2,
    "max": 5
  },
  "skills": ["Python", "Django", "PostgreSQL"],
  "jobType": "FULL_TIME",
  "descriptionText": "We are looking for a Backend Engineer.",
  "descriptionHtml": "<p>We are looking for a Backend Engineer.</p>",
  "recruiter": {
    "name": "Example Recruiter",
    "photo": "https://cdn.cutshort.io/public/users/example"
  },
  "matchedInputs": ["python"]
}
```

### 💳 Pricing

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

Current saved-job prices:

| Apify plan | Price per saved job | Price per 1,000 saved jobs |
| --- | ---: | ---: |
| Free | `$0.00004347` | `$0.04347` |
| Bronze | `$0.00003780` | `$0.03780` |
| Silver | `$0.000029484` | `$0.029484` |
| Gold | `$0.00002268` | `$0.02268` |
| Platinum | `$0.00001512` | `$0.01512` |
| Diamond | `$0.000010584` | `$0.010584` |

Use `Job limit` to control run size and cost. Lower it for a small sample, or raise it when you want a broader export.

### ⚠️ 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 row each when the public page still exposes job data.
- `salary.minUsdEstimate` and `salary.maxUsdEstimate` are calculated estimates, not values shown by CutShort.
- Invalid targets and no-result searches are reported in logs, not as placeholder dataset rows.

### ❓ 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 row.

#### 🧭 Can I match rows back to my inputs?

Yes. The `matchedInputs` array keeps the submitted skill or URL that matched each de-duplicated job, without adding broader source metadata to every row.

#### 📉 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 minimum and maximum values.

#### 🧩 Why does the dataset not include direct job URLs?

The dataset keeps source-native job IDs and slugs, so URLs can be rebuilt downstream without storing duplicate derived fields in every row.

### 📝 Changelog

- 1.0: Updated the public dataset to nested company, salary, experience, and recruiter objects; kept matched-input reconciliation; tuned the first-run input; and moved to tiered saved-job pricing.
- 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 WTTJ jobs with companies, salaries, locations, remote policy, and contract type.
- [Goodmoves Jobs Scraper ↗](https://apify.com/maximedupre/goodmoves-jobs-scraper) - Export charity-sector jobs with organisations, salaries, dates, locations, and apply metadata.
- [Rozee.pk Jobs Scraper ↗](https://apify.com/maximedupre/rozee-pk-jobs-scraper) - Collect Pakistan job listings with companies, cities, salaries, skills, and descriptions.
- [Freelancer Scraper ↗](https://apify.com/maximedupre/freelancer-scraper) - Find public Freelancer.com projects and profiles with budgets, skills, ratings, and source URLs.

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

# Actor input Schema

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

Search CutShort jobs by skill, technology, or role term.

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

Add CutShort job pages, search pages, or category pages.

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

Choose full job rows, compact job rows, or lightweight job identity rows.

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

Maximum jobs to save across all skills and URLs.

## Actor input object example

```json
{
  "skills": [
    "python"
  ],
  "outputMode": "full",
  "maxItems": 60
}
```

# Actor output Schema

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

Successfully scraped public CutShort job listings.

# 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"
    ],
    "maxItems": 60
};

// 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"],
    "maxItems": 60,
}

# 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"
  ],
  "maxItems": 60
}' |
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

Download the OpenAPI definition: https://api.apify.com/v2/actors/k7AeZdaB7lQlgoyOX/builds/e3lWF5cl4ajuRppju/openapi.json
