# Shine.com Jobs Scraper (`bovi/shine-scraper`) Actor

Collect public Shine.com job listings by keyword and city, including company, location, salary, experience, skills, posting date and optional job descriptions.

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

## Pricing

from $1.60 / 1,000 shine.com jobs scrapers

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

This Actor collects public job listings from Shine.com in India. It reads the server-rendered job search results and can open each listing's public detail page to add its description, industry, employment type and expiry date. No Shine login is used. Each job is written once by its Shine job ID, and `maxResults` caps the total number of records across all searches.

### Input

| Field | Type | Default | Description |
| --- | --- | --- | --- |
| `keywords` | string list | `jobs in all india` | Search phrase, job title or skill. This prefill returns Shine's public all-India jobs feed. |
| `locations` | string list | empty | Optional Indian cities. Empty searches all India. |
| `searchUrls` | string list | empty | Optional HTTPS Shine `/job-search/` URLs. When supplied, these replace keyword searches. |
| `maxResults` | integer | `50` | Maximum unique job records for the whole run. |
| `includeDescription` | boolean | `true` | Read public job detail pages for description and additional fields. |
| `proxyConfiguration` | object | `{"useApifyProxy": false}` | Optional Apify proxy settings. No proxy is used when disabled or omitted. |

Example input:

```json
{
  "keywords": ["python developer"],
  "locations": [],
  "maxResults": 10,
  "includeDescription": true,
  "proxyConfiguration": {"useApifyProxy": false}
}
```

### Example output

This excerpt is from a public Shine listing and its public detail page. Optional fields appear only when the source provides them.

```json
{
  "jobId": "19835485",
  "title": "Python Developer",
  "company": "INTELLICS GLOBAL SERVICES PRIVATE LIMITED",
  "companyId": 780947,
  "url": "https://www.shine.com/jobs/python-developer/intellics-global-services-private-limited/19835485",
  "locations": ["Chennai"],
  "location": "Chennai",
  "salaryText": "Not Disclosed",
  "experienceText": "3 to 5 Yrs",
  "experienceMinYears": 3,
  "experienceMaxYears": 5,
  "skills": ["python"],
  "postedAt": "2026-10-16T15:38:14Z",
  "expiresAt": "2026-10-31T15:38:12Z",
  "employmentType": "FULL_TIME",
  "industry": "IT Services & Consulting",
  "searchKeyword": "python developer",
  "sourcePage": "https://www.shine.com/job-search/python-developer-jobs"
}
```

`salaryMinLakh` and `salaryMaxLakh` are included only when Shine displays a salary with a recognizable rupee, lakh or crore unit. Hidden or undisclosed amounts are not inferred. Posting and expiry timestamps are normalized to UTC. Job descriptions are plain text; email addresses and Indian phone numbers are replaced with `[contact removed]`.

### Price per result

The reference Shine champion lists **$0.002 per job result** at its FREE tier, with lower prices on higher tiers. This source code does not configure platform pricing; the price shown on the published Actor page controls the actual charge. No `Actor.charge` call is made.

# Actor input Schema

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

Search phrase, job title or skill. Use 'jobs in all india' for Shine's public all-India feed. Each keyword can be combined with every city below.

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

Optional Shine search cities such as Bangalore, Mumbai, Delhi, Hyderabad, Pune or Chennai. Empty means all India.

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

Optional public Shine job-search URLs. Only HTTPS shine.com job-search pages are accepted; query strings are not used.

## `maxResults` (type: `integer`):

Maximum total number of unique job listings written across all searches.

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

Fetch each job's public detail page to add its description, industry, employment type and expiry date.

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

Optional proxy settings. Disable the Apify Proxy to connect directly.

## Actor input object example

```json
{
  "keywords": [
    "jobs in all india"
  ],
  "locations": [],
  "searchUrls": [],
  "maxResults": 50,
  "includeDescription": true,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# Actor output Schema

## `results` (type: `string`):

Dataset with the scraped records.

# 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": [
        "jobs in all india"
    ],
    "locations": [],
    "searchUrls": [],
    "maxResults": 50,
    "includeDescription": true,
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ]
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("bovi/shine-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": ["jobs in all india"],
    "locations": [],
    "searchUrls": [],
    "maxResults": 50,
    "includeDescription": True,
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
    },
}

# Run the Actor and wait for it to finish
run = client.actor("bovi/shine-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": [
    "jobs in all india"
  ],
  "locations": [],
  "searchUrls": [],
  "maxResults": 50,
  "includeDescription": true,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}' |
apify call bovi/shine-scraper --silent --output-dataset

```

## MCP server setup

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