{
  "openapi": "3.0.1",
  "info": {
    "title": "Singapore Jobs Scraper for MyCareersFuture - Salaries & Leads",
    "description": "Scrape Singapore jobs from MyCareersFuture by keyword, filter or link: SGD salary ranges, skills, seniority, employer UEN and full descriptions, plus hiring-company leads. Monitor mode returns only new or changed jobs. No login or API key. Independent tool, not affiliated with any government agency.",
    "version": "0.1",
    "x-build-id": "R4mpVCLit9WXJXtPk"
  },
  "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>, or a company name such as <code>SMRT</code> (MyCareersFuture's search also matches employer names). Each keyword runs its own search, combined with the filters below, and the keywords share Max jobs equally. Leave blank to scrape every job that matches the filters, or the newest jobs across Singapore if no filter is set.",
            "items": {
              "type": "string"
            }
          },
          "startUrls": {
            "title": "MyCareersFuture URLs",
            "type": "array",
            "description": "Optional. Paste MyCareersFuture links directly: job pages (e.g. <code>https://www.mycareersfuture.gov.sg/job/.../...-085da1b5d4c665c1bf2a9e7913e4ceee</code>) to scrape only those jobs, or a search link with your filters applied on the site (e.g. <code>https://www.mycareersfuture.gov.sg/search?search=data&category=Information%20Technology</code>). A search link keeps every filter it carries (category, location, employment type, seniority, salary, work arrangement, posted by, sort). Used in addition to the keywords above; the form's example keyword is skipped when you paste links.",
            "items": {
              "type": "string"
            }
          },
          "urlsFromFile": {
            "title": "Import URLs from a file (one per line)",
            "type": "string",
            "description": "Bulk-load links without adding them one at a time. Either <b>paste your whole list</b> here, one link per line, or give <b>a single link to the file</b> and it is downloaded for you - a public <code>.txt</code>/<code>.csv</code>, a Google Sheets or Drive share link (shared as \"Anyone with the link\"; converted to CSV export), or an Apify key-value-store record. Blank lines, <code>#</code> comments, quotes and extra CSV columns are ignored, and duplicates are only scraped once. A PDF, an Excel file or an image is refused with a note on the run card: save it as .csv or .txt first."
          },
          "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",
                "Public / Civil Service",
                "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": []
          },
          "districts": {
            "title": "Locations (districts)",
            "type": "array",
            "description": "Restrict results to jobs in one or more Singapore districts, as MyCareersFuture files them. <code>Islandwide</code> = jobs with no fixed worksite; <code>Overseas</code> = jobs outside Singapore.",
            "items": {
              "type": "string",
              "enum": [
                "D01",
                "D02",
                "D03",
                "D04",
                "D05",
                "D06",
                "D07",
                "D08",
                "D09",
                "D10",
                "D11",
                "D12",
                "D13",
                "D14",
                "D15",
                "D16",
                "D17",
                "D18",
                "D19",
                "D20",
                "D21",
                "D22",
                "D23",
                "D24",
                "D25",
                "D26",
                "D27",
                "D28",
                "Islandwide",
                "Overseas"
              ],
              "enumTitles": [
                "D01 Marina, Raffles Place, People's Park, Cecil",
                "D02 Anson, Tanjong Pagar",
                "D03 Queenstown, Bukit Merah, Tiong Bahru",
                "D04 Harbourfront, Sentosa Island, Telok Blangah",
                "D05 Pasir Panjang, Hong Leong Garden, Clementi New Town",
                "D06 Beach Road, High Street",
                "D07 Middle Road, Golden Mile",
                "D08 Little India",
                "D09 Cairnhill, Orchard, River Valley",
                "D10 Tanglin, Ardmore, Bukit Timah, Holland Road",
                "D11 Watten Estate, Thomson, Novena",
                "D12 Toa Payoh, Balestier, Serangoon",
                "D13 Macpherson, Braddell",
                "D14 Geylang, Eunos",
                "D15 Joo Chiat, Katong, Amber Road",
                "D16 Bedok, Eastwood, Kew Drive, Upper East Coast",
                "D17 Changi, Loyang",
                "D18 Pasir Ris, Tampines",
                "D19 Hougang, Sengkang, Serangoon Garden, Punggol",
                "D20 Ang Mo Kio, Bishan",
                "D21 Upper Bukit Timah, Clementi Park, Ulu Pandan",
                "D22 Jurong, Jurong Island, Tuas",
                "D23 Hillview, Bukit Panjang, Dairy Farm, Choa Chu Kang",
                "D24 Tengah, Lim Chu Kang",
                "D25 Kranji, Woodgrove, Woodlands",
                "D26 Springleaf, Upper Thomson",
                "D27 Sembawang, Yishun",
                "D28 Seletar",
                "Islandwide (no fixed worksite)",
                "Overseas"
              ]
            }
          },
          "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",
                "Flexi-work",
                "Internship/Attachment"
              ]
            },
            "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": []
          },
          "flexibleWorkArrangements": {
            "title": "Flexible work arrangements",
            "type": "array",
            "description": "Only jobs that offer one of these flexible work arrangements (as the employer lists them on MyCareersFuture).",
            "items": {
              "type": "string",
              "enum": [
                "Flexi-Hours",
                "Telecommuting",
                "Employees Choice of Days Off",
                "Staggered Time",
                "Compressed Work Schedule",
                "Creative Scheduling"
              ]
            }
          },
          "postedBy": {
            "title": "Posted by",
            "enum": [
              "direct",
              "agency"
            ],
            "type": "string",
            "description": "Only jobs posted by direct employers, or only jobs a recruitment agency posted for a client. Leave empty for both."
          },
          "responsiveEmployersOnly": {
            "title": "Responsive employers only",
            "type": "boolean",
            "description": "Only jobs from employers MyCareersFuture marks as responsive (they reply to applicants).",
            "default": false
          },
          "governmentSchemes": {
            "title": "Government schemes",
            "type": "array",
            "description": "Only jobs offered under one of these Workforce Singapore schemes (for example the Career Conversion Programme).",
            "items": {
              "type": "string",
              "enum": [
                "P-Max",
                "Career Conversion Programme",
                "Career Trial",
                "Career Support Programme",
                "SGUnited Traineeships",
                "SGUnited Mid-Career Pathways Programme",
                "Mid-Career Pathways Programme",
                "GRaduate Industry Traineeships (GRIT) Programme"
              ]
            }
          },
          "salaryMin": {
            "title": "Minimum monthly salary (SGD)",
            "minimum": 0,
            "type": "integer",
            "description": "Only include jobs whose own minimum monthly salary is at least this amount (in SGD). MyCareersFuture's own salary filter keeps every job whose range reaches the amount, so the Actor also checks each job's minimum: every row starts at this amount or more. A pasted search link with its own salary filter keeps the site's meaning. Leave blank for any salary."
          },
          "sortBy": {
            "title": "Sort by",
            "enum": [
              "new_posting_date",
              "min_monthly_salary",
              "relevance"
            ],
            "type": "string",
            "description": "Ordering of search results. Monitor mode always reads newest first.",
            "default": "new_posting_date"
          },
          "postedWithinDays": {
            "title": "Posted within (days)",
            "minimum": 0,
            "type": "integer",
            "description": "Only include jobs posted or re-posted within this many days, by the posting date MyCareersFuture shows. 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 links (company leads are extra rows). Use 0 for no limit: every match, read in slices past MyCareersFuture's 10,000-jobs-per-search limit (about 70,000 jobs across Singapore). Left empty, a run takes 100, or a quick 25-job sample when nothing else is set either."
          },
          "scrapeJobDetails": {
            "title": "Scrape full job details",
            "type": "boolean",
            "description": "Open each job's detail record to add the full job description, number of vacancies, minimum years of experience, SSOC occupation code, education level and field of study, 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, industry, registered address, MyCareersFuture company page, and the website and headcount where the employer published them) and hiring signals across this run's matched jobs: job count, total vacancies, salary range, and the categories and seniority levels they are hiring for. Each lead row is billed as one result.",
            "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. The first run delivers up to Max jobs and records its starting point; later runs read newest first down to the last run's date and deliver only what is new. State persists across runs, so this pairs perfectly with Apify Schedules. 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 known job when its salary or status changes and tag it <code>salary_increase</code> / <code>salary_decrease</code> / <code>changed</code> with the previous salary. Turn off to deliver only brand-new jobs.",
            "default": true
          },
          "maxConcurrency": {
            "title": "Max concurrency",
            "minimum": 1,
            "maximum": 50,
            "type": "integer",
            "description": "Maximum number of detail records fetched in parallel (the run keeps a polite overall request rate either way).",
            "default": 10
          },
          "proxyConfiguration": {
            "title": "Proxy configuration",
            "type": "object",
            "description": "Proxy settings. The MyCareersFuture API is public and not geo-locked, so the default (Apify Proxy) is plenty; when the proxy does not answer, the run retries on its own IP.",
            "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
                  },
                  "PROXY_UNBLOCKER_UNITS": {
                    "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
                  },
                  "PROXY_UNBLOCKER_UNITS": {
                    "type": "integer",
                    "example": 0
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}