JobStreet $1πŸ’° Companies | Reviews Scraper avatar

JobStreet $1πŸ’° Companies | Reviews Scraper

Pricing

from $1.00 / 1,000 results

Go to Apify Store
JobStreet $1πŸ’° Companies | Reviews Scraper

JobStreet $1πŸ’° Companies | Reviews Scraper

From $1/1K. Pull JobStreet company profiles and employee reviews across Malaysia, Singapore, Indonesia, and the Philippines. Search by company, industry, or URL. Returns rich company records with embedded reviews or flat review datasets, with optional open job listings included.

Pricing

from $1.00 / 1,000 results

Rating

0.0

(0)

Developer

Abot API

Abot API

Maintained by Community

Actor stats

1

Bookmarked

2

Total users

1

Monthly active users

a day ago

Last modified

Share

JobStreet Scraper: Company Profiles and Employee Reviews

JobStreet Scraper pulls company profiles and employee reviews from JobStreet's four Southeast Asian sites: Malaysia, Singapore, the Philippines and Indonesia. Choose one row per company with the top reviews embedded, or one row per individual review for sentiment and NLP pipelines. Source companies by pasting URLs, searching by name, or browsing a whole industry, and optionally attach each company's open jobs. Export to JSON, CSV or Excel, or read results straight from the API.

Why This Scraper?

  • Four Southeast Asian markets in one actor. Malaysia, Singapore, the Philippines and Indonesia, with the country auto-detected from every pasted URL.
  • Two output shapes from one run. Get company aggregates with embedded top reviews, or one row per individual review.
  • Deep review fields. Each review carries its title, pros, cons, full experience text, job title, employment status, work location, per-category star ratings, a recommended flag, upvotes and the review date.
  • Rich company aggregates. Overall rating, review count, recommended percentage, salary perception, the full star distribution, per-category ratings, company size, perks, awards and an AI-written review summary when the company has published one.
  • Full review history. Reviews beyond the first 30 are paginated automatically; on a 137-review company a test run returned all 137 reviews with no repeats, so the whole history is reachable, not just the front page.
  • Open jobs on demand. Switch on Include open jobs to attach each company's current listings (title, location, salary text, work type, work arrangement, category, listing date and link) to its record.
  • Honest failures. If the site refuses the connection, the run fails loudly instead of returning an empty dataset that looks like a clean zero-match search.

Use Cases

  • HR and employer-branding teams: benchmark your own review scores and star breakdown against competitors in the same market.
  • Sentiment and NLP teams: pull one row per review to train or evaluate models on real employee feedback text.
  • Recruitment agencies: cross-reference a company's review sentiment with its currently open jobs before reaching out to candidates.
  • Market researchers: browse a whole industry in one run to compare pay perception and recommendation rates across many employers at once.

Data You Get

Sample shape: values are illustrative placeholders, not from a live profile or review.

FieldExample
id"000000000000000"
name"Sample Company"
url"https://my.jobstreet.com/companies/sample-company-000000000000000"
region"MY"
industry"Information & Communication Technology"
companySize"11-50"
totalJobs42
ratingOverall4
reviewCount320
recommendedPercent82
salaryRating3
ratingBreakdown{ "companyRating5StarCount": 90, "companyRating1StarCount": 12 }
categoryRatings[{ "description": "Work/Life balance", "rating": 4, "count": 95 }]
perks["Medical coverage", "Annual bonus"]
awards[{ "name": "Sample Employer Award", "year": 2025 }]
aiSummary{ "summary": "..." } (when enabled and available)
topReviews[ { review object }, ... ]
topReviewCount1
jobs[ { job object }, ... ] (when Include open jobs is on)
jobsEmbeddedCount1 (when Include open jobs is on)
scrapedAt"2026-01-01T00:00:00.000Z"

Every row carries a recordType field (company or review) so mixed exports can be split without guessing. Reviews mode returns one flat record per review instead: reviewId, companyId, companyName, title, pros, cons, overallExperienceDetails, jobTitle, workLocation, employmentStatus, salarySummary, recommended, recommendedLabel, per-category ratings, overallRating, createdAt, upvotes, a hasBeenFlagged moderation flag, the company url and scrapedAt. In incremental mode every row also carries changeType, changedFields, firstSeenAt, lastSeenAt and contentHash. Embedded jobs carry workArrangements (for example On-site) and classifications with their category ids. Company records also carry companyWebsite when the company has filled it, isClaimed, logoUrl, coverImageUrl, brandId, overviewText and a customStatement when the company has published one.

How to Use

  1. Pick a mode: companies (one row per company, top reviews embedded) or reviews (one row per review).
  2. Choose a source: paste Company URLs, or leave URLs empty and set Keywords, Industry, or both to discover companies. Industry has a real default value, so a name-only search must explicitly set it to blank, otherwise your keyword is narrowed to matching names inside that default industry, which usually returns nothing.
  3. Set Max reviews per company and, if you want them, switch on Include open jobs.
  4. Set Max items to cap the run, then click Start.

One company, with top reviews (companies mode):

{
"mode": "companies",
"urls": ["https://my.jobstreet.com/companies/aeon-168552725744507"],
"maxReviewsPerCompany": 10,
"includeAISummary": true
}

Up to 50 reviews for a company, sorted newest first (reviews mode):

{
"mode": "reviews",
"urls": ["https://my.jobstreet.com/companies/aeon-168552725744507"],
"maxReviewsPerCompany": 50,
"reviewSort": "recent",
"maxItems": 50
}

Browse an industry in Singapore:

{
"mode": "companies",
"country": "SG",
"industry": "Information & Communication Technology",
"maxReviewsPerCompany": 5,
"maxItems": 20
}

Search by name and embed open jobs:

{
"mode": "companies",
"country": "MY",
"keywords": "maybank",
"industry": "",
"includeJobs": true,
"maxJobsPerCompany": 20,
"maxItems": 5
}

Run it from your code

Python:

from apify_client import ApifyClient
client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("abotapi/jobstreet-companies-reviews-scraper").call(run_input={
"mode": "companies",
"urls": ["https://my.jobstreet.com/companies/aeon-168552725744507"],
"maxReviewsPerCompany": 10,
})
for company in client.dataset(run["defaultDatasetId"]).iterate_items():
print(company["name"], company["ratingOverall"], company["reviewCount"])

JavaScript:

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: '<YOUR_APIFY_TOKEN>' });
const run = await client.actor('abotapi/jobstreet-companies-reviews-scraper').call({
mode: 'companies',
urls: ['https://my.jobstreet.com/companies/aeon-168552725744507'],
maxReviewsPerCompany: 10,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();

Or connect it to Make, Zapier, n8n, Google Sheets or webhooks from the Integrations tab.

Reviews and jobs caps

  • Max reviews per company controls how many reviews are embedded (companies mode) or fanned out (reviews mode) per company, from 0 up to 1000. The first 30 reviews come from the same request that fetches the company profile; anything beyond 30 costs one extra request per additional 30 reviews. The default is 20. Setting this field to 0 returns the 30-review snapshot from the company page (it does not mean unlimited, and 0 does not mean 5). The value is capped at 1000, so a single company can never pull an unbounded number of reviews; lower it to keep large runs fast and cheap. Reviews are re-sorted by Review sort order after they are fetched.
  • Max jobs per company caps the jobs embedded when Include open jobs is on, from 0 up to 1000. Setting this field to 0 currently caps at 20 jobs rather than pulling every open job as its field description mentions. Set an explicit higher number if you need more than 20.
  • Max items caps the total company or review count for the whole run, from 0 up to 100000 (default 1000), and 0 is read as the 100000 ceiling. It applies independently of the two per-company caps above.

Send results into your apps (MCP connectors)

Optionally pipe the scraped results into the apps you already use, via Model Context Protocol (MCP) connectors. This is an extra delivery step after the scrape, the Apify dataset is never changed.

What gets written to the connector: a condensed, human-readable summary of each record, not the full JSON. Each item becomes one entry with a title and its key fields flattened to plain text. The complete record always stays in the Apify dataset.

  1. Authorize a connector once under Apify β†’ Settings β†’ Integrations (Notion, Linear, Airtable, or Apify).
  2. Select it in the "Pipe results into your apps" input field. (If the picker is empty, you haven't authorized a connector yet.)
  3. For Notion, also set notionParentPageUrl to the page where items should be created.

The connection is mediated by Apify's MCP proxy, so this actor never sees your third-party credentials. Leave the field empty to skip.

Input Parameters

ParameterTypeDefaultDescription
modestring"companies"companies (one row per company, top reviews embedded) or reviews (one row per review).
countrystring"MY"Market: MY, SG, PH, or ID. Overridden per URL when URLs are given.
urlsarray2 sample company URLsCompany URLs. Take priority over keywords and industry; country is auto-detected per URL. Accepts profile, /reviews, /jobs, trailing-slash, query-string, http:// and numeric-id-only (/companies/<id>) links on any MY/SG/PH/ID host. A ?sortBy=recent or ?sortBy=helpful on a company link sets the review sort for that company; a ?page= number is ignored (a warning is logged), because reviews are always fetched from the first page up to Max reviews per company. A /companies directory link (optionally ?keywords=dbs) switches to country discovery or a name search only when the list holds no company URL; mixed with company links it is ignored with a warning. The Console prefill lists one example of every accepted link shape. The two sample URLs (a DBS and an AEON profile) are the default: if you call the API without urls but set keywords, a non-default industry or a non-default country, the sample URLs are dropped and discovery runs instead (one log line says so); with nothing else set, the two samples are scraped.
keywordsstring(empty)Company-name search, used when URLs is empty. Combined with industry, narrows the industry browse to matching names.
industrystring"Information & Communication Technology"Browse up to 30 companies in an industry, used when URLs is empty. Leave blank for keyword-only or URL-only sourcing.
maxReviewsPerCompanyinteger20Reviews embedded (companies mode) or fanned out (reviews mode) per company. Minimum 0, maximum 1000. 0 returns 30 reviews.
reviewSortstring"helpful"helpful (most upvoted first) or recent (newest first). The site itself always returns reviews in its own default order; this only re-sorts the reviews already fetched by Max reviews per company, it does not change which reviews get fetched, so it can't guarantee you the company's truly newest reviews if the cap is smaller than its total review count.
includeAISummarybooleantrueCompanies mode. Embed the AI-written review summary when the company has published one.
includeJobsbooleanfalseCompanies mode. Embed the company's currently open jobs.
maxJobsPerCompanyinteger50Cap on jobs embedded per company when Include open jobs is on. Minimum 0, maximum 1000. See Reviews and jobs caps above for what 0 actually does today.
maxItemsinteger1000Total cap across all companies or reviews in the run. Minimum 0, maximum 100000. 0 is read as 100000.
maxTimeSecinteger0Wall-clock cap in seconds. Minimum 0. 0 means no limit; partial results are flushed when the deadline hits.
resumeFromRunIdstring(none)Run ID or dataset ID of an earlier run; companies (companies mode) or reviews (reviews mode) already collected there are skipped and not billed again.
incrementalModebooleanfalseReturn only NEW or UPDATED rows versus the stored baseline for this input; unchanged rows are not returned and not billed.
stateKeystring(auto)Incremental mode only. Custom baseline name; empty keys the baseline off mode, country, URLs, keywords, industry and review settings.
emitUnchangedbooleanfalseIncremental mode only. Also return unchanged rows; every returned row is billed.
ignoreFieldsForChangesarray(none)Incremental mode only. Extra field names that never count as a change (still returned).
proxyConfigurationobjectApify datacenter proxyProxy settings. See Plan Requirement below.
mcpConnectorsarray(none)Optional: send a summary of each record to apps you authorized under Integrations.
notionParentPageUrlstring(none)Notion connector only: page under which records are created.
maxNotifyListingsinteger50Cap on items written to each connector per run. Minimum 1, maximum 1000. Does not affect the dataset.

Output Example

Sample shape: values are illustrative placeholders, not from a live profile or review.

{
"id": "000000000000000",
"slug": "sample-company-000000000000000",
"url": "https://my.jobstreet.com/companies/sample-company-000000000000000",
"region": "MY",
"name": "Sample Company",
"industry": "Information & Communication Technology",
"totalJobs": 42,
"ratingOverall": 4,
"reviewCount": 320,
"salaryRating": 3,
"recommendedPercent": 82,
"ratingBreakdown": { "companyRating5StarCount": 90, "companyRating1StarCount": 12 },
"categoryRatings": [
{ "description": "Work/Life balance", "rating": 4, "count": 95 },
{ "description": "Career development", "rating": 3, "count": 88 }
],
"perks": ["Medical coverage", "Annual bonus"],
"aiSummary": {
"summary": "Reviewers describe a friendly team and manageable workload, with some noting slower promotions."
},
"topReviews": [
{
"reviewId": "000000000000001",
"title": "Decent benefits, growth is slow",
"pros": "Friendly colleagues and flexible working hours.",
"cons": "Promotions can take a long time to come through.",
"jobTitle": "Operations Executive",
"overallRating": 4,
"recommended": true,
"createdAt": "1 January 2026"
}
],
"topReviewCount": 1,
"jobs": [
{
"id": "000000000000002",
"title": "Sample Job Title",
"location": "Sample City",
"salaryLabel": "Salary range shown here",
"workTypes": ["Full time"],
"listingDateDisplay": "1d ago",
"url": "https://my.jobstreet.com/job/000000000000002"
}
],
"jobsEmbeddedCount": 1,
"scrapedAt": "2026-01-01T00:00:00.000Z"
}

Plan Requirement

This site only answers through a proxy connection, so the actor always uses the Proxy configuration setting (Apify datacenter by default, which needs no upgrade). If the proxy connection cannot be set up, the run stops immediately with a clear message instead of sending requests that would all be refused; check the Proxy configuration setting. For heavier or more frequent runs, the residential proxy group can give more headroom against rate limits; set proxyConfiguration.apifyProxyGroups to ["RESIDENTIAL"] under Connection if your plan includes it.

FAQ

How much does it cost?

This actor uses pay-per-event billing with three events: one actor start event per run, one result row event for every company or review row actually pushed to the dataset, and one detail-enrichment event per company whose open jobs were fetched, charged only when Include open jobs is on (batched once at the end of the run). In incremental mode, unchanged rows that are not returned are not billed. Rates are shown on the Pricing tab. Use Max items to cap the cost of any run; small runs cost proportionally more because of the per-run start event.

This actor collects only publicly available company and review data. You are responsible for how you use it: follow JobStreet's terms and the laws that apply to you, and get legal advice before any commercial redistribution of reviewer-authored text.

Can I get reviews for many companies in one run?

Yes. Paste multiple company URLs (any mix of Malaysia, Singapore, the Philippines and Indonesia), or use Industry, Keywords, or both to discover many companies at once; each one is fetched independently.

Can I get only new or changed companies and reviews on a schedule?

Yes. Turn on Incremental mode (recurring monitoring) in the Resume & recurring updates section and run the same input on a schedule. The actor keeps a baseline per input (companies mode tracks each company by its id, reviews mode tracks each review by reviewId) and returns only NEW or UPDATED rows; each returned row carries changeType and changedFields. Unchanged rows are not returned and not billed unless you turn on Emit unchanged rows, in which case every returned row is billed. Incremental rows also carry firstSeenAt, lastSeenAt and contentHash. Scrape time (scrapedAt), upvotes, logoUrl, coverImageUrl, the relative job age (listingDateDisplay, such as "3d ago") and those three tracking columns never count as a change, and the order of embedded jobs and reviews is ignored; add more names to Ignore fields when detecting changes (they are still returned). If a resumed run finds every record already collected by the earlier run, it ends successfully with a status message and returns nothing new. Rows that stop appearing are not reported as expired, because capped or filtered scans only see part of the data. Use State key to share or separate baselines on purpose. With reviewSort: "recent" and a per-company review limit, reviews mode only sees that window of reviews each run.

Why did my run fail instead of returning an empty dataset?

If a company lookup or every resolved company's fetch is refused, the run fails with a clear message instead of reporting a false empty result. A genuine zero-match search, one where your keyword or industry filter matched nothing, still exits cleanly with zero records and no charge; but in reviews mode, if every resolved company genuinely has zero reviews, or the run's time limit is reached before anything is pushed, the run fails with the same connection-problem message even though nothing was actually blocked.

What is the difference between Max reviews per company, Max jobs per company and Max items?

The first two apply per company, independently of each other. Max items caps the total record count for the whole run on top of that. See Reviews and jobs caps under How to Use for what 0 does on each field today.

Can I use it with AI agents or MCP?

Yes. Call it from any Apify integration or MCP client, and use the connector field to push results into Notion, Linear or Airtable.

πŸ”— Want more JobStreet data?

Pair this actor with these related scrapers from the same team:

πŸ’Ό JobStreet Scraper
Scrape JobStreet listings across Malaysia, Singapore, Indonesia, and the Philippines...
πŸ’Ό SEEK Company Reviews
Scrape SEEK Australia and New Zealand company profiles and employee reviews. Choose...
πŸ“‡ Comparably
Extract rich company data from comparably.com using company names or profile URLs. Get...
πŸ’Ό RepVue Scraper
Scrape RepVue company profiles, RepVue Score, sales-rep reviews, and compensation by role...
πŸ’Ό SEEK Jobs Scraper
Scrape SEEK.com.au and SEEK.co.nz jobs by keyword, location, or filters. Extract full...
πŸ’Ό We Work Remotely Scraper
Extract current remote job listings from weworkremotely.com. Use keyword search or WWR...

πŸ‘‰ Browse all abotapi scrapers

πŸ’¬ Support

  • 🐞 Found a bug or a missing field? Open a ticket on the Issues tab. We usually reply within hours.
  • πŸ› οΈ Need another site, extra fields or a private build? Email contact@abotapi.com.
  • ⭐ Enjoying it? A quick review on the actor page helps other users find it.