India Jobs Feed: Internshala, Instahyre, CutShort, Apna, Shine
Pricing
from $1.49 / 1,000 job postings
India Jobs Feed: Internshala, Instahyre, CutShort, Apna, Shine
Pull India jobs from Internshala, Instahyre, CutShort, Apna, Shine, WorkIndia, Hirist and Wellfound (India roles) into one feed. Get only new, updated or closed jobs per run, flag cross-board duplicates, export JSONL or Adzuna-style XML. $0.00199 per row; 4 boards bill their own fee too.
Pricing
from $1.49 / 1,000 job postings
Rating
0.0
(0)
Developer
GetAScraper
Maintained by CommunityActor stats
0
Bookmarked
156
Total users
63
Monthly active users
6 days ago
Last modified
Categories
Share
| Build a single India job inventory from eight job boards. Bring Apna, CutShort, Internshala, Instahyre, Wellfound, Hirist, WorkIndia, and Shine results into one canonical dataset while keeping source identity and links. | |||
| India jobs sources and inventory • Apna, CutShort, Internshala, Instahyre, and the combined India job feed | |||
Blue and grey collar roles | Technology and startup roles | Internships and entry-level jobs | ➤ You are here |
|
One canonical India jobs feed built from eight public job boards Combine Apna, CutShort, Internshala, Instahyre, Wellfound, Hirist, WorkIndia, and Shine listings into a single dataset while keeping each source's identity and links. |
| 🧩 Distinct members Keep every source listing separate. | 🔗 Cross-board matching Spot the same job on several boards without merging rows. | 🧭 Change context Track lifecycle states and source quality. | 🤖 Agent-ready Short rows for AI agents, or full rows and exports. |
Job-data teams can use this bilingual discovery feed for भारत jobs, blue-collar and entry-level hiring, India technology roles, and global startup hiring. It is designed for product managers, HR-tech teams, labor-market analysts, feed operations teams, and AI agents that need source-linked records.
🔎 What this feed does
It collects public listings from Apna, CutShort, Internshala, Instahyre, Wellfound, Hirist, WorkIndia, and Shine. It normalizes the returned records into one canonical dataset.
| Board | Based in | Strongest for | How it runs |
|---|---|---|---|
| Apna | India | Blue and grey collar roles | Separate Actor, bills its own price |
| CutShort | India | Technology and startup roles | Separate Actor, bills its own price |
| Internshala | India | Internships and entry-level jobs | Separate Actor, bills its own price |
| Instahyre | India | Technology roles | Separate Actor, bills its own price |
| Hirist | India | Technology and senior roles | Inside this feed, no second charge |
| WorkIndia | India | Blue collar and entry-level roles with monthly pay | Inside this feed, no second charge |
| Shine | India | Broad hiring across industries | Inside this feed, no second charge, not preselected |
| Wellfound | United States | Startup roles, India only here | Inside this feed, no second charge |
Seven of the eight boards are India-based. Wellfound is a global startup board; the feed keeps a Wellfound job only when its own published locations name an Indian city, state, or India itself. Roles in other countries are dropped, never guessed. WorkIndia is preselected for new runs. Shine is available but not preselected, because it limits how fast many runs can read its pages at the same time; add it to sources when you want it.
Each source member keeps its own listingKey, so downstream joins do not merge or remove source records. Rows that look like the same job at the same company and city share a clusterId, and you can ask for one row per job with uniqueOnly. City spellings are matched across boards, so Bengaluru and Bangalore count as the same city. Matching is strict on purpose: when the same company posts one role on two boards for different cities, those stay separate. In our own test searches the same job showed up on more than one board mostly for large delivery and logistics employers across Apna and WorkIndia, and rarely elsewhere, so expect cross-board matches to be real but not frequent.
Lifecycle states are conservative: NEW, UPDATED, UNCHANGED, CLOSED, and REOPENED. Closure detection is on by default, but a job is only marked CLOSED when its board's scan was proven complete and not cut short by your per-board limit, and the job was missing on two runs in a row. With a small per-board limit most scans are cut short, so jobs usually stay open rather than closing by mistake. Wellfound and CutShort never close jobs in this version. WorkIndia and Shine never close jobs either: WorkIndia lists a rolling batch of fresh postings rather than its whole inventory, and Shine is far too large to scan in full, so a missing job there says nothing about whether it is still open. For those two boards read NEW and UPDATED as the useful signals. Source quality flags make incomplete or capped scans visible.
Your monitor keeps its history when a board's Actor is updated. Only a change to your own search settings starts a fresh history.
If a run is about to reach its time limit, the feed stops waiting, stops any board still running, and returns the rows it already has with lifecycleStatus set to PARTIAL. Partial rows carry no new, updated, or closed guarantee, and your saved monitoring history is left untouched. RUN_SUMMARY says so in plain words.
🎯 Who uses it
- I am a job-data product manager building India listings into our product while preserving the source identity behind each row.
- I am an HR-tech analyst comparing titles, locations, skills, and salary details where each source publishes them.
- I am a labor-market researcher collecting a reproducible job or internship inventory with lifecycle and source context.
- I am a feed operations lead delivering canonical records and export files without collapsing similar listings across sources.
🚀 How it works
| STEP 1 Choose a scope Set sources, a keyword, locations, and bounded limits. | STEP 2 Receive source members Review canonical rows with source IDs, links, and quality flags. | STEP 3 Export or repeat Use the dataset or verified chunked exports for your workflow. |
For later runs, choose changesOnly to emit meaningful lifecycle changes instead of unchanged rows. Monitoring state persists in a named store across Apify runs. Dataset rows are pushed first, and export records are read-back verified before state commits.
⚙️ Input
| Field | Type | Required | Description |
|---|---|---|---|
sources | array of strings | No | Choose one or more boards: Apna, CutShort, Internshala, Instahyre, Wellfound (India roles only), Hirist, WorkIndia, and Shine. Apna, CutShort, Internshala, and Instahyre each run as a separate Actor that bills its own per-result price to your account on top of this feed. Wellfound, Hirist, WorkIndia, and Shine run inside this Actor with no extra charge. Everything except Shine is preselected. |
keyword | string | No | Search by a job title, skill, or other simple term. Use one skill word on CutShort. Leave empty for the latest jobs from each board. |
locations | array of strings | No | Add cities or regions, or leave empty for all available locations. |
companyNames | list of names | No | Keep listings whose employer name contains one of these names. |
excludeKeywords | list of words | No | Remove listings containing any of these words in the title, employer, location, or description. |
remoteOnly | boolean | No | Keep only listings marked remote by the source. Shine rarely marks a job remote, so expect few Shine rows with this on. |
postedWithinDays | integer | No | Keep only jobs posted in the last N days. Applies to WorkIndia and Shine; the other boards ignore it. |
minMonthlySalary | integer | No | Keep only jobs stating a monthly salary of at least this many rupees. Applies to WorkIndia only; WorkIndia jobs with no stated monthly pay are left out when it is set. |
internshalaMode | enum | No | Choose Internshala jobs or internships. |
includeDetails | boolean | No | Include descriptions, skills, salary, and company details when published. Defaults to disabled (keeps the default run fast); enable it for the full record. |
outputMode | enum | No | Return all matching jobs (all), only new and changed jobs (changesOnly), or short rows for AI agents (compact, see below). Defaults to all. |
uniqueOnly | boolean | No | Return one row per job when the same title, company, and city appear more than once, on one board or several. Fewer rows means a lower feed bill. Defaults to off. |
maxTotalRows | integer | No | Optional limit on the total rows returned, shared evenly between boards. Compact mode returns 50 rows when it is empty. |
monitorScope | text | No | Optional name for this monitor's saved state. Reuse the same name on a schedule to compare against the previous run. Leave empty for one-off searches; runs without a name never block each other. |
maxItemsPerSource | integer | No | Maximum jobs from each selected board. Defaults to 25. A lower value lowers both the feed charge and the child Actors' charges. |
maxPagesPerSource | integer | No | Search depth on boards that support page limits. Defaults to 5 pages. |
🤖 Use it from an AI agent or MCP client
The Apify MCP server can call this Actor as a tool. For a quick search that returns a small, readable answer, pass one or two boards, a keyword, a city, a small per-board limit, and outputMode set to compact:
{"sources": ["workindia", "apna"],"keyword": "delivery partner","locations": ["Bengaluru"],"maxItemsPerSource": 15,"outputMode": "compact"}
Compact mode returns at most 50 rows (set maxTotalRows to change that), one row per job, spread across the boards you chose. Each row has only title, company, location, salary, url, source, lifecycle, and clusterId, and a field the board does not publish is left out. Leave monitorScope empty so repeated or parallel calls never block each other. A search that uses only boards running inside this feed (Wellfound, Hirist, WorkIndia, Shine) skips the separate board Actors and usually finishes faster.
🧾 Data table
The canonical dataset preserves source members and records only fields available from the selected source. Missing values are left out of the row, never filled with placeholders. A salary currency or period appears only when the source states it.
| Field | Type | Description |
|---|---|---|
listingKey | string | Stable source-namespaced member ID. |
clusterId | string | Shared by rows that look like the same job at the same company and city. Absent when the title, company, or city is missing. |
clusterSize | integer | Rows in this run that share the clusterId, when more than one. |
isCanonical | boolean | True on the most complete row of a cluster, false on the other members. |
sourcePlatform | string | Source platform that produced the member. |
sourceRecordId | string | Native ID used by the source member. |
inventoryType | string | Job or internship when published by the source. |
title | string | Listing title when published by the source. |
company | string | Company name when published by the source. |
employer | string | Employer name as published (same value as company). |
description | string | Source-provided listing description when published. |
location | string | Listing location when published by the source. |
salaryMin | number | Lower salary or stipend value when published. |
salaryMax | number | Upper salary or stipend value when published. |
salaryCurrency | string | Salary currency when published by the source. |
salaryPeriod | string | Salary period when published by the source. |
salaryRaw | string | Original salary or stipend text when published. |
workArrangement | string | Work arrangement when published by the source. |
isRemote | boolean | Whether the source marks the listing as remote. |
isPartTime | boolean | Whether the source marks the listing as part-time. |
contractTypes | array of strings | Contract types when published by the source. |
skills | array of strings | Skills when published by the source. |
postedAt | string | Published date when available. |
validThrough | string | Application or listing end date when available. |
listingUrl | string | Direct source listing URL when available. |
applicationUrl | string | Application URL when available. |
sourceUrl | string | Original source URL when available. |
experienceMin | number | Minimum years of experience when the source states a number. |
experienceMax | number | Maximum years of experience when the source states a number. |
experienceText | string | Experience requirement in the source's own words. |
companySize | string | Company size band when published. |
companyStage | string | Company stage when published. |
companyFounded | integer | Year the company was founded, when published. |
employeeCount | integer | Employee count when published. |
openings | integer | Open positions for the listing, when published. |
applicants | integer | Applicants shown by the source at collection time. |
education | string | Education requirement when published. |
category | string | Job category or function when published. |
functions | array of strings | Job function tags when published. |
latitude | number | Job location latitude when the source publishes it. |
longitude | number | Job location longitude when the source publishes it. |
isActive | boolean | Whether the record is currently considered active. |
lifecycleStatus | string | Conservative NEW, UPDATED, UNCHANGED, CLOSED, or REOPENED state. PARTIAL means the run ran out of time and the row has no lifecycle guarantee. |
firstSeenAt | string | Time this source member was first recorded in its state scope. |
lastSeenAt | string | Time this source member was most recently seen. |
closedAt | string | Time the member was marked closed, if it was closed. |
changedFields | array of strings | Canonical fields that changed when a change was detected. |
sourceComplete | boolean | Whether the source scan was explicitly proven complete. |
sourceCapped | boolean | Whether the source result reached its configured record cap. |
closureEligible | boolean | Whether this source result can participate in closure checks. |
contractVersion | string | Version of the output layout. |
nativeDedupeKey | string | The board's own de-duplication key, when it publishes one. |
contentFingerprint | string | Hash of the business fields; a change marks the row UPDATED. |
sourceRunId | string | Run that produced the row. |
sourceBuildId | string | Build of the Actor that produced the row. |
sourceDatasetId | string | Dataset the row was read from. |
provenance | object | Adapter version plus the board's own fields, trimmed of long text already in the row. |
In compact mode each row has only these fields, and a field the board does not publish is omitted:
| Field | Type | Description |
|---|---|---|
title | string | Job title. |
company | string | Company name. |
location | string | Job location. |
salary | string | Salary or stipend as one short text, with currency and period when the board states them. |
url | string | Link to the listing. |
source | string | Board that published the job. |
lifecycle | string | NEW, UPDATED, UNCHANGED, CLOSED, REOPENED, or PARTIAL. |
clusterId | string | Shared by rows that look like the same job on one or several boards. |
WorkIndia states pay per month in rupees. Shine states pay on only a minority of postings. Experience on WorkIndia is read from its own wording (for example "1 - 2 Years" becomes a range, "Fresher" becomes zero).
📦 Exports
The default dataset is the canonical output. Each successful run also writes verified chunks to the default key-value store:
EXPORT_JSONL_n: newline-delimited canonical records.EXPORT_ADZUNA_SHAPED_XML_n: XML with an Adzuna-shaped field layout.EXPORT_MANIFEST: chunk metadata, checksums, and source context.RUN_HEALTH: child-run status and diagnostics.RUN_SUMMARY: whether the run was complete or partial, rows per board, and a plain note on what each board bills.
The XML is explicitly Adzuna-shaped. It does not claim official Adzuna compatibility, certification, or partnership.
🛡️ Limits and safety
This feed does not claim complete India job-market coverage or prove market gaps. It returns records from the selected sources only.
Missing source values stay absent. Similar listings remain separate source members unless you turn on uniqueOnly, and listingKey remains the safe join key.
Closure detection needs a complete scan that your per-board limit did not cut short, plus two missed runs in a row. Apna, Internshala, Instahyre, and Hirist can close jobs under these safeguards. CutShort, Wellfound, WorkIndia, and Shine cannot close jobs in this version.
🧮 What a run costs you
A run has two parts. The feed charges for each job row it returns. In addition, Apna, CutShort, Internshala, and Instahyre each run as their own Actor, and each of those bills its own per-result price to your account for the rows it collects. Wellfound, Hirist, WorkIndia, and Shine run inside this feed, so they add no second charge. Your total is the feed charge plus the child charges for the boards you select.
To keep the total low, pick only the boards you need, keep maxItemsPerSource small, and turn on uniqueOnly so a job listed more than once is returned once. Discovery runs default to includeDetails off, which is faster and cheaper. Turn it on when descriptions, skills, salary, or application context matter. Detailed rows can take longer on boards that publish a separate detail page.
💰 Pricing
Pay per returned job record. Empty runs and runs with no returned records do not incur result charges, and there is no subscription. The Store event is one Job posting for each row, and full details stay included in that row rather than creating a second charge from this feed.
The feed's own rate is shown live in the Store panel for your plan. Separate child-Actor charges apply to Apna, CutShort, Internshala, and Instahyre as described above. WorkIndia and Shine add no separate charge.
⭐ Enjoying India Jobs Feed?
| ⭐ ⭐ ⭐ ⭐ ⭐ Help other job-data teams find a source-linked India hiring feed. A rating helps product managers, analysts, and feed operations teams assess this Actor. Your feedback guides future improvements. |
| ★ Rate this Actor on Apify |
❓ FAQ
Does this combine source listings into one record?
Not by default. Each Apna, CutShort, Internshala, Instahyre, Wellfound, Hirist, WorkIndia, and Shine source member keeps a distinct listingKey, so every record stays traceable to its source. Rows that look like the same job share a clusterId. Turn on uniqueOnly to get one row per job.
भारत jobs feed कैसे काम करता है?
Choose sources and a scope, then run the Actor. It returns canonical rows with source member IDs, lifecycle information, links, and reliability flags.
When can a listing be marked closed?
Only when the board's scan was proven complete and not cut short by your per-board limit, and the job was missing on two runs in a row. CutShort, Wellfound, WorkIndia, and Shine cannot close jobs in this version.
Do the filters work across every board?
Yes. Keyword, location, company, excluded-word, and remote-only filters are applied to every selected board. Boards also receive their own native filters where available. If a board does not publish an employer or remote signal, that record cannot pass a matching filter that requires it.
Should I request full job details?
Request full details when you need descriptions, skills, salary, or application context. It can take longer and use more platform compute on some boards, while other boards already include most details in their listing response.
Why does my bill include more than the feed price?
Apna, CutShort, Internshala, and Instahyre run as separate Actors that bill their own per-result price to your account. Wellfound, Hirist, WorkIndia, and Shine run inside this feed and add no second charge. Select fewer boards or use a lower per-board limit to reduce the total.
What does a PARTIAL row mean?
The run reached its time limit before every board finished. The feed returned what it had, marked those rows PARTIAL, and did not change your monitoring history. Run again with fewer boards or a lower limit.
Does Wellfound return jobs outside India?
No. A Wellfound job is kept only when its own published locations name an Indian place. Roles in other countries are dropped.
How do I call this from an AI agent or MCP client?
Pass one or two boards in sources, a keyword, a city in locations, maxItemsPerSource between 10 and 25, and outputMode set to compact. You get at most 50 short rows (title, company, location, salary, url, source, lifecycle, clusterId) and a field the board does not publish is left out. Leave monitorScope empty so parallel calls never block each other. Add postedWithinDays for fresh jobs, or minMonthlySalary for WorkIndia pay.
Why is Shine not preselected?
Shine limits how fast many runs can read its pages at the same time, so a default run that included it could return fewer Shine rows when several runs start together. A single run is fine. Add shine to sources when you want it.
Why did a board return no rows?
Each board reports its own note in RUN_HEALTH. Common reasons are a keyword that board does not index (CutShort matches single skill words), a city spelled in a way the board does not use, or a filter such as minMonthlySalary that the board's jobs do not state. Try a broader keyword or remove one filter.
Is the XML an official Adzuna feed?
No. The XML uses an Adzuna-shaped layout for downstream mapping. It is not an official Adzuna integration or a promise of compatibility.
🔗 Other actors
- 💼 Apna.co Jobs Scraper: India Blue & Grey Collar Listings ↗: Collect public Apna.co job listings.
- CutShort Jobs Scraper: India Tech Jobs & Salaries ↗: Collect CutShort roles and source-published salary data.
- 🎓 Internshala Jobs Scraper: Applicants per Opening & Hiring Data ↗: Track Internshala jobs and internships.
- 💼 Instahyre Jobs Scraper: India Tech Jobs & Hiring Monitor ↗: Track Instahyre technology roles and source-published hiring data.
- 🇨🇳 51job Scraper 前程无忧: China Jobs, Salary Data & Recruiter Scores ↗: Collect China job listings and source-published hiring data.