# foundit Scraper — Jobs, Salaries, Skills & Employers (`logiover/foundit-scraper`) Actor

foundit scraper (Monster India): export jobs from foundit.in with company, locations and coordinates, experience, salary, skills, industry, function, employment type, applicants, posting and expiry dates, apply link and full description. Search by keyword, city and filters or paste URLs. No login.

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

## Pricing

from $1.00 / 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/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

## foundit Scraper — Jobs, Salaries, Skills & Employers from foundit.in (Monster India)

**Export jobs from foundit.in — title, company, locations with coordinates, experience, salary when the posting shows it, skills, industries, functions, designations, employment type, applicants and views, posting, refresh and expiry dates, the apply link and the full job description (text and HTML) — as clean JSON, CSV or Excel, without a login.**

> Independent tool. Not affiliated with, endorsed by, or sponsored by foundit, Monster or their owners. "foundit" and "Monster" are trademarks of their owners and are used here only to describe the public website this Actor reads.

**foundit Scraper** is a foundit job scraper and Monster India scraper for one of India's largest job boards. It turns any foundit.in search — a keyword or several, a city, a state, "Remote", an experience range, a job type (work from home, contract, walk-in, jobs for women, permanent), direct employers or recruitment firms, an industry, a function, one employer, a pasted foundit URL, or the whole board — into structured job data: job title, **company** (name, foundit page, logo, website and "about" when given), **location text plus structured cities, states, country and coordinates**, **experience as text and as min / max years**, **salary as foundit prints it with min / max numbers and currency** (only where the posting gives one), skills, industries, functions, foundit's designation category, employment types, job types, **applicants, views, Quick Apply and Great Place To Work flags**, **posted / first posted / updated / expiry timestamps in ISO 8601**, the external **apply link** of aggregated postings, the recruiter and — only where the employer chose to publish it — the recruiter's phone number, and the **complete job description** as plain text and as HTML. Use it to **scrape foundit.in** by keyword and city, as a **foundit API alternative** (we found no documented public API for foundit's job listings), or to **export foundit jobs to CSV, Excel or JSON** for a spreadsheet, ATS, CRM, BI tool or data warehouse. No foundit account, no API key, no cookies, no browser.

Recruitment agencies, HR-tech and staffing-software sellers, job aggregators, salary and compensation analysts, labour-market researchers, placement cells, upskilling companies and WhatsApp / Telegram job channels use it for **foundit job data extraction**, daily feeds of new **fresher jobs, work from home jobs and walk-in drives**, hiring-signal lead lists of companies, and skills-demand research. Typical searches it answers: *foundit scraper*, *scrape foundit.in jobs*, *Monster India job scraper*, *foundit jobs to Excel*, *foundit job data API*, *job vacancy data India*, *fresher jobs in Bengaluru list*, *work from home jobs India dataset*, *walk-in interview jobs Delhi*, *jobs in Pune 3 to 5 years experience*, *data analyst jobs with salary in LPA*, *फाउंडइट जॉब्स डेटा (foundit jobs data)*, *नौकरी की जानकारी एक्सेल में (job information in Excel)*, *फ्रेशर्स के लिए जॉब (jobs for freshers)*, *वर्क फ्रॉम होम जॉब्स (work from home jobs)*, *वॉक-इन इंटरव्यू (walk-in interview)* and *job portal data scraping India*. On **2026-10-25** foundit listed about **189,765 live jobs**; the Actor read **12,000 of them with full details in 16.0 minutes** and **25,082 job cards of one search without details in 160 seconds**. All numbers on this page were measured on the Apify platform on 2026-10-25.

***

### Table of contents

- [At a glance](#at-a-glance)
- [What you get](#what-you-get)
- [Who uses it — 12 workflows](#who-uses-it--12-workflows)
- [Cookbook — 16 ready-to-run inputs](#cookbook--16-ready-to-run-inputs)
- [Tutorial: your first run in the Apify Console](#tutorial-your-first-run-in-the-apify-console)
- [Tutorial: run it from the API](#tutorial-run-it-from-the-api)
- [Input reference](#input-reference)
- [Output data dictionary](#output-data-dictionary)
- [Real output sample](#real-output-sample)
- [Scale and speed (measured)](#scale-and-speed-measured)
- [What you pay](#what-you-pay)
- [Integrations](#integrations)
- [Performance tips](#performance-tips)
- [Troubleshooting: every status message explained](#troubleshooting-every-status-message-explained)
- [Honest limits](#honest-limits)
- [How it compares](#how-it-compares)
- [FAQ](#faq)
- [Glossary](#glossary)
- [Is it legal to scrape foundit?](#is-it-legal-to-scrape-foundit)
- [Changelog](#changelog)
- [Support](#support)

***

### At a glance

| | |
|---|---|
| **Site** | foundit.in — India's job board, formerly Monster India (some of its services still run under the monsterindia.com name) |
| **Jobs available** | about 189,765 live jobs on 2026-10-25 with no filter; typical searches: "software" 25,652 matches, "data analyst" 984 matches |
| **Search by** | keywords (all words must match, a comma means OR), cities and states ("Bengaluru", "Pune", "Karnataka", "Remote"), experience range in years, posted within 1–60 days, job type, employer type, industries, functions, employers, pasted foundit URLs, or everything |
| **Per job** | 52 columns with details (41 without): title, company block, location text, cities, states, country, coordinates, experience text and years, salary text and numbers, employment types, job types, industries, functions, designations, roles, qualifications, skills, benefits, applicants, views, Quick Apply, Great Place To Work, walk-in drive, four timestamps, posting source, apply link, recruiter, full description in text and HTML |
| **Depth** | one foundit search can be read down to its 9,600th result at most (measured); the Actor splits bigger searches by state, experience and employer type and de-duplicates — a search that foundit counts at 25,652 jobs gave 25,082 unique jobs (98 %) |
| **Speed** | 30 jobs with full details in 11 s · 1,000 with full details in 63 s · 12,000 with full details in 16.0 min · 25,082 job cards (no details) in 160 s |
| **Output** | JSON, CSV, Excel, XML, HTML; API, webhooks, Make, Zapier, n8n, Google Sheets, MCP |
| **Login / cookies / proxy** | None needed (load spreading over Apify datacenter IPs and a capped residential rescue route are built in) |
| **Price** | $1.50 → $1.00 per 1,000 jobs by Apify plan, all included |

***

### What you get

Every job is one row; the [data dictionary](#output-data-dictionary) lists every column with its measured fill rate.

- **Identity** — `jobId`, `url`, `title` (plus `searchQuery` / `searchLocation` when you gave keywords or locations).
- **Company** — name (empty and flagged `isCompanyConfidential` when the employer hides it), `companyId`, foundit page, website, logo, "about", employer type (Company or Consultant).
- **Location** — foundit's location text, `isRemote`, and from the job page `cities`, `states`, `country`, `latitude`, `longitude`.
- **Requirements** — experience (text and min / max years), salary (text, min, max, currency), employment types, job types, industries, functions, designations, roles, qualifications, skills, benefits.
- **Activity** — `applicants`, `views`, Quick Apply, Great Place To Work, walk-in drive details.
- **Dates** — `postedAt`, `firstPostedAt`, `updatedAt`, `expiresAt`, `scrapedAt` (ISO 8601, UTC).
- **Source** — `postingSource` (**employer**: posted on foundit by the employer; **aggregated**: collected by foundit from another site or career page), external `applyUrl`, recruiter name, phone (only if published), designation and profile.
- **Description** — plain text and foundit's HTML.

What the board looks like (the 12,000-job proof run, newest first): 97 % of the jobs are aggregated and 3 % were posted on foundit by the employer; top states Karnataka (21 %), Maharashtra (20 %), Telangana (18 %), Haryana (6 %), Tamil Nadu (6 %); top functions Consumer Bank (4 %), Sales (3 %), Banking (2 %), Finance (2 %), Software Engineering (2 %); top industries Other (73 %), Banking/Accounting/Financial Services (11 %), IT/Computers - Software (3 %), Real Estate (2 %), Electronic Components/Semiconductors (1 %); top employment types Full time (100 %), Part time (0 %); median minimum experience 4 years among the 6,514 jobs that state one; 1.9 % show a salary; 0.1 % are remote.

***

### Who uses it — 12 workflows

#### 1. Recruitment and staffing agencies

Run "java developer, python developer" for Pune and Bengaluru every morning with `postedWithinDays: 1`, keep `employerType: Company` rows and call the firms that opened five or more similar roles this week.

#### 2. HR-tech, ATS and recruitment-software sales

Companies that post many jobs buy hiring software. Export a month of jobs, group by `companyId`, rank by open roles and join `companyUrl` into your CRM.

#### 3. Job aggregators and niche job boards

Run a daily `postedWithinDays: 1` pull, de-duplicate on `jobId`, show the external `applyUrl` of aggregated jobs and retire listings on `expiresAt`.

#### 4. Salary and compensation analysts

Where a posting shows pay, `salaryMin`, `salaryMax` and `salaryCurrency` are numbers: group by `functions` and `experienceMinYears` and build LPA bands — read [honest limits](#honest-limits) first, only a small share of postings show a salary.

#### 5. Labour-market researchers and economists

Count postings per city, state, industry and function over time; measure the experience mix, the share of work from home roles and how long postings stay open (`expiresAt` minus `postedAt`).

#### 6. EdTech, bootcamps and upskilling companies

`skills` and `designations` show what employers ask for: count skills per designation and city to choose the next course and show live demand on your landing page.

#### 7. Placement cells and fresher-job channels

Pull fresher jobs (`minExperienceYears: 0`, `maxExperienceYears: 0`) and walk-in drives per city and send students a daily list with the apply link, experience and expiry date.

#### 8. Investors and equity analysts

Hiring velocity is a growth signal: count open roles per employer (`companies: ["Infosys"]`) and function week over week and compare firms of one industry.

#### 9. B2B sales and growth teams

A company hiring "SAP consultants" or "data engineers" is a buyer for the tools around them: build lead lists from `companyName`, `companyUrl`, `industries` and the role mix.

#### 10. Diversity and inclusion programmes

Run `jobType: "Jobs for Women"` for your cities and list employers with `isGreatPlaceToWork: true` for outreach and partnerships.

#### 11. Overseas and contract recruiters

Some postings are for work abroad (filter `country != "India"` after the export) and `jobType: "Contract Job"` gives contract openings with employer, location and experience band.

#### 12. AI assistants, RAG and LLM pipelines

`description` is clean text, `descriptionHtml` keeps structure, and `skills`, `designations` and `industries` are ready labels for job matching, résumé tailoring or skills extraction.

***

### Cookbook — 16 ready-to-run inputs

Paste any of these into the **Input** tab (JSON view) or send it as the body of an API run. Each input was validated against the input schema; the counts in the notes are foundit's own match counts on 2026-10-25.

#### 1. A quick look (what the Console pre-fills)

```json
{ "searchQueries": ["data analyst"], "maxResults": 30 }
```

30 jobs with full details in about 11 seconds; foundit counted 984 matches.

#### 2. Fresher jobs in Pune, added in the last 7 days

```json
{ "locations": ["Pune"], "minExperienceYears": 0, "maxExperienceYears": 0, "postedWithinDays": "7", "maxResults": 500 }
```

The experience filter keeps every range that overlaps 0–0, which includes postings that state no experience (94,058 of 189,765); check the `experience` column for explicit fresher roles.

#### 3. Data analyst jobs in three cities

```json
{ "searchQueries": ["data analyst"], "locations": ["Bengaluru", "Hyderabad", "Pune"], "maxResults": 1500 }
```

Each keyword-and-city pair is its own search; jobs found by several are saved once and `searchLocation` shows the first search that found them.

#### 4. Python or Java developers with 3 to 6 years

```json
{ "searchQueries": ["python developer, java developer"], "locations": ["Bengaluru"], "minExperienceYears": 3, "maxExperienceYears": 6, "maxResults": 1000 }
```

A comma inside one line means OR; without it every word must match. 190 matches.

#### 5. Work from home jobs added in the last 3 days

```json
{ "jobType": "Work From Home", "postedWithinDays": "3", "maxResults": 1000 }
```

628 work-from-home jobs in total, 26 of them new in 3 days: a small, fast run.

#### 6. Walk-in drives

```json
{ "jobType": "Walkin Job", "maxResults": 100 }
```

Walk-in postings are rare: 25 on 2026-10-25. The `walkIn` column holds dates, times, city and addresses.

#### 7. Jobs for women, in two cities

```json
{ "jobType": "Jobs for Women", "locations": ["Mumbai", "Chennai"], "maxResults": 500 }
```

foundit's own tag: 313 jobs nationwide, 42 in Mumbai.

#### 8. Direct employers only, no recruitment firms

```json
{ "searchQueries": ["sales executive"], "locations": ["Mumbai"], "employerType": "Company", "maxResults": 1000 }
```

`employerType: "Consultant"` gives the opposite view (4,940 jobs).

#### 9. Every open job of one employer

```json
{ "companies": ["Tata Consultancy Services"], "maxResults": 2000 }
```

Use the name exactly as the `companyName` column shows it (445 jobs). Pasting an employer page (a `companyUrl` value) into `startUrls` works too.

#### 10. Banking jobs in the Sales function

```json
{ "industries": ["Banking/Accounting/Financial Services"], "functions": ["Sales"], "maxResults": 2000 }
```

Industry and function names are the ones in the `industries` and `functions` columns (1,409 matches).

#### 11. A whole state, search cards only

```json
{ "locations": ["Karnataka"], "includeDetails": false, "maxResults": 20000 }
```

A state name uses foundit's state filter (46,549 jobs); with a limit the newest are read first. Cards have no description or coordinates.

#### 12. Remote jobs

```json
{ "locations": ["Remote"], "maxResults": 800 }
```

737 jobs. "Remote", "Work from home", "WFH" and "Anywhere" all select foundit's remote group.

#### 13. Everything on foundit, search cards only

```json
{ "includeDetails": false, "maxResults": 0 }
```

`maxResults: 0` means no limit. The Actor slices the board by state, experience and employer type to get past the 9,600-per-search window; raise the run timeout and read [Scale and speed](#scale-and-speed-measured).

#### 14. Paste a foundit search URL with any filters

```json
{ "startUrls": ["https://www.foundit.in/srp/results?query=java&locations=pune&experienceRanges=2~5"], "maxResults": 1000 }
```

Set the filters on foundit.in and paste the address-bar URL. Understood parameters: `query`, `locations`, `experienceRanges`, `jobFreshness`, `industries`, `functions`, `roles`, `jobTypes`, `employerTypes`, `companies`, `companyIds`, `qualifications`, `jobStates`, `jobCities`, `jobCountries`, `salaryRanges`. SEO pages (`/search/python-jobs-in-pune`) and employer pages work as well.

#### 15. Specific jobs by URL

```json
{ "startUrls": ["https://www.foundit.in/job/senior-platform-software-engineer-oracle-bengaluru-bangalore-india-69555260", "https://www.foundit.in/job/us-it-recruiter-dpr-technologies-solutions-private-limited-coimbatore-69555938"] }
```

Job pages are always read with full details; a job foundit has taken down is counted under `jobsNotFound` in the SUMMARY.

#### 16. Daily monitoring of new jobs

```json
{ "searchQueries": ["data engineer"], "locations": ["Bengaluru", "Pune", "Hyderabad"], "postedWithinDays": "1", "maxResults": 2000 }
```

Save it as a task, add a daily schedule and use `jobId` as the key. 30 new "data engineer" jobs appeared in Bengaluru alone in one day.

***

### Tutorial: your first run in the Apify Console

1. Open the Actor page and click **Try for free** (or **Start**).
2. In **Keywords** type what you would type into foundit's search box, one search per line; in **Locations** add cities, states or "Remote". Leave both empty for all of India.
3. Optional: **Experience**, **Posted within**, **Job type**, **Employer type**, **Industries**, **Functions**, **Employers**.
4. Set **Maximum results** (the pre-filled 30 finishes in seconds; the default is 1,000). Leave **Read every job's page** on for descriptions, cities, coordinates, views and the employer block; switch it off for the fastest bulk export of search cards.
5. Click **Save & Start**; the status line counts saved jobs while the run goes.
6. Open the **Output** tab: five ready-made views (Overview, Skills & requirements, Employers, Locations, Descriptions) and **Export** to JSON, CSV, Excel, XML or HTML. The **Storage → Key-value store → SUMMARY** record explains the run in numbers.

### Tutorial: run it from the API

#### 1. Get your token

Console → Settings → Integrations → **API token**. Use it as `YOUR_TOKEN` below and never publish it.

#### 2. Run and get the data in one call (small runs)

```bash
curl -s -X POST "https://api.apify.com/v2/acts/logiover~foundit-scraper/run-sync-get-dataset-items?token=YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"searchQueries":["data analyst"],"locations":["Pune"],"maxResults":50}'
```

The response is the list of jobs. For results as CSV add `&format=csv` (or `xlsx`).

#### 3. Start a run and fetch the data later (big runs)

```bash
## start
curl -s -X POST "https://api.apify.com/v2/acts/logiover~foundit-scraper/runs?token=YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"jobType":"Work From Home","maxResults":700}'
## poll: GET https://api.apify.com/v2/actor-runs/RUN_ID?token=YOUR_TOKEN   (status SUCCEEDED)
## data: GET https://api.apify.com/v2/datasets/DATASET_ID/items?format=xlsx&token=YOUR_TOKEN
```

#### 4. Node.js (apify-client)

```js
import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('logiover/foundit-scraper').call({
  searchQueries: ['python developer'],
  locations: ['Bengaluru'],
  minExperienceYears: 2,
  maxExperienceYears: 5,
  maxResults: 300,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items.length, items[0].title, items[0].companyName, items[0].salary);
```

#### 5. Python (apify-client)

```python
import os
from apify_client import ApifyClient

client = ApifyClient(os.environ["APIFY_TOKEN"])
run = client.actor("logiover/foundit-scraper").call(run_input={
    "searchQueries": ["python developer"],
    "locations": ["Bengaluru"],
    "postedWithinDays": "7",
    "maxResults": 300,
})
for job in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(job["jobId"], job["title"], job["companyName"], job["experience"], job["salary"])
```

#### 6. Read the run summary

Every run writes a `SUMMARY` record to its key-value store: `outcome`, `stoppedBy`, `rowsSaved`, `searchPagesRead`, `detailPagesRead`, `duplicatesSkipped`, `durationSecs`, `firstRowSecs`, one entry per search with foundit's own match count (`foundOnFoundit`) and `coveragePercent`, and the request and route statistics.

```bash
curl -s "https://api.apify.com/v2/key-value-stores/STORE_ID/records/SUMMARY?token=YOUR_TOKEN"
```

***

### Input reference

| Field | Type | Default | What it does |
|---|---|---|---|
| `searchQueries` | list of text | empty | Job titles, skills or employer names, one search per line, as in foundit's search box. All words of a line must match; a comma inside a line means OR. Empty = every job. |
| `locations` | list of text | empty | Cities, states or "Remote". Names are checked against foundit's own location list; unknown ones are reported and skipped. foundit groups nearby places: Delhi, Gurgaon and Noida return the same Delhi NCR set, Mumbai, Navi Mumbai and Thane the same Mumbai set (the `location` column shows each job's real places). State names (Karnataka, Maharashtra …) use foundit's state filter. "India" / "Pan India" means no location filter. Empty = all of India. |
| `minExperienceYears` | whole number 0–40 | empty | Lower end of the experience range (foundit's overlap filter). |
| `maxExperienceYears` | whole number 0–40 | empty | Upper end of the experience range. `0` and `0` is the freshers filter. |
| `postedWithinDays` | choice | any time | Only jobs foundit listed as new in the last 1, 3, 7, 15, 30 or 60 days. |
| `jobType` | choice | any | Work From Home, Contract Job, Walkin Job, Jobs for Women or Permanent Job. |
| `employerType` | choice | any | `Company` (direct employers) or `Consultant` (recruitment firms). |
| `industries` | list of text | empty | foundit industry names exactly as the `industries` column shows them. A name foundit does not know matches nothing. |
| `functions` | list of text | empty | Job functions exactly as the `functions` column shows them. |
| `companies` | list of text | empty | Employer names exactly as the `companyName` column shows them. |
| `startUrls` | list of text | empty | foundit search pages (`/srp/results?…`), SEO search pages (`/search/…-jobs-in-…`), employer pages (`/search/…-jobs-career`) and single job pages (`/job/…`). Other URLs are skipped with a note. |
| `sortBy` | choice | `newest` | `newest` (stable order; required for splitting big searches) or `relevance` (foundit's order; can reshuffle between page requests, so searches above 9,600 matches are not split). |
| `includeDetails` | yes / no | yes | Open every job for the description (text and HTML), cities, states, country, coordinates, views and the employer and recruiter block. Off = search-card fields only, much faster. |
| `splitBroadSearches` | yes / no | yes | Split a search with more than 9,600 matches by state, experience and employer type so that the run can collect more; everything is de-duplicated. Needs `newest`. |
| `maxResults` | whole number 0–1,000,000 | 1,000 (Console pre-fill 30) | Stop after this many jobs in total. `0` = no limit. With several searches each gets an equal share first. |
| `proxyConfiguration` | proxy | not used | Leave empty. The Actor connects directly, adds Apify datacenter sessions on its own when foundit's per-address limit is reached, and uses a small capped residential rescue route only if everything else is refused. Set a proxy only to force one. |

**How the pieces combine.** Keywords × locations make the searches; the filters apply to every search; URLs are extra searches or single jobs. Use one line per place in `locations`, and spell industry, function and employer names exactly as foundit does (copy them from a previous export).

**What `maxResults` does with details on.** One job page is read per job, so `maxResults` is also the number of job pages read. You are charged per job in the dataset. A job whose page cannot be read after several tries is still saved from its search card (no description); jobs found but not read before the time limit are neither saved nor charged.

***

### Output data dictionary

Fill rates were measured on the 12,000-job proof run of 2026-10-25 (full details, 12,000 unique jobs, 0 duplicates). Rows are never padded: a value foundit does not give is `null` (or an empty list), never a placeholder.

**Identity**

| Column | Type | Filled | Meaning | Example |
|---|---|---|---|---|
| `jobId` | number | 100 % | foundit job id (the number at the end of the job URL). | `69555938` |
| `url` | text | 100 % | The job's page on foundit.in. | `https://www.foundit.in/job/…` |
| `title` | text | 100 % | Job title as posted. | `Us It Recruiter` |
| `searchQuery` | text | only with keywords / locations | The keyword search that first found this job (only when keywords were given). | — |
| `searchLocation` | text | only with keywords / locations | The location search that first found this job (only when locations were given). | — |

**Company**

| Column | Type | Filled | Meaning | Example |
|---|---|---|---|---|
| `companyName` | text | 99.8 % | Employer name as shown. null when foundit hides it (isCompanyConfidential). | `Dpr Technologies Solutions …` |
| `isCompanyConfidential` | true / false | 100 % | true when the employer chose to hide its name on foundit. | `false` |
| `companyId` | number | 100 % | foundit employer id. | `1147121` |
| `companyUrl` | text | 99.8 % | The employer's job list on foundit.in. | `https://www.foundit.in/sear…` |
| `companyWebsite` | text | 0.1 % | Employer website when foundit lists one. | `https://www.paytm.com/` |
| `companyLogoUrl` | text | 73.8 % | Employer logo image URL. | `https://media.monsterindia.…` |
| `companyAbout` | text | 21.5 % | Employer description (text) when the posting carries one — details on. | `Established in 1994, Kotak …` |
| `employerType` | text | 92.5 % | Company or Consultant (recruitment firm). | `Company` |

**Location**

| Column | Type | Filled | Meaning | Example |
|---|---|---|---|---|
| `location` | text | 100 % | Location text exactly as foundit shows it (one or several cities, may contain Remote). | `Coimbatore` |
| `isRemote` | true / false | 100 % | true when the location text says Remote or the job type is Work From Home. | `false` |
| `cities` | list | 88.6 % | Cities of the posting (structured, details on). | `["Coimbatore"]` |
| `states` | list | 88.5 % | States of the posting (details on). | `["Tamil Nadu"]` |
| `country` | text | 100 % | Country of the posting (details on). | `India` |
| `latitude` | number | 87.4 % | Latitude of the first city (details on), from foundit's location list; a pair outside India for an Indian place is repaired if swapped, else left empty. | `11.016845` |
| `longitude` | number | 87.4 % | Longitude of the first city (details on), same rules as latitude. | `76.955832` |

**Requirements**

| Column | Type | Filled | Meaning | Example |
|---|---|---|---|---|
| `experience` | text | 54.3 % | Experience text as shown on foundit; null when the posting gives none. | `2-5 Years` |
| `experienceMinYears` | number | 54.3 % | Minimum years of experience (null when none is given). | `2` |
| `experienceMaxYears` | number | 54.3 % | Maximum years of experience (null when none is given). | `5` |
| `salary` | text | 1.9 % | Salary range text as foundit prints it (null when hidden or not given). | `3,00,000-6,50,000 INR` |
| `salaryMin` | number | 1.8 % | Lower end of the yearly salary in salaryCurrency. | `300000` |
| `salaryMax` | number | 1.9 % | Upper end of the yearly salary in salaryCurrency. | `650000` |
| `salaryCurrency` | text | 1.9 % | Currency of the salary (INR for almost all). | `INR` |
| `employmentTypes` | list | 99.9 % | Employment types, e.g. Full time. | `["Full time"]` |
| `jobTypes` | list | 0.4 % | Special job types from the search card: Work From Home, Contract Job, Walkin Job, Jobs for Women. Empty for regular postings (the default 'Permanent Job' tag is left out). | `["Walkin Job"]` |
| `industries` | list | 96.7 % | Industries of the posting ("Other" is foundit's catch-all). | `["Banking/Accounting/Financ…` |
| `functions` | list | 95.8 % | Job functions / departments as given by the posting. | `["Others"]` |
| `designations` | list | 28.8 % | foundit's own job-designation category when it has assigned one, e.g. Software Engineer/Programmer or Sales Exec/Sales Representative. | `["Other Roles"]` |
| `roles` | list | 3.5 % | foundit roles chosen by the employer (employer-posted jobs). | `["Other Roles"]` |
| `qualifications` | list | 1.1 % | Education required (employer-posted jobs). | `["Master in Computer Applic…` |
| `skills` | list | 92.3 % | Skills and keywords of the posting. | `["Sourcing Techniques", "Te…` |
| `benefits` | list | 0.4 % | Benefits listed by the employer (employer-posted jobs). | `["Health insurance"]` |

**Activity**

| Column | Type | Filled | Meaning | Example |
|---|---|---|---|---|
| `applicants` | number | 100 % | Number of applicants foundit shows. | `0` |
| `views` | number | 100 % | Number of views foundit shows (details on). | `2` |
| `isQuickApply` | true / false | 100 % | true when applying happens on foundit (Quick Apply). | `true` |
| `isGreatPlaceToWork` | true / false | 100 % | true when the employer carries foundit's Great Place To Work badge. | `false` |
| `walkIn` | object | 0.1 % | Walk-in drive details: dates, times, city and addresses (walk-in jobs only). | `{"dates": "26 Oct - 27 Oct"…` |

**Dates**

| Column | Type | Filled | Meaning | Example |
|---|---|---|---|---|
| `postedAt` | text | 100 % | The "posted" time foundit shows (moves forward when a job is refreshed), ISO 8601 UTC. | `2026-10-25T11:51:44.000Z` |
| `firstPostedAt` | text | 100 % | When foundit created the record, ISO 8601 UTC: equal to postedAt for new jobs, earlier for refreshed ones, later on some aggregated jobs. | `2026-10-25T11:51:44.000Z` |
| `updatedAt` | text | 100 % | Last update of the posting, ISO 8601 UTC. | `2026-10-25T11:51:44.000Z` |
| `expiresAt` | text | 100 % | When foundit expires the posting, ISO 8601 UTC. | `2026-12-23T18:30:00.000Z` |

**Source**

| Column | Type | Filled | Meaning | Example |
|---|---|---|---|---|
| `postingSource` | text | 100 % | employer = posted on foundit by the employer; aggregated = collected by foundit from another site. | `employer` |
| `applyUrl` | text | 88.8 % | External application link for aggregated jobs (null for jobs applied to on foundit). | `https://hcbt.fa.em2.oraclec…` |
| `recruiterName` | text | 99.8 % | Recruiter / poster name as shown. | `Chevula Balaraju` |
| `recruiterPhone` | text | 0.2 % | Recruiter phone as foundit prints it — only where the employer chose to show contact details (about 2 in 1,000); null otherwise. | `8124404404` |
| `recruiterDesignation` | text | 0.4 % | Recruiter's job title (details on, employer-posted jobs). | `HR Manager` |
| `recruiterProfileUrl` | text | 0.4 % | Recruiter's foundit profile (details on, employer-posted jobs). | `https://www.foundit.in/recr…` |

**Description**

| Column | Type | Filled | Meaning | Example |
|---|---|---|---|---|
| `description` | text | 100 % | Full job description as plain text (details on). | `Description We are seeking …` |
| `descriptionHtml` | text | 100 % | The same description with foundit's HTML markup (details on). | `<h2><strong>Description</st…` |

**Meta**

| Column | Type | Filled | Meaning | Example |
|---|---|---|---|---|
| `scrapedAt` | text | 100 % | When the row was collected, ISO 8601 UTC. | `2026-10-25T12:34:52.556Z` |

Columns that need the job page (`description`, `descriptionHtml`, `cities`, `states`, `country`, `latitude`, `longitude`, `views`, `companyAbout`, `recruiterDesignation`, `recruiterProfileUrl`) exist only when `includeDetails` is on (41 columns without them, 52 with). `searchQuery` and `searchLocation` appear only when keywords or locations were given.

**Why some fill rates are low.** About 97 % of foundit's jobs are *aggregated* (collected from other sites): they carry the basics but rarely a salary, roles, qualifications, benefits or a recruiter block, while 65 % of the *employer-posted* jobs show a salary. See [honest limits](#honest-limits).

***

### Real output sample

Two real rows from the 2026-10-25 proof run, unmasked. Long texts are shortened with "…" and columns that are empty for the row are left out here to save space; the dataset has every column.

**1. An employer-posted job with salary**

```json
{
 "jobId": 69543035,
 "url": "https://www.foundit.in/job/environmental-monitoring-executive-visiontek-consultancy-services-private-limited-jharsuguda-69543035",
 "title": "Environmental Monitoring Executive",
 "companyName": "Visiontek Consultancy Services Private Limited",
 "isCompanyConfidential": false,
 "companyId": 503688,
 "companyUrl": "https://www.foundit.in/search/visiontek-consultancy-services-private-limited-503688-jobs-career",
 "location": "Jharsuguda",
 "isRemote": false,
 "experience": "2-3 Years",
 "experienceMinYears": 2,
 "experienceMaxYears": 3,
 "salary": "2,00,000-2,50,000 INR",
 "salaryMin": 200000,
 "salaryMax": 250000,
 "salaryCurrency": "INR",
 "employmentTypes": ["Full time"],
 "employerType": "Consultant",
 "industries": ["Manufacturing"],
 "functions": ["Manufacturing/Engineering/R&D"],
 "designations": ["Environmental Engineer"],
 "roles": ["Environmental Engineer"],
 "qualifications": ["Bachelor of Science (B.Sc)"],
 "skills": ["Stack Monitoring", "AAQM", "water sampling", "Effluent Sampling", "Environmental Monitoring"],
 "applicants": 2,
 "isQuickApply": true,
 "isGreatPlaceToWork": false,
 "postedAt": "2026-10-24T04:58:50.000Z",
 "firstPostedAt": "2026-10-24T04:58:50.000Z",
 "updatedAt": "2026-10-24T04:58:50.000Z",
 "expiresAt": "2026-12-22T18:30:00.000Z",
 "postingSource": "employer",
 "recruiterName": "Puspalata Giri",
 "benefits": ["Office cab/shuttle", "Health insurance"],
 "description": "Job Title: Environmental Monitoring Executive\nJob Location: [Odisha]\nExperience: 2-3 Years\nQualification: B.Sc. / M.Sc. in Chemistry, Environmental Science, or a related…",
 "descriptionHtml": "<h1>Job Title: Environmental Monitoring Executive</h1><p><strong>Job Location:</strong> [Odisha]</p><p><strong…",
 "cities": ["Jharsuguda"],
 "states": ["Odisha (Orissa)"],
 "country": "India",
 "latitude": 21.855438,
 "longitude": 84.006166,
 "views": 7,
 "scrapedAt": "2026-10-25T12:43:50.321Z"
}
```

**2. An aggregated job with an external apply link**

```json
{
 "jobId": 69555220,
 "url": "https://www.foundit.in/job/business-analyst-3-ops-oracle-bengaluru-bangalore-india-69555220",
 "title": "Business Analyst 3-Ops",
 "companyName": "Oracle",
 "isCompanyConfidential": false,
 "companyId": 441866,
 "companyUrl": "https://www.foundit.in/search/oracle-441866-jobs-career",
 "companyLogoUrl": "https://media.monsterindia.com/logos/xSP_orclinx/jdlogo.gif",
 "location": "Bengaluru, India",
 "isRemote": false,
 "experience": "6-10 Years",
 "experienceMinYears": 6,
 "experienceMaxYears": 10,
 "employmentTypes": ["Full time"],
 "employerType": "Company",
 "industries": ["IT/Computers - Hardware & Networking"],
 "functions": ["Business practice and Operations"],
 "designations": ["Software Engineer/Programmer"],
 "skills": ["Process Documentation", "no-code platforms", "AI agent", "Spreadsheets", "Rpa", "Reporting Tools"],
 "applicants": 1,
 "isQuickApply": false,
 "isGreatPlaceToWork": false,
 "postedAt": "2026-10-24T18:33:25.000Z",
 "firstPostedAt": "2026-10-24T18:33:25.000Z",
 "updatedAt": "2026-10-24T18:59:22.000Z",
 "expiresAt": "2026-12-08T18:30:00.000Z",
 "postingSource": "aggregated",
 "applyUrl": "https://careers.oracle.com/jobs/#en/sites/jobsearch/job/347675/?location=India&locationId=300000000106947",
 "recruiterName": "Oracle",
 "description": "The Customer Entitlement Services (CES) for Oracle Health provides validated customer assets and entitlement data to the Customer Deal Desk (CDD), Client Renewals, and Cl…",
 "descriptionHtml": "<div><p><span>The Customer Entitlement Services (CES) for Oracle Health provides validated customer assets and…",
 "cities": ["Bengaluru / Bangalore"],
 "states": ["Karnataka"],
 "country": "India",
 "latitude": 12.971599,
 "longitude": 77.594563,
 "views": 14,
 "companyAbout": "Oracle Corporation is an American multinational computer technology corporation headquartered in Austin, Texas…",
 "scrapedAt": "2026-10-25T12:35:18.508Z"
}
```

**CSV columns** (the order of the Excel / CSV export):

`jobId, url, title, companyName, isCompanyConfidential, companyId, companyUrl, companyWebsite, companyLogoUrl, location, isRemote, experience, experienceMinYears, experienceMaxYears, salary, salaryMin, salaryMax, salaryCurrency, employmentTypes, jobTypes, employerType, industries, functions, designations, roles, qualifications, skills, applicants, isQuickApply, isGreatPlaceToWork, walkIn, postedAt, firstPostedAt, updatedAt, expiresAt, postingSource, applyUrl, recruiterName, recruiterPhone, benefits, description, descriptionHtml, cities, states, country, latitude, longitude, views, companyAbout, recruiterDesignation, recruiterProfileUrl, scrapedAt`

In CSV and Excel exports the list and object columns (`skills`, `industries`, `cities`, `walkIn` …) hold JSON text.

***

### Scale and speed (measured)

All runs below were executed on the Apify platform on 2026-10-25 with the default settings (2,048 MB, direct connection plus the built-in load spreading).

| Run | Jobs | Time | Notes |
|---|---|---|---|
| Console pre-fill ("data analyst", 30 jobs, full details) | 30 | 11 s | first jobs saved after 1 s |
| Default settings, no filters, full details | 1,000 | 63 s | 13 search pages + 1,000 job pages |
| Proof run: no filters, full details | 12,000 unique | 957 s (16.0 min) | 13 jobs per second; 0 duplicates; peak memory 166 MB |
| One broad search, search cards only | 25,082 unique | 160 s | foundit counted 25,652 matches for "software"; 98 % read |

An earlier run of the same size the same day took 701 s (11.7 minutes): the speed depends on how busy foundit's per-address limit is at that moment.

In the proof run foundit answered 9 % of the attempts with a refusal (HTTP 403, a per-address rate limit); the Actor retried each one on a fresh address, so none failed and none was lost. Peak memory stayed far below the 2,048 MB default.

#### How the whole site is read

foundit lets anyone read **one search down to its 9,600th result** — the request offset is clamped at 9,500 and 100 results are returned per request (measured 2026-10-25), whatever the headline count says. The Actor therefore:

1. reads the first window of 9,600 newest jobs of every search;
2. if foundit reports more matches than that and `splitBroadSearches` is on, splits the search into slices — by **state** (foundit's 35 state filter values), and where a state slice is still too big by **years of experience** (single years 0 to 24, then 25 and above), and then by **employer type**;
3. reads each slice to its own 9,600th result, newest first, and **de-duplicates by `jobId`** across all slices and searches;
4. stops when 98 % of foundit's own count has been seen, when `maxResults` is reached, or when the time limit comes.

The `SUMMARY` record reports foundit's own match count, the share read (`coveragePercent`) and the number of searches that could not be read completely (`searchesCutAtWindow`). A status message that says *"N search(es) have more matches than foundit lets anyone read"* tells you that a search was cut at the window; narrow it with keywords or filters.

**Planning big runs.** With details the measured rate is about 13 jobs per second, which is arithmetic for roughly 45,000 jobs in the default 1-hour timeout; raise the run timeout (Run options) for more. Without details the same search runs several times faster. The Actor reads the timeout of the run, stops cleanly before it and reports `PARTIAL` with the number of jobs found but not read; jobs that were found but not read are neither saved nor charged. We did not read the entire board of about 189,765 jobs in one run during testing.

***

### What you pay

**A fixed price per job in the dataset — search pages, job pages, connections and compute are included.** No monthly rental, no charge for duplicates or for jobs your filters excluded.

| Apify plan | Price per 1,000 jobs | 1,000 jobs | 10,000 jobs | 100,000 jobs |
|---|---|---|---|---|
| Free | $1.50 | $1.50 | $15.00 | $150.00 |
| Bronze | $1.33 | $1.33 | $13.33 | $133.33 |
| Silver | $1.17 | $1.17 | $11.67 | $116.67 |
| Gold, Platinum, Diamond | $1.00 | $1.00 | $10.00 | $100.00 |

The price is the same with or without details. The 12,000-job proof run costs $18.00 on the Free plan and $12.00 on Gold; a daily refresh of 2,000 new jobs is about $90 a month on Free and $60 on Gold.

#### Maximum cost per run

Apify stops every pay-per-result run at its **Maximum cost per run** (you set it in the run options; the platform also applies a default). The Actor reads that limit when it starts, collects only what it covers, stops cleanly and says so: *"Saved 37 jobs — this run's maximum cost ($0.05) covers 37 results at the current price. Raise "Maximum cost per run" to get more."* (real message of a test run on 2026-10-25 — 37 jobs saved, 37 charged; the number depends on your plan's price). The run ends as **Succeeded**, the SUMMARY says `stoppedBy: "MAX_COST"`, and you pay only for the jobs in the dataset.

***

### Integrations

- **API, apify-client and webhooks** — see [Tutorial: run it from the API](#tutorial-run-it-from-the-api). A webhook on **Run succeeded** (Actor → Integrations → Webhooks) POSTs the dataset id to your endpoint or queue: the cleanest way to load new jobs into an ATS, CRM or job board.
- **Make, Zapier, n8n** — run `logiover/foundit-scraper` with your JSON input, then read the dataset items into Google Sheets, Slack, Telegram, e-mail, a CRM, Postgres or an LLM step.
- **Google Sheets and Airtable** — the Apify Google Sheets integration appends every scheduled run to a sheet; for Airtable use Make, Zapier or n8n, or import the CSV (`jobId` is the natural primary field).
- **Scheduling** — Actor → **Schedules**: run daily with `postedWithinDays: 1`, keep rows whose `jobId` you have not seen and drop rows whose `expiresAt` has passed.
- **Data warehouses (BigQuery, Snowflake, Postgres, S3)** — fetch `GET /v2/datasets/{id}/items?format=json` (or `csv`, `xlsx`, `xml`) from your ETL tool or trigger the load by webhook. Dates are ISO 8601, numbers are numbers, lists are arrays.
- **MCP and AI agents** — the Actor works with the Apify MCP server, so an assistant can call it as a tool ("find data analyst jobs in Pune posted this week that ask for SQL") and receive structured rows.

***

### Performance tips

- **Search cards first, details for a shortlist.** For a bulk export run with `includeDetails: false`, filter in your sheet, then paste the interesting job URLs into `startUrls` for full details.
- **Use foundit's filters instead of post-filtering** — `locations`, `minExperienceYears`, `maxExperienceYears`, `postedWithinDays`, `jobType`, `employerType`, `industries`, `functions` and `companies` shrink the search before anything is downloaded.
- **Keep newest-first** (the default): it is stable between page requests, which is what lets the Actor split big searches and de-duplicate safely.
- **Several keywords or cities in one run** — each search gets a fair share of `maxResults`, and jobs found by several searches are saved once.
- **Leave the proxy empty.** The direct connection plus Apify datacenter sessions is the fastest route; the residential rescue route switches on by itself only when everything else is refused.
- **Long runs need a long timeout.** Use the run options to raise it; the default is 1 hour.

***

### Troubleshooting: every status message explained

| Status / outcome | What it means | What to do |
|---|---|---|
| `COMPLETED: saved N jobs (the "maxResults" limit of N).` | You got what you asked for. | Raise `maxResults` (0 = no limit) for more. |
| `COMPLETED: saved N jobs.` | Every job the searches returned was read. N can differ from foundit's headline: duplicates are saved once and counts move during a run. | — |
| `COMPLETED: saved N jobs (this run's maximum cost of $X covers N results).` / `Saved N jobs — this run's maximum cost ($X) covers N results at the current price. Raise "Maximum cost per run" to get more.` | The run reached your **Maximum cost per run** (`stoppedBy: MAX_COST`). | Raise the limit. |
| `The run's maximum cost ($X) does not cover a single result — raise "Maximum cost per run".` | The limit is below the price of one job. | Raise the limit. |
| `PARTIAL: saved N jobs — K job page(s) could not be read (those rows keep their search-card fields and have no description).` | K job pages failed after retries; those jobs are saved from their search cards. | Paste those URLs into `startUrls` later. |
| `PARTIAL: … — K search page(s) could not be read (…)` | Some search pages failed after all retries. | Re-run later; the SUMMARY shows which search. |
| `PARTIAL: … — the run time limit was reached before K found job(s) could be read; raise the timeout to collect the rest.` | The timeout came first; the K jobs found but not read are neither saved nor charged (`foundButNotReadInTime`). | Raise the timeout in the run options. |
| `PARTIAL: … — K search(es) have more matches than foundit lets anyone read (9,600 per search); narrow them with keywords or filters.` | A search was cut at foundit's window (splitting off, relevance order, or a slice that is itself too big). | Add keywords, a location or filters; use newest-first with splitting on. |
| `EMPTY_RESULT: foundit answered, but no jobs match these filters right now. Widen the search (fewer filters, another keyword or location).` | The search exists and is empty (run **succeeds**). | Fewer filters; check industry, function and employer spelling. |
| `BLOCKED: no jobs collected — foundit could not be reached (…) after N attempt(s). This is an access failure, not an empty result.` | Every route was refused (run **fails**). | Re-run later; the SUMMARY's `statusCounts` and `lastError` say what happened. |
| `FETCH_FAILED: no jobs collected and N request(s) could not be read (…), so an empty result cannot be confirmed.` / `FETCH_FAILED: N job(s) were found but none could be read before the run time limit — raise the timeout.` | Connections or pages failed, so emptiness cannot be confirmed (run **fails**). | Re-run later or raise the timeout. |
| `INVALID_INPUT: "minExperienceYears" (a) is larger than "maxExperienceYears" (b).` | The range is the wrong way round (run **fails**). | Swap the numbers. |
| `INVALID_INPUT: None of the locations is known to foundit (…)` | Nothing in `locations` is in foundit's list (run **fails**). | Use the usual city name ("Bengaluru", "Pune"), a state, or "Remote". |
| `INVALID_INPUT: Every URL in "startUrls" was skipped — paste foundit.in search pages (/srp/results?query=…) or job pages (/job/…).` | None of the URLs is a foundit search or job page (run **fails**). | Paste foundit.in URLs. |
| Log: `Unknown location "…" — skipped …` / `"postedWithinDays" … is not one of 1, 3, 7, 15, 30, 60 — ignored.` / `Unknown "jobType" …` / `Unknown "employerType" …` | One value was not one foundit offers; the rest ran. | Use a listed value. |
| Log: `Relevance order can reshuffle between page requests …` | Relevance order was chosen; big searches are not split. | Use newest-first for deep runs. |
| Log: `Resumed after a platform restart: N job(s) already saved are not written or charged again.` | The platform moved the run to another server; nothing is saved or charged twice. | Nothing — informational. |
| Log: `foundit refused the direct connection (HTTP 403) — pausing it for N s …` / `foundit is refusing most of the … addresses …` | The per-address limit was hit; the run continues over datacenter sessions. | Nothing — informational. |
| Log: `Every other route is refused right now — using a small residential rescue route (capped) …` | All routes were refused at once; up to 12 MB of residential traffic per run keeps short runs alive. | Nothing; for very large runs in such a period, re-run later. |

***

### Honest limits

- **Salary is rare.** foundit shows a salary on 1.9 % of the proof run's jobs: on 65 % of employer-posted jobs but on 0.1 % of aggregated ones. Postings that hide the salary (foundit's "confidential" flags) have `null` salary columns. Amounts are in the posting's own unit and are mostly yearly; a few employers enter placeholder ranges (for example 0-1,000 INR) and foundit shows them as typed.
- **Most jobs are aggregated.** About 97 % of foundit's jobs come from other sites, so `qualifications`, `roles`, `benefits`, `recruiterDesignation` and `recruiterProfileUrl` are filled for the small employer-posted share only.
- **Experience is missing on 46 % of jobs** because the posting gives none; the columns are then `null`, not 0.
- **Locations.** `location` is foundit's text; `cities` / `states` are empty for jobs posted for "India" without a city. Coordinates come from foundit's own location list, which has a few wrong entries: a pair that lies outside India for an Indian city is repaired when it is merely swapped and dropped otherwise (16 of 10,550 rows in testing).
- **Near-identical postings.** Employers and aggregators often post the same role several times under different job ids; the Actor de-duplicates by `jobId` only.
- **Dates.** `postedAt` is the time foundit shows as "posted"; `firstPostedAt` is when foundit created the record. `firstPostedAt` is later than `postedAt` on some aggregated jobs (foundit created its record after the original posting date) and earlier on refreshed ones.
- **Hidden employers.** When an employer hides its name, `companyName`, `companyUrl`, `companyWebsite` and `companyLogoUrl` are `null` and `isCompanyConfidential` is `true`.
- **Contact data.** Recruiter phone numbers appear only on postings whose employer chose to publish them (about 2 in 1,000); no e-mail addresses are collected. The Actor never touches foundit's résumé database, candidate profiles or anything behind a login.
- **9,600 per search.** Splitting gets past it, but a slice that is itself bigger than 9,600 may be read incompletely; the SUMMARY says so. The entire board was not read in one run during testing.
- **Walk-in jobs are few** (25 on 2026-10-25).
- **Counters move.** `applicants` and `views` are foundit's counters at the moment the job page was read.
- **The site can change.** foundit may rename fields or move its search service; the Actor is maintained and updated when it does.

***

### How it compares

| | Copy and paste from the website | Browser extension or page scraper | A script you write yourself | foundit Scraper |
|---|---|---|---|---|
| Login | none | often your own session | needs care | none |
| One search deeper than 9,600 results | no | no | only with your own slicing logic | yes (state, experience and employer-type slices, de-duplicated) |
| Full description, coordinates, views | one job at a time | page by page | yes, if you build the second request | yes, one job page per job in parallel |
| Handling foundit's per-address limit | — | — | you build the pacing, retries and fallback | built in (paced exits, fresh datacenter sessions, capped residential rescue) |
| Dates as ISO timestamps, numbers as numbers | by hand | depends | by hand | yes |
| Scheduling and webhooks | no | no | you build it | Apify schedules, webhooks, API |
| Maintenance when the site changes | — | you | you | us |
| Cost | your time | a licence | engineering time | $1.50 → $1.00 per 1,000 jobs |

***

### FAQ

#### What is foundit Scraper?

An Apify Actor that reads foundit.in — India's job board, formerly Monster India — the way a browser does and returns every job as a clean row: title, company, locations, experience, salary where given, skills, industries, functions, dates, apply link and the full description.

#### What happened to Monster India — is foundit the same site?

Yes. Monster India now trades as foundit; some of its services still run under the monsterindia.com name. Jobs, employers and job ids are the same.

#### Is there an official foundit API?

We found no documented public API for foundit's job listings. The website's search page calls a JSON service; this Actor calls it the way a browser does, so you get structured data without writing or maintaining that code.

#### How do I export foundit jobs to Excel or CSV?

Run the Actor, open the **Output** (or Storage → Dataset) tab and choose **Export → Excel** or **CSV**; through the API add `?format=xlsx` or `?format=csv` to the dataset items URL.

#### Do I need a foundit account, login, cookies or an API key?

No. The Actor reads only what any visitor can see. You need an Apify account to run it.

#### Do I need proxies to scrape foundit?

No, leave the proxy field empty. foundit limits requests per IP address; the Actor paces itself, adds Apify datacenter sessions when the direct connection is refused, and uses a small capped residential rescue route only if everything else is refused.

#### How many jobs can I scrape from foundit?

About 189,765 jobs were live on 2026-10-25. One search can be read down to its 9,600th result; bigger searches are split by state, experience and employer type. The Actor delivered 12,000 unique jobs with details in 16.0 minutes and 25,082 unique jobs of one search without details in 160 seconds.

#### Why does foundit show about 189,765 jobs but one search stops at 9,600?

That is foundit's own window: its search service clamps the offset, so no search can be read past its 9,600th result. The Actor splits a search into slices below the window and merges them without duplicates ([how the whole site is read](#how-the-whole-site-is-read)).

#### How fast is it?

30 jobs with details in about 11 seconds, 1,000 in 63 seconds, 12,000 in 16.0 minutes; several times faster without details ([Scale and speed](#scale-and-speed-measured)).

#### How much does it cost to scrape foundit?

$1.50 per 1,000 jobs on the Free plan, falling to $1.00 on Gold and above; search pages, job pages, connections and compute are included ([What you pay](#what-you-pay)).

#### Can I get the salary of every job?

Only where the posting shows one: 1.9 % of the proof run's jobs (65 % of employer-posted, 0.1 % of aggregated ones). Hidden salaries are `null`; we never estimate or invent one.

#### Why is the salary empty for most jobs?

Most foundit jobs are collected from other sites and career pages, and those postings rarely state pay; foundit also lets employers mark the salary confidential.

#### In what unit is the salary — monthly or yearly?

`salary`, `salaryMin` and `salaryMax` are the posting's amounts in `salaryCurrency` (INR). Most are yearly CTC figures such as 4,50,000-8,50,000 (4.5 to 8.5 LPA); a few employers type monthly amounts, so check the magnitude before aggregating.

#### Can I filter jobs by experience?

Yes: `minExperienceYears` and `maxExperienceYears` use foundit's overlap filter. Rows carry `experience` ("4-8 Years") and numeric min / max years, `null` when the posting gives none.

#### Can I get jobs for a particular city?

Yes, put it in `locations` ("Bengaluru", "Pune", "Mumbai"). Names are checked against foundit's location list; a state name uses the state filter and "Remote" selects remote jobs.

#### Why do Delhi, Gurgaon and Noida return the same jobs?

foundit groups nearby places into one search area (Delhi NCR; Mumbai, Navi Mumbai and Thane …). The `location` column shows each job's real places, so you can filter afterwards.

#### Can I scrape work from home jobs?

Yes: `jobType: "Work From Home"` or `locations: ["Remote"]`. `isRemote` is true when the location says Remote or the job type is Work From Home.

#### Can I scrape walk-in interview jobs?

Yes: `jobType: "Walkin Job"`; the `walkIn` column has dates, times, city and addresses. foundit has few of them (25 on 2026-10-25).

#### Can I get fresher jobs?

Set `minExperienceYears: 0` and `maxExperienceYears: 0`. The filter also returns postings that state no experience, so check `experience` when you need explicit fresher roles.

#### Does it include the full job description?

Yes, with **Read every job's page** on (the default): `description` as plain text and `descriptionHtml` with foundit's markup.

#### Does it include the company's website?

`companyWebsite` is filled only when foundit lists one (0.1 % of the proof run); `companyUrl` is always the employer's foundit page and aggregated jobs carry the external `applyUrl`.

#### Does it get recruiters' phone numbers or e-mail addresses?

Only what foundit publishes: `recruiterPhone` is filled for postings whose employer chose to show contact details (about 2 in 1,000), unmasked and as foundit prints it. No e-mail addresses are collected and nothing behind a login is touched.

#### What do "employer" and "aggregated" mean in `postingSource`?

`employer`: posted on foundit by the employer (richer data, apply on foundit). `aggregated`: collected by foundit from another website or a career page; `applyUrl` leads there.

#### What is the difference between `postedAt`, `firstPostedAt` and `updatedAt`?

`postedAt` is the time foundit shows as "posted" (refreshed postings move forward), `firstPostedAt` is when foundit created the record, `updatedAt` its last update; all UTC ISO 8601. `expiresAt` is when foundit expires the posting.

#### Why is the company name missing on some jobs?

Employers can hide their name; the site then shows a row of asterisks. The Actor stores `null` in `companyName` and sets `isCompanyConfidential` to `true`.

#### Can I scrape the jobs of one company?

Yes: put the exact employer name in `companies`, or paste the employer's foundit page (any job's `companyUrl`) into `startUrls`.

#### Can I paste a foundit search URL with my filters?

Yes: `startUrls` accepts `/srp/results?…` search pages, SEO pages like `/search/python-jobs-in-pune` and employer pages; the URL's filters are used as they are.

#### Are duplicates removed?

By `jobId`, across all searches, slices and URLs of a run. Different ids for the same role (foundit lists reposts and near-identical jobs) are separate jobs.

#### How do I monitor new jobs every day?

Save your input as a task, set `postedWithinDays` to 1, add a daily schedule and use `jobId` as the key ([recipe 16](#16-daily-monitoring-of-new-jobs)).

#### Does it work for jobs outside India?

foundit also lists postings for the Gulf, Australia, Europe and other countries; they come back with their `country` and the coordinates foundit gives.

#### Why are some columns empty for some rows?

Because foundit does not give the value for that posting; see [Honest limits](#honest-limits) and the fill rates in the [data dictionary](#output-data-dictionary).

#### I need a field or filter that is missing. Can you add it?

Probably — write to us ([Support](#support)) with an example job URL and the field you need.

***

### Glossary

- **foundit** — India's job board, formerly Monster India. **नौकरी (job, employment)**, **फ्रेशर (fresher)**, **वेतन / सैलरी (salary)**, **अनुभव (experience)**, **नौकरी का विवरण (job description)** — the Hindi words behind most searches for job data.
- **CTC (cost to company)** — the yearly package an employer states; foundit salaries are mostly CTC. **LPA (lakhs per annum)** — yearly pay in lakh rupees; 1 lakh = 1,00,000 (4,50,000 INR = 4.5 LPA).
- **Walk-in** — a hiring drive where candidates come to a venue on given dates without an appointment (job type "Walkin Job").
- **Consultant** — foundit's employer type for recruitment firms; **Company** is a direct employer.
- **Aggregated job** — collected by foundit from another website or career page; **employer-posted job** — posted on foundit by the employer.
- **Quick Apply** — applying with your foundit profile without leaving the site. **Great Place To Work (GPTW)** — a workplace certification foundit shows as a badge.
- **Designation** — foundit's job-title category (for example "Software Engineer/Programmer"); **function** and **industry** — the department and the sector of a posting.
- **NCR** — the National Capital Region around Delhi (Gurgaon / Gurugram, Noida, Faridabad, Ghaziabad). **JD** — job description. **Notice period** — the time a working candidate serves before joining.
- **Window** — foundit's limit of 9,600 readable results per search.

***

### Is it legal to scrape foundit?

The Actor reads only information that foundit shows to any visitor without a login, at a modest pace, the way a browser does. Collecting publicly available data is generally lawful, but your use of it is your responsibility: check foundit's terms of use, keep to the purpose you have a legal basis for, and do not use the data to harass, spam or discriminate. Recruiter names and phone numbers are personal data — under India's **Digital Personal Data Protection Act, 2023 (DPDP Act)** and, for people in the EU, the **GDPR**, you need a lawful purpose, must keep the data secure, and must honour deletion requests. The Actor never accesses résumés, candidate profiles or anything behind a login. This section is general information, not legal advice.

***

### Changelog

- **1.0 — 2026-10-25** — first release: keyword, location and filter searches, URL input, full job details, automatic splitting beyond foundit's 9,600-results-per-search limit, pay per result with a maximum-cost guard.

***

### Support

Questions, a missing field, or a job that looks wrong? Open an issue from the Actor page (the **Issues** tab) with the run link or the job URL — we reply within 24 hours.

# Changelog

This Actor's version history is a separate document: https://apify.com/logiover/foundit-scraper/changelog.md

# Actor input Schema

## `searchQueries` (type: `array`):

Job titles, skills or company names, one per line, exactly like foundit's search box (e.g. "data analyst", "python", "sales executive", "Tata Consultancy Services"). Every line is a separate search and results are de-duplicated. All words of a line must match; put a comma inside a line to mean OR ("java, python"). Leave empty to list every job.

## `locations` (type: `array`):

Cities, states or "Remote", one per line ("Bengaluru", "Pune", "Mumbai", "Karnataka", "Remote"). foundit groups nearby cities: Delhi, Gurgaon and Noida return the same Delhi NCR set, Mumbai, Navi Mumbai and Thane the same Mumbai region set — the `location` column shows each job's real city. Unknown names are reported and skipped. Leave empty for all of India.

## `minExperienceYears` (type: `integer`):

Only jobs whose required experience range overlaps this range (foundit's own experience filter). Leave both fields empty for any experience; 0 and 0 gives fresher-friendly jobs.

## `maxExperienceYears` (type: `integer`):

Upper end of the experience range, in years. See "Experience from".

## `postedWithinDays` (type: `string`):

Only jobs foundit listed as new within this many days (foundit's own freshness filter).

## `jobType` (type: `string`):

foundit's job-type filter: work from home, contract, walk-in drives, jobs for women, or permanent jobs.

## `employerType` (type: `string`):

Direct employers (Company) or recruitment firms (Consultant).

## `industries` (type: `array`):

foundit industry names exactly as the `industries` column shows them, one per line (e.g. "IT/Computers - Software", "Banking/Accounting/Financial Services", "Real Estate"). A name foundit does not know matches nothing.

## `functions` (type: `array`):

Job functions exactly as the `functions` column shows them, one per line (e.g. "Information Technology", "Sales", "Human Resources").

## `companies` (type: `array`):

Employer names exactly as foundit shows them (e.g. "Tata Consultancy Services", "Accenture"), one per line. Only jobs of these employers.

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

Optional: paste foundit search pages (https://www.foundit.in/srp/results?query=java\&locations=pune\&experienceRanges=2~5), SEO search pages (https://www.foundit.in/search/python-jobs-in-pune), employer pages (…/search/…-jobs-career) or single job pages (https://www.foundit.in/job/…-69548725). Search pages are read to the end of what foundit lets anyone read; job pages are read one by one.

## `sortBy` (type: `string`):

Newest first (recommended: stable order, lets the Actor split searches beyond 9,600 results) or foundit's relevance order.

## `includeDetails` (type: `boolean`):

On (recommended): open every job for the full description (text and HTML), structured cities, states and coordinates, views, employer description and recruiter. Off: only the search-card fields, much faster.

## `splitBroadSearches` (type: `boolean`):

foundit lets anyone read at most 9,600 results of one search. With this on, a search with more matches is split automatically (by state, experience and employer type) so that the run can collect more; everything is de-duplicated. Needs "Newest first".

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

Stop after this many jobs in total (0 = no limit). On 2026-10-25 foundit listed about 192,800 live jobs.

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

Leave empty: the Actor connects directly and switches on its own to the Apify datacenter proxy and, if needed, a small residential rescue route when foundit refuses the platform's address. Set a proxy here only to force one.

## Actor input object example

```json
{
  "searchQueries": [
    "data analyst"
  ],
  "locations": [],
  "postedWithinDays": "",
  "jobType": "",
  "employerType": "",
  "industries": [],
  "functions": [],
  "companies": [],
  "startUrls": [],
  "sortBy": "newest",
  "includeDetails": true,
  "splitBroadSearches": true,
  "maxResults": 30,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `results` (type: `string`):

All foundit jobs collected in this run.

# 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 = {
    "searchQueries": [
        "data analyst"
    ],
    "maxResults": 30
};

// Run the Actor and wait for it to finish
const run = await client.actor("logiover/foundit-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 = {
    "searchQueries": ["data analyst"],
    "maxResults": 30,
}

# Run the Actor and wait for it to finish
run = client.actor("logiover/foundit-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 '{
  "searchQueries": [
    "data analyst"
  ],
  "maxResults": 30
}' |
apify call logiover/foundit-scraper --silent --output-dataset

```

## MCP server setup

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