# MyCareersFuture Scraper — Singapore Jobs, Salaries & Leads (`scrapesage/mycareersfuture-scraper`) Actor

Scrape Singapore's official government job portal, MyCareersFuture. Get real salary ranges, skills, position level, employer UEN, company website, full description and GPS location — turning hiring into B2B leads. Monitor mode emits only new or changed jobs. No login or API key needed.

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

## Pricing

$4.00 / 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.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use 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 Scraper — Singapore Jobs + Hiring-Company Leads (Salary, Skills & Employer Data)

Extract **complete job data from [MyCareersFuture.gov.sg](https://www.mycareersfuture.gov.sg)** — Singapore's official government job portal — including the fields generic job scrapers miss: **legally-mandated SGD salary ranges, the full job description, required skills, number of vacancies, SSOC occupation codes, exact geo-coordinates, and the complete hiring-company profile** (UEN, website, industry, employee count, logo). Optionally turn every employer into a **ready-to-contact B2B lead** with aggregated hiring signals.

No login, no cookies, no browser — fast JSON extraction with 99%+ reliability.

### Why this MyCareersFuture scraper?

Because employers are **legally required** to advertise on MyCareersFuture (under the Fair Consideration Framework) and to **disclose salary**, this is the single richest, most complete source of Singapore hiring data anywhere — and this actor ships **the richest dataset in the category**:

| Data | Generic job scrapers | This actor |
|---|---|---|
| Real SGD salary min/max + type | ❌ often hidden | ✅ legally mandated |
| Full job description (clean text) | partial | ✅ |
| Required skills (tagged) | ❌ | ✅ |
| Number of vacancies | ❌ | ✅ |
| Min. years experience + SSOC occupation code | ❌ | ✅ |
| Employment type, seniority, work arrangements | partial | ✅ |
| Exact location + lat/lng + district/region | ❌ | ✅ |
| **Hiring company UEN** (links to ACRA) | ❌ | ✅ |
| Company website, industry (SSIC), employee count, logo | ❌ | ✅ |
| Posting date, expiry date, view & application counts | partial | ✅ |
| Deduplicated **hiring-company B2B leads** | ❌ | ✅ opt-in |
| Monitor mode — only new & changed jobs | ❌ | ✅ |

### Use cases

- **Recruitment & sourcing** — pull every live role in a sector with real salary bands, skills, and seniority; benchmark compensation and find candidates' target employers.
- **B2B lead generation** — companies that are hiring are companies that are **spending**. Export hiring employers with UEN, website, industry, and headcount (`type: "company"`) and feed your CRM. Perfect for recruiters, staffing agencies, HR-tech/SaaS, payroll, training, corporate services and commercial real estate.
- **Salary & labour-market intelligence** — track SGD salary ranges, in-demand skills, and hiring volume by category, seniority and region across Singapore.
- **Hiring-intent monitoring** — schedule recurring runs to watch a sector, role, or specific employer and capture only **new and changed** postings (e.g. salary updates, re-opens).
- **Market research & data enrichment** — enrich a UEN list, map demand by SSOC occupation, or power dashboards, newsletters and job-aggregator apps.

### How to use

1. [Sign up for Apify](https://console.apify.com/sign-up) — the free plan is enough to try this actor.
2. Open the **MyCareersFuture Scraper**, enter search keywords and/or filters (category, employment type, seniority, minimum salary), or paste MyCareersFuture URLs, and click **Start**.
3. Watch results stream into the dataset table.
4. **Export** as JSON, CSV, Excel, XML, or RSS — or pull results programmatically via the [Apify API](https://docs.apify.com/api/v2).

### Input

```json
{
    "searchKeywords": ["software engineer", "data analyst"],
    "categories": ["Information Technology"],
    "employmentTypes": ["Permanent", "Full Time"],
    "positionLevels": ["Manager", "Senior Executive"],
    "salaryMin": 5000,
    "sortBy": "new_posting_date",
    "maxItems": 200,
    "scrapeJobDetails": true,
    "includeCompanyLeads": true,
    "monitorMode": false
}
````

- **searchKeywords** — keywords; each runs its own search and is combined with the filters below. Leave blank to scrape the newest jobs across Singapore.
- **startUrls** — paste MyCareersFuture job pages (scrape only those jobs) or a search/results URL with your filters applied on the site.
- **categories / employmentTypes / positionLevels** — restrict results (e.g. `Information Technology`, `Permanent`, `Manager`).
- **salaryMin** — only jobs whose minimum monthly salary (SGD) is at least this amount.
- **sortBy** — `new_posting_date` (newest, default), `min_monthly_salary` (lowest salary first), or `relevance`.
- **postedWithinDays** — only jobs posted within N days (0 = no limit).
- **maxItems** *(default 100)* — cap across all keywords/URLs (0 = no limit, can be 60,000+).
- **scrapeJobDetails** *(default true)* — enrich each job with full description, vacancies, experience, SSOC code, screening questions, expiry date, view count, and the employer's website/industry/description.
- **includeCompanyLeads** *(default false)* — also output one deduplicated lead record per hiring company with aggregated hiring signals.
- **monitorMode** *(default false)* — only output new & changed jobs since the previous run for the same input (state persists across runs — pairs perfectly with Schedules).
- **proxyConfiguration** — proxy settings (Apify Proxy by default; the API isn't geo-locked, so this is plenty).

### Output

One record per job (`type: "job"`), plus optional hiring-company lead records (`type: "company"`):

```json
{
    "type": "job",
    "jobId": "MCF-2026-1000311",
    "uuid": "14d02f410bf9ae035b62dfb9f3ef44dd",
    "url": "https://www.mycareersfuture.gov.sg/job/engineering/software-engineer-...-14d02f410bf9ae035b62dfb9f3ef44dd",
    "title": "Software Engineer / Senior Software Engineer (Automation & SCADA)",
    "description": "Job Responsibilities:\n• Responsible for software prototyping, design, development...",
    "companyName": "EA RECRUITMENT PTE. LTD.",
    "companyUen": "202102411G",
    "companyWebsite": "https://example.com.sg",
    "companyIndustry": "78104",
    "companyEmployeeCount": "50",
    "companyLogoUrl": "https://static.mycareersfuture.gov.sg/images/company/logos/.../logo.jpg",
    "isResponsiveEmployer": true,
    "salaryMin": 4000,
    "salaryMax": 6000,
    "salaryType": "Monthly",
    "employmentTypes": ["Permanent", "Full Time"],
    "positionLevels": ["Executive"],
    "categories": ["Engineering", "Information Technology"],
    "skills": ["C++", "Python", "SCADA", "REST", "SDLC"],
    "numberOfVacancies": 2,
    "minimumYearsExperience": 2,
    "ssocCode": "25121",
    "district": "Islandwide",
    "region": "Islandwide",
    "latitude": 1.3294,
    "longitude": 103.8021,
    "postedDate": "2026-06-12",
    "expiryDate": "2026-07-12",
    "numberOfApplications": 0,
    "status": "Open",
    "applicationUrl": "https://www.mycareersfuture.gov.sg/job/engineering/...",
    "scrapedAt": "2026-06-12T08:11:10.000Z"
}
```

A hiring-company lead (`type: "company"`) carries `companyName`, `companyUen`, `companyWebsite`, `companyDescription`, `companyIndustry` (SSIC), `companyEmployeeCount`, `companyLogoUrl`, plus aggregated signals across the run: `liveJobCount`, `totalVacancies`, `salaryMinAcrossJobs`/`salaryMaxAcrossJobs`, `categoriesHiring`, `positionLevelsHiring`, and `regions`.

#### What to expect (field coverage)

MyCareersFuture is employer-entered data, so a few fields are populated only when the employer fills them in. Verified live, you can typically expect:

| Field group | Coverage |
|---|---|
| title, salary min/max, employment type, seniority, categories, company name + UEN | ~100% |
| skills, posting/expiry dates, status, region | ~95–100% |
| full description, vacancies, min. experience, SSOC code *(with `scrapeJobDetails`)* | ~95% |
| exact street address + lat/lng | present for jobs with a fixed worksite (blank for "Islandwide"/remote) |
| company website, employee count, description | present when the employer published them |

A blank field means the employer didn't publish it — not that scraping failed. Nothing is dropped, so you always get the richest dataset available.

### Automate & schedule

Run this actor on autopilot and pull results into your own stack:

- **[Apify API](https://docs.apify.com/api/v2)** — start runs, fetch datasets, and manage schedules over REST.
- **[apify-client for JavaScript](https://docs.apify.com/api/client/js/)** and **[apify-client for Python](https://docs.apify.com/api/client/python/)** — official SDKs.
- **[Schedules](https://docs.apify.com/platform/schedules)** — run it daily/weekly with **Monitor mode** to capture only new & changed jobs; perfect for hiring-intent feeds and lead pipelines.
- **[Webhooks](https://docs.apify.com/platform/integrations/webhooks)** — trigger downstream actions (CRM import, Slack alert, email sequence) the moment a run finishes.

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

const client = new ApifyClient({ token: 'MY_APIFY_TOKEN' });

const run = await client.actor('scrapesage/mycareersfuture-scraper').call({
    searchKeywords: ['data analyst'],
    categories: ['Information Technology'],
    salaryMin: 5000,
    maxItems: 200,
    includeCompanyLeads: true,
});

const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(`Got ${items.length} jobs & hiring-company leads`);
```

### Integrate with any app

Connect the dataset to 5,000+ apps — no code required:

- **[Make](https://docs.apify.com/platform/integrations/make)** — multi-step automation scenarios.
- **[Zapier](https://docs.apify.com/platform/integrations/zapier)** — push new hiring-company leads straight into your CRM.
- **[Slack](https://docs.apify.com/platform/integrations/slack)** — get notified when a monitored sector or employer posts new jobs.
- **[Google Drive / Sheets](https://docs.apify.com/platform/integrations/drive)** — auto-export every run to a spreadsheet.
- **[Airbyte](https://docs.apify.com/platform/integrations/airbyte)** — pipe results into your data warehouse.
- **[GitHub](https://docs.apify.com/platform/integrations/github)** — trigger runs from commits or releases.

### Use with AI assistants (MCP)

The output is clean, LLM-ready JSON. Call this actor from Claude, ChatGPT, or any agent framework through the **[Apify MCP server](https://docs.apify.com/platform/integrations/mcp)** — ask your assistant to "find Singapore IT jobs paying over $8k and list the hiring companies with their websites" and let it run this scraper for you.

### More scrapers from scrapesage

Build a complete **Singapore hiring & lead-gen stack**:

- **[LinkedIn Jobs Scraper](https://apify.com/scrapesage/linkedin-jobs-scraper)** — job postings and hiring-intent signals from LinkedIn.
- **[Multi-ATS Job Scraper](https://apify.com/scrapesage/multi-ats-job-scraper)** — jobs straight from company career pages (Greenhouse, Lever, Ashby, SmartRecruiters, Workday).
- **[SGCarMart Used Car Scraper](https://apify.com/scrapesage/sgcarmart-used-car-scraper)** — Singapore used-car listings, prices (COE/OMV/ARF) and dealer leads.
- **[Eventbrite Scraper](https://apify.com/scrapesage/eventbrite-scraper)** — events plus organizer leads (ticket prices, emails, socials).
- **[Sched Conference Scraper](https://apify.com/scrapesage/sched-conference-scraper)** — speakers, sessions and sponsors as B2B leads.
- **[Bark Listing Scraper](https://apify.com/scrapesage/bark-listing-scraper)** — service-provider leads from Bark.
- **[Facebook Ad Library Scraper](https://apify.com/scrapesage/facebook-ad-library-scraper)** — competitor ad intelligence on Meta & Instagram.
- **[Google Ads Transparency Scraper](https://apify.com/scrapesage/google-ads-transparency-scraper)** — who's advertising what on Google.
- **[LinkedIn Jobs](https://apify.com/scrapesage/linkedin-jobs-scraper)**, **[Airbnb](https://apify.com/scrapesage/airbnb-scraper)** and more on the [scrapesage profile](https://apify.com/scrapesage).

### Tips

- **Hiring-company leads**: turn on `includeCompanyLeads` to get one deduplicated record per employer with website, industry and aggregated hiring signals — ideal for B2B outreach.
- **Whole-of-Singapore pulls**: set `maxItems: 0` and leave keywords blank to capture every live posting (60,000+); narrow by `categories` or `salaryMin` to stay focused and cheap.
- **Recurring monitoring**: combine [Schedules](https://docs.apify.com/platform/schedules) with **Monitor mode** to track only newly posted or changed jobs — perfect for daily hiring-intent feeds.
- **Cost control**: turn off `scrapeJobDetails` for a fast, cheaper run when you only need salary, company, skills and location from the search results.

### FAQ

**Does it need the MyCareersFuture / WSG API key or a login?** No. This actor reads the same public data the website shows — no key, login or cookies needed.

**Is the salary data reliable?** Yes. Employers on MyCareersFuture must disclose salary under the Fair Consideration Framework, so salary ranges are present on virtually every job — far more complete than LinkedIn or generic job boards.

**Can I get the hiring company's contact details?** You get the company name, UEN, website, industry (SSIC) and logo. The UEN lets you cross-reference [ACRA](https://www.acra.gov.sg) and enrich further. MyCareersFuture itself doesn't publish employer emails/phones.

**Can I export to Google Sheets, CSV, or Excel?** Yes — one click in the dataset view, or automatically on every run via the [Google Drive integration](https://docs.apify.com/platform/integrations/drive).

**How do I monitor new jobs automatically?** Create a [Schedule](https://docs.apify.com/platform/schedules) (e.g. daily) with **Monitor mode** on, and optionally add a [webhook](https://docs.apify.com/platform/integrations/webhooks) or [Zapier zap](https://docs.apify.com/platform/integrations/zapier) to push new postings/leads into your CRM as they appear.

**Does Monitor mode conflict with Apify Schedules?** No — they're complementary. The Schedule decides *when* a run starts; Monitor mode decides *which* jobs are new or changed within that run (state persists in a named key-value store), so scheduled runs only emit fresh data.

**A field is blank — why?** Some employers don't publish a website, employee count, or a fixed address (e.g. "Islandwide" / remote roles). Fields are blank only when the employer didn't provide that data — never because the scraper skipped it.

**Is scraping MyCareersFuture legal?** This actor collects publicly available data only. You are responsible for using the data in compliance with applicable laws (e.g. PDPA/GDPR for personal data) and the site's terms.

### Need help?

Open an issue on the actor's **Issues** tab, or visit the [Apify help center](https://help.apify.com/). Feature requests are welcome — this actor is actively maintained.

# Actor input Schema

## `searchKeywords` (type: `array`):

Keywords to search for, e.g. <code>software engineer</code>, <code>nurse</code>, <code>data analyst</code>. Each keyword runs its own search and is combined with the filters below. Leave blank to scrape every job that matches the filters (or all of Singapore's newest jobs if no filters are set).

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

Optional. Paste MyCareersFuture URLs directly: individual job pages (e.g. <code>https://www.mycareersfuture.gov.sg/job/.../...-085da1b5d4c665c1bf2a9e7913e4ceee</code>) to scrape only those jobs, or a search/results URL with your filters applied on the site (e.g. <code>https://www.mycareersfuture.gov.sg/search?search=data\&category=Information%20Technology</code>). Used in addition to the keywords above.

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

Restrict results to one or more MyCareersFuture job categories.

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

Restrict results to one or more employment types.

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

Restrict results to one or more seniority levels.

## `salaryMin` (type: `integer`):

Only include jobs whose minimum monthly salary is at least this amount (in SGD). Salary disclosure is legally mandated on MyCareersFuture under the Fair Consideration Framework, so this filter is reliable. Leave blank for any salary.

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

Ordering of search results.

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

Only include jobs posted within this many days (based on the original posting date). Use 0 for no date limit. Great with Monitor mode and Schedules to capture only fresh postings.

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

Maximum number of jobs to scrape across all keywords and URLs. Use 0 for no limit (can be 60,000+ across all of Singapore).

## `scrapeJobDetails` (type: `boolean`):

Open each job's detail endpoint to enrich it with the full job description, number of vacancies, minimum years of experience, SSOC occupation code, working hours, government support schemes, screening questions, expiry date, view count and the employer's website, industry (SSIC) and company description. Turn off for a fast, cheap run with the (still rich) search-result fields only.

## `includeCompanyLeads` (type: `boolean`):

In addition to job records, push one deduplicated lead record per hiring company (type = "company") with the company profile (UEN, website, industry, employee count, logo) and aggregated hiring signals across this run: live job count, total vacancies, salary range, and the categories and seniority levels they're hiring for.

## `monitorMode` (type: `boolean`):

Only output jobs that are new or have changed (e.g. salary updated, re-opened) since the previous run for the same input. State persists across runs, so this pairs perfectly with Apify Schedules to track a role, sector or employer over time without re-pulling unchanged jobs. Leave off to always return every match.

## `monitorTrackChanges` (type: `boolean`):

When monitor mode is on, re-emit a job when its salary changes and tag it <code>salary\_increase</code> / <code>salary\_decrease</code> with the previous salary. Turn off to treat only brand-new jobs as changes.

## `maxConcurrency` (type: `integer`):

Maximum number of requests fetched in parallel.

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

Proxy settings. The MyCareersFuture API has no aggressive anti-bot and is not geo-locked, so the Apify Proxy default is plenty and helps spread requests across IPs on large runs.

## Actor input object example

```json
{
  "searchKeywords": [
    "software engineer"
  ],
  "categories": [],
  "employmentTypes": [],
  "positionLevels": [],
  "sortBy": "new_posting_date",
  "postedWithinDays": 0,
  "maxItems": 100,
  "scrapeJobDetails": true,
  "includeCompanyLeads": false,
  "monitorMode": false,
  "monitorTrackChanges": true,
  "maxConcurrency": 10,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

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

All scraped job records and optional hiring-company lead records as JSON items in the default dataset.

# 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 = {
    "searchKeywords": [
        "software engineer"
    ],
    "maxItems": 100
};

// Run the Actor and wait for it to finish
const run = await client.actor("scrapesage/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 = {
    "searchKeywords": ["software engineer"],
    "maxItems": 100,
}

# Run the Actor and wait for it to finish
run = client.actor("scrapesage/mycareersfuture-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "searchKeywords": [
    "software engineer"
  ],
  "maxItems": 100
}' |
apify call scrapesage/mycareersfuture-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=scrapesage/mycareersfuture-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "MyCareersFuture Scraper — Singapore Jobs, Salaries & Leads",
        "description": "Scrape Singapore's official government job portal, MyCareersFuture. Get real salary ranges, skills, position level, employer UEN, company website, full description and GPS location — turning hiring into B2B leads. Monitor mode emits only new or changed jobs. No login or API key needed.",
        "version": "0.1",
        "x-build-id": "iuCWlwRZZkU3MZfec"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/scrapesage~mycareersfuture-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-scrapesage-mycareersfuture-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/scrapesage~mycareersfuture-scraper/runs": {
            "post": {
                "operationId": "runs-sync-scrapesage-mycareersfuture-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/scrapesage~mycareersfuture-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-scrapesage-mycareersfuture-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "properties": {
                    "searchKeywords": {
                        "title": "Search keywords",
                        "type": "array",
                        "description": "Keywords to search for, e.g. <code>software engineer</code>, <code>nurse</code>, <code>data analyst</code>. Each keyword runs its own search and is combined with the filters below. Leave blank to scrape every job that matches the filters (or all of Singapore's newest jobs if no filters are set).",
                        "items": {
                            "type": "string"
                        }
                    },
                    "startUrls": {
                        "title": "MyCareersFuture URLs",
                        "type": "array",
                        "description": "Optional. Paste MyCareersFuture URLs directly: individual job pages (e.g. <code>https://www.mycareersfuture.gov.sg/job/.../...-085da1b5d4c665c1bf2a9e7913e4ceee</code>) to scrape only those jobs, or a search/results URL with your filters applied on the site (e.g. <code>https://www.mycareersfuture.gov.sg/search?search=data&category=Information%20Technology</code>). Used in addition to the keywords above.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "categories": {
                        "title": "Job categories",
                        "type": "array",
                        "description": "Restrict results to one or more MyCareersFuture job categories.",
                        "items": {
                            "type": "string",
                            "enum": [
                                "Accounting / Auditing / Taxation",
                                "Admin / Secretarial",
                                "Advertising / Media",
                                "Architecture / Interior Design",
                                "Banking and Finance",
                                "Building and Construction",
                                "Consulting",
                                "Customer Service",
                                "Design",
                                "Education and Training",
                                "Engineering",
                                "Entertainment",
                                "Environment / Health",
                                "Events / Promotions",
                                "F&B",
                                "General Management",
                                "General Work",
                                "Healthcare / Pharmaceutical",
                                "Hospitality",
                                "Human Resources",
                                "Information Technology",
                                "Insurance",
                                "Legal",
                                "Logistics / Supply Chain",
                                "Manufacturing",
                                "Marketing / Public Relations",
                                "Medical / Therapy Services",
                                "Personal Care / Beauty",
                                "Professional Services",
                                "Purchasing / Merchandising",
                                "Real Estate / Property Management",
                                "Repair and Maintenance",
                                "Risk Management",
                                "Sales / Retail",
                                "Sciences / Laboratory / R&D",
                                "Security and Investigation",
                                "Social Services",
                                "Telecommunications",
                                "Travel / Tourism",
                                "Wholesale Trade",
                                "Precision Engineering",
                                "Others"
                            ]
                        },
                        "default": []
                    },
                    "employmentTypes": {
                        "title": "Employment types",
                        "type": "array",
                        "description": "Restrict results to one or more employment types.",
                        "items": {
                            "type": "string",
                            "enum": [
                                "Permanent",
                                "Full Time",
                                "Part Time",
                                "Contract",
                                "Temporary",
                                "Freelance"
                            ]
                        },
                        "default": []
                    },
                    "positionLevels": {
                        "title": "Seniority / position levels",
                        "type": "array",
                        "description": "Restrict results to one or more seniority levels.",
                        "items": {
                            "type": "string",
                            "enum": [
                                "Senior Management",
                                "Middle Management",
                                "Manager",
                                "Professional",
                                "Senior Executive",
                                "Executive",
                                "Junior Executive",
                                "Non-executive",
                                "Fresh/entry level"
                            ]
                        },
                        "default": []
                    },
                    "salaryMin": {
                        "title": "Minimum monthly salary (SGD)",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Only include jobs whose minimum monthly salary is at least this amount (in SGD). Salary disclosure is legally mandated on MyCareersFuture under the Fair Consideration Framework, so this filter is reliable. Leave blank for any salary."
                    },
                    "sortBy": {
                        "title": "Sort by",
                        "enum": [
                            "new_posting_date",
                            "min_monthly_salary",
                            "relevance"
                        ],
                        "type": "string",
                        "description": "Ordering of search results.",
                        "default": "new_posting_date"
                    },
                    "postedWithinDays": {
                        "title": "Posted within (days)",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Only include jobs posted within this many days (based on the original posting date). Use 0 for no date limit. Great with Monitor mode and Schedules to capture only fresh postings.",
                        "default": 0
                    },
                    "maxItems": {
                        "title": "Max jobs",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Maximum number of jobs to scrape across all keywords and URLs. Use 0 for no limit (can be 60,000+ across all of Singapore).",
                        "default": 100
                    },
                    "scrapeJobDetails": {
                        "title": "Scrape full job details",
                        "type": "boolean",
                        "description": "Open each job's detail endpoint to enrich it with the full job description, number of vacancies, minimum years of experience, SSOC occupation code, working hours, government support schemes, screening questions, expiry date, view count and the employer's website, industry (SSIC) and company description. Turn off for a fast, cheap run with the (still rich) search-result fields only.",
                        "default": true
                    },
                    "includeCompanyLeads": {
                        "title": "Emit hiring-company leads",
                        "type": "boolean",
                        "description": "In addition to job records, push one deduplicated lead record per hiring company (type = \"company\") with the company profile (UEN, website, industry, employee count, logo) and aggregated hiring signals across this run: live job count, total vacancies, salary range, and the categories and seniority levels they're hiring for.",
                        "default": false
                    },
                    "monitorMode": {
                        "title": "Monitor mode (only new & changed)",
                        "type": "boolean",
                        "description": "Only output jobs that are new or have changed (e.g. salary updated, re-opened) since the previous run for the same input. State persists across runs, so this pairs perfectly with Apify Schedules to track a role, sector or employer over time without re-pulling unchanged jobs. Leave off to always return every match.",
                        "default": false
                    },
                    "monitorTrackChanges": {
                        "title": "Flag salary changes",
                        "type": "boolean",
                        "description": "When monitor mode is on, re-emit a job when its salary changes and tag it <code>salary_increase</code> / <code>salary_decrease</code> with the previous salary. Turn off to treat only brand-new jobs as changes.",
                        "default": true
                    },
                    "maxConcurrency": {
                        "title": "Max concurrency",
                        "minimum": 1,
                        "maximum": 50,
                        "type": "integer",
                        "description": "Maximum number of requests fetched in parallel.",
                        "default": 10
                    },
                    "proxyConfiguration": {
                        "title": "Proxy configuration",
                        "type": "object",
                        "description": "Proxy settings. The MyCareersFuture API has no aggressive anti-bot and is not geo-locked, so the Apify Proxy default is plenty and helps spread requests across IPs on large runs.",
                        "default": {
                            "useApifyProxy": true
                        }
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
