JobStreet & JobsDB Scraper: Every Job, Counted avatar

JobStreet & JobsDB Scraper: Every Job, Counted

Pricing

from $0.70 / 1,000 jobs

Go to Apify Store
JobStreet & JobsDB Scraper: Every Job, Counted

JobStreet & JobsDB Scraper: Every Job, Counted

Every job a JobStreet or JobsDB search lists in 6 countries, checked against the site's count. $1 per 1,000 jobs. Full description, salary and company profile.

Pricing

from $0.70 / 1,000 jobs

Rating

0.0

(0)

Developer

Luzi

Luzi

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

7 days ago

Last modified

Security

Limited permissions

Share

Get every job a JobStreet or JobsDB search lists, in Malaysia, Singapore, the Philippines, Indonesia, Hong Kong or Thailand, checked against the site's own count for that search, and each job with its full description, salary, applicant count, work type, classification, expiry date, screening questions and the hiring company's profile (industry, size, website, rating and reviews). One row per job. No account or cookies needed.

Tested daily. Latest check: 3,906 of 3,906 jobs from six searches, one in each country, three of them over 1,000 jobs, matching the site's count.

What does this Actor do?

You give it keywords and a place, or links to JobStreet or JobsDB job searches. For each search it reads the site's results and then each job's details, and saves one row per job, until it reaches your limit or the search has no more jobs. There is no page limit: a search of a thousand jobs is read to its last job. The run's final status tells you whether every job was read: "Saved 111 jobs from 1 search. That is every job the site lists for the search (111 of 111)."

Searches are read newest first. In relevance order the site repeats some jobs on later pages and leaves others out, so a long search read that way comes up short; newest first, each job comes once.

Each job comes with:

  • its title, link, teaser, summary and the full description, as text and as HTML
  • the date it was listed, when it expires, and whether it has expired
  • the salary, when the job shows one
  • work type (full time, part time, contract, casual) and work arrangement (on-site, hybrid, remote)
  • the classification and subclassification, with their ids
  • the place: the state and country, and the district, city or region when the site gives them
  • the advertiser, whether the site verified it and since when it advertises there
  • the hiring company's profile, when it has one: industry, size, website, description, rating, number of reviews and perks, and for some companies their registration number
  • the screening questions the employer asks applicants, when there are any
  • the job's selling points, tags, logo, cover image and video
  • phone numbers the ad lists, when it lists any
  • how many people applied and the site's application volume label, when the site shows them
  • whether you apply on the site or on the employer's own site
  • the search it was found in, and how many jobs the site counted for it

Why use it?

  • Six countries in one Actor. JobStreet Malaysia, Singapore, the Philippines and Indonesia, and JobsDB Hong Kong and Thailand, with the same input and the same fields.
  • Know you have the whole search. The run checks what it read against the site's own count, so a short read is never silent.
  • The company comes with the job. Industry, size, website, rating and review count are on the row when the company has a profile.
  • Track a job market. Run it daily with "Today", and collect each day's new jobs.
  • Use the data anywhere. Download as JSON, CSV or Excel, or send it to your own tools through Apify's API and integrations.

How to use it

  1. Pick the Country, then type one or more Keywords and a Location, or paste Search links, or both.
  2. Optionally, choose Classifications, Work types, Work arrangements, Date listed, a Salary range, Sort by and Max jobs per search.
  3. Click Start. When the run ends, open the Output tab to view the jobs or download them.

Run it with no input to see a sample: up to 50 "software engineer" jobs in Kuala Lumpur, charged as usual.

A job search on my.jobstreet.com, sg.jobstreet.com, ph.jobstreet.com, id.jobstreet.com, hk.jobsdb.com or th.jobsdb.com, such as https://my.jobstreet.com/data-engineer-jobs/in-Kuala-Lumpur?daterange=7 or https://hk.jobsdb.com/jobs?keywords=accountant&where=Kowloon. Its keywords, place, classification, subclassification, work type, work arrangement, date listed and salary filters are used. A link is read newest first unless it asks for relevance. A classification written in the link's path (/jobs-in-information-communication-technology) is not read: pick it under Classifications instead. Other pages (a single job, a company) and other sites stop the run before anything is read, naming the link.

Input

FieldWhat it doesDefault
Country (market)MY, SG, PH, ID (JobStreet), HK or TH (JobsDB), for the keywordsMY
Keywords (keywords)Job titles or skills to search for, one search each—
Location (location)A city, district, region or state, used for every keyword. Empty = whole country—
Classifications (classifications)Only jobs in these classificationsall
Work types (workTypes)full-time, part-time, contract, casualall
Work arrangements (workArrangements)on-site, hybrid, remoteall
Date listed (datePosted)any, or listed in the last 1, 3, 7, 14 or 31 daysany
Salary type (salaryType)annual, monthly or hourly: what the salary range is counted inmonthly
Salary from / to (salaryMin, salaryMax)Only jobs paying in this range, in the country's currency—
Sort by (sortBy)date (newest first) or relevancedate
Search links (startUrls)JobStreet or JobsDB job search links—
Max jobs per search (maxJobsPerSearch)Stop each keyword or link after this many jobs, 1 to 10,000100
Only new jobs (onlyNewItems)Return only jobs no earlier run returned; newest first only (see below)off

Give at least one keyword, a location, or one link. A location with no keywords searches every job there. Example input:

{
"market": "SG",
"keywords": ["data engineer", "analytics engineer"],
"workArrangements": ["hybrid", "remote"],
"datePosted": "7",
"maxJobsPerSearch": 500
}

New items only

Turn on Only new jobs (onlyNewItems) for a scheduled run, or a re-run of the same task. Each run then returns only the jobs it has not returned before: it reads each search back to a day before the last run that read it, through the site's own listed-in-the-last-days window (daterange), and skips the jobs an earlier run saved. Skipped jobs are neither saved nor charged; each new job is charged as usual. It works only with Sort by set to date (newest first, the default): in relevance order the site repeats some jobs on later pages and leaves others out.

  • Runs with other settings, or from another task, keep their own list, so two schedules on one search never skip each other's jobs.
  • If a search stops at Max jobs per search, the jobs past that point are not returned later. Set the maximum above what one search gets between runs.
  • The list lives in your Apify account, in a key-value store named jobstreet-jobs-scraper-monitor. Delete it to start afresh.

Output

One row per job. An example, with made-up values and the longer lists cut:

{
"job_id": "95000001",
"url": "https://my.jobstreet.com/job/95000001",
"title": "Data Engineer",
"company_name": "Example Sdn Bhd",
"advertiser_id": "60000001",
"advertiser_name": "Example Sdn Bhd",
"advertiser_verified": true,
"advertiser_registered_at": "2012-05-01T00:00:00.000Z",
"is_private_advertiser": false,
"employer_id": "7000",
"employer_name": "Example",
"employer_company_id": "800000",
"employer_company_url": "https://my.jobstreet.com/companies/example-800000",
"company_profile_id": "7000",
"company_profile_url": "https://my.jobstreet.com/companies/example-800000",
"company_industry": "Information & Communication Technology",
"company_size": "101-1,000 employees",
"company_website": "https://www.example.com",
"company_description": "We build example things.\nSince 1999.",
"company_rating": 4.1,
"company_review_count": 42,
"company_perks": ["Flexible hours", "Medical"],
"company_logo_url": "https://image-service-cdn.seek.com.au/…",
"company_jobs_url": "https://my.jobstreet.com/Example-jobs/at-this-company",
"company_tags": [{ "name": "Registration No.", "value": "000000-X" }],
"logo_url": "https://image-service-cdn.seek.com.au/…",
"cover_image_url": "https://image-service-cdn.seek.com.au/…",
"location": "Bayan Lepas, Penang",
"suburb": "Bayan Lepas",
"area": null,
"city": null,
"region": null,
"state": "Penang",
"country": "Malaysia",
"country_code": "MY",
"location_ids": ["1000187"],
"locations": [
{
"label": "Bayan Lepas, Penang",
"country_code": "MY",
"hierarchy": ["Bayan Lepas", "Penang"]
}
],
"salary": "RM 6,000 – RM 8,000 per month",
"work_type": "Full time",
"work_type_id": "242",
"work_arrangements": ["Hybrid"],
"work_arrangement_ids": ["2"],
"classification": "Information & Communication Technology",
"classification_id": "6281",
"subclassification": "Engineering - Software",
"subclassification_id": "6287",
"classifications": [
{
"classification": "Information & Communication Technology",
"classification_id": "6281",
"subclassification": "Engineering - Software",
"subclassification_id": "6287"
}
],
"role_id": "data-engineer",
"normalised_role_title": "Data Engineer",
"listed_at": "2026-10-22T01:02:03.000Z",
"listed_ago": "5h ago",
"expires_at": "2026-11-21T12:59:59.999Z",
"is_expired": false,
"status": "Active",
"is_promoted": false,
"display_type": "standard",
"apply_on_other_site": false,
"is_verified": true,
"has_role_requirements": true,
"applicant_count": 25,
"applicant_volume": "High application volume",
"badges": ["On-site"],
"contacts": [],
"tags": ["Be an early applicant"],
"teaser": "Join a small team building our data platform…",
"abstract": "Hybrid role in Penang.",
"bullet_points": ["Hybrid working", "Medical benefits"],
"screening_questions": ["What's your expected monthly basic salary?"],
"video_url": null,
"details_read": true,
"description_text": "About the role\n- Build our data platform…",
"description_html": "<p><strong>About the role</strong></p><ul><li>Build our data platform…</li></ul>",
"search_keyword": "data engineer",
"search_location": "Penang",
"search_location_resolved": "Penang",
"search_location_id": "1000187",
"search_market": "MY",
"search_url": "https://my.jobstreet.com/jobs?keywords=data%20engineer&where=Penang&sortmode=ListedDate",
"search_total": 157,
"search_listed": 157
}
FieldWhat it holds
job_idThe site's id for the job
urlThe job's page
titleThe job's title
company_nameThe company hiring, as the ad names it
advertiser_idThe site's id for the advertiser (the employer or its recruiter)
advertiser_nameThe advertiser's name
advertiser_verifiedtrue when the site verified the advertiser
advertiser_registered_atWhen the advertiser joined the site
is_private_advertisertrue for a private advertiser
employer_idThe site's id for the employer
employer_nameThe employer's name
employer_company_idThe employer's company id, when it has a company page
employer_company_urlThe employer's company page
company_profile_idThe site's id for the company profile
company_profile_urlThe company's profile on the site, when it has one
company_industryThe company's industry
company_sizeThe company's size ("101-1,000 employees")
company_websiteThe company's website
company_descriptionThe company's description, one paragraph a line
company_ratingThe company's rating on the site, out of 5
company_review_countHow many reviews the rating is from
company_perksThe perks and benefits the company lists
company_logo_urlThe logo on the company's profile
company_jobs_urlThe advertiser's other jobs on the site
company_tagsFacts the company lists about itself, such as its registration number
logo_urlThe logo on the job ad
cover_image_urlThe cover image on the job ad
locationWhere the job is, as the site shows it
suburbThe district or suburb, when the site gives one
areaThe area within the city, when the site gives one
cityThe city, when the site gives one
regionThe region, when the site gives one
stateThe state or province
countryThe country
country_codeMY, SG, PH, ID, HK or TH
location_idsThe site's ids for the place
locationsEvery place the ad lists, with its place names from narrow to broad
salaryThe pay, as shown. Empty when the job shows none
work_typeFull time, Part time, Contract/Temp or Casual/Vacation
work_type_idThe site's id for the work type
work_arrangementsOn-site, Hybrid or Remote
work_arrangement_idsThe site's ids for them
classificationThe classification ("Information & Communication Technology")
classification_idIts id
subclassificationThe subclassification ("Engineering - Software")
subclassification_idIts id
classificationsEvery classification the ad lists
role_idThe site's role id ("data-engineer")
normalised_role_titleThe site's name for the role
listed_atWhen the job was listed
listed_agoHow long ago, as the site says it ("4h ago")
expires_atWhen the ad expires
is_expiredtrue when the ad has expired
statusActive or Expired
is_promotedtrue when the site showed the job as a promoted ad on the page that listed it, or an earlier one
display_typeHow the site lays the ad out in the results (standard for most)
apply_on_other_sitetrue when you apply on the employer's own site
is_verifiedtrue when the site marks the ad verified
has_role_requirementstrue when the ad lists role requirements
applicant_countHow many people applied, when the site shows it
applicant_volumeThe site's label for it ("High application volume")
badgesThe badges the site puts on the job ("On-site")
contactsPhone numbers the ad lists
tagsThe site's labels on the ad ("Be an early applicant")
teaserThe short text the site shows in the results
abstractThe ad's summary
bullet_pointsThe ad's selling points
screening_questionsThe questions the employer asks applicants
video_urlThe ad's video, when it has one
details_readfalse when the job was taken down while the run read it: the row then holds only what the results showed
description_textThe full description, as plain text
description_htmlThe full description, with its formatting
search_keywordThe keyword the job was found under
search_locationThe location you searched
search_location_resolvedThe place the site searched for it
search_location_idThe site's id for that place
search_marketMY, SG, PH, ID, HK or TH
search_urlThe search on the site
search_totalHow many jobs the site counts for the search. Empty only when a promoted job was listed and the search filters on work arrangement and salary at once
search_listedThe site's headline number for the search

Not included: the apply link and an email address (the sites show them only to signed-in members), and salary estimates for a job that shows no salary.

How much does it cost?

No surcharges and no paid options; an item that fails is not charged.

You pay for what you get:

  • $1 per 1,000 jobs ($0.001 a job). Each job is charged once per run, even when two of your searches list it.
  • No start fee, and nothing per search.

So a search that lists 400 jobs costs $0.40. If you set a maximum cost for a run, the Actor stops when it reaches it and keeps every job saved so far.

How long does a run take?

About 50 jobs in 15 to 25 seconds; 3,906 jobs from six searches in 18 minutes (about 3.6 jobs a second). One search of 10,000 jobs takes about 45 minutes, inside the default 1-hour timeout; for several large searches in one run, raise the run's timeout.

Good to know

  • The site decides what matches. Its count includes jobs that only loosely match a keyword; the Actor returns what the site lists.
  • Counts move. The count for a busy search changes while it is read, so a search can read a job or two short of it, or past it. The final status says so, by search.
  • Relevance order is not checked. Sorted by relevance, the site repeats jobs on later pages and leaves others out, so a search read that way is not checked against the count; use newest first (the default) to read a search whole.
  • One job, one row. A job found again in the same run, under the same or another search, is saved and charged once. It still counts toward each search that lists it, so every search is checked against its own count.
  • A job taken down mid-run keeps the fields the results showed (title, company, place, salary, teaser) and has details_read set to false.
  • A search that cannot be read is reported in the run's status; the other searches carry on. The run fails only when none could be read.
  • Labels are in English, in every country. The job's own text (title, description) is in whatever language the employer wrote it.
  • Running it daily? Remove repeats by job_id.

More Actors from us

Use it from an AI agent or the API

One call starts a run and returns its items (Apify waits up to 300 seconds; for a longer run, start it with POST /v2/acts/…/runs and read its dataset):

POST https://api.apify.com/v2/acts/luzivanlt~jobstreet-jobs-scraper/run-sync-get-dataset-items?token=<YOUR_APIFY_TOKEN>

With the sample input as its JSON body:

{
"market": "MY",
"keywords": ["software engineer"],
"location": "Kuala Lumpur",
"datePosted": "any",
"salaryType": "monthly",
"sortBy": "date",
"maxJobsPerSearch": 50
}

Its inputs, in the order of the input form:

InputWhat it takesDefault
market (Country)Which site to search: JobStreet Malaysia, Singapore, the Philippines or Indonesia, or JobsDB Hong Kong or Thailand."MY"
keywords (Keywords)Job titles or skills to search for, one search per keyword (e.g. "data engineer").—
location (Location)Where the jobs are, as you would type it on the site: a city, district, region or state (e.g. "Kuala Lumpur", "Penang", "Cebu" or "Kowloon").—
classifications (Classifications)Only jobs in these classifications, for the keywords above.—
workTypes (Work types)Only these work types, for the keywords above: full time, part time, contract/temp or casual/vacation.—
workArrangements (Work arrangements)Only jobs on-site, hybrid or remote, for the keywords above.—
datePosted (Date listed)Only jobs listed in this time, for the keywords above: any time, today, or the last 3, 7, 14 or 30 days."any"
salaryType (Salary type)What the salary range below is counted in: annually, monthly or hourly."monthly"
salaryMin (Salary from)Only jobs paying at least this, in the country's currency (RM, S$, ₱, Rp, HK$ or ฿), for the keywords above.—
salaryMax (Salary to)Only jobs paying at most this, in the country's currency, for the keywords above.—
sortBy (Sort by)The order the jobs are read in: newest first, or relevance."date"
startUrls (Search links)Links to JobStreet or JobsDB job searches (my., sg., ph. or id.jobstreet.com; hk. or th.jobsdb.com), e.g. https://my.jobstreet.com/data-engineer-jobs/in-Kuala-Lumpur?daterange=7.—
maxJobsPerSearch (Max jobs per search)Stop each keyword or link after this many jobs, from 1 to 10,000.100
onlyNewItems (Only new jobs)Turn this on for a scheduled run, or a re-run of the same task: each run then returns only the jobs it has not returned before, reading each search back to a day before the last run that read it, through the site's own listed-in-the-last-days window.—

Apify's MCP server, https://mcp.apify.com, lists it as luzivanlt/jobstreet-jobs-scraper. To give an AI agent this Actor as a tool, add the server to the agent's MCP config:

{
"mcpServers": {
"apify": {
"url": "https://mcp.apify.com?tools=luzivanlt/jobstreet-jobs-scraper"
}
}
}

The client signs in with OAuth, or add "headers": { "Authorization": "Bearer <APIFY_TOKEN>" }.

Charged per job delivered; the sample input above costs at most $0.05.

FAQ

Do I need a JobStreet or JobsDB account, or cookies? No. The Actor reads what anyone can see on the sites without signing in.

Which countries does it cover? JobStreet Malaysia, Singapore, the Philippines and Indonesia, and JobsDB Hong Kong and Thailand. Not Vietnam.

Can I run it from my own code, on a schedule, or with other apps? Yes. Like any Apify Actor, you can start it through the Apify API, run it on a schedule, and connect it to other apps with Apify's integrations and webhooks.

This Actor reads only public job ads. An ad can list a phone number or name a person; treat those as personal data. Check the sites' terms and the laws that apply to you (such as Malaysia's PDPA, Singapore's PDPA or the GDPR) before you use the data. If you are unsure, ask a lawyer.

Support

Found a problem or missing a feature? Open an issue on the Issues tab and include the run's link.


This Actor is not affiliated with, endorsed by or sponsored by JobStreet, JobsDB or SEEK.