# JobStreet Singapore Scraper — Jobs, Salaries & Leads (`scrapesage/jobstreet-singapore-scraper`) Actor

Scrape JobStreet Singapore (sg.jobstreet.com). Get salary ranges, work type & arrangement (on-site/hybrid/remote), classification, company, full job descriptions and recruiter contact — turning postings into hiring-intent leads. Monitor mode emits only new or changed jobs. No login, no API key.

- **URL**: https://apify.com/scrapesage/jobstreet-singapore-scraper.md
- **Developed by:** [Scrape Sage](https://apify.com/scrapesage) (community)
- **Categories:** Jobs, Lead generation, Agents
- **Stats:** 14 total users, 5 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.77 / 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

## JobStreet Singapore Scraper — Jobs, Salaries, Skills & Company Leads

> **Disclaimer:** This Actor is an independent tool and is not affiliated with, endorsed by, or sponsored by SEEK Limited or any of its subsidiaries. All trademarks mentioned are the property of their respective owners. "JobStreet" is referenced only to describe the publicly available website this Actor collects data from.

Extract **complete job data from [JobStreet Singapore](https://sg.jobstreet.com)** — the country's largest commercial job board (on the SEEK platform). Get every field that matters: **salary ranges, work type and arrangement (on-site / hybrid / remote), classification, company, and the full job description** — plus, for lead generation, the **advertiser, employer verification badge, and recruiter phone number** when published.

No login, no cookies, no browser, no API key — fast JSON extraction straight from JobStreet's public search and GraphQL APIs, with **monitor mode** to capture only newly-posted or changed jobs on a schedule.

### Why this JobStreet scraper?

Most job scrapers grab the listing card and stop, or return one stale aggregator feed without salaries or descriptions. This actor reads JobStreet's live search API **and** enriches each posting through its GraphQL job API — so you get the **richest JobStreet Singapore dataset in the category**, with parsed salaries, full descriptions, and the employer turned into a lead.

| Data | Typical job scrapers | This actor |
|---|---|---|
| Job title, company, location, listed date | ✅ | ✅ |
| Salary **parsed** to min/max + period + currency | ❌ raw text or null | ✅ when published |
| Work type (Full/Part time, Contract…) | partial | ✅ |
| Work **arrangement** (on-site / hybrid / remote) | ❌ | ✅ |
| Classification + sub-classification | ❌ | ✅ |
| Full job description (HTML **and** plain text) | partial | ✅ |
| Advertiser + employer verification badge | ❌ | ✅ |
| **Recruiter phone number** (lead gen) | ❌ | ✅ when published |
| Expiry date, posting status, ad type (organic/sponsored) | ❌ | ✅ |
| Company profile URL + logo | ❌ | ✅ |
| **Monitor mode** — only new & changed jobs | ❌ | ✅ |
| No start fee | ❌ | ✅ |

### Use cases

- **Recruitment & sourcing intelligence** — track who's hiring across Singapore's largest commercial board, with salaries, work arrangement and full descriptions in one clean feed.
- **Lead generation** — a new posting is a buying signal. Capture the advertiser, company page and (when published) the recruiter phone number; target agencies and employers for HR-tech, staffing, training, payroll or recruitment outreach.
- **Salary & compensation benchmarking** — parse published salary ranges by role, classification, work type and arrangement. Turn on *Only jobs with a salary* for clean benchmarking datasets.
- **Labour-market research** — analyse hiring velocity, remote/hybrid mix, and in-demand categories across Singapore.
- **Job boards & aggregators** — power a niche site with fresh, structured, deduplicated postings — salaries and descriptions included.

### 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 **JobStreet Singapore Scraper**, enter search terms (e.g. `data engineer`, `nurse`) and any filters, and click **Start**.
3. Watch results stream into the dataset table — one clean row per job.
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
{
    "searchTerms": ["data engineer", "accountant"],
    "classifications": ["6281"],
    "workTypes": ["Full time"],
    "salaryMin": 4000,
    "onlyWithSalary": false,
    "sortBy": "ListedDate",
    "postedWithinDays": 7,
    "includeJobDetails": true,
    "maxItems": 500,
    "monitorMode": false
}
```

- **searchTerms** — keywords, each searched separately. Leave empty to scrape **all** live Singapore jobs (narrow with filters and limits).
- **startUrls** — paste JobStreet job URLs (`https://sg.jobstreet.com/job/12345678`) to scrape specific postings, or search URLs to reuse their keyword.
- **classifications** — optional JobStreet classification IDs (e.g. `6281` ICT, `1209` Engineering, `1203` Accounting); see the field hint for the full list.
- **workTypes** — keep only these work types (`Full time`, `Part time`, `Contract/Temp`, `Casual/Vacation`). Applied by the actor with loose matching, so `Contract` also matches `Contract/Temp`.
- **salaryMin** — minimum monthly salary in SGD (applied to published salaries).
- **onlyWithSalary** *(default false)* — drop postings without a published salary (~40–45% of JobStreet SG jobs show one).
- **sortBy** *(default `ListedDate`)* — newest first (best for monitoring) or `KeywordRelevance`.
- **postedWithinDays** *(default 0 = no limit)* — only jobs listed within the last N days; also stops pagination early for fast, cheap incremental runs.
- **includeJobDetails** *(default true)* — fetch each job's GraphQL detail for the full description, exact salary, advertiser verification, status, expiry date and recruiter phone. Adds one request per job.
- **maxItems / maxItemsPerSearch** *(default 0 = no limit)* — caps for test runs or budget control.
- **monitorMode** *(default false)* — emit only new or changed jobs since the last run (see below).
- **dedupStoreName** *(default `jobstreet-sg-state`)* — named store holding the monitor state.
- **proxyConfiguration** — proxy settings (default Apify Proxy; residential is **not** needed).

### Output

One clean record per job:

```json
{
    "jobId": "92698989",
    "title": "Accounts Executive (Full Sets / Shipping)",
    "url": "https://sg.jobstreet.com/job/92698989",
    "teaser": "Handle finance analysis, budgeting, audit checks and vessel-related documentation…",
    "abstract": "Handle finance analysis, budgeting, audit checks, accounting records…",
    "descriptionHtml": "<ul><li><p><strong>Position : Accounts Executive…</strong></p></li>…</ul>",
    "descriptionText": "Position : Accounts Executive (Full Sets / Shipping)\nLocation : Orchard…",
    "companyName": "Search Personnel Pte Ltd",
    "companyUrl": "https://sg.jobstreet.com/companies/search-personnel-168551...",
    "advertiserName": "Search Personnel Pte Ltd",
    "advertiserIsVerified": true,
    "recruiterPhone": "+65 6...",
    "salaryLabel": "$4,000 – $4,500 per month",
    "salaryMin": 4000,
    "salaryMax": 4500,
    "salaryPeriod": "month",
    "salaryCurrency": "SGD",
    "workTypes": ["Full time"],
    "workArrangements": ["On-site"],
    "classification": "Accounting",
    "subClassification": "Accounts Officers/Clerks",
    "bulletPoints": ["5-day work week", "Career progression"],
    "location": "Orchard, Central Region, SG",
    "region": "Central Region",
    "country": "Singapore",
    "listingDate": "2026-06-12T14:13:52Z",
    "expiryDate": "2026-07-13T13:59:59.999Z",
    "status": "Active",
    "isExpired": false,
    "jobAdType": "ORGANIC",
    "isFeatured": false,
    "logoUrl": "https://bx-branding-gateway.cloud.seek.com.au/...jdpLogo",
    "searchTerm": "accountant",
    "scrapedAt": "2026-06-12T17:00:53.690Z"
}
```

#### What to expect (field coverage)

JobStreet is employer-entered data, so several fields appear only when the employer published them.

| Field group | Always present | Present when published |
|---|---|---|
| Identity | jobId, title, url, listingDate | teaser, bulletPoints |
| Salary | salaryLabel/Min/Max parsed | shown on ~40–45% of postings (the rest hide it) |
| Classification | classification, subClassification | — |
| Work | workTypes | workArrangements (on-site/hybrid/remote) |
| Job details *(with `includeJobDetails`)* | descriptionHtml, descriptionText, status, expiryDate | abstract, advertiserIsVerified, **recruiterPhone** |
| Company | companyName, companyUrl, advertiserName | logoUrl, companyId |
| Location | location, country | region (when the label includes a region) |

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

### Monitor only new & changed jobs

Turn on **`monitorMode`** and the actor saves a fingerprint of every job it has seen in a **named key-value store** (`dedupStoreName`), then on each later run emits **only jobs that are new or have changed** — tagged with `monitorStatus`:

- `new` — a posting not seen before.
- `salary_change` — the salary changed (with `previousSalaryLabel`).
- `updated` — the job was relisted / its listing date changed.

The **first run emits everything** (and seeds the state); subsequent runs emit only the delta. Combined with a daily [Schedule](https://docs.apify.com/platform/schedules), you get a clean feed of *just* the new Singapore roles for your search — perfect for hiring-signal alerts and job-board ingestion.

- Monitor mode is the actor's own dedupe layer — it **complements**, and does not conflict with, Apify [Schedules](https://docs.apify.com/platform/schedules) (a cron trigger) or the Console [Monitoring](https://docs.apify.com/platform/monitoring) tab (charts & alerts). The Schedule triggers the run; monitor mode decides what's worth saving.
- Use a **distinct `dedupStoreName` per independent monitor** so their states don't mix.
- If you schedule frequent runs, enable the Schedule's *exclusive* option so a new run doesn't start before the previous one finishes writing its state.
- Heads-up: a quiet run legitimately returns **0 items**, which can trip a Console Monitoring "results lower than N" alert — expected behaviour, not an error.

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

This Actor uses Apify's **pay-per-event** pricing: you are charged only for the results it delivers, with no monthly rental and no start fee. The events it can charge are:

- **Job Scraped** - One JobStreet Singapore job posting with salary range, work type $ arrangement, classification, company, full job description and recruiter contact (when published)

The current price of each event is shown on the **Pricing** tab of this page. Set a maximum total charge on the run if you want a hard cap on spend, and use the input limits to control how much the Actor fetches.

### 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 hourly/daily to track new Singapore postings; pair with `monitorMode` for a new-jobs-only feed.
- **[Webhooks](https://docs.apify.com/platform/integrations/webhooks)** — trigger downstream actions (CRM import, Slack alert, job-board ingest) 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/jobstreet-singapore-scraper').call({
    searchTerms: ['data engineer'],
    onlyWithSalary: true,
    postedWithinDays: 7,
    monitorMode: true,
});

const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(`Got ${items.length} new Singapore jobs`);
```

### 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 job postings or leads straight into your ATS, CRM, or spreadsheet.
- **[Slack](https://docs.apify.com/platform/integrations/slack)** — get notified when a monitored search finds new roles.
- **[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 accounting jobs paying over $5k and list the companies and salaries" and let it run the scraper for you.

### Agent-ready: autonomous payments (x402 & Skyfire)

This actor is **agent-ready** — AI agents can discover it, run it, and **pay for it autonomously**, with no Apify account and no human in the loop. It uses [pay-per-event](https://docs.apify.com/platform/actors/publishing/monetize/pay-per-event) pricing and [limited permissions](https://docs.apify.com/platform/actors/development/permissions), so it qualifies for Apify's agentic-payment standards:

- **[x402](https://docs.apify.com/platform/integrations/x402)** — an open, HTTP-native payment protocol. Agents pay per run in USDC on the Base network directly through the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp) — no account, no API key.
- **[Skyfire](https://docs.apify.com/platform/integrations/skyfire)** — agent-to-service payments for fully autonomous AI-agent workflows.

Building an AI agent, MCP tool, or autonomous data pipeline? This scraper is ready to plug in and pay as it goes.

### More scrapers from scrapesage

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

- **[MyCareersFuture Scraper](https://apify.com/scrapesage/mycareersfuture-scraper)** — Singapore's government job portal: mandatory salary ranges, skills and employer UEN.
- **[SGCarMart Used Car Scraper](https://apify.com/scrapesage/sgcarmart-used-car-scraper)** — Singapore used cars with prices, COE/OMV/ARF and dealer leads.
- **[Multi-ATS Job Scraper](https://apify.com/scrapesage/multi-ats-job-scraper)** — postings from Greenhouse, Lever, Ashby, SmartRecruiters & Workday in one unified dataset.
- **[LinkedIn Jobs Scraper](https://apify.com/scrapesage/linkedin-jobs-scraper)** — LinkedIn job postings as hiring-intent signals.
- **[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 from Sched events.
- **[Bark Listing Scraper](https://apify.com/scrapesage/bark-listing-scraper)** — service-provider leads from Bark.
- **[Google Ads Transparency Scraper](https://apify.com/scrapesage/google-ads-transparency-scraper)** — who's advertising what on Google.

### Tips

- **Newest-first + `postedWithinDays`** is the cheapest way to track a market: results are sorted newest-first, so the actor stops paginating once it passes your date window.
- **Listing-only, faster runs**: set `includeJobDetails: false` to skip the per-job detail call — you still get salary, work type/arrangement, classification, company and location from the listing, at a fraction of the cost. Turn it on for full descriptions and recruiter contacts.
- **Salary benchmarking**: combine `onlyWithSalary: true` with a classification to build a clean compensation dataset for a sector.
- **Big pulls**: JobStreet lists ~60,000+ live Singapore jobs. Use `searchTerms`, `classifications` and limits to focus a run.
- **Recurring monitoring**: combine `monitorMode` with [Schedules](https://docs.apify.com/platform/schedules) and a [webhook](https://docs.apify.com/platform/integrations/webhooks) to push new roles into your CRM the moment they appear.

### FAQ

**How do I scrape jobs for a specific role or sector?** Put keywords in `searchTerms` and/or pick `classifications`, `workTypes` and `salaryMin`. You can also paste a JobStreet job URL into `startUrls` to scrape a specific posting.

**Does it need a JobStreet API key or login?** No. This actor reads the same public search and GraphQL APIs that power sg.jobstreet.com — no key, cookie or login required.

**Why do some jobs have no salary?** JobStreet lets employers hide salary, so roughly 40–45% of Singapore postings show a range. When a salary is published, it's parsed into `salaryMin`, `salaryMax`, `salaryPeriod` and `salaryCurrency`. Use `onlyWithSalary` to keep only jobs that show one.

**Where does the recruiter phone come from?** From the job's own detail page, where some advertisers (especially recruitment agencies) publish a contact number. It's captured with `includeJobDetails` on, and is blank when the advertiser didn't publish it.

**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?** Turn on `monitorMode`, create a [Schedule](https://docs.apify.com/platform/schedules) (e.g. daily), 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 into your CRM as they appear.

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

### Disclaimer

**This Actor is an independent tool and is not affiliated with, endorsed by, or sponsored by SEEK Limited or any of its subsidiaries. All trademarks mentioned are the property of their respective owners.**

"JobStreet" and any related marks are the property of their respective owners and are used here only in a descriptive, nominative sense - to identify the publicly accessible website from which this Actor collects data. This Actor is not an official JobStreet product, is not authorised or certified by SEEK Limited, and does not distribute JobStreet software. It collects only publicly available information; you are responsible for ensuring your use of that data complies with applicable laws, regulations and the terms of the source website.

### Need help?

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

# Actor input Schema

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

Keywords to search on JobStreet Singapore, e.g. <code>data engineer</code>, <code>nurse</code>, <code>accountant</code>. Each term is searched separately. Leave empty to scrape <b>all</b> live Singapore jobs (narrow with the filters and limits below).

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

Paste JobStreet Singapore job URLs (<code>https://sg.jobstreet.com/job/12345678</code>) to scrape specific postings, or search-result URLs to reuse their keyword. Used in addition to the search terms above.

## `classifications` (type: `array`):

Optional JobStreet classification IDs to filter by (combined with every search term). Common IDs: <code>6281</code> Information & Communication Technology, <code>1209</code> Engineering, <code>1203</code> Accounting, <code>1204</code> Administration & Office Support, <code>1216</code> Sales, <code>1223</code> Marketing & Communications, <code>1210</code> Banking & Financial Services, <code>1220</code> Healthcare & Medical, <code>6304</code> Manufacturing/Transport/Logistics, <code>6317</code> Human Resources & Recruitment, <code>1211</code> Construction, <code>6092</code> Education & Training.

## `workTypes` (type: `array`):

Optional. Keep only jobs of these work types. Labels: <code>Full time</code>, <code>Part time</code>, <code>Contract/Temp</code> (or just <code>Contract</code>), <code>Casual/Vacation</code>. Matching is loose, so <code>Contract</code> also matches <code>Contract/Temp</code>.

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

Only keep jobs whose published monthly salary is at least this amount (SGD). Jobs that don't publish a salary are kept unless 'Only jobs with a salary' is on.

## `onlyWithSalary` (type: `boolean`):

Drop postings that don't show a salary. About 40–45% of JobStreet Singapore jobs publish a salary range — turn this on for clean salary-benchmarking datasets.

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

Result ordering. <code>Newest first</code> is best for monitoring fresh postings; <code>Most relevant</code> ranks by keyword match.

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

Only include jobs listed within the last N days (0 = no date limit). Because results are sorted newest-first, this also stops pagination early for fast, cheap incremental runs.

## `includeJobDetails` (type: `boolean`):

Fetch each job's detail (via JobStreet's GraphQL API) for the <b>full job description</b>, the job summary, exact salary, employer verification badge, posting status, expiry date, and the <b>recruiter phone number</b> when published (great for lead generation). Adds one request per job. Turn off for a faster, cheaper listing-only run.

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

Maximum number of jobs to scrape across all search terms and URLs (0 = no limit).

## `maxItemsPerSearch` (type: `integer`):

Cap the number of jobs scraped for each individual search term / classification (0 = no limit).

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

Output only jobs that are <b>new</b> or have <b>changed</b> (e.g. a salary update or a relist) since the last run for the same input. Each row is tagged with <code>monitorStatus</code> (<code>new</code>, <code>salary\_change</code>, <code>updated</code>) and, for salary changes, <code>previousSalaryLabel</code>. The first run emits everything and seeds the state. Pairs perfectly with Apify Schedules — see the README.

## `dedupStoreName` (type: `string`):

Named key-value store that holds the 'seen jobs' state for monitor mode. Use a distinct name per independent monitor (e.g. per client or per saved search) so their states don't mix.

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

Maximum number of API requests made in parallel.

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

Proxy settings. JobStreet's public API has no aggressive anti-bot, so the default Apify Proxy is more than enough; no residential proxy is required.

## `urlsFromFile` (type: `string`):

Paste a list of URLs (one per line), OR one link to a .txt/.csv file, Google Sheet or Google Drive file containing them. Lets you import many Start URLs at once instead of typing each. Google Sheet/Drive share links are handled automatically.

## Actor input object example

```json
{
  "searchTerms": [
    "data engineer"
  ],
  "onlyWithSalary": false,
  "sortBy": "ListedDate",
  "postedWithinDays": 0,
  "includeJobDetails": true,
  "maxItems": 0,
  "maxItemsPerSearch": 0,
  "monitorMode": false,
  "dedupStoreName": "jobstreet-sg-state",
  "maxConcurrency": 10,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

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

All scraped job postings in the default dataset. One clean row per job.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

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

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "searchTerms": [
        "data engineer"
    ],
    "urlsFromFile": ""
};

// Run the Actor and wait for it to finish
const run = await client.actor("scrapesage/jobstreet-singapore-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "searchTerms": ["data engineer"],
    "urlsFromFile": "",
}

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

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

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

```

## CLI example

```bash
echo '{
  "searchTerms": [
    "data engineer"
  ],
  "urlsFromFile": ""
}' |
apify call scrapesage/jobstreet-singapore-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,scrapesage/jobstreet-singapore-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/Ik7waJHe0QZB27LOU/builds/lBWarG3MrwULcCZBM/openapi.json
