JobStreet Scraper: Jobs in Singapore, Malaysia & Philippines
Pricing
from $0.50 / 1,000 job posting returneds
JobStreet Scraper: Jobs in Singapore, Malaysia & Philippines
Scrape JobStreet job listings in Singapore, Malaysia, the Philippines and Indonesia by keyword and location, no login. Salary range, company, work type, posted date and job link for each posting. Filter by title, company or district. Export to Google Sheets.
Pricing
from $0.50 / 1,000 job posting returneds
Rating
0.0
(0)
Developer
Adriana Voss
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
a day ago
Last modified
Categories
Share
Get JobStreet job postings for Singapore, Malaysia, the Philippines or Indonesia by keyword and location, one row per posting, with pay range, company, work type and posted date. Type a job title (or "title @ district"), pick the country, and each matching posting comes back as its own row with a direct job link. No login, no cookies, no key. You are charged per posting returned, and a search with no matches costs nothing.
Who uses it
- Recruiters and sourcers watching which companies in Singapore, Kuala Lumpur, Manila or Jakarta are hiring for a role right now.
- Salary and market researchers comparing the pay range posted for the same job title across districts and countries.
- Sales teams building lists of companies that are hiring, from the company name and company profile link.
- Job aggregators and Sheets or n8n workflows that need fresh JobStreet postings on a schedule.
Pay is only shown on part of the postings (36 to 58 of every 100 postings in the 2026-10-20 checks, depending on the country) and is returned as null when the employer did not post one. Full job descriptions are not included: each row carries the posting's one-line teaser and highlight bullets.
The four countries
country | Site | Example search line |
|---|---|---|
sg Singapore (default) | sg.jobstreet.com | accountant @ Orchard |
my Malaysia | my.jobstreet.com | software engineer @ Kuala Lumpur |
ph Philippines | ph.jobstreet.com | customer service @ Metro Manila |
id Indonesia | id.jobstreet.com | driver @ Jakarta |
One country per run. Hong Kong and Thailand are on JobsDB, a separate actor.
How to use
- In the Apify Console. Open the actor page and click Start — the
keywordsfield is already pre-filled with a working example. Results land in the run's dataset as soon as each item is found. - Via the API. Call it directly with a POST request — no Console needed once you have an API token:
curl "https://api.apify.com/v2/acts/accountable_eel~jobstreet-jobs-lookup/run-sync-get-dataset-items?token=<YOUR_TOKEN>" \-X POST \-H "Content-Type: application/json" \-d '{"keywords":["sales"]}'
- On a schedule. Save this actor as an Apify Task with the input you want, then add a Schedule (hourly, daily, weekly) so it runs on its own — no server of your own required.
Input
{"keywords": ["sales"]}
One search per line. Write "keywords @ location", or just the keywords and pick a location below. Pick Singapore, Malaysia, the Philippines or Indonesia under Search settings. Accepted formats: sales, accountant @ Orchard, software engineer @ Kuala Lumpur, customer service @ Metro Manila, driver @ Jakarta.
Output
One row per job posting. Missing values are null, never 0 or an empty string. Every row carries jobUrl (the posting's link), scrapedAt, and the search that produced it.
Example row (real posting, Singapore, 2026-10-20):
{"jobId": "95346790","title": "No Need Experience! Branch Sales Executive ($3600 + Commission)","companyName": "Talents Connect","country": "SG","location": "Singapore","classification": "Sales","workTypes": ["Full time"],"workArrangement": null,"salaryLabel": "$3,600 – $4,400 per month","postedAt": "2026-10-19T04:23:12Z","jobUrl": "https://sg.jobstreet.com/job/95346790"}
Fields: jobId, title, companyName, advertiser (may be a recruiter), companyUrl, location, country, remote, classification, subClassification, workTypes, workArrangement (Remote / Hybrid when JobStreet says so), salaryLabel (as JobStreet words it), teaser, bulletPoints, isFeatured, postedAt, postedAgo, jobUrl, companyLogoUrl.
Column reference:
| query | found | status | searchKeywords | searchLocation | jobCount | totalAvailable | truncated | jobs | jobId | title | companyName | advertiser | companyUrl | location | country | remote | classification | subClassification | workTypes | workArrangement | salaryLabel | teaser | bulletPoints | isFeatured | postedAt | postedAgo | jobUrl | companyLogoUrl | scrapedAt |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| sales | true | OK | <all postings found (full list)> | <advertiser (may be a recruiter)> | <remote?> | <pay range (as jobstreet displays it)> | <teaser (the posting's one-line summary)> | <posted (as jobstreet words it)> | 1970-01-01T00:00:00.000Z |
A search with no matching postings comes back as one row with "found": false and is never charged.
Limits
- Search depth. JobStreet hands out 100 postings per page. This actor reads up to 30 pages, so at most 3,000 postings per search; "Most postings to return per search" (default 50) is your budget control. When a search has more matches than you asked for,
truncatedistrueandtotalAvailablesays how many JobStreet counts. - Pace. The actor sends at most one request per second, so a 3,000-posting search takes about 45 seconds.
- Filters. Keywords, location (
where) and "Posted within" are applied by JobStreet itself. Title, company, district and remote filters are applied by the actor after the postings arrive. - No job descriptions. Only the one-line teaser and highlight bullets are returned; job pages are never opened.
Pricing
Pay-per-event. A flat per-run fee covers session/proxy warmup; you're billed
per item only when data is actually found and returned — see
.actor/pay_per_event.json for exact prices. A miss is never charged.
One billable event, job-returned, charged once per posting returned. A search with no matches, or whose matches are all filtered out, is never charged. The "Most postings to return per search" and "Stop after this many results" fields cap your spend.
Example runs
Paste any of these into the Input tab and press Start.
Sales jobs in Singapore. The default shape.
{"country": "sg","keywords": ["sales"],"maxResults": 20}
Software engineers in Kuala Lumpur, posted in the last week.
{"country": "my","keywords": ["software engineer @ Kuala Lumpur"],"postedWithin": "week","maxJobsPerQuery": 100}
Customer service roles in Metro Manila, remote only, skipping staffing agencies.
{"country": "ph","keywords": ["customer service @ Metro Manila"],"remoteOnly": true,"excludeCompanies": ["recruit", "staffing"]}
Drivers in Jakarta.
{"country": "id","keywords": ["driver @ Jakarta"],"maxJobsPerQuery": 50}
Use it from Clay, n8n, Make, or an AI agent
This actor runs synchronously over plain HTTP — call it directly from a script, a workflow tool, or an AI agent, no Apify Console needed once you have an API token.
curl "https://api.apify.com/v2/acts/accountable_eel~jobstreet-jobs-lookup/run-sync-get-dataset-items?token=<YOUR_TOKEN>" \-X POST \-H "Content-Type: application/json" \-d '{"keywords":["sales"]}'
n8n. Add an HTTP Request node: Method POST, URL https://api.apify.com/v2/acts/accountable_eel~jobstreet-jobs-lookup/run-sync-get-dataset-items?token=<YOUR_TOKEN>, Body Content Type JSON, JSON Body {"keywords":["sales"]} (swap in an expression from an earlier node for a real value).
Clay. Add an "HTTP API" column: Method POST, URL https://api.apify.com/v2/acts/accountable_eel~jobstreet-jobs-lookup/run-sync-get-dataset-items?token=<YOUR_TOKEN>, Body {"keywords":["{{search}}"]}, mapping the row's search into the keywords array.
MCP. In Claude, Cursor, or any MCP client with the Apify MCP server, ask for "jobstreet scraper" — the agent will find and run this actor.