# Unstop Jobs Search Scraper (`jobsapi/unstop-jobs-search-scraper`) Actor

Scrape job and internship listings from Unstop.com, India's talent discovery and hiring platform for students and graduates. Extract job titles, companies, locations, stipends, and application links for campus recruitment.

- **URL**: https://apify.com/jobsapi/unstop-jobs-search-scraper.md
- **Developed by:** [Jobs API](https://apify.com/jobsapi) (community)
- **Categories:** Jobs, Automation, Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.99 / 1,000 job details

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#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

### What does Unstop Jobs Search Scraper do?

Unstop Jobs Search Scraper extracts **current public job opportunities from [Unstop](https://unstop.com/job?oppstatus=open)** through its first-party jobs feed. It is a bounded Unstop jobs API alternative for collecting listing content; it does not access candidate profiles, authenticated pages, or private recruiter data.

The Actor supports keyword search plus single and multiple public job URL lookups. Each emitted row is verified against the numeric opportunity ID and includes a substantial public description, organization data, job details, and registration requirements.

### Why use Unstop Jobs Search Scraper?

- Build searchable job datasets for labor-market research and recruitment analytics.
- Monitor public roles, skills, salary disclosures, work modes, and registration deadlines.
- Resolve known Unstop job URLs into consistent structured records.
- Schedule recurring runs, call the Actor through the Apify API, connect datasets to integrations, and monitor failures in Apify Console.
- Keep costs predictable with explicit item, page, request, delay, and timeout limits.

The Actor uses ordinary sequential HTTPS requests. It does not require a browser, login, proxy, CAPTCHA bypass, cookies, or fingerprint evasion.

### What data can Unstop Jobs Search Scraper extract?

| Field | Type | Description |
|---|---|---|
| `jobId`, `title`, `company` | string | Verified opportunity identity and organization. |
| `description`, `descriptionHtml` | string | Sanitized public job description in text and HTML. |
| `locations`, `location`, `workMode` | array/string | Structured places and working arrangement. |
| `skills`, `workFunctions`, `eligibilityRules` | array/object | Public requirements and categories. |
| `salaryMin`, `salaryMax`, `salaryCurrency` | number/string | Compensation only when the source marks it as disclosed. |
| `registrationDeadline`, `viewsCount` | string/integer | Public registration and popularity metadata. |
| `jobUrl`, `sourceApiUrl` | string | Canonical public listing and source request URLs. |
| `detailVerified`, `verificationEvidence` | boolean/object | Machine-readable data-quality evidence. |

Empty and synthetic values are omitted. The Actor deliberately does not fabricate an `applyUrl`; `jobUrl` is the public Unstop listing.

### How to scrape Unstop jobs

1. Open the Actor input tab in Apify Console.
2. Select `search`, `single`, or `multiple` mode.
3. For search mode, enter a keyword query and optional location. For direct modes, provide official `unstop.com/jobs/` URLs ending in a numeric opportunity ID.
4. Set small `maxItems`, `maxPages`, and `maxRequests` values for an initial run.
5. Start the Actor and inspect the dataset plus `RUN_SUMMARY` and `RUN_DIAGNOSTICS` in the key-value store.
6. Download results or connect the dataset to your preferred Apify integration.

Direct modes scan the current open-jobs feed for the requested IDs. If an ID is no longer present, the run reports that honestly instead of emitting a placeholder.

### How much will it cost to scrape Unstop?

This Actor uses platform compute rather than a browser, so small bounded runs are typically lightweight. Actual cost depends on your Apify plan, memory setting, page count, request latency, and current platform pricing. Check the Actor run estimate in Apify Console before scheduling large recurring jobs. Start with three items and a few pages, then raise limits only when the measured match rate requires it.

### Input

See the input tab for full configuration options. A bounded search example is:

```json
{
  "mode": "search",
  "query": "business",
  "location": "",
  "maxItems": 3,
  "maxPages": 3,
  "maxRequests": 5,
  "requestTimeoutSecs": 60
}
```

The search matcher requires every query word and every location word to occur in the public opportunity payload. `maxPages`, `maxRequests`, `requestDelayMs`, and `requestTimeoutSecs` provide hard operational bounds.

### Output

You can download the dataset in various formats such as JSON, HTML, CSV, or Excel. Simplified records look like this:

```json
[
  {
    "jobId": "1700123",
    "title": "Senior Software Engineer",
    "company": "Example Technology Pvt Ltd",
    "location": "Bengaluru, Karnataka, India",
    "skills": ["Python", "System Design"],
    "salaryCurrency": "INR",
    "jobUrl": "https://unstop.com/jobs/senior-software-engineer-example-1700123",
    "detailVerified": true
  },
  {
    "jobId": "1700456",
    "title": "Business Development Executive",
    "company": "Example Company",
    "workMode": "In Office",
    "jobUrl": "https://unstop.com/jobs/business-development-executive-example-1700456",
    "detailVerified": true
  }
]
```

`RUN_SUMMARY` records request and page counts, feed totals, emitted records, access method, and final status. `RUN_DIAGNOSTICS` explains source, lookup, or validation failures and is never inserted into the dataset.

### Tips and advanced options

- Begin with a broad one-word query if a narrow multi-word query returns no matches.
- Increase `maxPages` together with `maxRequests`; each scanned feed page consumes one request.
- Use direct mode only for currently open public listings.
- Add a modest `requestDelayMs` for larger scans or frequent schedules.
- Keep `maxItems` low while validating downstream integrations.

### Local development

From this Actor directory, use:

```text
npm ci --no-audit --no-fund
npm run check
npm test
apify validate-schema
apify run --purge
npm run validate
```

Local output is stored under `storage/` only and is not uploaded to Apify Console.

### FAQ, disclaimers, and support

#### Why did a direct lookup fail?

The opportunity may be closed, removed, malformed, or beyond the configured page/request bounds. Inspect `RUN_DIAGNOSTICS`, confirm the URL ends in the numeric opportunity ID, and increase both limits carefully if needed.

#### Does this Actor need a proxy or account?

No. It uses only the current public jobs feed. If Unstop changes access requirements, the Actor fails with diagnostics rather than attempting bypass techniques.

#### Is scraping Unstop legal?

Our Actors are ethical and do not extract any private user data, such as email addresses, gender, or location. They only extract what the user has chosen to share publicly. We therefore believe that our Actors, when used for ethical purposes by Apify users, are safe. However, you should be aware that your results could contain personal data. Personal data is protected by the GDPR in the European Union and by other regulations around the world. You should not scrape personal data unless you have a legitimate reason to do so. If you're unsure whether your reason is legitimate, consult your lawyers.

Use the Actor only for lawful purposes, respect Unstop's applicable terms and robots directives, and apply appropriate retention controls. For programmatic use, open the Actor's API tab. For bugs or feature requests, use the Actor's Issues tab and include a redacted input plus run ID.

# Actor input Schema

## `mode` (type: `string`):

Search the current feed, resolve one job URL, or resolve multiple job URLs.

## `query` (type: `string`):

All query words must occur in the public opportunity payload.

## `location` (type: `string`):

Optional case-insensitive location or work-scope filter.

## `jobUrl` (type: `string`):

A public Unstop /jobs/ URL ending in the opportunity ID; used in single mode.

## `jobUrls` (type: `array`):

Public Unstop /jobs/ URLs ending in opportunity IDs; used in multiple mode.

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

Public Unstop job URL objects accepted for request-list compatibility.

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

Maximum records to emit. Direct modes never emit more than the supplied URL count.

## `maxPages` (type: `integer`):

Maximum public API pages to scan. The feed currently exposes up to 55 pages.

## `maxRequests` (type: `integer`):

Hard upper bound for public API requests in this run.

## `requestDelayMs` (type: `integer`):

Optional delay between sequential public API requests.

## `requestTimeoutSecs` (type: `integer`):

Maximum seconds to wait for one public API request.

## Actor input object example

```json
{
  "mode": "search",
  "query": "software engineer",
  "location": "",
  "maxItems": 3,
  "maxPages": 55,
  "maxRequests": 60,
  "requestDelayMs": 0,
  "requestTimeoutSecs": 60
}
```

# Actor output Schema

## `dataset` (type: `string`):

Dataset containing verified job records.

## `runSummary` (type: `string`):

Request counts, feed coverage, result count, and final status.

## `diagnostics` (type: `string`):

Machine-readable source or validation failures; never mixed into the dataset.

# 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 = {};

// Run the Actor and wait for it to finish
const run = await client.actor("jobsapi/unstop-jobs-search-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 = {}

# Run the Actor and wait for it to finish
run = client.actor("jobsapi/unstop-jobs-search-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 '{}' |
apify call jobsapi/unstop-jobs-search-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,jobsapi/unstop-jobs-search-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/s6ONdF9KQaj1vdgQZ/builds/8iathzyBVswhBg9Ml/openapi.json
