JobStreet Job Listings Scraper

Export public JobStreet job listings by keyword, country, and optional location into structured records for recruitment research and market analysis.

Data fields

FieldTypeDescription
jobIdstring | nullValue exported as jobId.
seekJobIdstring | nullValue exported as seekJobId.
titlestring | nullValue exported as title.
canonicalUrlstring | nullValue exported as canonicalUrl.
companystring | nullValue exported as company.
companyUrlstring | nullValue exported as companyUrl.
advertiserIdstring | nullValue exported as advertiserId.
locationstring | nullValue exported as location.

Input preview

queryJob title or keywords *
countryJobStreet country
locationLocation
maxItemsMaximum listings

API and agents

This actor can be run through Apify API, datasets, webhooks, schedules, and the official Apify MCP server.

Ready-to-run examples

Open a saved Apify example, adjust the input, and run the actor in your own Apify account.

View all examples

How this actor works

See example inputs, outputs, API usage, and practical limits before running this actor on Apify.

Open Apify page

Export public JobStreet job listings from supported Southeast Asian JobStreet marketplaces. Search by keyword, choose a marketplace, and download structured records for recruitment research, salary analysis, and hiring-market monitoring.

What you get

Each result represents one public JobStreet listing. Search results currently provide title, employer, location, salary label, classification, work type, teaser text, dates, and source context. Fields unavailable in the public search response are returned as null or an empty list rather than guessed.

{
  "jobId": "94228905",
  "title": "Software Engineer Project Manager",
  "company": "HiThink Technology Indonesia",
  "location": "South Jakarta, Jakarta",
  "salaryText": "Rp 13.500.000 – Rp 20.000.000 per month",
  "salaryCurrency": "IDR",
  "canonicalUrl": "https://id.jobstreet.com/job/94228905"
}

Output fields

Group Fields
Identity and employer jobId, seekJobId, title, canonicalUrl, company, companyUrl, advertiserId
Location and salary location, locationCountry, locationState, locationSuburb, locationPostcode, salaryText, salaryMin, salaryMax, salaryCurrency, salaryType
Job classification employmentType, workArrangement, category, subCategory, roleId, teaser, bulletPoints
Description and company details description, descriptionHtml, descriptionMarkdown, descriptionLength, contentQuality, companyIndustry, companySize, companyWebsite, phoneNumber, screeningQuestions, applyUrl
Dates and source postedDate, validThrough, contentHash, isSponsored, sourceUrl, sourceCountry, sourceDomain, searchQuery, searchUrl, scrapedAt, fetchedAt, detailFetched, extractedEmails
Tracking compatibility changeType, trackedHash, firstSeenAt, lastSeenAt, previousSeenAt, expiredAt, stateKey, isRepost, repostOfId, repostDetectedAt

Who is it for?

  • Recruiters and talent teams building role- and location-specific prospecting lists.
  • Market researchers comparing public hiring demand, employers, and disclosed compensation.
  • Analysts and developers feeding structured JobStreet records into dashboards, databases, or agents.
  • Job-market monitors tracking public listings repeatedly through stable job IDs and source URLs.

Use cases

  • Build a list of relevant openings for recruitment research.
  • Compare advertised salary ranges across locations and job categories.
  • Monitor public hiring demand for a keyword or role.

Limits

Results reflect the fields publicly returned by JobStreet at request time. Salary and employer details vary by listing. The actor does not access login-only data and never fabricates unavailable detail fields.

Tips for useful searches

  • Use role-focused terms such as software engineer, accountant, or customer service.
  • Start with 10–25 listings to review a new query, then raise maxItems when it returns relevant roles.
  • Select the country where the hiring market is relevant; results are not inferred from your location.
  • Keep salaryText alongside normalized salary values because listings may use different pay periods or disclose no pay.
  • Save jobId, canonicalUrl, and scrapedAt when comparing repeated exports over time.

Working with the data

Goal Suggested fields
Find new openings title, company, location, postedDate, canonicalUrl
Compare compensation salaryText, salaryMin, salaryMax, salaryCurrency, salaryType
Segment hiring demand category, subCategory, employmentType, workArrangement
Keep a research trail jobId, sourceUrl, searchQuery, scrapedAt, contentHash

API usage

Node.js

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('fetch_cat/jobstreet-job-listings-scraper').call({
  query: 'software engineer', country: 'ID', maxItems: 25,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);

Python

from apify_client import ApifyClient
client = ApifyClient("YOUR_APIFY_TOKEN")
run = client.actor("fetch_cat/jobstreet-job-listings-scraper").call(
    run_input={"query": "software engineer", "country": "ID", "maxItems": 25}
)
print(list(client.dataset(run["defaultDatasetId"]).iterate_items()))

cURL

curl -X POST 'https://api.apify.com/v2/acts/fetch_cat~jobstreet-job-listings-scraper/runs?token=YOUR_APIFY_TOKEN' \
  -H 'content-type: application/json' \
  -d '{"query":"software engineer","country":"ID","maxItems":25}'

MCP and agent workflows

Use the same structured input with the Apify MCP server. Add it to Claude Code with:

claude mcp add --transport http apify https://mcp.apify.com?tools=fetch_cat/jobstreet-job-listings-scraper

Or add this server configuration to an MCP-compatible client:

{
  "mcpServers": {
    "apify": {
      "type": "http",
      "url": "https://mcp.apify.com?tools=fetch_cat/jobstreet-job-listings-scraper"
    }
  }
}

Example prompts:

  • "Find 20 public software engineer openings on JobStreet Malaysia and summarize the employers and locations."
  • "Export public accounting jobs in Singapore and group listings by disclosed salary range."
  • "Compare titles, work arrangements, and employers in this JobStreet result dataset."

An agent can run a country-specific search, then filter the returned default-dataset rows by title, location, employer, or disclosed salary.

Examples

The Actor currently provides Input recipes above. After publication, Publisher will add verified, ready-to-run examples for Indonesia software-engineering and Malaysia accounting searches; this README will then link only to real public example pages.

Support

If a supported marketplace returns no listings for a known public query, include the input and run URL when contacting support so the route can be checked.

Common questions

Questions and answers reused from the canonical actor README.

Which marketplaces are supported?

Malaysia, Singapore, Indonesia, and the Philippines.

Why are some fields empty?

JobStreet does not disclose every salary, employer, or listing-detail field in every public search response.

Can I use this in an agent workflow?

Yes. Submit the same JSON input through the Apify API or the Actor's MCP integration.

Does it access private job data?

No. It exports only public listing data available at request time.