# MyCareersFuture Scraper - Singapore Jobs & Salaries (`scrapewise/mycareersfuture-scraper`) Actor

Scrape MyCareersFuture (Singapore) without login: jobs by keyword, category, salary, company UEN or all open jobs, with salary range, employer UEN and industry, applications, views, skills and description. US$ 2 per 1,000.

- **URL**: https://apify.com/scrapewise/mycareersfuture-scraper.md
- **Developed by:** [Scrapewise Data](https://apify.com/scrapewise) (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 $3.40 / 1,000 job delivereds

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

## MyCareersFuture Scraper: Singapore jobs, salaries and employers

Scrape [MyCareersFuture](https://www.mycareersfuture.gov.sg/), Singapore's national job portal, **without an account,
API key or browser**. Search by keyword, category, salary, employment type, seniority or company UEN, or take **every
open job in Singapore** (about 90,000), and get one clean row per job: **title, salary range in SGD, employer name and
UEN, industry (SSIC), company size, employment type, position level, category, years of experience, skills, number of
applications and views, posting and expiry dates, workplace district and the full job description**.

Built for recruiters and staffing agencies tracking who is hiring, HR and compensation teams benchmarking salaries,
job boards and aggregators, labour-market researchers, and sales teams looking for companies that are growing.

**US$ 2.00 per 1,000 jobs. No start fee, no monthly fee. Error rows, duplicates and jobs outside your filters are
free.**

### At a glance

- **Price per 1,000 jobs, Free plan:** US$ 2.00
- **Fee per run start:** None
- **Keyword search that matches the website:** Yes (the site's own search)
- **All open jobs in Singapore in one run:** Yes, newest first
- **Filters: category, salary, type, level, company UEN:** Yes
- **"Posted in the last N days" that stops paging early:** Yes
- **Applications and views per job:** Yes
- **Resumes after a platform restart without charging twice:** Yes

### What you can do with it

- **Daily feed of new jobs.** `allJobs: true`, `postedWithinDays: 1` gives every job posted in Singapore since
  yesterday. The Actor reads newest first and stops paging as soon as it reaches older jobs.
- **Salary benchmarking.** Search "data analyst" or "staff nurse" and get the posted monthly salary range of every
  open role, with seniority, experience and industry, ready for a pivot table.
- **Who is hiring.** Filter by category ("Information Technology", "Banking and Finance") and read company name, UEN,
  SSIC industry and company size. Use `excludeAgencies` to keep direct employers only.
- **Watch competitors or clients.** Put their UENs in `companyUens` and get all their open roles on every run.
- **Reuse a search you already have.** Paste a MyCareersFuture search link or a single job link.

### Input

| Field | What it does |
|---|---|
| `searchTerms` | Keywords, one per line (data analyst, nurse, software engineer). Uses MyCareersFuture's own search. |
| `startUrls` | MyCareersFuture search links, job links or company links. Filters in a search link are kept. |
| `allJobs` | Every open job in Singapore, newest first, narrowed by the filters. |
| `companyUens` | All open jobs of these companies (Singapore UEN, for example 198103792H). |
| `categories` | MyCareersFuture categories (Information Technology, Engineering, Healthcare / Pharmaceutical...). |
| `employmentTypes` | Full Time, Permanent, Contract, Part Time, Temporary, Freelance, Internship/Attachment. |
| `positionLevels` | Fresh/entry level up to Senior Management. |
| `minSalary` | Minimum monthly salary in SGD (MyCareersFuture's own filter). |
| `sortBy` | `newest` (default) or `relevance` for keyword searches. |
| `maxResultsPerSearch` | Jobs per term, company or link. Default 100. |
| `maxItems` | Hard cap on charged jobs for the whole run. |
| `postedWithinDays` | Only jobs posted in the last N days (free filter). |
| `maxYearsExperience` | Only jobs asking for at most N years (free filter). |
| `excludeAgencies` | Skip jobs posted by agencies on behalf of a client (free filter). |
| `withSalaryOnly` | Skip jobs with a hidden salary (free filter). |
| `excludeKeywords` | Skip jobs whose title has any of these words (free filter). |
| `includeDescription` | Full description as plain text (default on). Same price either way. |

Example: every IT job posted in the last 7 days that pays at least SGD 8,000 a month, direct employers only.

```json
{
  "allJobs": true,
  "categories": ["Information Technology"],
  "minSalary": 8000,
  "postedWithinDays": 7,
  "excludeAgencies": true,
  "maxResultsPerSearch": 2000
}
```

An empty input runs a small example (20 jobs for "data analyst"), so the Actor never fails on a blank form.

### Output

One real row from a local test run on 2026-09-30 (search "analyst", descriptions shortened):

```json
{
  "type": "job",
  "jobId": "2a54e095a4069ecee96739cdcec3daba",
  "jobPostId": "MCF-2026-1723144",
  "title": "Analyst, SEA Team",
  "url": "https://www.mycareersfuture.gov.sg/job/banking-finance/analyst-sea-team-cvc-asia-pacific-2a54e095a4069ecee96739cdcec3daba",
  "companyName": "CVC ASIA PACIFIC (SINGAPORE) PTE. LTD.",
  "companyUen": "200701926C",
  "companyWebsite": null,
  "companyIndustry": "CORPORATE FINANCE ADVISORY SERVICES",
  "companySsicCode": "66192",
  "companyEmployeeCount": null,
  "companyLogoUrl": "https://static.mycareersfuture.gov.sg/images/company/logos/eb4b6fc0ddd0dcc5759c55954eeff239/cvc-asia-pacific.png",
  "companyDescription": "CVC Asia Pacific (Singapore) Pte. Ltd. (\"CVC\") is one of the world's leading private equity ...",
  "hiringCompanyName": null,
  "hiringCompanyUen": null,
  "postedByAgency": false,
  "salaryMin": 10000,
  "salaryMax": 11000,
  "salaryPeriod": "Monthly",
  "salaryCurrency": "SGD",
  "salaryHidden": false,
  "employmentTypes": ["Permanent"],
  "positionLevels": ["Professional"],
  "categories": ["Banking and Finance"],
  "minimumYearsExperience": 5,
  "numberOfVacancies": 1,
  "skills": ["Due Diligence", "Investment Analysis", "Financial Modelling", "Risk Analysis", "Vietnamese"],
  "keySkills": [],
  "flexibleWorkArrangements": [],
  "governmentSchemes": [],
  "workingHours": null,
  "shiftPattern": null,
  "district": "D01 Marina, Raffles Place, People's Park, Cecil",
  "region": "Central",
  "address": "9 RAFFLES PLACE, REPUBLIC PLAZA, Singapore 048619",
  "postalCode": "048619",
  "latitude": 1.28319353228376,
  "longitude": 103.850836660214,
  "isOverseas": false,
  "postedDate": "2026-09-30",
  "originalPostedDate": "2026-09-30",
  "expiryDate": "2026-10-14",
  "updatedAt": "2026-09-30T00:50:19.000Z",
  "applications": 0,
  "views": 3,
  "repostCount": 0,
  "status": "Open",
  "ssocCode": "33499",
  "occupationId": "OCC008583",
  "otherRequirements": null,
  "description": "CVC is one of the world's leading private equity and investment advisory firms ...",
  "searchTerm": "analyst",
  "position": 1,
  "source": "term:analyst",
  "scrapedAt": "2026-09-30T01:40:45Z",
  "errorCode": null,
  "error": null
}
```

- `salaryMin`/`salaryMax` are the monthly range the employer posted, in SGD. When the employer hides the salary,
  `salaryHidden` is `true` and the amounts are empty.
- `hiringCompanyName` is filled when a recruitment agency (`companyName`) posts on behalf of a client.
- `address` and the coordinates are the workplace the employer published; they are empty when the employer hides them.
- `ssocCode` is the Singapore Standard Occupational Classification code, handy for grouping titles.

The run also saves `SEARCH_SUMMARY` in its key-value store: for each term, company or link, how many jobs
MyCareersFuture has and how many were delivered (free).

#### Error rows (never charged)

| errorCode | When |
|---|---|
| `NO_RESULTS` | MyCareersFuture has no open jobs for the search with your filters. |
| `NOT_FOUND` | The job link does not exist or the job was removed. |
| `INVALID_URL` | The link is not a MyCareersFuture search, job or company link. |
| `BLOCKED` | MyCareersFuture did not answer after several attempts. |
| `INVALID_INPUT` | A field has a value the Actor cannot use (the message says which). |
| `UNEXPECTED` | Anything else; the rest of the run continues. |

### Pricing

Pay per event, no start fee:

| Event | Price per 1,000 (Free plan) | Charged for |
|---|---|---|
| Job delivered | **US$ 2.00** | each unique job |

Examples: 1,000 jobs cost US$ 2.00; a daily feed of about 1,500 new jobs costs about US$ 3.00 a day. Error rows,
duplicates and filtered-out jobs are free, and `maxItems` is a hard stop.

### How it works and limits

- It reads the same public data the MyCareersFuture website shows, from the portal's own JSON API, over plain HTTP.
  No login, no browser. Keyword searches use the site's own search, so you get the same jobs you would see there.
- Only open jobs are listed by MyCareersFuture; closed and expired jobs disappear from the portal.
- Keyword searches fetch each job's full page for the description and experience fields; turn
  `includeDescription` off for faster runs when you only need titles, salaries and employers.
- **No personal data.** Rows carry employer data only (company name, UEN, industry, size, website, logo, workplace).
  The Actor never returns the poster's account IDs, and email addresses, phone numbers, agency personnel names and
  personnel registration numbers written inside descriptions are replaced by `[contact removed]`.

### FAQ

**Do I need a MyCareersFuture or Singpass account?** No. Everything comes from public job pages.

**How many jobs can I get?** All of them: MyCareersFuture lists about 90,000 open jobs and `allJobs` pages through
the whole list, newest first.

**Is the salary always there?** Almost always: in our tests over 99% of jobs had a posted salary range.

**What if the run is restarted by the platform?** Jobs already in the dataset are not charged again: the Actor reads
its own dataset when it starts and skips what was delivered.

**How fast is it?** In our tests: 250 new jobs in 11 to 34 s from the all-jobs feed; 130 keyword results with full
descriptions in 17 to 25 s.

### Changelog

- **0.1 (2026-09-30):** first version: keyword search, all-jobs feed, company UENs, links, category, salary, type,
  level and date filters, resume after restart.

Independent tool, not affiliated with Workforce Singapore or the Government of Singapore.

# Actor input Schema

## `searchTerms` (type: `array`):

Job titles, skills or keywords, one per line (for example: data analyst, nurse, software engineer, accountant). Each term is sent to MyCareersFuture's own search and returns up to 'Max results per search' jobs.

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

Links copied from mycareersfuture.gov.sg: a search page (https://www.mycareersfuture.gov.sg/search?search=python\&salary=6000), a single job page (https://www.mycareersfuture.gov.sg/job/...) or a company page. Filters in a search link are kept.

## `allJobs` (type: `boolean`):

Ignore keywords and take every open job on MyCareersFuture (about 90,000), newest first, narrowed by the filters below. Use with 'Max results per search' or 'Max jobs in total'.

## `companyUens` (type: `array`):

All open jobs of these companies, by Singapore UEN, one per line (for example 198103792H). The UEN is in every row as companyUen.

## `categories` (type: `array`):

MyCareersFuture job categories (a job matching any of them is kept). Empty = all.

## `employmentTypes` (type: `array`):

Full Time, Permanent, Contract, Part Time, Temporary, Freelance, Internship. Empty = all.

## `positionLevels` (type: `array`):

Seniority as posted by the employer. Empty = all.

## `minSalary` (type: `integer`):

Only jobs whose monthly salary range reaches at least this amount in SGD (MyCareersFuture's own salary filter). Empty = any.

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

Newest first (by posting date) or MyCareersFuture's relevance ranking for keyword searches.

## `maxResultsPerSearch` (type: `integer`):

How many jobs to take from each term, company or link. Empty = 100. MyCareersFuture returns 100 jobs per API page and the Actor pages through all of them.

## `maxItems` (type: `integer`):

Hard cap on charged jobs for the whole run, across all terms and links. Empty or 0 = no cap besides the per-search limit.

## `postedWithinDays` (type: `integer`):

Keep only jobs posted or reposted in the last N days (for example 1 for a daily feed, 7 for weekly). With 'Newest first' the Actor stops paging as soon as it reaches older jobs. Skipped jobs are not charged.

## `maxYearsExperience` (type: `integer`):

Keep only jobs asking for at most this many years (0 = entry level). Skipped jobs are not charged.

## `excludeAgencies` (type: `boolean`):

Skip jobs posted by recruitment agencies on behalf of a client. Skipped jobs are not charged.

## `withSalaryOnly` (type: `boolean`):

Skip jobs whose salary is hidden. Skipped jobs are not charged.

## `excludeKeywords` (type: `array`):

Words, one per line. Jobs with any of them in the title are skipped and not charged.

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

Full job description and company description as plain text (contact details removed). Turn off for smaller rows; the price is the same.

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

Apify datacenter proxy is the default and works for MyCareersFuture. Refused requests are retried on another IP.

## Actor input object example

```json
{
  "searchTerms": [
    "data analyst"
  ],
  "sortBy": "newest",
  "includeDescription": true,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

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

No description

## `resultsCsv` (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 = {
    "searchTerms": [
        "data analyst"
    ],
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("scrapewise/mycareersfuture-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 = {
    "searchTerms": ["data analyst"],
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("scrapewise/mycareersfuture-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 '{
  "searchTerms": [
    "data analyst"
  ],
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call scrapewise/mycareersfuture-scraper --silent --output-dataset

```

## MCP server setup

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