Shine.com Jobs Scraper: India Job Listings by Role and City
Pricing
$1.00 / 1,000 scraped jobs
Shine.com Jobs Scraper: India Job Listings by Role and City
Shine jobs scraper for India job listings: search any role and city, get one clean row per job with salary band, experience, location and description. Shine.com jobs to JSON. Pay per job.
Pricing
$1.00 / 1,000 scraped jobs
Rating
0.0
(0)
Developer
Gerald Dobin
Maintained by CommunityActor stats
0
Bookmarked
1
Total users
0
Monthly active users
3 hours ago
Last modified
Categories
Share
Shine.com Jobs Scraper: India Job Listings
Give this Actor a list of job titles or skills, and optionally a list of Indian cities, and it returns every matching job advertised on Shine.com as clean rows in one schema. Shine is one of India's largest job portals, and each row carries the job title, the hiring company, the public job page link, every city the role is advertised in, the salary band parsed into numbers, the experience band parsed into years, the employment type, the industry, the employer's own skill tags, the posting and expiry dates, and the full job description as both cleaned HTML and plain text. Jobs are deduplicated by Shine's own job id, so a role that appears under two of your keywords arrives once and is billed once.
Who it is for
Recruiters and staffing agencies sourcing in India. Watch "python developer in Bangalore" and "data analyst in Pune" on a daily schedule and see every new opening with the pay band and the experience band already in the row, instead of clicking through a results page. The company id groups every listing from one poster, so you can tell a direct employer from an agency at a glance.
Job boards and aggregators that need an India feed. Point the Actor at fifty role and city
combinations, run it nightly, and load the rows straight into your index. Every row has a stable
jobId to upsert on and an expiresAt date, so yesterday's index and today's diff cleanly.
Market and salary research across roles and cities. salaryMinLakh and salaryMaxLakh are
real numbers in lakh per year, parsed out of the text Shine prints, so you can pivot pay against
experience, city and industry without writing a parser. The same search run against several cities
gives you a like for like comparison.
Sample output
One row per job. Here is a real row from a test run, with the two long description fields shortened for readability:
{"jobId": "19443568","title": "Python Developer","company": "SP Staffing Services Private Limited Hiring For Leading MNC Company","companyId": 734032,"url": "https://www.shine.com/jobs/python-developer/sp-staffing-services-private-limited/19443568","locations": ["Hyderabad"],"location": "Hyderabad","salaryText": "Rs 26 - 38 Lakh/Yr","salaryMinLakh": 26,"salaryMaxLakh": 38,"salaryPeriod": "year","experienceText": "5 to 10 Yrs","experienceMinYears": 5,"experienceMaxYears": 10,"employmentType": "Regular, Full time","jobType": "Regular","industry": "IT Services & Consulting","keywords": ["rest api", "python", "flask", "django", "gcp", "fast api"],"postedAt": "2026-08-11T07:12:45.000Z","postedText": "2026-08-11T12:42:45","expiresAt": "2026-10-09T18:30:00.000Z","descriptionHtml": "<h2><strong>Warm Greetings!</strong></h2><p><strong>Role:</strong> Python Developer ...</p>","descriptionText": "Warm Greetings!\nRole: Python Developer\nExperience: 5 to 10 yrs ...","searchKeyword": "python developer","searchLocation": null,"sourcePage": "https://www.shine.com/job-search/python-developer-jobs","scrapedAt": "2026-09-12T15:44:10.311Z","error": null}
Every field is present on every row. A field is null when Shine does not publish it, never
missing and never an empty string. Dates are ISO 8601 in UTC, converted from the India Standard
Time the site publishes them in, and postedText keeps the original for reference. A date that
does not exist, such as a 31st of February, comes back empty rather than quietly sliding into March.
Salary numbers are always annual and always in lakh. A monthly band is multiplied by twelve, a
crore figure is multiplied by a hundred, and a figure Shine writes in rupees, such as
"Rs 50,000 - 3.0 Lakh/Yr", is converted, so every row is comparable with every other row.
salaryPeriod records what the employer actually quoted, year or month. When the employer
hides the pay, or writes a number with no unit at all, salaryText keeps whatever was published
and the three salary fields are null: a wrong number in a salary dataset is worse than a missing
one.
Contact details are removed. Employers routinely paste a recruiter's mobile number or email
address into the description, the job title, or the company line. Every string in every row is
checked and any email address or Indian phone number is replaced with [contact removed], and
mailto: and tel: links are stripped out of the description entirely. The rest of the sentence
is left alone, so the row is still readable. There is no setting to turn this off.
If a search page cannot be read, you get an error row carrying searchKeyword, searchLocation,
sourcePage, error and scrapedAt, with every other field empty. The error column holds one of
a short fixed set of codes, so you can filter on it: blocked, redirected to page 1,
unrecognised city, network error, unreadable page, page not found, address refused,
response too large or unexpected error. Error rows are never charged for.
Input reference
| Input | What it does |
|---|---|
keywords | Job titles or skills to search for, one per line, for example python developer. Each keyword becomes one search. Optional if you give searchUrls instead, but a run needs at least one of the two. |
locations | Indian cities, one per line, for example Bangalore, Mumbai, Delhi NCR, Hyderabad, Pune, Chennai. Every keyword is searched in every city. Leave empty to search all of India. |
searchUrls | Shine job search addresses to use exactly as they are, for example https://www.shine.com/job-search/python-developer-jobs-in-bangalore. Paste a page two address and paging starts there. |
maxJobsPerSearch | How many jobs to take from each search. Shine returns 20 per page. Default 100. Set 0 for everything Shine will serve, up to a safety cap of 250 pages, about 5,000 jobs, per search. |
postedWithinDays | Keep only jobs posted in the last N days. |
experienceMin, experienceMax | Keep only jobs whose published experience band overlaps this range, in years. A job that publishes no band is kept. |
includeDescription | Include the full description as HTML and text. On by default. Turning it off makes the dataset several times smaller. |
maxConcurrency | Requests in flight at once. Capped at 2. |
One run collects at most 50 searches (keywords times cities, plus any search URLs) and at most 20,000 jobs. A run that asks for more searches than that is refused before it makes a single request, with a message telling you to split it, rather than being silently trimmed to a number you did not choose. A single search stops after 250 pages, or after ten pages in a row that produce no new rows, whichever comes first.
Common city names are mapped to the ones Shine's own URLs use, so Bengaluru finds Bangalore and
Delhi NCR finds Delhi. If Shine does not recognise a city at all it quietly answers with the
all India result set, which would mean paying for rows from the wrong place. This Actor spots that,
warns you and skips that search rather than billing you for it.
How deep a single search goes
Shine tells you how many pages a search has, and it serves the first few of them to anyone. Past that it answers a page number with a redirect back to page one, and how far you get varies by search and by day: a broad all India search often serves two pages, while a narrower city search usually serves more. This Actor watches for that redirect and stops paging there, so you never receive, or pay for, the same twenty jobs a second time. The run log says which page it stopped on.
The way to get more jobs is therefore to go wider rather than deeper: more keywords, and each
keyword split across cities. python developer in eight cities will return far more distinct jobs
than python developer across all India ever will, and the rows carry searchLocation so you can
tell them apart.
Pricing
Pay per result. You are charged once for each job row delivered, and nothing else: no charge for a
page that fails, no charge for an error row, and no charge for a duplicate a search returns twice.
A run with the default input, two broad all India keywords, delivers around 60 rows, because Shine
serves only the first pages of a broad search. Add cities to get more. Set maxJobsPerSearch to
put a ceiling on what any one search can cost.
What it does not do
- No candidate or recruiter contact data. Shine's listing data includes a recruiter phone
number and email address in their own fields, and those are never read into a row. Contact
details that employers paste into the description or the title are found and replaced with
[contact removed], andmailto:andtel:links are removed. You get the company name, the job fields and the public job page link. There is no option to get anything else. - No login and no private pages. Only pages any visitor can open, with no account and no session.
- Only what robots.txt allows, and only search pages. Shine's terms permit automated access as
its robots.txt permits, so the file is fetched at the start of every run and every address is
checked against it. On top of that there is a positive rule: the only addresses this Actor will
request at all are
https://www.shine.com/job-search/...search pages androbots.txt. Every redirect is put through both checks again, so nothing can walk the Actor onto another part of the site. If robots.txt ever stops allowing the job search pages, the run stops with a clear message instead of scraping. - No job detail pages. The search listing already carries the description, the salary band and the dates, so there is nothing to gain from twenty extra requests per page.
- No browser. Plain HTTP, at most two requests at a time, with a one to two second pause between any two requests anywhere in the run, not per search. If the site pushes back with a 403, a 429 or a challenge page, that refusal is retried once and no more, and three refusals in a row stop the whole run rather than pushing harder at a site that has said no.
Freshness
Rows are read live from Shine on every run, never from a cache or a stored copy, and scrapedAt
records the moment each row was read. Shine timestamps each listing itself, and postedAt carries
that, so you can tell a job posted this morning from one that has been up for a month. New jobs
appear on the site continuously, so a daily or hourly schedule with postedWithinDays set to 1
gives you a clean stream of what is new without paying for the same rows again.
What people search for
If you arrived looking for a Shine jobs scraper, this is it. The same Actor answers searches for: Shine jobs scraper, Shine.com jobs, Shine job listings, India jobs scraper, Indian job portal scraper, jobs in Bangalore scraper, Mumbai jobs scraper, Hyderabad jobs scraper, Pune jobs scraper, Delhi NCR jobs scraper, Chennai jobs scraper.