# Shine.com Jobs Scraper - India Jobs, Salaries & Descriptions (`steadyscrape/shine-jobs-scraper`) Actor

Scrape job listings from Shine.com, one of India's largest job sites: title, company, cities, salary, experience, skills, posted date and full description. Search by keyword and city, filter by experience, salary and job type, or paste Shine links. Monitor mode. Export to CSV, JSON or API.

- **URL**: https://apify.com/steadyscrape/shine-jobs-scraper.md
- **Developed by:** [Steady Scrape](https://apify.com/steadyscrape) (community)
- **Categories:** Jobs, Lead generation, Automation
- **Stats:** 4 total users, 3 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.50 / 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.

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.com Jobs Scraper — India jobs with salaries, skills and full descriptions

Scrape job listings from **Shine.com**, one of India's largest job sites (over 2 lakh live jobs). Search by
**keyword** and **city**, filter by **experience**, **salary**, **employment type** and **top companies**, or paste any
Shine search link with the filters you set on the site. Every job comes with its **title**, **company**, **cities**,
**salary band**, **experience band**, **skills**, **posted date** and **link**. Turn on the job page (on by default)
to also get the **full description**, every skill, **industry**, **department**, **employment type** (regular,
contractual, internship, work from home), **full time / part time**, **number of vacancies**, **expiry date**, the
**salary range in rupees** and the **company profile** (description, website, size, founding year, headquarters,
social links).

No login, no API key, no browser to configure. Shine lets you page through every job of a search, so a run returns
everything a search holds, up to the maximum you set.

### What you can use it for

- **Job market research in India**: which skills, salaries and experience levels employers ask for, city by city.
- **Recruitment and staffing leads**: companies hiring for a role right now, with their profile and website.
- **Job boards and alerts**: run on a schedule with **monitor mode** to receive only the jobs posted since the last run.
- **Salary benchmarking**: salary bands and rupee ranges by title, city and experience.
- **Training data and analytics**: thousands of structured job descriptions with skills attached.

### Input

| Field | What it does |
|---|---|
| **Job titles or keywords** | What you would type in Shine's search box: `python developer`, `data analyst`, `c#`. Each keyword is searched in each city. |
| **Cities** | `Bangalore`, `Pune`, `Gurgaon`, `All India`… Common spellings (`Bengaluru`, `Gurugram`, `New Delhi`) are understood. Empty = all of India. |
| **Shine search links** | Any link copied from shine.com after a search, with every filter it carries (department, industry, company…). Read from its first page. |
| **Experience** / **Salary** / **Employment type** | Shine's own filters. Ticking several keeps jobs matching any of them. |
| **Top companies only** | Shine's "Top companies" switch. |
| **Sort by** | Relevance or most recent. |
| **Posted within the last N days** | Keeps only recent jobs, reading newest first and stopping at the first older one. |
| **Include the full job page** | One extra page per job for the description, company profile and the rest (priced as a detailed job). |
| **Max jobs per search** | Stops each search after this many new jobs (default 100; 0 = every page). |
| **Only new jobs (monitor)** | Skips, for free, every job this Actor already delivered to you in an earlier run. |

```json
{
    "keywords": ["python developer", "data analyst"],
    "locations": ["Bangalore", "Pune"],
    "experience": ["3to5"],
    "postedWithinDays": 7,
    "includeDetails": true,
    "maxJobsPerSearch": 200
}
```

### Output

One row per job. Example (with the job page, shortened):

```json
{
    "status": "ok",
    "search": "python developer in Bangalore",
    "position": 1,
    "jobId": "19829780",
    "title": "Python Developer",
    "companyName": "Right Move Staffing Solutions Private Limited",
    "url": "https://www.shine.com/jobs/python-developer/right-move-staffing-solutions-private-limited/19829780",
    "locations": ["Bangalore"],
    "experience": "4 to 6 Yrs",
    "salary": "10 - 30 Lakh/Yr",
    "skills": ["python", "azure", "aws", "html", "css", "api", "rest api", "fast api", "react"],
    "postedAt": "2026-10-16T09:45:58.000Z",
    "badges": ["activelyHiring", "earlyApplicant"],
    "instantApply": true,
    "logoUrl": null,
    "scrapedAt": "2026-10-18T02:21:33.189Z",
    "details": {
        "description": "We are seeking a skilled Python Developer to join our dynamic team in Karnataka…",
        "descriptionHtml": "<p>We are seeking a skilled Python Developer…</p>",
        "skills": ["python", "azure", "aws", "html", "css", "api", "rest api", "react", "fast api"],
        "industry": "Accounting & Auditing",
        "departments": ["Finance / Accounts / Tax"],
        "employmentType": "Regular",
        "jobType": "Full Time",
        "vacancies": null,
        "expiresAt": "2026-10-31T09:45:56.000Z",
        "postedBy": null,
        "salaryMinInr": 1000000,
        "salaryMaxInr": 3000000,
        "locationStates": [{ "city": "Bangalore", "state": "Karnataka" }],
        "isTopCompany": false,
        "company": { "description": "…", "website": null, "size": null, "foundedYear": null, "headquarters": null, "socialLinks": {} }
    }
}
```

| Field | Meaning |
|---|---|
| `search` | The keyword, keyword and city, or link the row came from. |
| `position` | Place in Shine's results for that search, from 1. |
| `salary` / `experience` | Shine's bands as printed ("Not Disclosed" when the employer hides the salary). |
| `postedAt` / `details.expiresAt` | ISO 8601 UTC (Shine shows India time). |
| `badges` | Shine's labels such as "Actively Hiring" (`activelyHiring`) and "Be an early applicant" (`earlyApplicant`). |
| `details` | `null` without the job page, or when that page could not be read (the row is then charged as a plain job). |
| `details.salaryMinInr` / `salaryMaxInr` | Yearly rupees as Shine stores them; `null` when Shine shows the salary as not disclosed. A band "below Rs 50,000" is stored with a minimum of 1. |
| `details.company` | `null` when Shine has no company profile for the job. |

A search or link that gives no job produces one **free** row with `status` and `reason`: `no_results`,
`location_not_found` (a city Shine's location filter does not list), `invalid` (a link that is not a Shine search),
`blocked` (Shine refused to answer) or `unreadable`. The run's `SUMMARY` record lists every search with Shine's total,
pages read, jobs delivered, duplicates and jobs skipped by the monitor.

### Pricing

Pay per result, nothing per run:

- **US$0.0015 per job** as the results page shows it (US$1.50 per 1,000).
- **US$0.0025 per job with its full page** (US$2.50 per 1,000).

A job found by several of your searches is charged once. Free rows, duplicates and jobs skipped by monitor mode are
never charged. Set a maximum cost per run in Apify and the Actor stops before reading pages it cannot charge for.

### Limits and notes

- Shine's own location filter is used, so a city must be one Shine lists (its location filter names the places
  where it has jobs). A city it does not list gets a free `location_not_found` row instead of unrelated jobs.
- Some descriptions are cut by Shine itself at about 2,000 characters; they arrive as Shine publishes them.
- Recruiters' e-mail addresses and phone numbers are not collected.
- The Actor reads at about one and a half pages a second, so 1,000 jobs with their pages take about 13 minutes (without them, about a minute).
- If Shine refuses requests, the run stops asking and returns what it has; nothing undelivered is charged.

### Is it legal?

This Actor reads only public job listings that Shine shows to any visitor without an account: no login, no personal
data beyond what employers publish with their jobs (recruiter contact details are left out), and it honours Shine's
robots.txt rules for the pages it reads. Check that your use of the data complies with Shine's terms and the laws that
apply to you (such as India's DPDP Act or the GDPR) before using it commercially.

# Actor input Schema

## `keywords` (type: `array`):

One per line, as you would type them in Shine's search box: <code>python developer</code>, <code>data analyst</code>, <code>c#</code>. Each keyword is searched in each location below. Leave empty to list every job in the locations.

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

One per line: <code>Bangalore</code>, <code>Pune</code>, <code>Gurgaon</code>, <code>All India</code>. Common spellings such as <code>Bengaluru</code>, <code>Gurugram</code> or <code>New Delhi</code> are understood. A city Shine does not list gives a free row explaining why. Leave empty to search all of India.

## `searchUrls` (type: `array`):

Links copied from shine.com after searching and setting any filters (department, industry, company…), e.g. <code>https://www.shine.com/job-search/python-jobs?location=243\&fexp=3</code>. Each is read from its first page with its own filters; the filters below do not apply to links.

## `experience` (type: `array`):

Shine's experience filter. Ticking several keeps jobs matching any of them.

## `salary` (type: `array`):

Shine's salary filter, in lakh rupees a year. Ticking several keeps jobs matching any of them.

## `employmentTypes` (type: `array`):

Shine's employment filter.

## `topCompaniesOnly` (type: `boolean`):

Shine's "Top companies" switch.

## `sortBy` (type: `string`):

Shine's own order. <b>Most recent</b> together with a maximum gives you the newest jobs of each search.

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

Keeps only jobs posted in the last N days, reading each search newest first and stopping at the first older job. 0 keeps every job.

## `includeDetails` (type: `boolean`):

Opens each job's own page for its full description, every skill, industry, department, employment type, vacancies, expiry date, salary figures in rupees and the company profile. Priced as a detailed job (see Pricing).

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

Stops each search after this many new jobs. 0 reads every page Shine shows.

## `onlyNewJobs` (type: `boolean`):

Turns a scheduled run into a job alert: a job this Actor already delivered to you in an earlier run is skipped and not charged. The first run delivers everything and is the baseline.

## Actor input object example

```json
{
  "keywords": [
    "python developer"
  ],
  "locations": [
    "Bangalore"
  ],
  "topCompaniesOnly": false,
  "sortBy": "relevance",
  "postedWithinDays": 0,
  "includeDetails": true,
  "maxJobsPerSearch": 20,
  "onlyNewJobs": false
}
```

# Actor output Schema

## `jobs` (type: `string`):

No description

## `summary` (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": [
        "python developer"
    ],
    "locations": [
        "Bangalore"
    ],
    "maxJobsPerSearch": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("steadyscrape/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 = {
    "keywords": ["python developer"],
    "locations": ["Bangalore"],
    "maxJobsPerSearch": 20,
}

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

```

## MCP server setup

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