SEEK Company Reviews - Profiles, Ratings & Employee Sentiment
Pricing
from $1.00 / 1,000 results
SEEK Company Reviews - Profiles, Ratings & Employee Sentiment
From $1/1K. Scrape SEEK Australia and New Zealand company profiles and employee reviews. Choose aggregated company data with top reviews or one row per review for sentiment analysis. Region is auto-detected from each URL, with clean structured output ready for analytics.
Pricing
from $1.00 / 1,000 results
Rating
0.0
(0)
Developer
Abot API
Maintained by CommunityActor stats
1
Bookmarked
2
Total users
1
Monthly active users
4 hours ago
Last modified
Categories
Share
SEEK Scraper: Company Reviews, Ratings and Culture Data for Australia and New Zealand
SEEK Scraper pulls company review data from au.seek.com and nz.seek.com, the two largest job platforms in their markets. Get a company's overall rating, five-star distribution, per-category sub-ratings, recommended percentage, salary perception score, AI-generated review summary, perks and awards, plus its individual reviews with pros, cons, long-form experience details and reviewer context. Choose one row per company with top reviews embedded, or one row per individual review for sentiment and NLP pipelines. Search by company name, browse an industry, or paste company links; region is detected automatically per link so Australian and New Zealand companies can be mixed in one run. Export to JSON, CSV or Excel, or pull results straight into your app through the API.
Why This Scraper?
- Two record grains from one input: company aggregates with embedded top reviews, or one row per individual review.
- Rich per-company fields: overall rating, five-star distribution, six per-category sub-ratings (work-life balance, career development, benefits, management, environment, diversity), recommended percent, salary perception score, branding, an AI-generated review summary, perks and awards.
- Full review record: title, pros, cons, long-form experience details, reviewer job title, employment status, salary perception, per-category ratings, upvotes and review date.
- Optional embedded open jobs: switch on
includeJobsto add each company's currently listed positions to its record in the same run. - Deep review history on demand: 20 reviews embedded per company by default, or fetch hundreds by raising the review cap.
- Region auto-detected per URL, so Australian and New Zealand company links can be mixed freely in one run.
- Built for monitoring: Incremental mode returns only new and changed records on recurring runs, Resume continues one interrupted run without re-collecting what it already has, and a blocked or empty run still finishes cleanly with a status message instead of erroring out.
Use Cases
- Employer branding and HR teams: track how your own company's SEEK rating, recommend percent and pros/cons shift over time.
- Recruiters and talent teams: check a target employer's culture signals before placing a candidate or accepting a role.
- Market researchers: build a comparison set of employee sentiment across an industry or a named shortlist of companies.
- Sentiment and NLP pipelines: feed individual review text (title, pros, cons, experience details) into classification or theme-extraction workflows.
- Competitive analysis: compare a company's ratings and hiring volume, via the optional open-jobs embed, against named competitors.
Data You Get
Sample shape: values are illustrative placeholders, not from a live profile.
Shown below: companies mode (the default), one row per company.
| Field | Example |
|---|---|
id | "610233" |
slug | "sample-company-610233" |
url | "https://au.seek.com/companies/sample-company-610233" |
region | "AU" |
name | "Sample Company Pty Ltd" |
isClaimed | true |
logoUrl | "https://image-service-cdn.seek.com.au/610233/logo" |
coverImageUrl / brandId / customStatement | branding fields, present on every company record whether or not includeJobs is on |
totalJobs | 42 |
ratingOverall | 3.7 |
reviewCount | 128 |
salaryRating | 3 |
recommendedPercent | 64 |
ratingBreakdown | { "companyRating1StarCount": 6, ..., "companyRating5StarPercentage": 21.1 } |
categoryRatings | [ { "rating": 3.8, "count": 128, "description": "Work/Life balance" }, ... ] |
aiSummary | { "headline": "Supportive teams, slower promotion track", "summary": "Generated summary text appears here.", "pros": "...", "cons": "...", "themes": [...] } |
perks | [ "Flexible working hours", "Study leave", "Staff discount" ] |
awards | [ { "name": "Sample Employer Award", "year": "2025" } ] |
website | { "url": "https://www.example.com.au/", "displayName": "Example" } |
size / primaryLocation / industryId / organisationId | "5,001-10,000" / "Melbourne, Australia" / "I0079" / "18011" |
specialities | [ "Cloud", "Internet" ] |
overviewText / overviewParagraphs | the overview as one text, and as a list of paragraphs |
topReviews | [ <up to maxReviewsPerCompany review objects, shape below> ] |
topReviewCount | 1 |
scrapedAt | "2026-03-14T02:15:00.000Z" |
Every company record carries coverImageUrl, brandId and customStatement (extra branding fields), whether or not includeJobs is on. When SEEK publishes them it also carries industry / industryName, traditionalLand, traditionalPlace, missionStatement, synonym and graduatesOverview. When includeJobs is on, each company record also gets a jobs array of the company's currently listed positions, each with id, url, title, teaser, salaryLabel, workTypes, location, classifications, bulletPoints, listingDate, advertiserName and employerCompanyId, and a jobsEmbeddedCount count. In reviews mode, each row is a single review instead: reviewId, companyId, companyName, companySlug, region, url, title, pros, cons, overallExperienceDetails, jobTitle, workLocation, employmentStatus, salarySummary, recommended, recommendedLabel, overallRating, ratings, upvotes, createdAt, hasBeenFlagged and scrapedAt. When the employer has replied to a review, the row also carries reply (the employer response); it is absent when there is none. These profile fields and reply are only present when SEEK publishes them, and appear on records from this release onward.
How to Use
- Pick a mode:
companies(one row per company, top reviews embedded) orreviews(one row per individual review). - Choose a source: paste company URLs, or set keywords, industry, or both to discover companies.
- Set the review depth and any optional toggles (AI summary, open jobs), then set Max items to cap run size and cost.
- Click Start, then download the dataset as JSON, CSV or Excel, or read it through the API.
Search for a company by keyword (companies mode):
{"mode": "companies","region": "AU","keywords": "atlassian","industry": "","maxReviewsPerCompany": 5,"maxItems": 5,"proxyConfiguration": { "useApifyProxy": true }}
The industry field defaults to a specific industry category even when you don't set it, and combining a keyword with an industry narrows to matching names inside that industry only, so a keyword-only search must explicitly set "industry": "" to search company names generally rather than inside the default industry.
Pull the most recent reviews for a company by URL (reviews mode):
{"mode": "reviews","urls": [{ "url": "https://au.seek.com/companies/coles-group-433124" }],"maxReviewsPerCompany": 20,"reviewSort": "recent","maxItems": 20}
Browse New Zealand companies by keyword:
{"mode": "companies","region": "NZ","keywords": "Air New Zealand","industry": "","maxReviewsPerCompany": 3,"maxItems": 1}
Companies mode with embedded open jobs:
{"mode": "companies","urls": [{ "url": "https://au.seek.com/companies/coles-group-433124" }],"maxReviewsPerCompany": 3,"includeJobs": true,"maxJobsPerCompany": 20,"maxItems": 1}
Run it from your code
Python:
from apify_client import ApifyClientclient = ApifyClient("<YOUR_APIFY_TOKEN>")run = client.actor("abotapi/seek-companies-reviews-scraper").call(run_input={"mode": "companies", "keywords": "atlassian", "industry": "", "maxItems": 5})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/seek-companies-reviews-scraper').call({ mode: 'companies', keywords: 'atlassian', industry: '', maxItems: 5 });const { items } = await client.dataset(run.defaultDatasetId).listItems();
Or connect it to Make, Zapier, n8n, Google Sheets or webhooks from the Integrations tab.
Review and job depth
maxReviewsPerCompany controls both grains: in companies mode it is how many top reviews are embedded per company (default 20); in reviews mode it is the cap per company. Setting it to 0 does not mean unlimited, it falls back to 30; raise it to an explicit number (up to 1000) to fetch deeper history a page at a time. The default rose from 5 to 20, so a reviews-mode run that omits this field now returns, and bills, up to 20 review rows per company instead of 5. maxJobsPerCompany (companies mode, includeJobs on) caps the embedded jobs array the same way (default 50); setting it to 0 pulls open jobs up to the 1000 maximum, never beyond it.
Resume and recurring updates
- Resume (
resumeFromRunId) continues one specific interrupted or previous run: paste its run id or dataset id and this run skips records it already collected there, so pasted URLs are not re-fetched or re-billed on a resumed companies-mode run (matching is by the company's ownid, which is parsed directly from the URL, so a pasted link is recognized without needing to fetch it first). In reviews mode, each company's page is still fetched, but individual reviews already seen (matched byreviewId) are not re-pushed or re-billed. - Incremental mode (
incrementalMode) is for scheduling the same mode/query repeatedly: the actor remembers the previous run itself, so you never paste a run id. The first run returns everything asNEW. Later runs return onlyNEW,UPDATEDandREAPPEAREDby default;UNCHANGEDrecords are suppressed and not billed unlessemitUnchangedis on. State is isolated per mode and per URLs/keywords/industry/reviewSort/includeJobs/includeAISummarysetup; setstateKeyto name or deliberately share a campaign. REAPPEAREDandEXPIREDin detail:EXPIRED(companies mode only) is only produced once a run has fully scanned its tracked URLs/keywords/industry, withemitExpiredon, and was not capped by Max items or Max run time and did not use Resume. That same condition is also what marks a company as "gone" in the stored state; ifemitExpiredhas never been turned on, no company is ever marked gone, soREAPPEAREDcannot occur either, since it only fires for a company that state says is currently gone. Reviews mode never producesEXPIRED: its review sample is a bounded top-N per company, not an exhaustive scan, so an absent review in one run's sample is not reliable evidence it was deleted.- What counts as a change: every returned field is compared except
scrapedAt,topReviewsandtopReviewCount(companies mode) and each job'slistingDateDisplay, which are kept in the output but never make a recordUPDATED.changedFieldsnames exactly the compared fields that moved. Add your own withignoreFieldsForChanges(a top-level name such asratingOverall, or a dotted path such asjobs.salaryLabelfor a nested field). The ignore set is applied to the saved baseline too, so changing it never causes a one-time wave ofUPDATEDrows. Numbers are compared by value, so25.0and25are the same. Partial scans (Max items, Max run time, Resume, or a pasted URL that starts past page 1) never produceEXPIRED. - Jobs and change detection:
jobsis always returned in full on every row whenincludeJobsis on, but a capped job list (more open roles thanmaxJobsPerCompany, the common case at the default of 50) is excluded from change detection entirely, since SEEK's job list can reorder between requests. When a company's full job list fits under the cap,jobsis compared by its set of ids and a genuine add or remove still surfaces asUPDATED.
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.
- Authorize a connector once under Apify โ Settings โ Integrations (Notion, Linear, Airtable, or Apify).
- Select it in the "Pipe results into your apps" input field. (If the picker is empty, you haven't authorized a connector yet.)
- For Notion, also set
notionParentPageUrlto 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
| Parameter | Type | Default | Description |
|---|---|---|---|
mode | string enum | "companies" | "companies" (one row per company, top reviews embedded) or "reviews" (one row per individual review). |
region | string enum | "AU" | "AU" (au.seek.com) or "NZ" (nz.seek.com). Auto-detected per URL when urls is set. |
urls | array | one example URL per supported shape (see the URL shapes table) | SEEK URLs. Overrides keywords/industry when set. The shipped example URLs (one per shape) only run when industry is cleared to blank; because Industry defaults to Mining, Resources & Energy, an untouched run ignores them and browses that industry instead. To scrape your own URLs, replace the examples (any other list wins). If keywords or industry is set while urls still holds exactly the shipped examples, the examples are ignored and your keywords/industry are used. |
keywords | string | (none) | Company-name keyword search. Several names can be separated by commas, semicolons or new lines (each searched, up to 20 hits per name, merged without duplicates). A comma, semicolon or new line always starts a new name, so a single company name that itself contains a comma is searched as two names; paste its URL instead. Ignored if urls is set. Combined with industry, narrows that industry's browse list to matching names. |
industry | string enum | "Mining, Resources & Energy" | Browse up to 30 companies in a SEEK industry category. For keyword-only or URL-only sourcing, explicitly set this to ""; omitting it from an API call still fills in the default industry and narrows your keyword search to that industry's companies. |
maxReviewsPerCompany | integer | 20 | Companies mode: top-N reviews to embed. Reviews mode: max reviews per company (each review is a billed row). 0 falls back to 30, not unlimited; maximum 1000. |
reviewSort | string enum | "helpful" | "helpful" (most upvoted first) or "recent" (newest first). |
includeAISummary | boolean | true | Companies mode only. Adds SEEK's AI-generated review summary when available. |
includeJobs | boolean | false | Companies mode only. Embeds a jobs array of the company's currently listed positions on each record. |
maxJobsPerCompany | integer | 50 | Cap on jobs length when includeJobs is true. 0 pulls up to the 1000 maximum. |
maxItems | integer | 1000 | Total cap across all companies (reviews mode counts individual reviews). Maximum 100000; 0 is read as that ceiling, so a run is never unbounded. |
maxTimeSec | integer | 0 | Wall-clock cap; the actor flushes what it has and exits cleanly when exceeded. 0 = no time limit. |
resumeFromRunId | string | (none) | Continue one specific interrupted or previous run: paste its run id or dataset id. |
incrementalMode | boolean | false | Turn on for recurring monitoring of this same mode/query; see "Resume and recurring updates" above. |
stateKey | string | (none) | Incremental mode only. Name a monitoring campaign, or deliberately share state across differently-configured runs. |
emitUnchanged | boolean | false | Incremental mode only. Also return (and bill) records unchanged since the last run. |
emitExpired | boolean | false | Incremental mode + companies mode only. Also return (and bill) companies from a previous run no longer resolved, once a run has fully scanned its targets. |
ignoreFieldsForChanges | array | [] | Incremental mode only. Field names (or dotted paths for nested fields) that never count as a change; they stay in the output. |
proxyConfiguration | object | Apify Datacenter | Connection settings. For heavier workloads, set apifyProxyGroups to ["RESIDENTIAL"]. |
mcpConnectors | array | (none) | Optional: send a summary of each record to apps you authorized under Integrations. |
notionParentPageUrl | string | (none) | Notion connector only: page under which records are created. |
maxNotifyListings | integer | 50 | Cap on items written to each connector per run. Does not affect the dataset. |
URL shapes accepted in urls
| Shape | Example | Behaviour |
|---|---|---|
| Company profile (AU/NZ) | https://au.seek.com/companies/atlassian-437216 | Scraped; region from the host |
| Reviews page | .../atlassian-437216/reviews | Scraped as the company |
| Reviews, paginated | .../reviews?page=2 | Scraped; counts as a partial scope, so no EXPIRED |
| Reviews, sorted | .../reviews?sortby=recent | The pasted sort is applied for that company (overrides Review sort) |
| Jobs tab | .../atlassian-437216/jobs | Scraped as the company (turn on Include jobs for the jobs list) |
| NZ profile / stale slug | https://nz.seek.com/companies/air-new-zealand-432555 | The numeric id wins |
| Legacy hosts | https://www.seek.com.au/companies/..., https://www.seek.co.nz/companies/... | Mapped to AU / NZ |
| Numeric id only | https://au.seek.com/companies/437216 | Scraped; SEEK redirects to the canonical slug |
| Directory keyword | https://au.seek.com/companies?q=atlassian | Routed to the keyword search (up to 20 companies) |
| Directory industry by name | https://au.seek.com/companies?industry=Legal | Routed to the industry browse (up to 30 companies) |
Directory landing, numeric industry= id, /companies/browse?industry= id | https://au.seek.com/companies | Not supported: skipped with a warning in the log naming the URL. Use the Keywords / Industry inputs |
The shipped example urls (one per shape) are scraped only when industry is cleared to blank; with the default Industry they are ignored and the industry is browsed. Duplicates of the same company id are scraped once.
Output Example
Sample shape: values are illustrative placeholders, not from a live profile.
{"id": "610233","slug": "sample-company-610233","url": "https://au.seek.com/companies/sample-company-610233","region": "AU","name": "Sample Company Pty Ltd","isClaimed": true,"logoUrl": "https://image-service-cdn.seek.com.au/610233/logo","coverImageUrl": "https://image-service-cdn.seek.com.au/610233/cover","brandId": "11111111-2222-3333-4444-555555555555","totalJobs": 42,"ratingOverall": 3.7,"reviewCount": 128,"salaryRating": 3,"recommendedPercent": 64,"ratingBreakdown": {"companyRating1StarCount": 6,"companyRating1StarPercentage": 4.7,"companyRating2StarCount": 9,"companyRating2StarPercentage": 7.0,"companyRating3StarCount": 24,"companyRating3StarPercentage": 18.8,"companyRating4StarCount": 62,"companyRating4StarPercentage": 48.4,"companyRating5StarCount": 27,"companyRating5StarPercentage": 21.1},"categoryRatings": [{ "rating": 3.8, "count": 128, "description": "Work/Life balance" },{ "rating": 3.5, "count": 128, "description": "Career development" },{ "rating": 3.9, "count": 128, "description": "Benefits & perks" },{ "rating": 3.4, "count": 128, "description": "Management" },{ "rating": 3.7, "count": 128, "description": "Working environment" },{ "rating": 3.6, "count": 128, "description": "Diversity & equal opportunity" }],"aiSummary": {"headline": "Supportive teams, slower promotion track","summary": "Generated summary text appears here, drawn from recent reviews.","pros": "Colleagues are described as friendly and management as approachable.","cons": "Several reviewers note limited progression beyond entry-level roles.","themes": ["teamwork", "career growth", "work-life balance"]},"perks": ["Flexible working hours", "Study leave", "Staff discount"],"awards": [{ "name": "Sample Employer Award", "year": "2025" }],"topReviews": [{"reviewId": "710004421","companyId": "610233","title": "Good team, slow to promote","pros": "Friendly colleagues and flexible hours.","cons": "Promotions can take a long time to come through.","jobTitle": "Customer Service Officer","workLocation": "Sample Suburb NSW 2000","employmentStatus": "2 to 4 years in the role, current employee","salarySummary": "Average","recommended": true,"recommendedLabel": "Recommended","overallRating": 4,"ratings": [{ "category": "Work/Life balance", "rating": 4 },{ "category": "Career development", "rating": 3 }],"upvotes": 6,"createdAt": "9 March 2026","hasBeenFlagged": false}],"topReviewCount": 1,"scrapedAt": "2026-03-14T02:15:00.000Z"}
Plan Requirement
No paid proxy plan is required. In testing, a plain datacenter connection read company profile, reviews and directory pages with full content, so the default proxy setting works on any Apify plan, including free. Each page is tried on up to five connections within a 25 second window. If the default connection is unavailable, the run continues on a backup connection and logs: "Served over the backup connection (the default connection was unavailable)." If your account's proxy access is refused, the log shows a boxed warning ("The selected connection is unavailable to this run. Apify free plans do not include residential proxies. Continuing on a backup connection; some pages may still be unavailable."). If no connection can read any page, the run ends as failed instead of an empty success, with one of these messages: "The proxy connection was refused for this account, so no page could be read. Your Apify plan does not include proxy access; a paid plan is required", "No results: residential proxies are unavailable on this run (Apify free plans do not include them), and the backup connection could not load the requested SEEK pages", or "Could not load any results page (the requests failed), so nothing was collected. This is a connection problem, not an empty search." A custom proxy URL list is used as given, with no backup connection. For heavier or scheduled workloads you can switch to the Residential proxy group by setting apifyProxyGroups to ["RESIDENTIAL"] and apifyProxyCountry to "AU" or "NZ". Runs comfortably in 256 MB of memory.
FAQ
How much does it cost?
Billing is pay per event, charged exactly as the code does: one apify-actor-start event per run; one apify-default-dataset-item event for every row pushed to the dataset (a company row in companies mode, a review row in reviews mode); and, only when includeJobs is on, one detail-enrichment event per company record that is actually returned with its jobs fetched, never for a record suppressed by Incremental mode even if its jobs were fetched to check for changes. Rows that are not pushed (unchanged, deduplicated, already collected by Resume, or failed) are not billed. The Pricing tab shows the current rates. Use Max items to cap the cost of any run, and note the review default of 20 per company means a reviews-mode run that omits maxReviewsPerCompany can bill up to 20 rows per company.
Is it legal to scrape SEEK?
This actor collects only publicly available company and review data. You are responsible for how you use it: follow SEEK's terms and the laws that apply to you, and get legal advice if you plan commercial redistribution or further processing of reviewer-submitted content.
Can I get only new or changed companies and reviews on a schedule?
Yes. Schedule the actor from the Schedules tab and turn on Incremental mode. Each run then returns only new, updated and reappeared records, and unchanged ones are not billed.
Why did I get REAPPEARED or EXPIRED records I wasn't expecting?
Both only ever occur in companies mode, and only after a run with Emit expired companies turned on has completed a full, uncapped scan of your URLs/keywords/industry with no Resume. That is the only way a company is ever marked "gone" in the stored state; without it, no company can later be marked REAPPEARED either. Reviews mode never produces either state, since its review sample is a bounded top-N per company, not an exhaustive scan.
Why did my run finish with an empty dataset instead of failing?
This actor treats "nothing matched your search" and "every company failed to fetch" the same way: the run finishes with a clear status message explaining what happened, rather than erroring out, so a legitimate empty result is never confused with a crash. Check the status message and the run log for the specific reason, and try again if requests were refused.
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 SEEK data?
Pair this actor with these related scrapers from the same team:
| ๐ผ SEEK Jobs Scraper Scrape SEEK.com.au and SEEK.co.nz jobs by keyword, location, or filters. Extract full... | ๐ JobStreet Pull JobStreet company profiles and employee reviews across Malaysia, Singapore... |
| ๐ Trade Me NZ Scraper Scrape trademe.co.nz across all five sections: Marketplace goods and auctions, Property... | ๐ Comparably Extract rich company data from comparably.com using company names or profile URLs. Get... |
| ๐ Homes.co.nz Scraper Scrape Homes.co.nz listings by location or URL with pagination. Extract property details... | ๐งฉ Distressed Property Scraper Find mortgagee-sale and distressed-property listings in Australia and New Zealand. NZ... |
๐ 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.