Foundit Jobs Lookup: foundit jobs scraper from $1.5/1k
Pricing
from $0.75 / 1,000 job posting returneds
Foundit Jobs Lookup: foundit jobs scraper from $1.5/1k
Run keyword + location job searches on foundit (formerly Monster India) and get one clean row per posting: title, company, location, experience, pay range (if stated) and apply link. No login required. You pay per posting returned, and a search that finds nothing is free.
Pricing
from $0.75 / 1,000 job posting returneds
Rating
0.0
(0)
Developer
Adrian Voss
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
a day ago
Last modified
Categories
Share
You write job searches the way you'd type them into foundit — python developer @ Bengaluru —
and this actor runs each one against foundit's own backing search API, one of India's
largest job boards (formerly Monster India), and returns one clean row per posting: title,
company, location, experience required, pay range (when disclosed), and a permanent link.
No login. No API key. foundit's search-results page renders its listings client-side after load, but the same-origin JSON endpoint that page calls to fetch them is not — see "Why this one" below.
Who it's for
Recruiters, staffing agencies, and outbound teams building an India-market candidate or lead list who need fresh postings by role and city without clicking through foundit's search pages by hand. It's also the data layer behind an internal hiring-trends dashboard, or a Clay/n8n workflow that watches a role for new postings on a schedule. Pricing is pay-per-event: a fraction of a cent for a posting you actually got, and nothing for a search that finds nothing.
This actor is the India-market counterpart to seek-jobs-search-lookup (Australia) and
xing-jobs-lookup (DACH): wide-net keyword + location search rather than a per-company listing.
If you already know which companies to target, company-domain-enrichment's hiring-activity
source answers a different question — this one answers "who's hiring for this role, in this
Indian city" when you don't have the company list yet.
Why this one
- Reaches data a plain page-load can't. foundit's search-results page ships real SEO meta
tags (title, description) but the job cards themselves are fetched by a JavaScript bundle after
load — the raw HTML has no listings in it at all. This actor instead calls that bundle's own
data source directly:
www.foundit.in/middleware/jobsearch, a same-origin JSON endpoint that answers a plain request (with one header set correctly — see the FAQ) with real, live results. No proxy, no browser automation, no CAPTCHA-solving. - The filters are real.
queryandlocationsare both genuinely honoured upstream — verified by watching the total-match count actually narrow (26,644 → 10,691 across one location filter on the same search) and confirming every returned posting's own location field matched. - You are never billed for the same posting twice. Every posting is deduplicated by its foundit job ID across the pages of one search and, by default, across every search in the run.
- Honest about apply links. foundit mixes on-site and off-site postings in the same result
set — some apply links point back to foundit, others go straight to the employer's own careers
page or a third-party board. Both
jobUrl(foundit's own listing page) andapplyUrl(wherever the posting actually sends an applicant) are returned as separate fields rather than assuming one covers the other. - No fabricated salary data. foundit reports an undisclosed salary as the literal string "0-0 INR" on the majority of postings — this actor nulls that out instead of showing you a fake zero.
What you get
One row per job posting by default. (Turn off "One row per job posting" in the Input tab to get
one row per search instead, with the whole posting list nested in jobs.) Every row carries
these fields:
| Field | Type / format | Description |
|---|---|---|
query | text | The search line you passed in, unchanged. |
found | boolean | true if the search returned at least one posting. false rows are never charged. |
status | text | OK, NOT_FOUND (no postings for that search), BAD_FORMAT (the line had neither keywords nor a location), or BLOCKED. |
searchKeywords | text | The keywords actually sent to foundit. |
searchLocation | text | The location actually sent to foundit. |
jobCount | number | How many postings this search returned after your filters — this is exactly what you're charged for. |
totalAvailable | number | foundit's own total-match count for the search, before this actor's page/depth limits. |
truncated | boolean | true if more postings were available than you asked for, or if paging stopped early. |
jobs | array | The full posting list. Present in every row; it's what gets expanded into separate rows in "one row per posting" mode. |
jobId | text | foundit's own numeric posting ID — stable, and what deduplication keys on. |
title | text | Job title. |
companyName | text | Hiring company (or recruiter) name, as foundit displays it. |
location | text | Location as foundit prints it on the posting (e.g. "Bengaluru, India"). |
remote | boolean | true if the location or title reads as remote / work-from-home. |
experience | text | Experience range foundit lists for the role (e.g. "5-7 Years"). |
salaryText | text | Pay range exactly as foundit's advertiser wrote it. Null when undisclosed (foundit's own "0-0 INR" placeholder is nulled out, not shown as a fake zero). |
employmentType | text | e.g. "Full time", "Part time", "Contract", when foundit states one. |
skills | text | Comma-separated skills foundit lists against the posting. |
postedAt | date (ISO) | foundit's own creation timestamp for the listing. |
postedAgo | text | The same thing in foundit's words ("20 hours ago"). |
jobUrl | link | Permanent link to the posting on foundit.in. |
applyUrl | link | Where the posting actually sends an applicant — sometimes foundit itself, sometimes the employer's own site or a third-party board (see "Why this one"). |
scrapedAt | date (ISO) | When this actor fetched the row. |
A search that returns no postings comes back as a single found: false row with a
status/message explaining why, and is never charged. So does a blank line.
Pricing
- Job posting returned: $1.5 per 1,000 job postings
Plus a $0.00005 start fee per run. Each event above is billed independently, only when it actually returns data — misses (found:false) are never charged.
You're charged per posting returned, not per search — a search that returns 30 postings
costs thirty, a genuinely empty search costs nothing, and a BAD_FORMAT line costs nothing.
Because you pay per posting, "Most postings to return per search" is your budget control: leave it at 40 (two pages) and a ten-search run costs at most 400 postings' worth.
1,000 postings through this actor: ~$1.55 if every search finds results. The same list built by hand-paginating foundit's search pages and copying fields: hours of manual work per 1,000 rows.
How to use
- In the Apify Console. Open the actor page and click Start — the
searchesfield is already pre-filled with a working example. Results land in the run's dataset as soon as each item is found. - Via the API. Call it directly with a POST request — no Console needed once you have an API token:
curl "https://api.apify.com/v2/acts/accountable_eel~foundit-jobs-lookup/run-sync-get-dataset-items?token=<YOUR_TOKEN>" \-X POST \-H "Content-Type: application/json" \-d '{"searches":["python developer @ Bengaluru"]}'
- On a schedule. Save this actor as an Apify Task with the input you want, then add a Schedule (hourly, daily, weekly) so it runs on its own — no server of your own required.
Paste one search per line:
python developer @ Bengalurudata analystsales manager @ Mumbai
A line with no @ location uses the location you set once in 🔍 Search settings — leave that
blank too and the search covers all of India.
🔍 Search settings:
| Input | What it does |
|---|---|
defaultLocation | Location for any line that doesn't name one. Write it the way foundit does — a city name, e.g. "Bengaluru", "Mumbai", "Pune". |
maxJobsPerQuery | Most postings to return per search. Default 40 (two pages). |
🎯 Narrow the results — applied here, to the postings after they arrive. They combine with AND across fields and OR within a field:
| Input | What it does |
|---|---|
titleKeywords | Keep only titles containing one of these — ["engineer","analyst"]. |
excludeTitleKeywords | Drop titles containing one of these — ["intern","trainee"]. Applied after the include list. |
companies | Keep only these companies — partial names match. |
excludeCompanies | Drop these companies — useful for filtering out recruitment agencies you already know. |
locations | Narrow a wide search to particular areas — e.g. "Whitefield", "Andheri". |
remoteOnly | Keep only roles whose location or title reads as remote / work-from-home. |
skipDuplicateJobs | On by default. Each posting is returned, and billed, once per run even if two searches overlap. |
Input
{"searches": ["python developer @ Bengaluru"]}
One search per line. Write it as "keywords @ location", or just the keywords and set a location below. foundit is India-focused — locations are Indian cities, e.g. "Bengaluru", "Mumbai", "Pune". Accepted formats: python developer @ Bengaluru, data analyst, sales manager @ Mumbai.
Output
| query | found | status | searchKeywords | searchLocation | jobCount | totalAvailable | truncated | jobs | jobId | title | companyName | location | remote | experience | salaryText | employmentType | skills | postedAt | postedAgo | jobUrl | applyUrl | scrapedAt |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| python developer @ Bengaluru | true | OK | python developer | Bengaluru | 40 | 232 | true | <all postings found (full list)> | 34056108 | Senior Python Developer | Arun Thiyagarajan (Proprietor of Swathi Business Solutions) | Bengaluru, Chennai | false | 10-15 Years | Full time | Azure, Python, Sql, Aws | 2025-02-21T17:36:00.000Z | 11 hours ago | https://www.foundit.in/job/senior-python-developer-arun-thiyagarajan-proprietor-of-swathi-business-solutions-bengaluru-bangalore-34056108 | 2026-09-08T17:44:33.798Z |
A miss comes back as a row with "found": false and is never charged.
Use it from Clay, n8n, Make, or an AI agent
This actor runs synchronously over plain HTTP — call it directly from a script, a workflow tool, or an AI agent, no Apify Console needed once you have an API token.
curl "https://api.apify.com/v2/acts/accountable_eel~foundit-jobs-lookup/run-sync-get-dataset-items?token=<YOUR_TOKEN>" \-X POST \-H "Content-Type: application/json" \-d '{"searches":["python developer @ Bengaluru"]}'
n8n. Add an HTTP Request node: Method POST, URL https://api.apify.com/v2/acts/accountable_eel~foundit-jobs-lookup/run-sync-get-dataset-items?token=<YOUR_TOKEN>, Body Content Type JSON, JSON Body {"searches":["python developer @ Bengaluru"]} (swap in an expression from an earlier node for a real value).
Clay. Add an "HTTP API" column: Method POST, URL https://api.apify.com/v2/acts/accountable_eel~foundit-jobs-lookup/run-sync-get-dataset-items?token=<YOUR_TOKEN>, Body {"searches":["{{search}}"]}, mapping the row's search into the searches array.
MCP. In Claude, Cursor, or any MCP client with the Apify MCP server, ask for "Foundit Jobs Scraper API from $1.5/1k | Apify" — the agent will find and run this actor.
Tips
- Set a city in
locationsordefaultLocationwhenever you can — foundit's own location filter is real (verified against every returned posting's location field) and narrows the result set before you pay for it, rather than after. salaryTextis empty on most postings — most Indian job ads don't disclose pay. Don't rely on this field being populated for filtering; usetitleKeywords/excludeTitleKeywordsinstead.- Keep "Max concurrency" conservative on a large list of searches. This target has no browser fallback, so getting rate-limited costs more in wasted requests than a slower, steadier crawl.
applyUrlsometimes points off-site (the employer's own careers page, or another job board) — don't assume every posting's apply flow stays on foundit.in.
vs. alternatives
| What it costs | What you get | Trade-off | |
|---|---|---|---|
This actor (foundit-jobs-lookup) | $0.0015 per posting returned (FREE tier, less on paid tiers), $0.00005 actor start, nothing for a genuinely empty search | One row per foundit job posting — title, company, location, experience, pay range and apply link, filterable by title keyword, company, location and remote | India-focused (foundit's own coverage); no full job description, only the fields the search API itself returns. |
| themineworks/foundit-jobs-scraper | Community actor, 172 users in the last 30 days, $2.50 per 1,000 results | Also scrapes foundit job search results | An established incumbent with more users; this actor prices lower per posting and never charges for a miss. |
| Doing it yourself | Your time + finding foundit's undocumented /middleware/jobsearch endpoint, working out the Referer requirement, handling pagination and dedup | The same data | This actor's endpoint discovery, dedup, and filtering logic is the maintenance burden it absorbs. |
Prices for third-party tools are as researched in September 2026 and are not tracked here — check the vendor before relying on the comparison.
FAQ
Why do some postings have no salary?
foundit reports an undisclosed salary as the literal string "0-0 INR" on the majority of
postings — this actor treats that as no data and returns null rather than showing a fake zero.
Expect salaryText to be empty on most rows.
Why does applyUrl sometimes point somewhere other than foundit.in?
foundit's own search results mix postings foundit hosts directly with postings it aggregates from
elsewhere — the aggregated ones send applicants straight to the employer's own careers page or a
third-party board. jobUrl always stays on foundit.in; applyUrl is wherever the posting itself
actually sends an applicant.
Does this handle rate limits or blocking?
Each request goes through Apify's proxy configuration and retries up to twice on failure. A
BLOCKED status means foundit returned HTTP 403, 429, or 503 — lowering "Max concurrency" can
help; no proxy has been needed for this target as of the last live check.
Do I need to configure proxies? No. The actor uses Apify's default proxy configuration out of the box; foundit's search endpoint has not required anything beyond a plain HTTP request (with the right Referer header, which this actor sets automatically) in testing.
Is this GDPR-relevant? The data returned is business/professional information already published publicly by employers on foundit's job board (job title, company, location, pay range) — not personal data about private individuals.
Can I schedule this to re-check the same searches on a cadence?
Yes — set up an Apify Task with a schedule and point it at this actor with a saved input.
skipDuplicateJobs keeps a single run's overlapping searches from double-billing, but each
scheduled run is independent — a role that appeared in yesterday's run will appear again today if
it's still listed.
Can an AI agent call this directly? Yes. It's registered on the Apify MCP server — an agent in Claude, Cursor, or another MCP client can find and run it by name ("Foundit Jobs Scraper API from $1.5/1k | Apify"), or you can call the REST endpoint shown above from any script or workflow tool.
Related actors
- SEEK Jobs Search Lookup — the same keyword + location search shape, against Australia's largest job board.
- XING Jobs Lookup — the DACH-region equivalent, against XING's professional network.
- Company Domain Enrichment — broader firmographic and hiring-activity enrichment once you know which companies to target.