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

Scrape job listings from Shine.com — India's top job portal. Keyword + location search, salary (INR), full description, no proxy needed. $0.99/1,000 results.

- **URL**: https://apify.com/unfenced-group/shine-scraper.md
- **Developed by:** [Unfenced Group](https://apify.com/unfenced-group) (community)
- **Categories:** Jobs, Automation, Developer tools
- **Stats:** 57 total users, 8 monthly users, 80.4% runs succeeded, 1 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.99 / 1,000 results

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?

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

## Shine.com Jobs Scraper

![Shine.com Jobs Scraper](https://api.apify.com/v2/key-value-stores/ClElVyZWvQgPQIuDL/records/shine-scraper)

Scrape job listings from [Shine.com](https://www.shine.com) — India's leading job portal with over 40 million registered job seekers and 500,000+ active listings. Extract structured data including job title, company, salary, location, experience level, and full job description. No API key required.

***

### Why this scraper?

#### 🔍 Keyword + Location Search

Search by any job title, skill, or keyword and optionally narrow results to a specific Indian city or region — Bangalore, Mumbai, Delhi, Pune, Hyderabad, Chennai, and more.

#### 💰 Salary Data Included

Shine.com publishes salary ranges for many listings. The scraper returns both the raw salary string and parsed numeric min/max values (in INR) and period (monthly/annual).

#### 📋 Full Job Descriptions

Every listing includes the complete HTML job description, plain text version, and Markdown-formatted version — ready for NLP pipelines, LLM fine-tuning, or structured analysis.

#### 📅 Freshness Filtering

Use the `daysOld` parameter to limit results to jobs posted within the last N days — ideal for daily monitoring feeds.

#### ♻️ Cross-Run Deduplication

The `skipReposts` option tracks jobs already seen across previous runs (90-day TTL) and skips them — eliminating duplicate processing costs.

#### 🔗 Custom Start URLs

Supply your own Shine.com job-search URLs directly to scrape any combination of keyword and location.

***

### Input parameters

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `searchQuery` | string | `""` | Keyword(s) to search for, e.g. `Python developer`, `marketing manager`. Leave empty to browse all jobs. |
| `location` | string | `""` | City or region filter, e.g. `Bangalore`, `Mumbai`, `Pune`. Leave empty for all locations. |
| `maxResults` | integer | `100` | Maximum number of listings to return. |
| `daysOld` | integer | `0` | Only return jobs posted within this many days. `0` = no age filter. |
| `skipReposts` | boolean | `false` | Skip listings already seen in previous runs. |
| `requestDelayMs` | integer | `1000` | Minimum delay between requests in milliseconds. |
| `respectRobotsTxt` | boolean | `true` | Check robots.txt crawl-delay on startup. |
| `startUrls` | array | `[]` | Specific Shine.com job-search URLs to scrape. When provided, `searchQuery` and `location` are ignored. |

***

### Output schema

#### Always present

| Field | Type | Description |
|-------|------|-------------|
| `id` | string | Unique Shine.com job ID |
| `url` | string | Direct link to the job listing on Shine.com |
| `title` | string | Job title |
| `company` | string | null | Employer name |
| `companyId` | string | null | Shine.com internal company identifier |
| `locations` | array | All listed cities/regions (can be multiple) |
| `city` | string | null | Primary location (first in `locations` array) |
| `experience` | string | null | Required experience range, e.g. `3 to 7 Yrs` |
| `industry` | string | null | Industry sector |
| `keywords` | array | Skills/keywords listed by the employer |
| `vacancies` | integer | null | Number of open positions |
| `employmentType` | string | null | `Regular`, `Contractual`, `Internship`, or `Work from Home` |
| `jobType` | string | null | `Full-time` or `Part-time` |
| `contractType` | string | null | `Permanent` or `Walkin` |
| `workMode` | string | null | `On-site`, `Hybrid`, or `Remote` |
| `isTopCompany` | boolean | Whether the posting is from a top-ranked company on Shine.com |
| `isEarlyApplicant` | boolean | Whether applying now qualifies as an early applicant |
| `applicantCount` | integer | null | Number of applicants, when disclosed by the platform |
| `expiryDate` | string | null | Listing expiry date (`YYYY-MM-DD`) |
| `salaryRaw` | string | null | Raw salary string as published, e.g. `Rs 14 - 26 Lakh/Yr` |
| `salaryMin` | number | null | Parsed minimum salary in INR |
| `salaryMax` | number | null | Parsed maximum salary in INR |
| `salaryCurrency` | string | null | Currency code, always `INR` when present |
| `salaryPeriod` | string | null | `YEAR` or `MONTH` |
| `descriptionHtml` | string | null | Full job description as HTML |
| `descriptionText` | string | null | Plain-text version of the job description |
| `descriptionMarkdown` | string | null | Markdown-formatted job description |
| `publishDate` | string | null | Posting date (`YYYY-MM-DD`) |
| `publishDateISO` | string | null | Posting date in ISO 8601 format |
| `scrapedAt` | string | Timestamp when this record was scraped |
| `source` | string | Always `shine.com` |
| `contentHash` | string | MD5 fingerprint of the job ID for deduplication |
| `isRepost` | boolean | `true` if this job was seen in a previous run |
| `originalPublishDate` | string | null | Date from the first time this job was seen (if `isRepost`) |
| `originalUrl` | string | null | URL from the first time this job was seen (if `isRepost`) |

> **Privacy note:** Recruiter emails, phone numbers, and company logo URLs are explicitly excluded from all output.

***

#### Example record

```json
{
  "id": "19140424",
  "url": "https://www.shine.com/jobs/mega-hiring-drive-international-voice-process/waterleaf-consultants-p-ltd/19140424",
  "title": "Mega Hiring Drive | International Voice Process",
  "company": "WATERLEAF CONSULTANTS (P) LTD.",
  "companyId": "500656",
  "locations": [
    "Hyderabad"
  ],
  "city": "Hyderabad",
  "experience": "0 Yrs",
  "industry": "BPO / Call Center",
  "keywords": [
    "international voice process",
    "excellent communication",
    "fresher",
    "st"
  ],
  "vacancies": 10,
  "employmentType": "Regular",
  "jobType": "Full-time",
  "contractType": "Permanent",
  "workMode": "On-site",
  "isTopCompany": false,
  "isEarlyApplicant": true,
  "applicantCount": null,
  "expiryDate": "2026-08-22",
  "salaryRaw": null,
  "salaryMin": null,
  "salaryMax": null,
  "salaryCurrency": null,
  "salaryPeriod": null,
  "descriptionHtml": "<p>Now Hiring International Voice Process <strong>(Contract-Based Opportunity)</strong></p>\r\n<p><strong>Eligibility:</st …",
  "descriptionText": "Now Hiring International Voice Process (Contract-Based Opportunity) Eligibility: Any Graduate / Any Post Graduate Pass-o …",
  "descriptionMarkdown": "Now Hiring International Voice Process **(Contract-Based Opportunity)**\n\n**Eligibility:**  \nAny Graduate / Any Post Grad …",
  "publishDate": "2026-06-23",
  "publishDateISO": "2026-06-23T20:26:56.000Z",
  "scrapedAt": "2026-06-24T16:54:32.579Z",
  "source": "shine.com",
  "contentHash": "10e7a9da2f9f6861",
  "isRepost": false,
  "originalPublishDate": null,
  "originalUrl": null
}
```

### Sample output

```json
{
  "id": "19049753",
  "url": "https://www.shine.com/job/c-net-wpf-developer/evoke-hr-solutions-pvt-ltd/19049753",
  "title": "C .NET WPF Developer",
  "company": "Evoke HR Solutions Pvt. Ltd.",
  "companyId": "772469",
  "locations": ["Bangalore"],
  "city": "Bangalore",
  "experience": "3 to 7 Yrs",
  "industry": "IT Services & Consulting",
  "keywords": [".net", "mvc", "wpf", "c#", "wpf developer"],
  "vacancies": 4,
  "employmentType": "Regular",
  "jobType": "Full-time",
  "contractType": "Permanent",
  "workMode": "On-site",
  "isTopCompany": false,
  "isEarlyApplicant": false,
  "applicantCount": null,
  "expiryDate": "2026-07-03",
  "salaryRaw": null,
  "salaryMin": null,
  "salaryMax": null,
  "salaryCurrency": null,
  "salaryPeriod": null,
  "descriptionHtml": "<p><strong>Job Summary</strong></p>...",
  "descriptionText": "Job Summary We are looking for a skilled C# .NET Developer...",
  "descriptionMarkdown": "**Job Summary**\n\nWe are looking for a skilled...",
  "publishDate": "2026-05-05",
  "publishDateISO": "2026-05-05T07:41:22.000Z",
  "scrapedAt": "2026-05-06T12:00:00.000Z",
  "source": "shine.com",
  "contentHash": "a3f8c1d2e9b47056",
  "isRepost": false,
  "originalPublishDate": null,
  "originalUrl": null
}
```

***

### Examples

#### 1. Search Python developer jobs in Bangalore

```json
{
  "searchQuery": "Python developer",
  "location": "Bangalore",
  "maxResults": 200
}
```

#### 2. All finance jobs posted in the last 7 days (nationwide)

```json
{
  "searchQuery": "finance",
  "daysOld": 7,
  "maxResults": 500
}
```

#### 3. Custom start URLs — scrape specific search pages

```json
{
  "startUrls": [
    { "url": "https://www.shine.com/job-search/data-engineer-jobs-in-pune" },
    { "url": "https://www.shine.com/job-search/machine-learning-jobs-in-bangalore" }
  ],
  "maxResults": 1000
}
```

#### 4. Daily feed — fresh jobs only, skip reposts

```json
{
  "searchQuery": "software engineer",
  "location": "Mumbai",
  "daysOld": 1,
  "skipReposts": true,
  "maxResults": 500
}
```

#### 5. Work from home jobs

```json
{
  "searchQuery": "work from home",
  "maxResults": 300
}
```

***

### 💰 Pricing

**$0.99 per 1,000 results** — you only pay for successfully retrieved listings.
Failed retries and filtered reposts are never charged.

| Results | Cost |
|---------|------|
| 100 | ~$0.1 |
| 1,000 | ~$0.99 |
| 10,000 | ~$9.9 |
| 100,000 | ~$99 |

> Flat-rate alternatives typically charge $29–$49/month regardless of usage.

Use the **Max results** cap in the input to control your spend exactly.

***

### Performance

| Run size | Approx. time |
|----------|-------------|
| 100 jobs | ~25 seconds |
| 1,000 jobs | ~4 minutes |
| 10,000 jobs | ~40 minutes |

Performance depends on Shine.com server response times. No proxy required — datacenter IPs are accepted by the platform.

***

### Known limitations

- Shine.com is India-focused. Listings are predominantly for the Indian market.
- Salary data is only available for listings where the employer has disclosed it.
- Individual recruiter contact details (email, phone) are excluded from output per privacy policy.
- The `daysOld` filter uses the job's posting timestamp and may include pinned/featured jobs with refreshed dates.
- `workMode` reflects the platform's own classification (`jWM` field); the majority of listings are `On-site`. Use `employmentType: "Work from Home"` to filter remote roles.

***

### Technical details

- **Source:** shine.com — India's leading job portal (40M+ registered job seekers)
- **Push notifications:** get new results delivered to Telegram, Discord, Slack, WhatsApp or any webhook the moment a scheduled run finds them
- **Architecture:** Direct REST API (`/api/v2/search/simple/`) — no HTML parsing, no buildId dependency
- **Memory:** 512 MB
- **Repost storage:** KeyValueStore `shine-scraper-job-dedup`, 90-day TTL
- **Retry:** Automatic retry on network errors, exponential backoff, 3 attempts per request

***

### Additional services

Need a custom actor, additional filters, scheduled runs, or integration support?.nl]\(mailto:info@unfencedgroup.nl) — we build on request.

***

### Related scrapers

Other scrapers in our **Jobs — India** collection:

- [Naukri.com Job Scraper](https://apify.com/unfenced-group/naukri-scraper)
- [TimesJobs.com Jobs Scraper](https://apify.com/unfenced-group/timesjobs-scraper)
- [Internshala Scraper](https://apify.com/unfenced-group/internshala-scraper)
- [Dice.com Jobs Scraper](https://apify.com/unfenced-group/dice-scraper)

***

### Run it on a schedule

This actor is built for repeat use. Set it to run daily, weekly, or hourly, and the data keeps flowing without you touching it.

- **Schedule runs** — open the actor, go to Schedules, and pick a cadence. Each run only charges you for the results it returns.
- **Connect it to your stack** — push results straight to Google Sheets, Slack, a webhook, or your database using Apify Integrations. No glue code needed.
- **Pull results via API** — every run writes a clean dataset you can fetch with one API call, ready for whatever you build on top of it.

Set it once and it runs on its own.

***

### Rate this actor

If this scraper does its job, a short review on the **Reviews** tab helps other users find it. Something not working? Open an issue on the **Issues** tab instead — issues get fixed.

***

### Need a custom scraper?

**[Unfenced Group](https://www.unfencedgroup.nl)** builds Apify actors for any website — for free.

If the site you need isn't in our portfolio yet, just ask. We scope, build, and publish it at no cost to you. You only pay for results — we absorb the compute and proxy costs ourselves. Same pay-per-result pricing, same quality, same standards as every actor in this portfolio.

**Get in touch:** [www.unfencedgroup.nl](https://www.unfencedgroup.nl)

# Actor input Schema

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

Keyword(s) to search for, e.g. 'Python developer', 'marketing manager'. Leave empty to browse all jobs.

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

City or region to filter by, e.g. 'Bangalore', 'Mumbai', 'Delhi'. Leave empty for all locations.

## `daysOld` (type: `integer`):

Only return jobs posted within this many days. Set to 0 to disable.

## `skipReposts` (type: `boolean`):

Skip job listings already seen in previous runs (requires cross-run deduplication store).

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

Minimum delay between page requests in milliseconds. Increase to reduce request rate.

## `respectRobotsTxt` (type: `boolean`):

Check and log robots.txt crawl-delay on startup.

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

Optional list of specific Shine.com job-search URLs to scrape, e.g. https://www.shine.com/job-search/data-engineer-jobs-in-pune. When provided, searchQuery and location are ignored.

## `fetchDetails` (type: `boolean`):

Fetch full job details from individual listing pages.

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

Maximum number of job listings to return.

## `telegramToken` (type: `string`):

Bot token from @BotFather, e.g. '110201543:AAHdqTcvCH1vGWJxfSeofSAs0K5PALDsaw'. Requires Telegram chat ID below.

## `telegramChatId` (type: `string`):

Chat or channel ID the bot posts to, e.g. '-1001234567890'. Get it from @userinfobot.

## `discordWebhookUrl` (type: `string`):

Discord channel webhook, e.g. 'https://discord.com/api/webhooks/%E2%80%A6'. Channel settings → Integrations → Webhooks.

## `slackWebhookUrl` (type: `string`):

Slack incoming webhook, e.g. 'https://hooks.slack.com/services/%E2%80%A6'.

## `whatsappPhoneNumberId` (type: `string`):

Meta Cloud API phone number ID, e.g. '106540352242922'. Requires access token and recipient below.

## `whatsappAccessToken` (type: `string`):

Meta Cloud API access token for the WhatsApp Business account.

## `whatsappTo` (type: `string`):

Recipient phone number in international format, e.g. '31612345678'.

## `webhookUrl` (type: `string`):

Any HTTPS endpoint. Receives a JSON POST with site, query, result counts and the newest items, e.g. 'https://example.com/hooks/jobs'.

## `webhookHeaders` (type: `object`):

Optional extra HTTP headers for the webhook request, e.g. {"Authorization": "Bearer abc123"}.

## `notificationLimit` (type: `integer`):

Maximum number of results shown in a notification message. Default 10, cap 25.

## `notifyOnlyChanges` (type: `boolean`):

Only send a notification when the run found new or changed items. Applies when incremental tracking is active; full runs with results always notify.

## Actor input object example

```json
{
  "searchQuery": "developer",
  "location": "",
  "skipReposts": false,
  "requestDelayMs": 1000,
  "respectRobotsTxt": true,
  "startUrls": [],
  "fetchDetails": false,
  "maxItems": 100,
  "notificationLimit": 10,
  "notifyOnlyChanges": true
}
```

# Actor output Schema

## `results` (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 = {
    "searchQuery": "developer",
    "maxItems": 100
};

// Run the Actor and wait for it to finish
const run = await client.actor("unfenced-group/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 = {
    "searchQuery": "developer",
    "maxItems": 100,
}

# Run the Actor and wait for it to finish
run = client.actor("unfenced-group/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 '{
  "searchQuery": "developer",
  "maxItems": 100
}' |
apify call unfenced-group/shine-scraper --silent --output-dataset

```

## MCP server setup

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