# Shine.com Scraper — India Job Ads, Skills & Employers (`logiover/shine-com-scraper`) Actor

Scrape vacancies from Shine.com, a leading Indian job board: title, hiring company, city, required experience range with a sortable numeric floor, employment type, listed skills and posting recency. Keyless, no login. JSON, CSV or Excel.

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

## Pricing

from $1.75 / 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.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#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 Scraper — India Job Ads, Skills & Employers

Export vacancies from **Shine.com**, a leading Indian job board — company, city, experience range and listed skills — to JSON, CSV or Excel. Keyless, no login.

### What does Shine.com Scraper do?

Shine renders its search results server-side, so this Actor parses the result cards directly and walks the pagination. No API key, no account, no cookies.

Shine's markup needs care in three places. Its class names carry **per-build hashes** (`jobCardNova_bigCard__W2xn3`), so selectors match the stable prefix rather than the full name. The experience range and the contract type share the **same repeated element**, so they are told apart by pattern instead of by position — otherwise "Contractual" lands in an experience column. And the location and skill blocks are rendered **two or three times** in the same card, so values are de-duplicated before they are written, which is what stops rows reading "Hyderabad, Hyderabad".

Experience is kept twice: the label as written (`3 to 8 Yrs`) and a numeric floor, so you can filter for junior or senior roles without parsing strings.

### Who is it for?

- **Recruitment agencies** tracking which Indian companies are hiring and where.
- **Staffing and RPO teams** building call lists of employers with open roles.
- **Skills researchers** measuring which technologies employers actually ask for.
- **Job boards and aggregators** that need an Indian feed.
- **Market analysts** sizing demand across Bangalore, Hyderabad, Chennai and beyond.

### Use cases

- List every company hiring SQL or frontend developers in Chennai this month.
- Measure which skills appear most often for a given role across India.
- Filter to roles asking 0–2 years to build a graduate-hiring pipeline.
- Track posting volume by city, month over month.
- Feed a niche board with fresh Indian listings.

### Why use this Actor?

- **Keyless** — nothing to sign up for.
- **14 structured fields**, with experience and contract type never mixed.
- **Numeric experience floor** for straightforward filtering.
- **Listed skills** captured per ad, de-duplicated.
- **Hash-proof selectors** — matches class prefixes, not build hashes.

### What data can you extract?

| Field | Type | Description |
|---|---|---|
| `jobId` | string | Shine listing ID |
| `title` | string | Job title |
| `jobUrl` | string | Public ad page |
| `companyName` | string | Hiring company or consultancy |
| `location` | string | Primary city |
| `experienceLabel` | string | Experience range as written |
| `experienceFrom` | number | Lower bound in years |
| `employmentType` | string | Contractual, full time, internship … |
| `skills` | string | Skills listed on the card |
| `postedLabel` | string | Posting recency as displayed |
| `country` | string | India |
| `source` | string | Always `shine_com` |
| `scrapedAt` | string | Run timestamp (ISO 8601) |

#### Example output

```json
{
  "jobId": "19172585",
  "title": "Mainframe Developer",
  "jobUrl": "https://www.shine.com/jobs/mainframe-developer/alphacom-systems-and-solutions-pvt-ltd/19172585",
  "companyName": "Alphacom Systems and Solutions Pvt Ltd",
  "location": "Hyderabad",
  "experienceLabel": "3 to 8 Yrs",
  "experienceFrom": 3,
  "employmentType": "Contractual",
  "skills": "jcl cics db2 cobol",
  "postedLabel": "posted 2 months ago",
  "country": "India",
  "source": "shine_com"
}
```

### How to use it

1. Enter a keyword, or leave it empty to walk the general listing.
2. Optionally add a city and a minimum experience level.
3. Set **Maximum results** and run, then export JSON, CSV or Excel.

### Input example

```json
{
  "query": "developer",
  "location": "Bangalore",
  "minExperience": 3,
  "maxResults": 1000
}
```

### Notes and limits

- Shine does **not** publish salary on its result cards, so this Actor ships no salary column rather than an always-empty one.
- A large share of Indian ads are posted by staffing consultancies, so `companyName` is often the consultancy rather than the end client — that is how the ad is published.
- `employmentType` appears on a minority of ads; it stays `null` when the employer omits it.
- This Actor exports listing cards, not full descriptions, which is what keeps bulk runs cheap. Open `jobUrl` for the full text.
- You are responsible for how you use employer data.

### FAQ

**Do I need a Shine account?**
No. Listings are public and this Actor needs nothing from you.

**Why is there no salary field?**
Because Shine's result cards do not carry one. An always-empty column would be worse than leaving it out.

**Can I filter by experience?**
Yes — set a minimum, and every row also carries `experienceFrom` for post-filtering.

**How am I charged?**
Pay per result — you pay for the vacancies delivered.

# Actor input Schema

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

Free-text search across Shine.com, e.g. "developer", "accountant" or "sales manager". Leave empty to walk the general listing.

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

Optional city filter, e.g. "Bangalore", "Hyderabad" or "Mumbai". Applied only when a keyword is set.

## `minExperience` (type: `integer`):

Only return roles asking for at least this many years. -1 disables the filter.

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

Stop after this many ads. Shine renders 20 cards per page and the Actor walks pages until the target is met.

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

Shine serves plain HTML; the default datacenter proxy is enough.

## Actor input object example

```json
{
  "query": "developer",
  "minExperience": -1,
  "maxResults": 500,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `jobId` (type: `string`):

No description

## `title` (type: `string`):

No description

## `jobUrl` (type: `string`):

No description

## `companyName` (type: `string`):

No description

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

No description

## `experienceLabel` (type: `string`):

No description

## `experienceFrom` (type: `string`):

No description

## `employmentType` (type: `string`):

No description

## `skills` (type: `string`):

No description

## `postedLabel` (type: `string`):

No description

## `country` (type: `string`):

No description

## `source` (type: `string`):

No description

## `scrapedAt` (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 = {
    "query": "developer",
    "location": "",
    "minExperience": -1,
    "maxResults": 500,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("logiover/shine-com-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 = {
    "query": "developer",
    "location": "",
    "minExperience": -1,
    "maxResults": 500,
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("logiover/shine-com-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 '{
  "query": "developer",
  "location": "",
  "minExperience": -1,
  "maxResults": 500,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call logiover/shine-com-scraper --silent --output-dataset

```

## MCP server setup

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