JobStreet Singapore Scraper — Jobs, Salaries & Leads
Pricing
$4.00 / 1,000 job scrapeds
JobStreet Singapore Scraper — Jobs, Salaries & Leads
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.
Pricing
$4.00 / 1,000 job scrapeds
Rating
0.0
(0)
Developer
Scrape Sage
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
4 hours ago
Last modified
Categories
Share
JobStreet Singapore Scraper — Jobs, Salaries, Skills & Company Leads
Extract complete job data from JobStreet Singapore — 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
- Sign up for Apify — the free plan is enough to try this actor.
- Open the JobStreet Singapore Scraper, enter search terms (e.g.
data engineer,nurse) and any filters, and click Start. - Watch results stream into the dataset table — one clean row per job.
- Export as JSON, CSV, Excel, XML, or RSS — or pull results programmatically via the Apify API.
Input
{"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.
6281ICT,1209Engineering,1203Accounting); 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, soContractalso matchesContract/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) orKeywordRelevance. - 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:
{"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 (withpreviousSalaryLabel).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, 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 (a cron trigger) or the Console Monitoring tab (charts & alerts). The Schedule triggers the run; monitor mode decides what's worth saving.
- Use a distinct
dedupStoreNameper 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.
Automate & schedule
Run this actor on autopilot and pull results into your own stack:
- Apify API — start runs, fetch datasets, and manage schedules over REST.
- apify-client for JavaScript and apify-client for Python — official SDKs.
- Schedules — run it hourly/daily to track new Singapore postings; pair with
monitorModefor a new-jobs-only feed. - Webhooks — trigger downstream actions (CRM import, Slack alert, job-board ingest) the moment a run finishes.
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 — multi-step automation scenarios.
- Zapier — push new job postings or leads straight into your ATS, CRM, or spreadsheet.
- Slack — get notified when a monitored search finds new roles.
- Google Drive / Sheets — auto-export every run to a spreadsheet.
- Airbyte — pipe results into your data warehouse.
- 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 — 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.
More scrapers from scrapesage
Build a complete Singapore hiring-intelligence & lead-gen stack:
- MyCareersFuture Scraper — Singapore's government job portal: mandatory salary ranges, skills and employer UEN.
- SGCarMart Used Car Scraper — Singapore used cars with prices, COE/OMV/ARF and dealer leads.
- Multi-ATS Job Scraper — postings from Greenhouse, Lever, Ashby, SmartRecruiters & Workday in one unified dataset.
- LinkedIn Jobs Scraper — LinkedIn job postings as hiring-intent signals.
- Eventbrite Scraper — events plus organizer leads (ticket prices, emails, socials).
- Sched Conference Scraper — speakers, sessions and sponsors from Sched events.
- Bark Listing Scraper — service-provider leads from Bark.
- Google Ads Transparency Scraper — who's advertising what on Google.
Tips
- Newest-first +
postedWithinDaysis 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: falseto 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: truewith a classification to build a clean compensation dataset for a sector. - Big pulls: JobStreet lists ~60,000+ live Singapore jobs. Use
searchTerms,classificationsand limits to focus a run. - Recurring monitoring: combine
monitorModewith Schedules and a webhook 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.
How do I monitor new jobs automatically? Turn on monitorMode, create a Schedule (e.g. daily), and optionally add a webhook or Zapier zap 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.
Need help?
Open an issue on the actor's Issues tab, or visit the Apify help center. Feature requests — more filters, more fields — are welcome; this actor is actively maintained.