# CutShort Jobs Scraper: India Tech Jobs & Salaries (`getascraper/cutshort-scraper`) Actor

Collect public CutShort tech job listings in India with displayed and internal salary ranges, skills, role and remote data, optional company profiles and employer email discovery, plus recurring change detection you can schedule to return only new and updated roles.

- **URL**: https://apify.com/getascraper/cutshort-scraper.md
- **Developed by:** [GetAScraper](https://apify.com/getascraper) (community)
- **Categories:** Jobs, Lead generation, Automation
- **Features:** Limited permissions
- **Stats:** 727 total users, 269 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.97 / 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: India Tech Jobs & Salaries

<table width="100%" style="display:table;width:100%;border-collapse:separate;border-spacing:0;table-layout:fixed;margin-bottom:0">
<tr>
<td colspan="4" style="padding:14px 18px;background:#F0FDFA;border:none;border-top:3px solid #0F766E;border-left:1px solid #D6D3D1;border-right:1px solid #D6D3D1;color:#1C1917;border-radius:10px 10px 0 0">
<span style="font-size:16px;font-weight:700;color:#1C1917">Track Indian tech hiring with source salary and change data you can trust.</span> <span style="font-size:15px;color:#57534E">Collect public CutShort jobs once or schedule a focused feed of new and updated roles.</span>
</td>
</tr>
<tr>
<td colspan="4" style="padding:10px 14px;background:#0F766E;border:none;border-left:1px solid #D6D3D1;border-right:1px solid #D6D3D1;color:#FFFFFF">
<span style="color:#FFFFFF;font-size:14px;font-weight:700;letter-spacing:0.5px">INDIA JOBS SOURCES AND INVENTORY</span>
<span style="color:#FFFFFF;font-size:13px">&nbsp;&nbsp;&bull;&nbsp;&nbsp;Apna, CutShort, Internshala, Instahyre, and the combined India job feed</span>
</td>
</tr>
<tr>
<td style="padding:10px 12px;border:none;border-left:1px solid #D6D3D1;border-bottom:1px solid #D6D3D1;vertical-align:top;width:25.0%;background:#F0FDFA;color:#1C1917">
<span style="overflow-wrap:break-word;word-break:break-word"><img src="https://apify-image-uploads-prod.s3.us-east-1.amazonaws.com/jNDbFabbVxMhnQNb4-actor-hgMCIk2Sb7HnSumQC-vaaBV31jet-ChatGPT_Image_Sep_4__2026__07_42_37_AM.png" width="20" height="20" style="vertical-align:middle;border-radius:4px">&nbsp;<a href="https://apify.com/getascraper/cutshort-scraper" style="color:#0F766E;text-decoration:none;font-weight:700;font-size:13px">CutShort Jobs</a></span><br>
<span style="color:#0F766E;font-size:11px;font-weight:700">&#10148; You are here</span>
</td>
<td style="padding:10px 12px;border:none;border-left:1px solid #D6D3D1;border-bottom:1px solid #D6D3D1;vertical-align:top;width:25.0%;background:#FFFFFF;color:#1C1917">
<span style="overflow-wrap:break-word;word-break:break-word"><img src="https://apify-image-uploads-prod.s3.us-east-1.amazonaws.com/jNDbFabbVxMhnQNb4-actor-4dMyE80KpfCIKroD4-AeB3jBrmgG-ChatGPT_Image_Sep_10__2026__08_22_23_PM.png" width="20" height="20" style="vertical-align:middle;border-radius:4px">&nbsp;<a href="https://apify.com/getascraper/internshala-scraper" style="color:#1C1917;text-decoration:none;font-weight:700;font-size:13px">Internshala Monitor</a></span><br>
<span style="color:#57534E;font-size:11px">Internships and entry-level jobs</span>
</td>
<td style="padding:10px 12px;border:none;border-left:1px solid #D6D3D1;border-bottom:1px solid #D6D3D1;vertical-align:top;width:25.0%;background:#FFFFFF;color:#1C1917">
<span style="overflow-wrap:break-word;word-break:break-word"><img src="https://apify-image-uploads-prod.s3.us-east-1.amazonaws.com/jNDbFabbVxMhnQNb4-actor-M5Myh7i6WMTmfwMlw-NCEUGam6gM-logo_200_200.webp" width="20" height="20" style="vertical-align:middle;border-radius:4px">&nbsp;<a href="https://apify.com/getascraper/instahyre-jobs-scraper" style="color:#1C1917;text-decoration:none;font-weight:700;font-size:13px">Instahyre Jobs</a></span><br>
<span style="color:#57534E;font-size:11px">Tech jobs and hiring alerts</span>
</td>
<td style="padding:10px 12px;border:none;border-left:1px solid #D6D3D1;border-right:1px solid #D6D3D1;border-bottom:1px solid #D6D3D1;vertical-align:top;width:25.0%;background:#FFFFFF;color:#1C1917">
<span style="overflow-wrap:break-word;word-break:break-word"><img src="https://apify-image-uploads-prod.s3.us-east-1.amazonaws.com/jNDbFabbVxMhnQNb4-actor-8hG15V7QtjKUpwAt3-GucaVgd5Jo-s11728_indian_flag_logo_isolated_on_white_background_-styliz_104" width="20" height="20" style="vertical-align:middle;border-radius:4px">&nbsp;<a href="https://apify.com/getascraper/india-job-inventory-feed" style="color:#1C1917;text-decoration:none;font-weight:700;font-size:13px">India Job Feed</a></span><br>
<span style="color:#57534E;font-size:11px">Combined multi-source job inventory</span>
</td>
</tr>
</table>
<table width="100%" style="display:table;width:100%;border-collapse:separate;border-spacing:0;margin-top:0;margin-bottom:0">
<tr>
<td style="padding:24px 28px;background:#F0FDFA;border:1px solid #99F6E4;border-top:none;color:#1C1917">
<span style="font-size:23px;font-weight:800;color:#1C1917;line-height:1.3">India tech job listings from CutShort, with real salary data</span><br>
<span style="font-size:15px;color:#57534E;line-height:1.6">Collect public CutShort search and category pages, including salary ranges, skills, remote status, and company details, with built-in change detection.</span>
</td>
</tr>
</table>
<table width="100%" style="display:table;width:100%;border-collapse:separate;border-spacing:0;margin-top:0"><tr><td style="padding:14px 12px;width:25%;background:#FFFFFF;border:1px solid #99F6E4;vertical-align:top;border-top:none;color:#1C1917;border-radius:0 0 0 10px"><span style="font-size:15px;font-weight:800;color:#115E59">✓ Honest salaries</span><br><span style="font-size:12px;color:#57534E">No invented currency or period.</span></td><td style="padding:14px 12px;width:25%;background:#FFFFFF;border:1px solid #99F6E4;border-left:none;vertical-align:top;border-top:none;color:#1C1917"><span style="font-size:15px;font-weight:800;color:#115E59">↻ Detect change</span><br><span style="font-size:12px;color:#57534E">See new and updated roles.</span></td><td style="padding:14px 12px;width:25%;background:#FFFFFF;border:1px solid #99F6E4;border-left:none;vertical-align:top;border-top:none;color:#1C1917"><span style="font-size:15px;font-weight:800;color:#115E59">⌁ Reduce duplicates</span><br><span style="font-size:12px;color:#57534E">Merge overlapping searches.</span></td><td style="padding:14px 12px;width:25%;background:#FFFFFF;border:1px solid #99F6E4;border-left:none;vertical-align:top;border-top:none;color:#1C1917;border-radius:0 0 10px 0"><span style="font-size:15px;font-weight:800;color:#115E59">↓ Export cleanly</span><br><span style="font-size:12px;color:#57534E">Keep source provenance.</span></td></tr></table>

Collect public job listings from CutShort search/category pages and direct public job URLs. The Actor returns source salary ranges, skills, locations, role and remote metadata, optional public company details, and provenance for every result.

It does not sign in, collect candidate data, use credentials, solve CAPTCHAs, or infer missing values.

### 🚀 How to use it

<table width="100%" style="display:table;width:100%;border-collapse:separate;border-spacing:0"><tr><td style="padding:16px 14px;width:33%;background:#F0FDFA;border:1px solid #99F6E4;border-radius:10px 0 0 10px;vertical-align:top;color:#1C1917"><span style="font-size:12px;font-weight:800;color:#0F766E;letter-spacing:1px">STEP 1</span><br><span style="font-size:14px;font-weight:700;color:#1C1917">Choose sources</span><br><span style="font-size:12px;color:#57534E">Add skills, public search URLs, or direct public job URLs.</span></td><td style="padding:16px 14px;width:33%;background:#F0FDFA;border:1px solid #99F6E4;border-left:none;vertical-align:top;color:#1C1917"><span style="font-size:12px;font-weight:800;color:#0F766E;letter-spacing:1px">STEP 2</span><br><span style="font-size:14px;font-weight:700;color:#1C1917">Choose the view</span><br><span style="font-size:12px;color:#57534E">Set filters, enrichment, and the unique-row limit.</span></td><td style="padding:16px 14px;width:33%;background:#F0FDFA;border:1px solid #99F6E4;border-left:none;border-radius:0 10px 10px 0;vertical-align:top;color:#1C1917"><span style="font-size:12px;font-weight:800;color:#0F766E;letter-spacing:1px">STEP 3</span><br><span style="font-size:14px;font-weight:700;color:#1C1917">Schedule updates</span><br><span style="font-size:12px;color:#57534E">Reuse the state name to receive changes on later runs.</span></td></tr></table>

### What the Actor returns

- Source job ID, canonical public URL, and source-provided application URL when present
- Title, description, skills, locations, experience, role types, and hiring-for-client status
- Both the displayed salary range (`salaryMin`/`salaryMax`, currency, period, original display text) and the source's internal salary floor and ceiling (`salaryInternalMin`/`salaryInternalMax`) as separate fields, when the source provides them
- Exact `remoteType`, plus a conservative `remote` normalization
- Optional public company identity, profile metadata, links, and tech stack
- Optional public job-poster ID, name, and profile image
- Optional employer contact email, read from the hiring company's own public website, with the website it came from
- Source URL(s), matched search terms and skills, stable dedupe key, duplicate counts, and content hash
- Optional `NEW`, `UPDATED`, or `UNCHANGED` status for recurring runs

Missing source fields are returned as `null` or empty arrays. Salary values stay in the source currency; the Actor does not apply an exchange-rate estimate.

### Remote semantics

The source distinguishes three values:

| `remoteType`      | `remote` | Meaning preserved by the Actor                                    |
| ----------------- | -------: | ----------------------------------------------------------------- |
| `remote_only`     |   `true` | Source marks the job as remote only                               |
| `remote_not_okay` |  `false` | Source does not allow remote work                                 |
| `remote_okay`     |   `null` | Source allows remote work but does not say the job is remote only |

Use `remoteOnly: true` to keep only the first category.

### 📧 Employer contact email (optional)

Turn on `enrichEmails` to get a public contact email for each hiring company, such as its careers, HR or general inbox. It is off by default.

- The email always comes from the company's own website, never from CutShort. The Actor first reads the website the company lists on its CutShort profile, and only looks the company up on the web when no website is listed.
- A site only counts when it really belongs to the company. When no confident match or no published email exists, the email fields stay empty and `emailEnrichmentStatus` says why (`not_found`, `failed`, or `skipped`).
- Every job from the same company gets the same email, and the website it was read from is returned as `employerWebsite`.
- Billed only when an email is found, once per company per run. Jobs without a found email cost nothing extra.
- In recurring runs, jobs that did not change are not looked up again.
- Some postings use a generic placeholder company name (for example an anonymous agency posting); those cannot always be matched.

### Input

| Field                    | Default        | Behavior                                                  |
| ------------------------ | -------------- | --------------------------------------------------------- |
| `skills`                 | `[]`           | Builds public CutShort jobs URLs from skill or role terms |
| `startUrls`              | `[]`           | Accepts public CutShort jobs pages and direct job URLs    |
| `locations`              | `[]`           | Keeps jobs matching any location text, case-insensitively |
| `roleTypes`              | `[]`           | Keeps jobs matching any exact source role type            |
| `remoteOnly`             | `false`        | Keeps only `remote_only` records                          |
| `postedWithinHours`      | none           | Keeps only jobs the source dated within this many hours; only has an effect on direct `/job/...` URLs, since list/category pages carry no date field. Undated jobs are kept, never dropped |
| `includeCompanyDetails`  | `false`        | Includes source-provided public company metadata, including funding stage, size, and tech stack (off by default to keep the default run fast; turn on for the full company profile) |
| `includeRecruiter`       | `false`        | Opts in to public job-poster ID, name, and image          |
| `includeDescriptionHtml` | `false`        | Includes source-provided sanitized description HTML       |
| `outputMode`             | `full`         | `full`, `summary`, or `urls_only`                         |
| `maxItems`               | `25`           | Caps unique records after deduplication and filters       |
| `enrichEmails`           | `false`        | Finds a public contact email on the hiring company's own website, billed only when an email is found (once per company per run); also returns `companyName` even when `includeCompanyDetails` is off |
| `monitoringMode`         | `false`        | Enables persistent recurring change detection             |
| `includeUnchanged`       | `false`        | Emits unchanged records in monitoring mode                |
| `stateName`              | `default`      | Separates independent recurring monitors                  |
| `proxyConfiguration`     | proxy disabled | Optional Apify proxy configuration                        |

`skills` and `startUrls` are combined. Duplicate request URLs and jobs returned by overlapping searches are deduplicated. If both inputs are empty, the Actor uses CutShort's public Python jobs page.

### Recurring monitoring

Enable `monitoringMode` and schedule the Actor with the same sources, filters, `maxItems`, enrichment options, and `stateName`.

The first successful run marks current jobs as `NEW`. Later successful runs compare each job's stable source-content hash and emit `NEW` and `UPDATED` records by default. Set `includeUnchanged` to also emit `UNCHANGED`.

Monitoring uses the stable job ID as `dedupeKey` and a deterministic state key derived from the effective source and filter scope. Snapshots are written only after all source requests and dataset writes succeed. The Actor does not label a job expired or closed when it disappears from a search page, because a ranking-window change alone is not evidence that the vacancy closed.

The latest run counts are available in the default key-value store under `RUN_SUMMARY`. Monitoring snapshots are stored in `cutshort-monitor-<stateName>`.

### Direct job URLs

Direct public `/job/...` URLs are supported. Their page metadata can expose fields not present on list pages, including source posting and validity dates and the JobPosting `directApply` flag. Fields remain null when the direct page does not provide them.

### Data integrity notes

- `salaryMin` and `salaryMax` prefer the source's displayed/vanity bounds and fall back only to other numeric bounds present in the payload. `salaryInternalMin` and `salaryInternalMax` are the source's separate internal floor/ceiling, kept distinct rather than merged into the displayed range; the two commonly differ.
- `salaryPeriod` comes from a structured source unit or an explicit period in the source salary text. It is never defaulted to yearly.
- `matchedSkills` contains source-listed skills that exactly normalize to a requested search term. `matchedSearchTerms` records every search term whose page returned that job.
- Recruiter metadata is off by default and is limited to fields publicly embedded in a job page. No email addresses, phone numbers, private profiles, or candidate information are collected from CutShort itself.
- `employerEmail` (from `enrichEmails`) is never sourced from CutShort. It is read from the hiring company's own public website (the one on its CutShort profile when listed) and is left unset when no confident match is found. `employerWebsite` shows the website it came from. Some CutShort listings only give a generic placeholder company name, which cannot always be matched.

### Coverage and limitations

Each search reads up to about 400 public jobs per skill or role (CutShort's own result pages, 50 jobs each), stopping as soon as your maximum is reached. Category pages linked with extra URL parameters return their first 50 jobs. The Actor does not claim complete historical coverage. CutShort can change its payload shape, cache public pages, or omit optional fields. A source request failure fails the run and does not advance monitoring state.

### Pricing

Pricing is pay per result, with no subscription. Empty runs do not create result charges. Check the Store pricing panel before a production rollout. The optional employer email is billed separately, only when an email is found, once per company per run.

### ⭐ Enjoying CutShort Jobs Scraper: India Tech Jobs & Salaries?

<table width="100%" style="display:table;width:100%;border-collapse:separate;border-spacing:0"><tr><td style="padding:20px 24px 14px;background:#F0FDFA;border:1px solid #99F6E4;border-left:5px solid #0F766E;border-radius:10px 10px 0 0;color:#1C1917"><span style="font-size:20px;letter-spacing:4px">⭐ ⭐ ⭐ ⭐ ⭐</span><br><span style="font-size:17px;font-weight:800;color:#1C1917">A review helps hiring and market-research teams find a dependable CutShort jobs feed.</span><br><span style="font-size:14px;color:#57534E">Your feedback tells us which workflow to improve next.</span></td></tr><tr><td style="padding:0;background:#0F766E;border:1px solid #0F766E;border-left:5px solid #0F766E;border-top:none;border-radius:0 0 10px 10px;text-align:center;color:#FFFFFF"><a href="https://apify.com/getascraper/cutshort-scraper/reviews" style="display:block;padding:13px 16px;color:#FFFFFF;text-decoration:none;font-weight:800;font-size:15px">★&nbsp;&nbsp;Rate this Actor on Apify</a></td></tr></table>

### Responsible use

Use the Actor only for public job-listing data and comply with CutShort's terms and applicable law. Do not use the output to profile candidates or attempt to access private data.

### 🔗 Other actors

- [Apna.co Jobs Scraper](https://apify.com/getascraper/apna-co-scraper) ↗ - collects public blue and grey collar job listings in India.
- [Internshala Scraper: Jobs & Internship Monitor](https://apify.com/getascraper/internshala-scraper) ↗ - tracks public internships and entry-level jobs in India.
- [Job Bank Scraper](https://apify.com/getascraper/jobbank-scraper) ↗ - collects public Canadian job listings.

# Changelog

This Actor's version history is a separate document: https://apify.com/getascraper/cutshort-scraper/changelog.md

# Actor input Schema

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

Build CutShort public jobs URLs from these terms. Results from overlapping terms are combined and deduplicated.

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

Public cutshort.io category/search pages and direct job URLs. URLs are combined with Skills.

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

Optional case-insensitive location text filters. A job is kept when any requested value occurs in a source location.

## `roleTypes` (type: `array`):

Optional exact CutShort role type values, such as full_time or internship. A job is kept when any value matches.

## `remoteOnly` (type: `boolean`):

Keep only records whose source remoteType is exactly remote_only.

## `postedWithinHours` (type: `integer`):

Keep only jobs the source dated within this many hours. CutShort only publishes a posting date on individual job pages, not on search/category listings, so this only has an effect when Public CutShort job or jobs URLs includes direct /job/... URLs. Jobs without a source date are kept, not dropped, since a missing date is not evidence of staleness. Leave empty for no filter.

## `includeCompanyDetails` (type: `boolean`):

Include source-provided company identity, profile, size, stage, funding code, follower count, links, and tech stack where present.

## `includeRecruiter` (type: `boolean`):

Opt in to source-provided public poster ID, name, and profile image. No private contact details are collected.

## `includeDescriptionHtml` (type: `boolean`):

Include the source-provided sanitized HTML description. Plain descriptionText is included in full output.

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

full returns all fields, summary returns core job fields and provenance, and urls_only returns identity, URLs, provenance, and monitoring metadata.

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

Maximum unique records emitted after deduplication and filters.

## `enrichEmails` (type: `boolean`):

Optional add-on, off by default. For each returned company, this looks for a public contact email on the company's own website: the website listed on its CutShort company profile when there is one, otherwise a site found by a web search and checked against the company name. Contact and about pages are read too. CutShort itself never exposes a recruiter email, so any email found comes from the company's public website, not from CutShort. Turning this on also includes the company name in the output even when Include public company details is off, since the company name is needed for the lookup, and adds the company website next to each email found. Postings listed only under a generic placeholder name cannot be looked up. Increases run time.

## `monitoringMode` (type: `boolean`):

Compare stable job content with the previous successful run for the same state name and source/filter scope.

## `includeUnchanged` (type: `boolean`):

In monitoring mode, also emit records whose stable source content has not changed.

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

Stable namespace for a recurring monitor. Use a different value for each independent monitor.

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

Optional network proxy configuration.

## Actor input object example

```json
{
  "skills": [],
  "startUrls": [],
  "locations": [],
  "roleTypes": [],
  "remoteOnly": false,
  "includeCompanyDetails": false,
  "includeRecruiter": false,
  "includeDescriptionHtml": false,
  "outputMode": "full",
  "maxItems": 25,
  "enrichEmails": false,
  "monitoringMode": false,
  "includeUnchanged": false,
  "stateName": "default",
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# 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": [],
    "startUrls": [],
    "enrichEmails": false,
    "proxyConfiguration": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("getascraper/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": [],
    "startUrls": [],
    "enrichEmails": False,
    "proxyConfiguration": { "useApifyProxy": False },
}

# Run the Actor and wait for it to finish
run = client.actor("getascraper/cutshort-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 '{
  "skills": [],
  "startUrls": [],
  "enrichEmails": false,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}' |
apify call getascraper/cutshort-scraper --silent --output-dataset

```

## MCP server setup

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