# MyCareersFuture Jobs Scraper (`deriverge/mycareersfuture-jobs-scraper`) Actor

Jobs from MyCareersFuture, Singapore's government job portal, with the monthly salary range, skills, experience, company UEN and industry, address with coordinates, applicant count and the full description. Search by keyword, category, level and salary, or schedule it as a daily alert.

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

## Pricing

from $0.15 / 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.
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 Jobs Scraper

MyCareersFuture Jobs Scraper returns jobs from MyCareersFuture, Singapore's government job portal, one row per job: monthly salary range, skills, years of experience, education level, occupation code, the company with its UEN and industry, the recruitment agency where one posted the job, workplace address with coordinates, application and view counts, and the full description. Type a keyword such as `data analyst` and click **Start**, or leave it empty for the newest jobs of all 90,404 on the portal on 11 October 2026. It costs $0.30 per 1,000 jobs on the Free plan ($0.15 on Business), and the $5 of monthly credit in Apify's Free plan covers about 16,000 jobs.

### What data does it return?

| Field | Description |
|---|---|
| `jobId`, `uuid`, `url` | MyCareersFuture's job post ID, such as `MCF-2026-1772808`, the internal ID and the job page. |
| `title` | Job title as the employer wrote it. |
| `company`, `companyUen`, `companyIndustry` | The hiring company, its Singapore Unique Entity Number and its industry under the SSIC classification, such as `INFORMATION TECHNOLOGY CONSULTANCY (EXCEPT CYBERSECURITY)`. |
| `companyWebsite`, `companyLogo`, `companyEmployees`, `companyDescription` | Company website, logo, employee count and profile text, as far as the company filled them in. |
| `postedByAgency`, `agency`, `agencyUen` | `true` when a recruitment agency posted the job for the company, with the agency's name and UEN. |
| `responsiveEmployer` | `true` when MyCareersFuture marks the employer as one that responds to applicants. |
| `salaryMin`, `salaryMax`, `salaryPeriod`, `salaryCurrency` | Salary range in SGD, such as `8000` to `9500` per `month`. |
| `employmentTypes`, `positionLevels`, `categories` | Types such as `Full Time` or `Contract`, levels such as `Senior Executive`, and job categories such as `Information Technology`. |
| `skills` | Skills tagged on the job, often 10 to 20 of them. |
| `minimumYearsExperience`, `educationLevel`, `vacancies` | Years of experience asked for, education level from Singapore's education classification, such as `Bachelor's degree or equivalent`, and the number of openings. |
| `occupationCode` | SSOC 2020 occupation code, such as `21222`. |
| `flexibleWorkArrangements`, `schemes` | Arrangements such as `Flexi-Hours` and government hiring schemes, both usually empty. |
| `address`, `postalCode`, `district`, `region` | Workplace address, postcode, postal district such as `D05 Pasir Panjang, Hong Leong Garden, Clementi New Town`, and region: `Central`, `East`, `North`, `North-East`, `West` or `Islandwide`. |
| `latitude`, `longitude` | Coordinates of the workplace. |
| `overseasCountry` | Country of the workplace for the few jobs outside Singapore. |
| `postedAt`, `firstPostedAt`, `expiresAt`, `updatedAt` | Date of the latest posting or repost, the first posting, the closing date and the last change. |
| `applications`, `views`, `reposts` | Applications and views so far, and how often the job was reposted. |
| `description`, `descriptionHtml` | The full job description as plain text and as HTML. |
| `searchQuery`, `key`, `scrapedAt` | The search that found the job, the key `mcf:<jobId>` used by new-only mode, and the time of the run in UTC. |

### How to scrape MyCareersFuture

1. Enter **Keywords** as in the portal's search box: a job title, a skill or a company, such as `nurse` or `DBS`. Each keyword is its own search. Leave it empty for all jobs.
2. Narrow with **Categories**, **Position levels** and **Minimum monthly salary (SGD)**. **Employment types** runs a separate search for each type and merges the results.
3. Set **Posted in the last days**, for example `1` for a daily alert or `7` for the last week, and keep **Sort by** on **Newest first**.
4. Turn on **Leave out agency postings** or fill **Exclude keywords** to drop jobs by title or company.
5. Set **Maximum jobs** (1,000 by default) and click **Start**. The jobs appear in the **Output** tab and can be exported as CSV, Excel or JSON. The `SUMMARY` record in the key-value store shows how many jobs each search matched and how many were returned.

An input for the API:

```json
{
  "keywords": ["software engineer", "nurse"],
  "employmentTypes": ["Permanent", "Full Time"],
  "minSalary": 5000,
  "postedWithinDays": 7,
  "maxItems": 2000
}
```

### Example output

A data analyst job from a run on 11 October 2026. `companyDescription`, `description` and `descriptionHtml` are cut short here and end in ` ...`; the dataset has the full text.

```json
{
  "key": "mcf:MCF-2026-1772808",
  "jobId": "MCF-2026-1772808",
  "uuid": "7b8842982d5974b1729af70395f24c02",
  "title": "Data Analyst",
  "url": "https://www.mycareersfuture.gov.sg/job/information-technology/data-analyst-cognizant-technology-solutions-asia-pacific-7b8842982d5974b1729af70395f24c02",
  "company": "COGNIZANT TECHNOLOGY SOLUTIONS ASIA PACIFIC PTE. LTD.",
  "companyUen": "200202851H",
  "companyIndustry": "INFORMATION TECHNOLOGY CONSULTANCY (EXCEPT CYBERSECURITY)",
  "companyWebsite": "https://www.cognizant.com/",
  "companyLogo": "https://static.mycareersfuture.gov.sg/images/company/logos/233bd52de74743edf6003e0bf26dc204/cognizant-technology-solutions-asia-pacific.jpg",
  "companyEmployees": null,
  "companyDescription": "About Cognizant:\n\nCognizant (Nasdaq-100: CTSH) engineers modern businesses. ...",
  "postedByAgency": false,
  "agency": null,
  "agencyUen": null,
  "responsiveEmployer": true,
  "salaryMin": 8000,
  "salaryMax": 9500,
  "salaryPeriod": "month",
  "salaryCurrency": "SGD",
  "employmentTypes": [
    "Full Time"
  ],
  "positionLevels": [
    "Senior Executive"
  ],
  "categories": [
    "Information Technology"
  ],
  "skills": [
    "Dashboards",
    "Data Analysis",
    "Performance Reporting",
    "Business Insights",
    "Technical Skills",
    "hands-on skills",
    "Data Storytelling and Visualisation",
    "Business Process Analysis",
    "Databricks",
    "Data-Driven Decision Making",
    "Collaboration With Stakeholders",
    "producing documentation",
    "SQL Development",
    "Information Visualization",
    "Power BI",
    "Data Visualisation"
  ],
  "minimumYearsExperience": 5,
  "vacancies": 1,
  "educationLevel": "Bachelor's degree or equivalent",
  "occupationCode": "21222",
  "flexibleWorkArrangements": [],
  "schemes": [],
  "workingHours": null,
  "shiftPattern": null,
  "otherRequirements": null,
  "address": "1 FUSIONOPOLIS LINK, NEXUS @ONE-NORTH, Singapore 138542",
  "postalCode": "138542",
  "district": "D05 Pasir Panjang, Hong Leong Garden, Clementi New Town",
  "region": "West",
  "overseasCountry": null,
  "latitude": 1.29925468229408,
  "longitude": 103.78960773275,
  "postedAt": "2026-10-07",
  "firstPostedAt": "2026-10-07",
  "updatedAt": "2026-10-07T08:38:00.000Z",
  "expiresAt": "2026-10-21",
  "applications": 70,
  "views": 462,
  "reposts": 0,
  "description": "Role Summary\nThe Data Analyst is responsible for transforming data ...",
  "descriptionHtml": "<p><strong>Role Summary</strong></p><p>The Data Analyst is responsible for transforming data ...",
  "searchQuery": "\"data analyst\"",
  "scrapedAt": "2026-10-11T15:51:20.811Z"
}
```

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

| | Free plan | Starter | Scale | Business |
|---|---|---|---|---|
| 1,000 jobs | $0.30 | $0.24 | $0.195 | $0.15 |

You pay only for the events in the table. There is no start fee, and compute time and proxies are included.

The 3,000 newest jobs on the portal cost $0.90 on the Free plan and $0.45 on Business. Jobs dropped by **Posted in the last days**, **Leave out agency postings** or **Exclude keywords**, jobs found twice by different keywords and jobs a watch has already returned are not charged.

### Limits

- MyCareersFuture answers slowly, a few seconds for each page of 100 jobs. On 11 October 2026 the 3,000 newest jobs took 80 seconds, and 796 jobs for `software engineer` and `nurse` from the last 7 days took 104 seconds.
- When sorting a search by date takes too long on the portal's side, the run continues with that search in relevance order and says so in the log.
- About 4 in 10 jobs have no street address: 1,176 of the 3,000 newest jobs were marked `Islandwide`, with `address`, `postalCode`, `district` and the coordinates empty. Only 2 were overseas.
- Company details depend on the company's profile: among the 3,000 newest jobs, `companyEmployees` was filled for 356 and `companyWebsite` for 1,101. `workingHours`, `shiftPattern` and `otherRequirements` are fields of the portal's own job record that employers rarely fill: they were empty on all 3,000 jobs, and on the full record of single jobs too, so expect them to be `null`.
- `postedByAgency` is `true` only when an agency names the client it posts for, as on 256 of the 3,000 newest jobs. Agencies that post under their own name appear as the `company`, so use **Exclude keywords** with their names if you want them out.
- The same vacancy can appear several times when different agencies post it: 5 of the 20 jobs for `data analyst` in one run were the same role from five staffing firms, each with its own `jobId`.
- If the portal asks the run to slow down (HTTP 429), it pauses a minute, at most three times, and then ends with the jobs it has.

### Daily job alerts

Set **Posted in the last days** to `1` or `2`, turn on **Return only jobs new since the last run**, give a **Watch name** or save the input as a task, and schedule a run each morning. The run returns and charges only jobs that no earlier run of the watch returned. Jobs over **Maximum jobs** stay new for the next run, and the watch forgets jobs after 120 days.

### FAQ

#### Is it legal to scrape MyCareersFuture?

MyCareersFuture is a public job portal run by Workforce Singapore, and the actor reads the job search data its website loads in the browser, without logging in. The rows describe jobs and companies; the internal account IDs of the people who posted them are not collected. You are responsible for how you use the data.

#### Is the salary always there?

In our runs it was: all 3,000 of the newest jobs on 11 October 2026 had `salaryMin` and `salaryMax`, every one per month, because the portal's job form asks for a monthly range. A job whose employer chose to hide the salary would have the four salary fields empty.

#### Can I use the UEN to look up the company?

Yes. `companyUen` is the Unique Entity Number that Singapore gives every registered company, the key of ACRA's business registry. It stays the same across all of a company's jobs, so it also groups jobs by employer more reliably than the name.

### Related scrapers

- [Job Bank Canada Scraper](https://apify.com/deriverge/job-bank-canada-scraper)
- [JobStreet Jobs Scraper](https://apify.com/deriverge/jobstreet-jobs-scraper)
- [Career Site and ATS Jobs API](https://apify.com/deriverge/career-site-jobs-search)
- [Foundit Jobs Scraper](https://apify.com/deriverge/foundit-jobs-scraper)

### Support

This actor is built and maintained by deriverge s.r.o., a software company based in the Czech Republic. If a run fails or a field you need is missing, please open an issue in the **Issues** tab or write to us at info@deriverge.com. We respond in English and Czech. Runs can be scheduled in Apify Console or started from the **API** tab, which has examples for Python, JavaScript and cURL and works with Make, Zapier, n8n and the Apify MCP server. If the actor saves you time, a short review helps other people find it.

# Changelog

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

# Actor input Schema

## `keywords` (type: `array`):

What to search for, as in the MyCareersFuture search box: a job title, skill or company, for example "data analyst", "nurse", "accountant" or "DBS". Each keyword is its own search. Leave empty for all jobs.

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

Only jobs in any of these categories. Leave empty for all.

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

Only jobs of these employment types; each type is searched separately and duplicates are removed. Leave empty for all.

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

Only jobs at any of these levels. Leave empty for all.

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

Only jobs that pay at least this much a month, as the salary filter on the website.

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

Order of the results, as on MyCareersFuture.

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

Only jobs posted (or reposted) in the last N days, for example 1 for a daily job alert or 7 for the last week.

## `excludeAgencyPostings` (type: `boolean`):

Leave out jobs that a recruitment agency posted on behalf of a client.

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

Drop jobs whose title or company contains any of these.

## `newOnly` (type: `boolean`):

Keeps a snapshot per watch name (or per saved task) and returns only jobs that were not there before. Schedule it daily for a job alert.

## `watchName` (type: `string`):

Name of the snapshot used by the new-only mode, for example "data-analyst-sg". Runs from a saved task get one automatically.

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

Hard cap on returned jobs. Every job already includes the full description, so 1,000 jobs take well under a minute.

## Actor input object example

```json
{
  "keywords": [
    "data analyst"
  ],
  "sortBy": "newest",
  "excludeAgencyPostings": false,
  "newOnly": false,
  "maxItems": 20
}
```

# Actor output Schema

## `jobs` (type: `string`):

One row per job with salary, skills, company, agency, experience, address, applicants and full description.

## `summary` (type: `string`):

Jobs matching and returned per search, dropped rows and warnings.

# 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 = {
    "keywords": [
        "data analyst"
    ],
    "maxItems": 20
};

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

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

```

## MCP server setup

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