# Shine Jobs Scraper | Shine.com India Jobs API with Salaries (`data_daemon/shine-jobs-scraper`) Actor

$0.80 per 1,000 jobs, description included | Scrape Shine.com India jobs by keyword and city: full description, salary range, experience, skills, industry, function, posting and expiry dates. Experience and date filters, only-new mode for schedules. No login.

- **URL**: https://apify.com/data_daemon/shine-jobs-scraper.md
- **Developed by:** [Daemon Data](https://apify.com/data_daemon) (community)
- **Categories:** Jobs, Lead generation, Agents
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.56 / 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

## Shine Jobs Scraper | Shine.com India Jobs API with Salaries

**Shine Jobs Scraper** is a pay-per-result Apify Actor that returns job listings from [Shine.com](https://www.shine.com/), HT Media's job board for jobs across India, as JSON, CSV or Excel. Search by keyword and city. Each row has the **full job description** (text and HTML), the **salary range** (as shown and as numbers), experience range, skills, industry, job function, employment type, cities, posting date and expiry date. Price: **$0.80 per 1,000 jobs**, plus $0.001 per run. You need no login, cookies or browser. On 26 October 2026 Shine listed 17,500 open jobs for `python`, 23,800 jobs in Bangalore and 2,860 in Kochi.

**$0.0008 per job, description included**, plus $0.001 per run. Apify's free plan ($5 credit every month) covers about **6,000 jobs with full descriptions**. It is built for schedules. Results are read **newest first**, and with **Only new jobs since the last run** a daily run returns, and charges for, only the jobs you have not received before.

> Live check, 26 Oct 2026: `data analyst` in Bangalore and Pune with 2 years of experience, posted in the last 3 days, gave 20 jobs from the first few pages (98 others were older, elsewhere or for another experience band, and were not charged). 50 `python` jobs with descriptions take about a minute.

### Who uses Shine data, and what for

| You are | What this Actor gives you |
|---|---|
| **Job aggregators and job-alert apps** | Shine as a source with stable ids, salary, experience band, full description and de-duplication across keywords and runs. Same conventions as the IIMJobs, Hirist, Foundit, Instahyre and Apna Actors by the same publisher. |
| **Recruiters and staffing agencies** | Who is hiring accountants in Mumbai or Java developers in Pune this week, at what salary and experience. |
| **Salary and labour-market analysts** | Salary ranges by role, city, experience and industry, with dates for trend lines. |
| **B2B sales and lead generation** | Companies with many open roles in a function are buying tools and services for it. |
| **AI agents (MCP)** | Ask Claude or ChatGPT "data analyst jobs in Pune posted this week with salary" and let it call this Actor through Apify's MCP server. |

### Quick start (about a minute)

1. Click **Try for free**. The form is pre-filled with `python`.
2. Optionally add keywords (`data analyst`, `accountant`, `sales executive`), cities (`Bangalore`, `Mumbai`, `Delhi`), an experience level or **Posted within the last 7 days**.
3. Click **Start**. 50 jobs with descriptions take about a minute and cost **$0.04**.
4. Download the results as JSON, CSV or Excel. Or save the input as a task, tick **Only new jobs since the last run** and **schedule it daily**.

**From code** (returns the jobs in one call):

```bash
curl -X POST "https://api.apify.com/v2/acts/data_daemon~shine-jobs-scraper/run-sync-get-dataset-items?token=YOUR_APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"searchTerms": ["data analyst"], "cities": ["Pune"], "postedWithinDays": 7, "maxJobsPerSearch": 100}'
```

### Input

| Field | What it does |
|---|---|
| `searchTerms` | Job titles or skills, one Shine search each. Empty = all jobs (in the given cities, or in India). |
| `cities` | Shine city names (`Bangalore`, `Mumbai`, `Delhi`, `Gurgaon`, `Noida`, `Navi Mumbai` ...). Each keyword runs once per city. Jobs Shine suggests in other cities are left out. |
| `experienceYears` | Only jobs whose experience range covers this many years. |
| `postedWithinDays` | Only jobs posted in the last N days. |
| `includeDescription` | Open each job page for the description, numeric salary, industry, function, employment type and expiry (default on; same price). |
| `maxJobsPerSearch` | Cap per keyword and city (default 50, newest first). `0` = no cap. |
| `maxJobs` | Total cap for the run. |
| `onlyNewSinceLastRun`, `stateName` | Only-new mode for schedules. |
| `skipJobIds` | Job ids you already have; never fetched or charged. |

Common names from other scrapers (`keywords`, `queries`, `location`, `city`, `maxItems`, `onlyNew`, `experience` and more) are accepted as aliases.

### Output

One item per job:

```json
{
  "id": "19927000",
  "url": "https://www.shine.com/jobs/senioor-accountant/shamisha-resources-management-llp/19927000",
  "title": "Senioor Accountant",
  "company": "Shamisha Resources Management LLP Hiring For A leading Pharma company",
  "companyId": 508638,
  "locations": ["Mumbai City"],
  "experienceText": "6 to 10 Yrs",
  "experienceMinYears": 6,
  "experienceMaxYears": 10,
  "salaryText": "8 - 18 Lakh/Yr",
  "salaryMin": 800000,
  "salaryMax": 1800000,
  "salaryCurrency": "INR",
  "salaryPeriod": "yearly",
  "skills": ["accounts payable", "accounts receivable", "accountants"],
  "industry": "Pharma / Biotech",
  "functions": ["HR"],
  "employmentType": "FULL_TIME",
  "badges": ["activelyHiring", "earlyApplicant"],
  "postedAt": "2026-10-24T08:27:54.000Z",
  "validThrough": "2026-12-15T18:30:00.000Z",
  "description": "Conducting Financial Analysis: Analysing financial statements and reports ...",
  "searchTerm": "accountant",
  "searchCity": "mumbai",
  "scrapedAt": "2026-10-26T05:24:49.630Z"
}
```

You can download the dataset as JSON, CSV, Excel, XML or HTML, or read it through the Apify API.

#### Data fields

| Field | Description |
|---|---|
| `id`, `url` | Shine job id (stable) and public job page |
| `title`, `company`, `companyId`, `companyLogo` | Job and employer (consultancies show the client they hire for) |
| `locations`, `places` | Cities as listed; city / state / country from the job page |
| `experienceText`, `experienceMinYears`, `experienceMaxYears` | Experience asked for |
| `salaryText`, `salaryMin`, `salaryMax`, `salaryCurrency`, `salaryPeriod` | Salary as shown and as numbers (when the employer discloses it) |
| `skills`, `industry`, `functions`, `employmentType` | Skills, industry, job function, employment type |
| `badges`, `instantApply` | Shine badges (actively hiring, early applicant) and one-click apply |
| `postedAt`, `validThrough` | Posted and expiry dates (ISO 8601, UTC) |
| `description`, `descriptionHtml` | Full job description |
| `searchTerm`, `searchCity`, `scrapedAt` | The search that found it; when this run saved it |

The Actor does not extract recruiter names, phone numbers or e-mail fields. Descriptions are kept as the employer posted them.

### Scheduling & automation

**Recipe: new accountant and finance jobs in two cities, every morning**

```json
{
    "searchTerms": ["accountant", "financial analyst"],
    "cities": ["Mumbai", "Pune"],
    "postedWithinDays": 2,
    "maxJobsPerSearch": 0,
    "onlyNewSinceLastRun": true,
    "stateName": "finance-jobs-daily"
}
```

Save it as a task and add a daily schedule. Each later run delivers only jobs that were not delivered before, and skipped jobs are not charged. The memory is a key-value store named `shine-jobs-state` in your own Apify account. Every run writes a `RUN-SUMMARY` record with found, new, filtered, skipped and charged counts. The task's Integrations tab sends results to Google Sheets, Slack, email or a webhook.

### How much does it cost to scrape Shine?

| Event | Price | When it is charged |
|---|---|---|
| Job | $0.0008 | Each job saved to your dataset, description included |
| Actor start | $0.001 | Once per run |

That is **$0.80 per 1,000 jobs**. Jobs skipped by only-new mode, `skipJobIds`, de-duplication or your city, experience and date filters are never charged. Scale plans pay 15% less and Business plans 30% less. If Shine refuses direct requests, the Actor continues through Apify's anti-bot proxy at no extra charge per job.

| How teams use it | Volume | Cost |
|---|---|---|
| Quick look: 50 `python` jobs with descriptions | 50 jobs | $0.041 |
| 500 newest `data analyst` jobs | 500 jobs | $0.40 |
| Daily feed: 3 keywords × 2 cities, only new | about 40 new jobs a day | about $1 a month |

### Tips

- Shine's keyword search is broad. `data analyst` also matches related titles, so use `experienceYears`, cities and `postedWithinDays` to narrow it.
- Turn off `includeDescription` for a fast list (titles, companies, cities, experience, salary text, skills). It needs one request per 20 jobs instead of one per job.
- Set a **maximum cost per run** on the task. The Actor stops cleanly at the limit and says so in the status message.

### FAQ

**Is there an official Shine API?**

Not a public one. This Actor reads Shine's public search and job pages, which robots.txt allows, and exposes them as a REST API with schedules, webhooks and only-new runs.

**Why do some jobs have no salary numbers?**

The employer chose "Not Disclosed". `salaryText` then says so.

**Do I need a proxy?**

No. If Shine starts refusing direct requests, the Actor switches to Apify's anti-bot proxy by itself.

### Related Actors by Daemon Data

- [Apna Jobs Scraper](https://apify.com/data_daemon/apna-jobs-scraper) – Apna (apna.co) India jobs with salary, locality and department, full-board export
- [IIMJobs Jobs Scraper](https://apify.com/data_daemon/iimjobs-jobs-scraper) – India's MBA, finance, consulting and management jobs with full descriptions and only-new mode
- [Hirist.tech Jobs Scraper](https://apify.com/data_daemon/hirist-jobs-scraper) – India IT and tech jobs with full descriptions, same scheduling conventions
- [Foundit Jobs Scraper](https://apify.com/data_daemon/foundit-jobs-scraper) – foundit.in (Monster India) jobs with full descriptions, only-new mode for daily feeds
- [Instahyre Jobs Scraper](https://apify.com/data_daemon/instahyre-jobs-scraper) – India tech and startup jobs with company size and full descriptions
- [Unstop Scraper](https://apify.com/data_daemon/unstop-scraper) – Unstop jobs, internships, hackathons and competitions with salaries, prizes and deadlines
- [Oracle Jobs Scraper](https://apify.com/data_daemon/oracle-hcm-jobs-scraper) – every job on any Oracle Recruiting Cloud (Oracle HCM) career site

### Support

Found a bug or need another field or filter? Open an issue on the Issues tab; issues are usually answered within a day. Custom variants of this Actor are available on request.

A quick review on the Actor page helps other users find it.

### Disclaimer

This Actor collects publicly available job listings for informational purposes and does not extract recruiters' contact fields. Respect the source website's terms of use and applicable data-protection laws when using the data.

# Actor input Schema

## `searchTerms` (type: `array`):

Job titles or skills, one Shine search each, e.g. `python`, `data analyst`, `accountant`, `sales executive`, `java developer`, `nurse`. Leave empty to list all jobs (in the given cities, or in India). A job found by two searches is saved and charged once.

## `cities` (type: `array`):

Cities as Shine names them, e.g. `Bangalore`, `Mumbai`, `Delhi`, `Gurgaon`, `Noida`, `Hyderabad`, `Pune`, `Chennai`, `Kolkata`, `Ahmedabad`, `Navi Mumbai`. Each keyword runs once per city. Shine also suggests jobs in nearby cities; the Actor keeps only jobs located in the city you asked for.

## `experienceYears` (type: `integer`):

Only jobs whose experience range covers this many years, e.g. 2 keeps "1 to 3 Yrs" and "0 to 4 Yrs" but not "5 to 8 Yrs".

## `postedWithinDays` (type: `integer`):

Only jobs posted in the last N days (e.g. 1 for a daily feed). Results are read newest first, so the search stops at the first page of older jobs. 0 or empty = any date.

## `includeDescription` (type: `boolean`):

Open each job page for the full description (text + HTML), numeric salary range, industry, function, employment type and expiry date. Turn off for a fast list of titles, companies, cities, experience, salary text and skills. Price is the same either way.

## `maxJobsPerSearch` (type: `integer`):

Cap for each keyword (and city). Newest jobs come first. 0 = no cap (a popular keyword can have tens of thousands of jobs; set a maximum cost per run).

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

Stop after this many saved jobs. 0 or empty = no total cap (the run's maximum cost still applies).

## `onlyNewSinceLastRun` (type: `boolean`):

For schedules: remember delivered job ids (in a named key-value store in your account) and save only jobs that earlier runs with the same settings did not deliver. Skipped jobs are not charged.

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

Name of the only-new memory. Empty = derived from the keywords, cities and experience. Give two schedules the same name to share one memory.

## `skipJobIds` (type: `array`):

Shine job ids you already have (the `id` field). They are neither fetched, saved nor charged.

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

Usually not needed. If shine.com refuses direct requests and no proxy is set here, the Actor switches to Apify's anti-bot proxy by itself and says so in the status message.

## Actor input object example

```json
{
  "searchTerms": [
    "python"
  ],
  "cities": [],
  "includeDescription": true,
  "maxJobsPerSearch": 50,
  "onlyNewSinceLastRun": false,
  "skipJobIds": [],
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

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

Shine jobs as JSON items in the default dataset (also downloadable as CSV, Excel, XML).

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

RUN-SUMMARY record: keywords, cities, jobs found, new, filtered, skipped (already delivered / skipJobIds) and charged counts.

# 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 = {
    "searchTerms": [
        "python"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("data_daemon/shine-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 = { "searchTerms": ["python"] }

# Run the Actor and wait for it to finish
run = client.actor("data_daemon/shine-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 '{
  "searchTerms": [
    "python"
  ]
}' |
apify call data_daemon/shine-jobs-scraper --silent --output-dataset

```

## MCP server setup

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