# Shine Jobs Scraper (`automation-lab/shine-com-public-vacancies`) Actor

Search public Shine.com India vacancies by role, city or job URL. Export stable job IDs, employers, titles, locations, publication dates, full descriptions and canonical URLs; salary only when published.

- **URL**: https://apify.com/automation-lab/shine-com-public-vacancies.md
- **Developed by:** [Automation Lab](https://apify.com/automation-lab) (community)
- **Categories:** Jobs, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.84 / 1,000 item extracteds

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

Search public Shine.com India vacancies by role and city, or supply Shine search/job URLs. Each record includes a stable job ID, employer, title, location, posting date, full published description and canonical URL. Salary is included **only when Shine publishes one**.

### Who is this for?

Recruiting analysts can build a current vacancy feed; hiring-market researchers can compare snapshots by `jobId`; data teams can load the dataset into a spreadsheet or warehouse. This Actor reads currently public listings, not historical postings.

### Why use this Actor?

The output is one normalized row per job, with a numeric ID that survives result ranking changes and a full description from the job's public structured data. Search and direct-job inputs share one parser. No Shine login or browser is required for the supported public pages.

### Getting started

1. Enter `data analyst` as the search phrase, optionally adding `Bangalore` as city, or supply a public Shine search/job URL.
2. Set the maximum vacancies. A small limit such as 10 is a useful first run.
3. Run the Actor and open the default dataset to download JSON, CSV or Excel.
4. For repeated monitoring, schedule runs and compare `jobId` values across datasets in your own workflow.

### Input parameters

| Input | Use |
| --- | --- |
| `query` | A role phrase, e.g. `data analyst`; creates a public Shine job-search URL. |
| `location` | Optional Indian city; requires `query`. |
| `startUrls` | Up to 30 Shine `/job-search/` or `/jobs/` pages, including direct vacancy URLs. |
| `maxItems` | Maximum unique complete jobs, default 10, range 1–1000. |

Choose a query or URLs, not both; a city filter is available only for query searches. Search pages paginate until the limit or the last page; duplicates are omitted by job ID. A job URL can be supplied on its own. Only `https://www.shine.com` job/search URLs are accepted.

### Output fields

| Field | Meaning |
| --- | --- |
| `jobId` | Stable numeric Shine job identifier. |
| `title`, `employer`, `location` | Public role, organization and location. |
| `postedAt` | Source publication timestamp, including time zone when provided. |
| `description` | Full publicly exposed description, not a search snippet. |
| `url` | Canonical Shine job URL without tracking parameters. |
| `salary` | Source-disclosed salary and period; absent when undisclosed. |
| `scrapedAt` | Observation timestamp for snapshot comparisons. |

### Sample vacancy

A real sampled listing returned `jobId: "19588199"`, `title: "Data Analyst"`, `employer: "QRN Services"`, `location: "Bangalore, Karnataka"`, and a public INR yearly salary. Listings change; that ID may disappear later.

### How much does it cost to export Shine vacancies?

This Actor charges $0.001 once per run (`start`) and one `item` event for each emitted vacancy. At BRONZE ($0.0014/item), 1, 10 and 100 jobs cost an estimated $0.0024, $0.015 and $0.141 respectively, including the start event. FREE is $0.00161/item; SILVER $0.001092/item; GOLD, PLATINUM and DIAMOND $0.00084/item. Tiers depend on qualifying **monthly Store spend**, not on how many jobs you request from this Actor. An empty search incurs no item events but still incurs the start event. These are price estimates, not guaranteed invoices; Apify applies its current account tier, applicable billing rules and any adjustments, refunds, disputes, taxes or corrections. Runtime infrastructure cost is borne by the publisher, not an extra source-service bill to the user.

### Monitoring and integrations

Schedule a run in Apify, export its dataset to Google Sheets or a warehouse through an integration, and compare IDs with the previous run. A changed description under the same ID indicates a changed posting; a new ID indicates a newly observed listing. The Actor does **not** maintain a cross-run history or send alerts itself. To avoid treating a vanished job as definitely closed, confirm source availability independently.

### API usage

The API can run the Actor and return default dataset items. Keep your token in an environment variable; never commit it.

```bash
curl -X POST 'https://api.apify.com/v2/acts/automation-lab~shine-com-public-vacancies/run-sync-get-dataset-items' \
  -H "Authorization: Bearer $APIFY_TOKEN" -H 'Content-Type: application/json' \
  -d '{"query":"data analyst","maxItems":5}'
```

### JavaScript and Python clients

```js
import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('automation-lab/shine-com-public-vacancies')
    .call({ query: 'data analyst', maxItems: 5 });
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);
```

```python
import os
from apify_client import ApifyClient
client = ApifyClient(os.environ['APIFY_TOKEN'])
run = client.actor('automation-lab/shine-com-public-vacancies').call(
    run_input={'query': 'data analyst', 'maxItems': 5})
for item in client.dataset(run['defaultDatasetId']).iterate_items():
    print(item)
```

### MCP use

After the Actor is available in the Store, connect an Apify MCP client using `https://mcp.apify.com?tools=automation-lab/shine-com-public-vacancies`. In Claude Code: `claude mcp add --transport http apify "https://mcp.apify.com?tools=automation-lab/shine-com-public-vacancies"`. In an editor's remote MCP JSON config, set `{"mcpServers":{"apify":{"url":"https://mcp.apify.com?tools=automation-lab/shine-com-public-vacancies"}}}`. Example prompt: “Find five public Shine data analyst vacancies and summarize their published locations.”

#### Desktop and editor MCP setup

For Claude Desktop, add `{"mcpServers":{"apify":{"url":"https://mcp.apify.com?tools=automation-lab/shine-com-public-vacancies"}}}` to the desktop MCP settings. For Cursor, add the same `apify` server under MCP settings; for VS Code, configure the same remote HTTP MCP URL in your workspace MCP server list. Supply your Apify credentials through the client's supported authorization flow, not in the prompt.

### FAQ

**Does the Actor alert me when a vacancy changes?** No. Schedule a run and compare the resulting datasets externally.

**Why was a vacancy missing?** It may have expired, fallen outside the capped search results, or temporarily been unavailable. Check the live source URL before treating absence as closure.

**Can I use a Shine URL directly?** Yes, pass one or more public `/jobs/` or `/job-search/` URLs in `startUrls` instead of a query.

### Limits and troubleshooting

Shine controls availability and may change its page markup. This Actor requires a visible search result with links and detail pages containing `JobPosting` structured data; it fails with an error rather than silently claiming a successful empty run on an unrecognized challenge. Some vacancies have no salary. The maximum of 100 pages per run prevents runaway pagination. If a URL returns not found, open it in a browser and use a current public job or search URL. If a result has disappeared between search and detail, try a fresh search later.

### Changes to search results

Search results can reorder between runs. Use `jobId` as the comparison key and retain `scrapedAt` to distinguish when each dataset observed the listing. A missing result within a capped batch is not proof that the listing was removed.

### Legality and responsible use

Read public listings responsibly. Respect Shine's terms, applicable privacy law and rate limits; avoid building profiles about individuals. The Actor does not bypass a login, CAPTCHA or private application flow. An external application process, when available, happens on the source site.

### Data handling and dependencies

The Actor fetches publicly accessible Shine search and job pages, then writes vacancy fields and observation times to the run's default Apify dataset. Input search terms and submitted URLs are used only to fetch the requested pages. The Actor does not request a Shine account, read applicant profiles, use AI, or send records to a separate enrichment service. Shine controls the source pages; Apify hosts the run, logs and dataset. No persistent cross-run cache or session store is created by this Actor. Apify's account/storage retention and deletion controls govern run records; delete unneeded datasets and runs in your Apify account. Do not include secrets or private applicant information in search inputs or URLs.

The `start` event is charged once for a run and `item` only for each emitted job record; no external API key or off-platform payment is needed. Failed or unavailable source pages cause a run error instead of a fabricated vacancy. Source listings may contain employer contact details or other personal information in descriptions: handle exported records under your own privacy obligations.

### Support

For a source-format change, empty/unexpected results, or a billing question, open a Store issue for this Actor and include the input shape and run URL. Do not post access tokens or personal data in a public report.

### Related workflows

For a separate India recruiting source, see [Apna India Job Listings Scraper](https://apify.com/automation-lab/apna-india-job-listings-scraper). Its data is not merged into Shine results.

# Changelog

This Actor's version history is a separate document: https://apify.com/automation-lab/shine-com-public-vacancies/changelog.md

# Actor input Schema

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

Role to search for, such as data analyst. Optional if URLs are provided.

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

Optional Indian city used with the search phrase, such as Bangalore.

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

Optional public shine.com/job-search/ or shine.com/jobs/ URLs (up to 30). Use instead of a search phrase.

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

Stop after this many deduplicated, fully described jobs; pages are followed until the limit or end of results.

## Actor input object example

```json
{
  "query": "data analyst",
  "maxItems": 10
}
```

# Actor output Schema

## `overview` (type: `string`):

Default dataset view of current public Shine job listings

# 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": "data analyst",
    "maxItems": 10
};

// Run the Actor and wait for it to finish
const run = await client.actor("automation-lab/shine-com-public-vacancies").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": "data analyst",
    "maxItems": 10,
}

# Run the Actor and wait for it to finish
run = client.actor("automation-lab/shine-com-public-vacancies").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": "data analyst",
  "maxItems": 10
}' |
apify call automation-lab/shine-com-public-vacancies --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,automation-lab/shine-com-public-vacancies"
        }
    }
}
```

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/GjWyLDri8g5gFCu7y/builds/iAPxwwDjZmC1iXUY6/openapi.json
