# Foundit Jobs Scraper (Monster India, Gulf & SE Asia) (`mina_safwat/foundit-jobs-scraper`) Actor

Scrapes job listings from foundit (formerly Monster) in India, Singapore, Malaysia, Indonesia, the Philippines, Hong Kong and the Gulf: title, company, location, experience, salary, skills, posted and expiry dates, apply link, and optionally the full description.

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

## Pricing

$1.50 / 1,000 jobs

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

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

### What does Foundit Jobs Scraper do?

**Foundit Jobs Scraper** collects **job listings from [foundit](https://www.foundit.in)**, the job site formerly known as **Monster India, Monster Gulf and Monster South-East Asia**. It works on all seven foundit sites: **India (foundit.in), Singapore (foundit.sg), Malaysia (foundit.my), Indonesia (foundit.id), the Philippines (foundit.com.ph), Hong Kong (foundit.hk)** and **the Gulf (founditgulf.com)**. Search on foundit as you normally would, paste the link, and get every job as a clean row: **title, company, location, years of experience, yearly salary range with currency, employment type, industry, function, skills, posted, updated and expiry dates, number of applicants, apply link** and, on request, the **full description, job types, company description, view count and every job location with coordinates**.

**Every filter in your link is kept**: keywords, location, experience, job freshness, industry, function, sort order and anything else foundit puts in the address.

Try it with the prefilled search: open the Actor, click **Start**, and 50 Python developer jobs in Bengaluru are ready in about five seconds. Running on the Apify platform also gives you API access, scheduled runs, integrations (Google Sheets, Make, Zapier, Slack, webhooks) and run monitoring.

### Why scrape foundit?

- **Salary benchmarking in India, South-East Asia and the Gulf.** Where employers publish pay, the Actor gives the yearly range as numbers in the site's currency (INR, SGD, MYR, IDR, PHP, HKD, AED).
- **Skills and labour market research.** Track which skills, functions and experience levels employers ask for, by city and country.
- **Recruitment and sales leads.** See which companies are hiring, for what, and where.
- **Job aggregation.** Feed a niche job board, newsletter or internal tool with fresh, structured listings, with the original apply link of each job.
- **Monitoring.** Schedule a daily run on a search filtered to the last day and keep only the job IDs you have not seen.

### How to scrape foundit jobs

1. Open the foundit site for your country, for example [foundit.in](https://www.foundit.in) or [founditgulf.com](https://www.founditgulf.com), and search: type the job title or skill, choose a location, then set any filters (experience, freshness, industry, function, sort order).
2. Copy the address from your browser's address bar, for example `https://www.foundit.in/srp/results?query=python%20developer&locations=bengaluru`.
3. Paste it into **foundit search or job links**. Add as many links as you like, one per line; sites can be mixed.
4. Set **Max jobs per search link**, and turn on **Include job details** if you need full descriptions.
5. Click **Start**, then download the results as JSON, CSV, Excel or HTML.

### Input

Everything is set on the Input tab. In JSON, the input looks like this:

```json
{
    "startUrls": [
        "https://www.foundit.in/srp/results?query=python%20developer&locations=bengaluru&experienceRanges=5~8&jobFreshness=7",
        "foundit.sg/srp/results?query=accountant",
        { "url": "https://www.founditgulf.com/srp/results?query=engineer&locations=dubai" },
        "https://www.foundit.in/search/infosys-671064-jobs-career",
        "https://www.founditgulf.com/job/pre-sales-solution-architect-ericsson-saudi-arabia-riyadh-69435207"
    ],
    "maxResults": 100,
    "includeDescription": false
}
```

| Field | What it does |
|---|---|
| `startUrls` | foundit links, one per line. Search results links (`/srp/results?...`) keep every filter. Keyword, city and company pages such as `/search/python-jobs-in-bangalore` or `/search/infosys-671064-jobs-career` are turned into the same search; a Gulf-wide page such as `/search/java-jobs-in-gulf` searches all of founditgulf.com. A single job link (`/job/...-69435207`) gives that one job. Old `monsterindia.com`, `monstergulf.com`, `monster.com.sg`, `monster.com.my`, `monster.co.id`, `monster.com.ph` and `monster.com.hk` links are read as their foundit sites. `https://` is optional, and API callers can also send `{"url": "…"}` objects. |
| `maxResults` | Stops after this many jobs from each search link. Default: 100. foundit returns up to 100 jobs per request and serves at most the first 10,000 results of any search. |
| `includeDescription` | Reads each job's details to add the full description (HTML and plain text), job types, the company's description, view count and every job location with coordinates. Default: off. It takes one extra request per job, so it is slower and charged a little extra per job (see the Pricing tab). |
| `proxyConfiguration` | Leave empty. The Actor connects directly and falls back to Apify Proxy on its own (datacenter, then residential in the site's country). Choosing a proxy sends every request through it; Apify's datacenter proxy is refused by foundit more often than not. |

#### Which filters are kept?

All of them: the Actor keeps the query string of your link as it is and only adds paging. Some examples of what foundit puts in its links:

| On foundit | In the link |
|---|---|
| Keywords | `query=python%20developer` |
| Location | `locations=bengaluru` |
| Experience (years) | `experienceRanges=5~8` |
| Job freshness (days) | `jobFreshness=7` |
| Industry | `industries=IT%2FComputers%20-%20Software` |
| Company | `companyIds=671064` |

### Output

Each job becomes one row. Here is a real one from foundit.sg with job details turned on, with the long texts shortened:

```json
{
    "jobId": 69405427,
    "title": "Fund Accountant (Consolidation 12m contract)",
    "companyName": "michael page international pte ltd",
    "companyId": 152063,
    "companyLogo": "https://media.monsterindia.com/logos/xmpsghkx/jdlogo.gif",
    "locations": "Singapore",
    "experienceMinYears": 3,
    "experienceMaxYears": 6,
    "salaryMin": 66000,
    "salaryMax": 90000,
    "salaryCurrency": "SGD",
    "salaryHidden": false,
    "employmentTypes": ["Full time"],
    "industries": ["Other"],
    "functions": ["Investment And Asset Management"],
    "skills": ["Tagetik", "Forecasting", "Management Reporting", "Financial Analysis", "Budgeting", "SAP", "Microsoft Excel"],
    "postedAt": "2026-10-09T17:17:30Z",
    "updatedAt": "2026-10-09T17:17:30Z",
    "expiresAt": "2026-11-07T18:30:00Z",
    "totalApplicants": 0,
    "quickApply": false,
    "jobSource": "SCRAPPING",
    "applyUrl": "http://www.michaelpage.com.sg/?gclid=CjwKEAjw8Jy8BRCE0pOC9qzRhkMSJABC1pvJzRFbMgzeDyHIZ_W9MmiVV91NA-pBytuZcNiEl74OsRoC41Pw_wcB",
    "jobUrl": "https://www.foundit.sg/job/fund-accountant-consolidation-12m-contract-michael-page-international-pte-ltd-singapore-69405427",
    "site": "foundit.sg",
    "market": "Singapore",
    "description": "<div><ul><li>Exposure to regional fund consolidation and financial reporting</li>...",
    "descriptionText": "• Exposure to regional fund consolidation and financial reporting\n• Opportunity to work with a leading investment and asset management platform\nAbout Our Client...",
    "companyDescription": "Michael Page International is a leading professional recruitment consultancy specialising in the recruitment of permanen...",
    "jobTypes": ["Permanent Job"],
    "views": 2,
    "jobLocations": [
        { "city": null, "state": null, "country": "Singapore", "countryCode": "SG", "latitude": 1.352083, "longitude": 103.819836 }
    ],
    "searchUrl": "https://www.foundit.sg/srp/results?query=accountant",
    "scrapedAt": "2026-10-11T07:45:56Z"
}
```

You can download the dataset in various formats such as JSON, HTML, CSV, or Excel. The Output tab has two views: **Jobs** (the main columns) and **Full details**.

### Data fields

| Field | Description |
|---|---|
| `jobId` | foundit's job number. |
| `title` | Job title. |
| `companyName` | Company name, as foundit writes it. Empty when the employer hides it. |
| `companyId` | foundit's company number (the one in company page links). |
| `companyLogo` | The company logo, when foundit has one. |
| `locations` | The job's places as foundit lists them, for example "Bengaluru, India" or "Saudi Arabia, Riyadh". |
| `experienceMinYears`, `experienceMaxYears` | Years of experience asked for. Empty when the job does not say. |
| `salaryMin`, `salaryMax` | The **yearly** pay range as numbers. Empty when the employer gave no pay or chose to hide it. |
| `salaryCurrency` | `INR`, `SGD`, `MYR`, `IDR`, `PHP`, `HKD`, `AED`, … Empty when there is no pay range. |
| `salaryHidden` | `true` when the employer marked the pay as confidential; foundit does not show it, and neither does the Actor. |
| `employmentTypes` | Such as "Full time". |
| `industries`, `functions` | The employer's industry and the job's function, as foundit labels them. |
| `skills` | Skills listed on the job. |
| `postedAt`, `updatedAt` | When the job was posted and last updated on foundit, in UTC. |
| `expiresAt` | When the listing closes on foundit, in UTC. |
| `totalApplicants` | Applicants foundit counts for the job; often 0 for jobs that are applied for on another site. |
| `quickApply` | `true` when the job is applied for on foundit itself (foundit's Quick Apply). |
| `jobSource` | `ORGANIC` for jobs posted on foundit by the employer, `SCRAPPING` (foundit's spelling) for jobs foundit collected from company career sites and other boards; most of those are applied for at `applyUrl`. |
| `applyUrl` | Where to apply, when that is outside foundit (company career site, LinkedIn, a government job bank, …). Empty for jobs applied for on foundit itself, and for some collected jobs that carry no outside link. |
| `jobUrl` | The job's page on foundit. |
| `site`, `market` | The foundit site the job was found on (`foundit.in`, `founditgulf.com`, …) and its market (India, Singapore, Malaysia, Indonesia, Philippines, Hong Kong, Gulf). A site can list jobs from neighbouring countries, so check `locations` for the job's own place. |
| `description`, `descriptionText` | The full job description, as HTML and as plain text with one line per paragraph or bullet (only with **Include job details**). |
| `companyDescription` | The company's own description, when foundit has one (only with details). |
| `jobTypes` | Such as "Permanent Job" or "Work From Home" (only with details; search results leave this out). |
| `views` | How many times the job has been viewed on foundit (only with details). |
| `jobLocations` | Every place of the job with city, state, country, two-letter country code and coordinates (only with details). |
| `searchUrl` | The link you pasted that found this job. |
| `scrapedAt` | When the job was collected, in UTC. |

The six detail fields are left out of the rows entirely when details are off. A job whose details could not be read is still saved, with those fields empty, and is not charged the details price; the run's status message says how many.

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

The Actor uses **pay-per-event** pricing: you pay a small fixed price for each job saved, and a small extra price for each job saved with its details. The exact prices are on the **Pricing** tab.

Details cost extra because foundit returns 100 jobs in one search request but needs one request per job for its details, so a run with details makes about 100 times as many requests.

You are never charged for links that return nothing: a search with no jobs, a search whose filters foundit rejects, an expired job or a link that is not a foundit search is listed in the run's `FAILED_INPUTS` record instead. If you set a maximum cost for a run, the Actor stops as soon as it is reached.

### Tips for scraping foundit

- **Let foundit filter for you.** Narrow the search on foundit (location, experience, freshness, industry) before copying the link. foundit applies the filters itself, so you only collect, and pay for, matching jobs.
- **Big searches stop at 10,000 jobs.** foundit serves no results past the 10,000th, however you page. Split a bigger search by location, experience or freshness.
- **Monitor new jobs** by scheduling a daily run on a link with `jobFreshness=1` and keeping only job IDs you have not seen.
- **Leave job details off** unless you need the description: runs are much faster and cheaper, and every row still has title, company, location, experience, pay, skills and dates.
- The same job found by two of your links is saved once.

### FAQ, disclaimers and support

**Which sites are supported?** foundit.in, foundit.sg, foundit.my, foundit.id, foundit.com.ph, foundit.hk and founditgulf.com, plus the old Monster links of those markets. **monster.com** (Monster in the US and Europe) is a different company's site and is not supported.

**Why do many jobs have no salary?** Most employers on foundit do not publish pay, and some publish a range but mark it confidential. Both come back empty; `salaryHidden` tells the second case apart.

**Why do many jobs link to LinkedIn or company sites?** foundit lists many jobs it collected from other boards and career sites (`jobSource` `SCRAPPING`). Their `applyUrl` is where the job is really applied for.

**What happens to links that return nothing?** They are not saved as rows, so you are not charged for them. Each is listed with its reason (no jobs match the search, foundit rejected the search's filters, job expired or removed, not a foundit search) in the `FAILED_INPUTS` record of the run's key-value store, and the run's status message gives the counts. A run fails only when every link could not be loaded.

**Is it legal to scrape foundit?** This Actor collects publicly posted job listings that employers publish so that people can find and apply for them. It does not collect recruiters' names or phone numbers. foundit's robots.txt asks automated clients not to use the interface this Actor reads; you are responsible for making sure your use complies with foundit's terms and with the laws that apply to you, such as data protection and copyright rules for republishing descriptions. If in doubt, ask a lawyer.

**Found a problem or need a custom solution?** Open an issue on the **Issues** tab and we will look into it. Custom scrapers and job data feeds are available on request.

# Actor input Schema

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

One link per line. Search on foundit.in, foundit.sg, foundit.my, foundit.id, foundit.com.ph, foundit.hk or founditgulf.com, set any filters (experience, freshness, location, industry, sort order, ...), then copy the address bar, for example https://www.foundit.in/srp/results?query=python%20developer\&locations=bengaluru. Every filter in the link is kept. Keyword, city and company pages such as https://www.foundit.in/search/python-jobs-in-bangalore work too, and so do single job links (https://www.foundit.in/job/...-69429854). Old Monster India, Monster Gulf and Monster SE Asia links are read as their foundit sites. Links without https:// are fine. monster.com (US and Europe) is not supported.

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

Stops after this many jobs from each search link. foundit returns up to 100 jobs per request and serves at most the first 10,000 results of any search; narrow a bigger search with filters.

## `includeDescription` (type: `boolean`):

Reads each job's details to add the full description (HTML and plain text), the company's description, view count and every job location with its state, country code and coordinates. This takes one extra request per job (search results bring 100 jobs per request), so it is slower and each job read this way is charged a little extra; see the Pricing tab.

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

Leave this empty. The Actor connects directly first and falls back to Apify's datacenter proxy, then residential proxy in the site's country, on its own. Choose a proxy here only to send every request through it.

## Actor input object example

```json
{
  "startUrls": [
    "https://www.foundit.in/srp/results?query=python%20developer&locations=bengaluru"
  ],
  "maxResults": 50,
  "includeDescription": false,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `dataset` (type: `string`):

No description

# 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 = {
    "startUrls": [
        "https://www.foundit.in/srp/results?query=python%20developer&locations=bengaluru"
    ],
    "maxResults": 50
};

// Run the Actor and wait for it to finish
const run = await client.actor("mina_safwat/foundit-jobs-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 = {
    "startUrls": ["https://www.foundit.in/srp/results?query=python%20developer&locations=bengaluru"],
    "maxResults": 50,
}

# Run the Actor and wait for it to finish
run = client.actor("mina_safwat/foundit-jobs-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 '{
  "startUrls": [
    "https://www.foundit.in/srp/results?query=python%20developer&locations=bengaluru"
  ],
  "maxResults": 50
}' |
apify call mina_safwat/foundit-jobs-scraper --silent --output-dataset

```

## MCP server setup

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