# Shine.com Jobs Scraper (India) (`codingfrontend/shine-com-jobs-scraper`) Actor

Scrape job listings from Shine.com — India's leading job portal. Extract job titles, companies, salaries, locations, skills, experience requirements, and descriptions. Supports keyword search with pagination.

- **URL**: https://apify.com/codingfrontend/shine-com-jobs-scraper.md
- **Developed by:** [Coding Frontned](https://apify.com/codingfrontend) (community)
- **Categories:** Jobs, Automation, Developer tools
- **Features:** Limited permissions
- **Stats:** 52 total users, 0 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.99 / 1,000 results

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?

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

### What does Shine.com Jobs Scraper do?

**Shine.com Jobs Scraper** extracts public job listings from [Shine.com](https://www.shine.com/job-search/). It reads the site's public search payload, including job identity, employer, location, experience, skills, salary text, description, dates, and pagination metadata. It does not log in, submit applications, solve CAPTCHA/security challenges, or use private APIs.

### Why use Shine.com Jobs Scraper?

Use it for India-focused recruiting research, skills discovery, salary benchmarking, and scheduled monitoring of public listings. The Actor follows the keyword-derived Shine route, supports bounded pagination, deduplicates by stable job ID by default, and keeps a global `maxJobs` limit across pages. Apify adds run history, scheduling, API access, dataset exports, and integrations. `proxyConfiguration` is optional ordinary transport configuration; it is not a fingerprint or CAPTCHA bypass.

### What data can Shine.com Jobs Scraper extract?

| Field | Type | Description |
| --- | --- | --- |
| `jobId`, `jobTitle`, `company`, `location` | string | Listing identity and public location. |
| `salaryRange`, `experience`, `industry`, `skills` | string/array | Public compensation, experience, industry, and skill evidence. |
| `jobDescription`, `education`, `vacancies` | string/number | Cleaned description and source-backed requirements/count. |
| `workMode`, `jobType`, `employmentType` | string | Work and employment labels when present. |
| `jobUrl`, `applyUrl` | URL | Canonical public listing and optional application link. |
| `postedDate`, `expiresDate` | ISO date | Source dates when parseable. |
| `searchKeywords`, `searchUrl`, `pageNumber`, `scrapedAt` | string/number/date | Request provenance. |

Optional source fields are omitted when the public payload does not provide reliable values.

### How to scrape Shine.com

1. Open the Actor's **Input** tab and enter a keyword phrase.
2. Choose the global item and page limits; optionally set a starting page, deduplication, delay, retry, or proxy option.
3. For repeatable parser QA, provide `fixtureFile` or `fixtureHtml` instead of using a live request.
4. Click **Start**, then inspect the dataset, run log, and `OUTPUT` key-value record. Use Apify's API or scheduler for recurring collection.

### How much will it cost to scrape Shine.com?

Cost varies with pages, response size, retries, request delay, proxy transport, and browser/platform overhead. There is no fixed price or throughput guarantee. `maxJobs` is global; `maxPages` limits pages for the run, and a blocked or malformed response can spend retries without creating normal rows. Fixture mode still performs local parsing work but makes no live request.

### Input

See the input tab for the complete configuration. The runtime validator rejects values outside the documented bounds.

- `keywords`, `searchQuery`, `query`: keyword aliases; precedence is `keywords`, then `searchQuery`, then `query`. Required after normalization, 1–100 characters.
- `maxJobs`, `maxItems`, `maxProducts`: global item-limit aliases; `maxJobs` wins, 1–200, default 20.
- `maxPages`: 1–10 pages, default is the smaller of 10 and the pages needed for the item limit.
- `startPage`: first Shine page, 1–1000, default 1.
- `deduplicate`: boolean, default `true`; IDs are the deduplication key.
- `requestDelayMs`: 0–5000 milliseconds, default 0.
- `maxRequestRetries`: 0–3, default 2.
- `requestTimeoutSecs`: 15–180 seconds, default 60.
- `proxyConfiguration`: optional object passed to Apify Proxy for live requests; not used in fixture mode.
- `includeDiagnostics`: boolean, default `false`. When true, failed, blocked, or empty runs can emit minimal diagnostic rows.
- `fixtureFile`: relative HTML path inside the Actor directory; mutually exclusive with `fixtureHtml`.
- `fixtureHtml`: inline HTML, 1–2,000,000 characters; mutually exclusive with `fixtureFile`.

The Actor requests pages in order and follows the public `next`/`num_pages` signal while both limits allow. It does not accept start URLs; generated keyword routes are the source of truth.

### Output

You can download the dataset in various formats such as JSON, HTML, CSV, or Excel.

Normal record:

```json
{
  "jobId": "19333543",
  "jobTitle": "Software Engineer",
  "company": "Example Technologies Pvt. Ltd.",
  "location": "Bangalore",
  "experience": "5 to 10 Yrs",
  "skills": ["docker", "python"],
  "jobDescription": "Public job description text.",
  "jobUrl": "https://www.shine.com/job-search/software-engineer/example-technologies/19333543/",
  "source": "Shine.com",
  "sourceDomain": "shine.com",
  "searchKeywords": "software engineer",
  "searchUrl": "https://www.shine.com/job-search/software-engineer-jobs/",
  "pageNumber": 1,
  "scrapedAt": "2026-09-09T13:30:00.000Z"
}
```

Diagnostic record when `includeDiagnostics` is true:

```json
{
  "url": "https://www.shine.com/job-search/software-engineer-jobs/",
  "error": "Shine returned an access challenge.",
  "errorCode": "ACCESS_BLOCKED",
  "scrapedAt": "2026-09-09T13:30:00.000Z"
}
```

The `OUTPUT` key-value record contains status, item counts, unique count, failures, pages processed, elapsed seconds, keywords, and `finishedAt`. Operational fields are not mixed into dataset rows.

### Tips and advanced options

Begin with one page and a small limit. Set `deduplicate: false` only when repeated source rows are useful. Increase delay before increasing retries, and use `includeDiagnostics` during troubleshooting. Treat a changed or missing `__NEXT_DATA__` payload as a source/parser issue rather than accepting guessed records. The checked-in fixture is synthetic parser QA, not a guarantee of current live availability.

### FAQ, support, and responsible use

**Why is the dataset empty?** Shine may return an access challenge, an empty page, or a changed structured-data shape. Enable diagnostics and review the run log.

**Is this Actor affiliated with Shine.com?** No. Follow Shine's terms, robots guidance, rate limits, privacy rules, and applicable employment-data law. Our Actors do not extract private user data such as email addresses, gender, or private location; they extract only information made public by the source. Public job listings can still contain personal data, so use a lawful purpose and consult qualified legal counsel when unsure.

For bugs or feature requests, use the Actor's **Issues** tab with a run ID and concise reproduction summary. The **API** tab and run history are useful for automation and monitoring.

### Local validation

```bash
npm install
npm test
npm run lint
npm run validate -- <dataset-json-file-or-directory>
npm run check
apify validate-schema
apify run --purge --input-file <input-json-file>
```

The checked-in `test/inputs/` matrix covers default, aliases/filters, pagination, diagnostics/developer controls, and fixture QA cases.

# Actor input Schema

## `keywords` (type: `string`):

Job title or keywords, maximum 100 characters.

## `searchQuery` (type: `string`):

Compatibility alias for keywords.

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

Compatibility alias for keywords.

## `maxJobs` (type: `integer`):

Global maximum unique jobs to save.

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

Compatibility alias for maxJobs.

## `maxProducts` (type: `integer`):

Compatibility alias for maxJobs retained for generic callers.

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

Maximum search pages to request, 1–10.

## `startPage` (type: `integer`):

Shine page number from which bounded pagination begins.

## `deduplicate` (type: `boolean`):

Deduplicate by Shine job ID across pages; default true.

## `includeDiagnostics` (type: `boolean`):

Emit minimal diagnostics for blocked, failed, or empty runs instead of failing without rows.

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

Delay before each request, 0–5000 ms.

## `maxRequestRetries` (type: `integer`):

Bounded retries per request, 0–3.

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

Bounded request-handler timeout.

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

Standard Apify Proxy settings for reliable request routing.

## `fixtureFile` (type: `string`):

Explicit local QA HTML path relative to the Actor directory; never a live fallback.

## `fixtureHtml` (type: `string`):

Explicit local QA HTML payload, mutually exclusive with fixtureFile.

## Actor input object example

```json
{
  "keywords": "software engineer",
  "maxJobs": 20,
  "maxPages": 1,
  "startPage": 1,
  "deduplicate": true,
  "includeDiagnostics": false,
  "requestDelayMs": 0,
  "maxRequestRetries": 2,
  "requestTimeoutSecs": 60,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "IN"
  }
}
```

# Actor output Schema

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

No description

## `output` (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 = {
    "keywords": "software engineer",
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ],
        "apifyProxyCountry": "IN"
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("codingfrontend/shine-com-jobs-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 = {
    "keywords": "software engineer",
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
        "apifyProxyCountry": "IN",
    },
}

# Run the Actor and wait for it to finish
run = client.actor("codingfrontend/shine-com-jobs-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 '{
  "keywords": "software engineer",
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "IN"
  }
}' |
apify call codingfrontend/shine-com-jobs-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,codingfrontend/shine-com-jobs-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/nkFTTcWfTpWK1mj9f/builds/jeAgqYNaikvLTxZPf/openapi.json
