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

Scrape jobs from MyCareersFuture.gov.sg: title, description, salary, skills, employer UEN, SSIC code, location, district, and application counts. Filter by keyword, category, employment type, seniority, and company. Export as JSON, CSV, or Excel.

- **URL**: https://apify.com/parsebird/mycareersfuture-jobs-scraper.md
- **Developed by:** [ParseBird](https://apify.com/parsebird) (community)
- **Categories:**
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.79 / 1,000 job scrapeds

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?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

### MyCareersFuture Singapore Jobs Scraper

Scrape job listings from **[MyCareersFuture.gov.sg](https://www.mycareersfuture.gov.sg)** — Singapore's national jobs portal run by Workforce Singapore — into clean, structured JSON. The MyCareersFuture Jobs Scraper returns the full job description, the mandatory salary range in SGD, the government-curated skills list, the employer's UEN and SSIC code, location, district, and live view and application counts, with no login and no MyCareersFuture API key.

<table><tr>
<td style="border-left:4px solid #C8102E;padding:12px 16px;font-weight:600">
Search every active listing by keyword, filter by job category, employment type, seniority, and employer, and get 37 structured fields per job — including salary, skills, employer UEN, SSIC code, district, and application counts — ready for analysis or a jobs product.
</td>
</tr></table>

##### Copy to your AI assistant

Copy this block into ChatGPT, Claude, Cursor, or any LLM to start using this actor.

```
Actor: parsebird/mycareersfuture-jobs-scraper (Apify). Scrapes jobs from mycareersfuture.gov.sg. Call with ApifyClient.
Input JSON fields:
  searchQuery: string — full-text over title, description, skills. "" = all active listings (~90,000)
  categories: string[] of category ids, e.g. ["11","21"]  (11=Engineering, 21=Information Technology, 5=Banking and Finance, 26=Marketing / Public Relations, ... 1-43)
  employmentTypes: string[] of ids  (2=Temporary, 3=Contract, 5=Part Time, 6=Freelance, 7=Permanent, 8=Full Time, 10=Internship/Attachment)
  positionLevels: string[] of ids  (1=Senior Management, 2=Middle Management, 3=Manager, 7=Professional, 8=Senior Executive, 9=Executive, 10=Junior Executive, 11=Non-executive, 12=Fresh/entry level)
  companyNames: string[] — normalised, case-insensitive substring match on posting + hiring company (entity suffixes stripped)
  maxItems: int (default 100, 0 = all). This is the number of billed rows.
  maxPages: int (default 2000, 100 listings per page)
  proxyConfiguration: { "useApifyProxy": true }
Output: one dataset item per job — job_id, job_post_id, title, description (HTML), employer_name, employer_uen, employer_logo_url, employer_description, employer_website_url, employer_size, employer_ssic_code, hiring_company_name, hiring_company_uen, employment_type, seniority, categories[], skills[], schemes[], flexible_work_arrangements[], min_experience_years, salary_min_sgd, salary_max_sgd, salary_type, location, district, region, is_overseas, posted_date, expires_date, updated_at, is_government_job, job_status, number_of_vacancies, view_count, application_count, job_url, scraped_at.
Example: { "searchQuery": "software engineer", "categories": ["21"], "maxItems": 100 }
API: https://api.apify.com/v2/acts/parsebird~mycareersfuture-jobs-scraper  ·  Token: https://console.apify.com/account/integrations
```

### What does MyCareersFuture Singapore Jobs Scraper do?

[MyCareersFuture](https://www.mycareersfuture.gov.sg) carries roughly **90,000 active job listings** from Singapore-registered employers, each with a mandatory salary disclosure and a standardised skills taxonomy. There is no public MyCareersFuture jobs API — this MyCareersFuture scraper is the alternative. It extracts:

- 💰 **Salary data** — the minimum and maximum monthly (or annual) salary in SGD that every listing on MyCareersFuture must disclose.
- 🧠 **Skills** — the government-curated skill tags attached to each role.
- 🏢 **Employer identity** — company name, **UEN** (joins to the ACRA registry), SSIC industry code, logo, headcount, website, and company profile.
- 🕵️ **Hiring company** — the real employer behind a recruitment-agency posting, when disclosed.
- 📍 **Location** — full street address, Singapore postal **district**, and region (Central, East, West, North, North-East).
- 📊 **Demand signals** — view count and application count for each listing, plus number of vacancies.
- 🎛️ **Filters** — keyword search, plus job category, employment type, seniority, and an employer allowlist.

Common uses: labour-market and salary-benchmarking research, recruitment intelligence, building a Singapore jobs board or aggregator, lead lists of hiring companies, and skills-demand tracking over time.

### Input parameters

| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| searchQuery | string | No | — | Full-text search across job titles, descriptions, and skills. Empty = all active listings. |
| categories | array | No | — | Job category IDs to keep. Empty = all. |
| employmentTypes | array | No | — | Employment type IDs to keep. Empty = all. |
| positionLevels | array | No | — | Seniority IDs to keep. Empty = all. |
| companyNames | array | No | — | Employer allowlist, normalised case-insensitive substring match. Unmatched name returns zero rows. |
| maxItems | integer | No | 100 | Maximum job rows saved. `0` = all matching listings. This is the number of billed rows. |
| maxPages | integer | No | 2000 | Maximum source pages scanned (100 listings per page). |
| proxyConfiguration | object | No | Apify Proxy | Proxy settings. MyCareersFuture's API works from datacenter IPs. |

#### Filter IDs

**Job categories** (`categories`): 1 Accounting / Auditing / Taxation · 5 Banking and Finance · 6 Building and Construction · 7 Consulting · 8 Customer Service · 9 Design · 10 Education and Training · 11 Engineering · 15 F\&B · 18 Healthcare / Pharmaceutical · 19 Hospitality · 20 Human Resources · 21 Information Technology · 22 Insurance · 23 Legal · 24 Logistics / Supply Chain · 25 Manufacturing · 26 Marketing / Public Relations · 29 Professional Services · 35 Sales / Retail · 36 Sciences / Laboratory / R\&D · 43 Precision Engineering (full list 1–43 in the Console dropdown).

**Employment types** (`employmentTypes`): 2 Temporary · 3 Contract · 5 Part Time · 6 Freelance · 7 Permanent · 8 Full Time · 10 Internship/Attachment.

**Position levels** (`positionLevels`): 1 Senior Management · 2 Middle Management · 3 Manager · 7 Professional · 8 Senior Executive · 9 Executive · 10 Junior Executive · 11 Non-executive · 12 Fresh/entry level.

#### Example inputs

All IT jobs, first 200:

```json
{ "searchQuery": "", "categories": ["21"], "maxItems": 200 }
```

Full-time senior engineering roles matching a keyword:

```json
{
  "searchQuery": "backend",
  "categories": ["11", "21"],
  "employmentTypes": ["8"],
  "positionLevels": ["1", "8"],
  "maxItems": 500
}
```

Every listing from specific employers:

```json
{ "searchQuery": "", "companyNames": ["shopee", "grab", "sea"], "maxItems": 0 }
```

Every active listing on MyCareersFuture:

```json
{ "searchQuery": "", "maxItems": 0 }
```

### What data can you extract from MyCareersFuture?

| Field | Description |
|-------|-------------|
| job\_id | Unique job listing UUID from MyCareersFuture |
| job\_post\_id | Human-readable job post ID (e.g. `MCF-2026-0776599`) |
| title | Job title |
| description | Full job description (HTML) |
| employer\_name / employer\_uen | Posting company and its Singapore UEN (joins to ACRA) |
| employer\_logo\_url / employer\_description / employer\_website\_url | Employer branding and profile |
| employer\_size / employer\_ssic\_code | Headcount and Singapore Standard Industrial Classification code |
| hiring\_company\_name / hiring\_company\_uen | Real employer behind an agency posting |
| employment\_type / seniority | Employment type(s) and position level(s) |
| categories / skills / schemes / flexible\_work\_arrangements | Classification, curated skills, hiring schemes, FWA types |
| min\_experience\_years | Minimum years of experience required |
| salary\_min\_sgd / salary\_max\_sgd / salary\_type | Disclosed salary range and period (Monthly or Annual) |
| location / district / region | Full address, Singapore postal district, region |
| is\_overseas | Work location is outside Singapore |
| posted\_date / expires\_date / updated\_at | Posting, expiry, and last-updated timestamps |
| is\_government\_job | Employer UEN matches a Singapore government entity |
| job\_status / number\_of\_vacancies | Listing status (Open, Re-open) and open headcount |
| view\_count / application\_count | Views and applications the listing has received |
| job\_url | Direct link to the listing on MyCareersFuture.gov.sg |
| scraped\_at | When the record was scraped |

### Output example

```json
{
  "job_id": "0b06b625c884745acdf98c2aa2ca0612",
  "job_post_id": "MCF-2026-0776599",
  "title": "Senior Data Engineer - MPID Team",
  "description": "<p>We are looking for a Senior Data Engineer...</p>",
  "employer_name": "SHOPEE IP SINGAPORE PRIVATE LIMITED",
  "employer_uen": "201818794D",
  "employer_logo_url": "https://static.mycareersfuture.gov.sg/images/company/logos/abc123/shopee.jpg",
  "employer_ssic_code": "62021",
  "hiring_company_name": "",
  "hiring_company_uen": "",
  "employment_type": "Permanent, Full Time",
  "seniority": "Senior Executive",
  "categories": ["Information Technology"],
  "skills": ["Python", "Apache Spark", "Data Modeling", "AWS"],
  "schemes": [],
  "flexible_work_arrangements": [],
  "min_experience_years": 2,
  "salary_min_sgd": 8000,
  "salary_max_sgd": 10500,
  "salary_type": "Monthly",
  "location": "1 FUSIONOPOLIS PLACE GALAXIS Singapore 138522",
  "district": "D05 Pasir Panjang, Hong Leong Garden, Clementi New Town",
  "region": "West",
  "is_overseas": false,
  "posted_date": "2026-08-12",
  "expires_date": "2026-09-10",
  "updated_at": "2026-08-27T09:46:29.000Z",
  "is_government_job": false,
  "job_status": "Re-open",
  "number_of_vacancies": 1,
  "view_count": 204,
  "application_count": 28,
  "job_url": "https://www.mycareersfuture.gov.sg/job/information-technology/senior-data-engineer-mpid-team-shopee-0b06b625c884745acdf98c2aa2ca0612",
  "scraped_at": "2026-08-29T10:00:00.000Z"
}
```

Download the dataset as **JSON, CSV, Excel, HTML, or XML** from the Storage tab or the [Apify API](https://docs.apify.com/api/v2).

### Use cases

- **Salary benchmarking** — every MyCareersFuture listing carries a disclosed SGD range; aggregate it by role, seniority, district, or industry.
- **Labour-market research** — track hiring volume, skills demand, and vacancy counts across the Singapore economy over time.
- **Recruitment intelligence** — see which companies are hiring, how many applications listings attract, and how long roles stay open.
- **Company lead lists** — pull employers by category or SSIC code, each with a UEN that joins to the ACRA company registry.
- **Job board / aggregator** — power a Singapore-focused jobs product with structured, deduplicated listings.
- **LLM training data** — a large corpus of well-structured job descriptions with salary and skills labels.

### How it works

1. **Search** — the scraper queries MyCareersFuture's public job API with your `searchQuery`, newest listings first, 100 per page.
2. **Filter** — `categories`, `employmentTypes`, `positionLevels`, and `companyNames` are applied to each listing (the API returns the full record, so filtering costs no extra requests).
3. **Shape** — each listing is flattened into 37 fields, with the address assembled into a single string and the salary range read from the mandatory disclosure.
4. Rows stream to the dataset and stop at `maxItems` (or run to the end of the feed when `maxItems` is `0`).

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

This actor is **pay per result** — you are charged once per job listing saved.

| Plan | Price per 1,000 jobs |
|------|----------------------|
| Free | **$0.99** |
| Bronze | **$0.89** |
| Silver | **$0.89** |
| Gold | **$0.79** |

A small platform **Actor start** fee also applies per run. `maxItems` is the exact number of billed rows — set it to control spend. Scraping 1,000 listings on the Free plan costs about **$0.99**; the full board of ~90,000 listings costs about **$89** and takes 30–45 minutes. Apify's monthly free platform usage covers small runs.

### How to scrape MyCareersFuture

1. Click **Try for free** and sign in to Apify.
2. Enter a **search query**, or leave it blank for every listing.
3. Optionally pick **categories**, **employment types**, **position levels**, or add **company names**.
4. Set **Max items** low for the first run (e.g. 100).
5. Click **Start**, then watch rows appear in the **Output** tab.
6. Export from **Storage**, or pull results via the API.

#### Run it via API

Python:

```python
from apify_client import ApifyClient

client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("parsebird/mycareersfuture-jobs-scraper").call(run_input={
    "searchQuery": "data analyst",
    "categories": ["21"],
    "employmentTypes": ["8"],
    "maxItems": 200,
})
for job in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(job["title"], "-", job["employer_name"], "-", job["salary_min_sgd"])
```

JavaScript:

```javascript
import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: '<YOUR_APIFY_TOKEN>' });
const run = await client.actor('parsebird/mycareersfuture-jobs-scraper').call({
    searchQuery: '',
    companyNames: ['shopee', 'grab'],
    maxItems: 0,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);
```

Schedule recurring runs, add webhooks, or push results to Google Sheets, Slack, Zapier, and Make with [Apify integrations](https://docs.apify.com/platform/integrations).

### FAQ

**Do I need a MyCareersFuture account or API key?**
No. The scraper reads MyCareersFuture's public job data only. There is no official MyCareersFuture jobs API for developers — this actor is the alternative.

**How current is the data?**
Live. Each run reads MyCareersFuture at that moment. Use Apify's scheduler to keep a dataset fresh.

**Does every listing really have a salary?**
Yes — salary disclosure is mandatory on MyCareersFuture. A small number of employers hide it; those rows come back with `salary_min_sgd` and `salary_max_sgd` as null.

**What is the UEN and why is it useful?**
The Unique Entity Number is every Singapore-registered entity's ID. `employer_uen` lets you join listings to the [ACRA](https://www.acra.gov.sg) company registry, financial filings, or your own CRM.

**How do I get every job on MyCareersFuture?**
Set `searchQuery` to `""` and `maxItems` to `0`. The run scans the whole feed (~90,000 listings, ~940 pages) and takes roughly 30–45 minutes.

**Why did my category / seniority filter return fewer rows than expected?**
Those filters are applied to each listing as it is read from the newest-first feed. For a very selective filter with no search query, raise `maxPages` so the run scans deeper into the feed.

**Something's not working.**
Open an issue on the **Issues** tab with your input and the run link — we respond quickly.

### Is it legal to scrape MyCareersFuture?

MyCareersFuture is a Singapore government portal and its job listings are public information any visitor can see. Scraping publicly available pages is legal in most jurisdictions, and this actor does not access private data or bypass any login. You are responsible for how you use the data — follow MyCareersFuture's Terms of Use and the Singapore PDPA when handling any personal data, and consult a lawyer if you are unsure. See Apify's guide on [the legality of web scraping](https://blog.apify.com/is-web-scraping-legal/).

### Related actors

- [Instahyre Jobs Scraper](https://apify.com/parsebird/instahyre-jobs-scraper) — India tech jobs with employer context.
- [JobsDB Job Scraper](https://apify.com/parsebird/jobsdb-job-scraper) — jobs across Southeast Asia.
- [Indeed Jobs Scraper](https://apify.com/parsebird/indeed-jobs-scraper) — job listings from Indeed worldwide.
- [Hiring.cafe Scraper](https://apify.com/parsebird/hiring-cafe-scraper) — aggregated jobs with 20+ filters.
- [UK Companies House Scraper](https://apify.com/parsebird/uk-companies-house-scraper) — company registry records.

Browse all [ParseBird actors](https://apify.com/parsebird) on Apify Store.

# Actor input Schema

## `searchQuery` (type: `string`):

Full-text search across job titles, descriptions, and skills. Leave empty to retrieve all active listings.

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

Keep only listings in these job categories. Leave empty for all.

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

Keep only listings offering one of these employment types. Leave empty for all.

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

Keep only listings at one of these seniority levels. Leave empty for all.

## `companyNames` (type: `array`):

Keep only listings from these employers. Normalised, case-insensitive substring match against the posting company and the hiring company — punctuation and entity suffixes (Pte Ltd, Ltd, LLC, Group, Holdings) are stripped before comparing. An unmatched name returns zero rows.

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

Maximum records to return. Set to 0 for all matching listings. This is the number of billed rows.

## `maxPages` (type: `integer`):

Maximum source pages scanned (100 listings per page). Raise this when a selective category / seniority filter needs to scan deep into the feed.

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

MyCareersFuture's public API works from datacenter IPs, so the default Apify Proxy is enough.

## Actor input object example

```json
{
  "searchQuery": "software engineer",
  "categories": [],
  "employmentTypes": [],
  "positionLevels": [],
  "companyNames": [],
  "maxItems": 100,
  "maxPages": 20,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# 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 = {
    "searchQuery": "software engineer",
    "categories": [],
    "employmentTypes": [],
    "positionLevels": [],
    "companyNames": [],
    "maxItems": 100,
    "maxPages": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("parsebird/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 = {
    "searchQuery": "software engineer",
    "categories": [],
    "employmentTypes": [],
    "positionLevels": [],
    "companyNames": [],
    "maxItems": 100,
    "maxPages": 20,
}

# Run the Actor and wait for it to finish
run = client.actor("parsebird/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 '{
  "searchQuery": "software engineer",
  "categories": [],
  "employmentTypes": [],
  "positionLevels": [],
  "companyNames": [],
  "maxItems": 100,
  "maxPages": 20
}' |
apify call parsebird/mycareersfuture-jobs-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,parsebird/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/4nX48yPwQwDhfDhmU/builds/93pPNuMA3d6LN0iur/openapi.json
