🏆 AI Powered Advanced Seek Job Scraper ⚡ Best Value 🏆 avatar

🏆 AI Powered Advanced Seek Job Scraper ⚡ Best Value 🏆

Pricing

from $1.00 / 1,000 results

Go to Apify Store
🏆 AI Powered Advanced Seek Job Scraper ⚡ Best Value 🏆

🏆 AI Powered Advanced Seek Job Scraper ⚡ Best Value 🏆

Scrape jobs from Seek, JobStreet and JobsDB across Australia, New Zealand, Singapore, Malaysia, Philippines, Indonesia, Hong Kong and Thailand — full descriptions, salary, contacts, with recruitment agencies filtered out.

Pricing

from $1.00 / 1,000 results

Rating

0.0

(0)

Developer

Muhammad Shamshad Aslam

Muhammad Shamshad Aslam

Maintained by Community

Actor stats

2

Bookmarked

2

Total users

1

Monthly active users

2 hours ago

Last modified

Share

Seek Job Scraper 🇦🇺🇳🇿🇸🇬 — Seek, JobStreet & JobsDB

Scrape job listings from the whole Seek network — Seek (Australia, New Zealand), JobStreet (Singapore, Malaysia, Philippines, Indonesia) and JobsDB (Hong Kong, Thailand) — from one actor. Every job comes with the full description, salary, work type, work arrangement, classification and the advertiser's details.

Then it goes further: filter out recruitment agencies, stop one advertiser flooding your results, and push each job straight into your workflow as it's found.

Features

Core scraping

  • 8 country sites — Australia, New Zealand, Singapore, Malaysia, Philippines, Indonesia, Hong Kong, Thailand
  • Full job description on every listing, in clean text and original HTML
  • Rich structured data — salary label, work type, work arrangement (Remote / Hybrid / On-site), classification and sub-classification, bullet points, listing date, advertiser ID
  • Real company profiles — the employer's own website, industry, size, primary address, specialities, description and logo, each as its own field
  • Recruiter profiles — name, photo and profile link from the "About the recruiter" card
  • 💰 Company salary estimates — Seek's own per-role pay bands for each employer, free
  • 🔎 Post filters — include/exclude keywords, required contact details, and a minutes-level freshness window
  • 👥 Applicant counts — how many people have applied, plus what share attached a résumé or cover letter, with min/max filtering
  • Ratings, reviews & AI summary — star rating, six-category breakdown, Seek's AI review summary and individual employee reviews
  • 🏢 More jobs from the same company — pull each employer's other openings, matched on advertiser ID
  • Paste a search URL — reproduce any search from the site, filters and all, country detected from the domain
  • Real filters — location, date posted, work type, salary range, sort by date or relevance
  • Duplicate-free — deduplicated by job ID. Seek genuinely repeats listings across pages; a 12-job run already caught 2
  • Fast — no browser, no login

Beyond a plain scraper

  • 🤖 Recruitment-agency filter — Seek is saturated with recruiters. Flag or remove them and keep only companies hiring for themselves. The keyword screen is free and needs no API key; add OpenAI for the harder cases
  • 🏢 Max jobs per company — stop one advertiser taking over your results
  • 📇 Contact extraction — application email and phone pulled out of the ad text when the advertiser included them
  • Per-job webhook — each job POSTed to your endpoint the moment it's found, ready for Clay, n8n, Make or Zapier. No dataset fetch afterwards

Why this one

This actorWhat to watch for elsewhere
Agency filteringBuilt in — free keyword screen plus optional AIUsually absent. Seek is full of recruiters and you filter them by hand
Company floodingmaxJobsPerCompany caps any one advertiserOne company's 40 listings can eat your whole run
DuplicatesDeduplicated by job IDSeek repeats ids across pages; without dedup you pay for the same job twice
DeliveryPer-job webhook into your workflowDataset only; you write the fetch-and-poll glue
SalaryThe advertiser's own stated salarySome actors charge extra per 1,000 for estimated salaries
Company pay bandsSeek's per-role estimates included freeCharged as a paid add-on, or absent
Ratings & reviewsStar rating, category breakdown, AI summary, review textNot offered
More jobs per employerExpand any company, matched on advertiser IDNot offered
Applicant insightCount plus résumé and cover-letter ratesCount only
Keyword filteringOne field selector, used for include and excludeFive toggles, with include and exclude searching different fields
Company profileReal data — website, industry, size, address, specialitiesOften returns "N/A" for every field
All 8 sitesOne actor, one inputSometimes split across separate actors

The company profile actually works. Seek's companyProfile takes a mandatory zone argument — omit it and the entire field silently returns null, which is why competing actors document it as "N/A" in every field. Pass it and you get the real thing — on a Melbourne nursing search, 14 of 14 rows carried a full profile:

Baptcare baptcare.org.au Social & Welfare Services >10,000 employees
Level 1, 1193 Toorak Road Camberwell.
NFP, Aged Care, Affordable Housing, FACS and Disability, In Home Care

Measured, not asserted. On a "recruitment consultant" search the free screen — with no API key at all — correctly flagged 11 of 14 listings as agencies (Gough Recruitment, Logical Staffing Solutions, Core Talent, 360 Personnel, PULSE Staffing…) while keeping genuine employers. Every token is matched as a separate word, so real companies like Cheshire, Staffordshire and Jobst are never caught by "hire", "staff" or "job".

Input

FieldTypeDefaultDescription
searchUrlstringOption 1. Paste a Seek/JobStreet/JobsDB search URL and everything below is read from it
countryselectauWhich site: au, nz, sg, my, ph, id, hk, th
keywordstringsoftware engineerRequired. Job title, skill or company
locationstringCity, suburb or region. Empty = whole country
sortByselectrelevancerelevance or date (newest first)
postedWithinDaysselect0Any time / 1 / 3 / 7 / 14 / 31 days
workTypeselectallFull time, Part time, Contract/Temp, Casual
classificationselectallAny of Seek's 30 job categories (Accounting → Trades & Services)
salaryMin / salaryMaxinteger0Salary band in local currency
salaryTypeselectannualAnnual, Monthly or Hourly
maxItemsinteger100How many jobs to scrape (see the cap below)
maxJobsPerCompanyinteger2Cap per advertiser (2–10, max 10). 0 = no limit
fetchJobDetailsbooleantrueFull description + contact extraction. One extra request per job
minApplicantsinteger0Only keep jobs with at least N applicants. 0 = no minimum
maxApplicantsinteger0Only keep jobs with at most N applicants. 0 = no maximum
includeKeywordsarrayKeep jobs containing at least one of these
excludeKeywordsarrayDrop jobs containing any of these
keywordMatchFieldsmulti-selecttitle, company, description, bullets, categoryWhich parts of the listing the keywords search
requireContactDetailsselectoffemail / phone / either / both
maxAgeMinutesinteger0Keep only jobs listed in the last N minutes
fetchCompanySalariesbooleanfalseSeek's per-role salary bands for each employer. One call per company, cached
fetchCompanyReviewsbooleanfalseStar rating, category breakdown, AI summary and employee reviews
maxReviewsPerCompanyinteger5Individual reviews per company (1–30). Rating and summary always included
fetchMoreCompanyJobsbooleanfalseAlso pull each employer's other open roles
moreJobsPerCompanyinteger5How many extra jobs per company (max 25). Needs the toggle above
expandedJobsOutputselectnestednested = extras hang off each row; separateRows = own rows
recruitmentAgencyHandlingselectoffoff / flag / exclude
openaiApiKeystringOptional, for the AI pass. The free screen runs without it
openaiModelselectgpt-4o-miniFixed — the nano models gave unreliable verdicts and were removed
webhookUrlstringPOST each job to your URL as it's found
proxyConfigproxyoffUsually unnecessary — Seek serves this without blocking

Paste a search URL

Build the search on the site with whatever filters you like, paste the URL, and the actor reproduces it exactly:

{ "searchUrl": "https://www.seek.com.au/software-engineer-jobs/in-All-Sydney-NSW?classification=6281&worktype=242" }
Parsed search URL -> site=www.seek.com.au keyword="software engineer"
location="All Sydney NSW" classification=6281 workType=242

Keyword, location and work type are read from the SEO path — Seek puts filters there, not only in the query string:

/software-engineer-jobs/in-All-Sydney-NSW/part-time
keyword ──────┘ location ──┘ work type

The country is detected from the domain, in every form Seek uses: www.seek.com.au, au.seek.com, seek.com.au, sg.jobstreet.com, the older jobstreet.com.sg, th.jobsdb.com and so on. Open-ended salary ranges (salaryrange=50000-) work too. Paste a single job URL by mistake and you get a clear error rather than an empty run.

Job classification

classification restricts results to one of Seek's 30 categories — the same list as the Classification filter on the site, from Accounting through to Trades & Services. The IDs were taken from Seek's own live data, so they match the site exactly.

The 500-result cap

Seek returns at most 500 results for any single search. Page 6 comes back empty no matter what you ask for — this is Seek's limit, not the actor's, and every scraper hits it.

To gather more, run several narrower searches and combine them: by location (Sydney, Melbourne, Brisbane…), by keyword (software engineer, backend engineer, full stack), or by work type. Each search gets its own 500. Jobs are deduplicated by ID within a run, so overlapping searches never produce duplicate rows.

Max jobs per company

One advertiser can swamp a search. maxJobsPerCompany caps how many rows any single advertiser contributes, so you see the market instead of one company's careers page.

0 means unlimited, not one per company — whatever that advertiser has, you get, up to maxItems. Defaults to 2. Skipped jobs do not count towards maxItems, so you still get the number you asked for, just spread across more employers.

Company salary estimates

Turn on fetchCompanySalaries and every employer's own pay bands come with the jobs — the same data behind the Salaries tab on their Seek company page:

Victoria Police (72 roles, updated 2 Jul 2026)
Administration Officer $60K - $77K 5 job ads
Administration Team Leader $79K - $96K 1 job ad
Advocate $113K - $137K 3 job ads

Large employers return a lot — Northern Health has 116 roles, Victoria Police 72, Serco 26. Fetched once per company and cached, so an employer with 30 jobs in your results costs a single call.

FieldMeaning
companySalaryRangesArray of { role, salaryRange, basedOnJobAds, salaryType, source }
companySalaryRoleCountHow many roles came back
companySalaryUpdatedAtWhen Seek last refreshed the estimates

source is "company" when the band comes from that employer's own past ads, or "industry" when Seek fell back to an industry average — so you can tell the difference rather than treating both as equal.

These are Seek's estimates, not published salaries. The advertiser's own stated salary, when there is one, stays in the separate salary field and is never overwritten. Coverage is partial: 3 of 8 employers in a Melbourne nursing test had bands.

Post filters

Seek's search cannot express these, so they run after collection. Filtered-out jobs do not count towards maxItems, and the log reports exactly what each filter removed:

Post filters: 19 dropped by keywords, 0 by contact requirement, 0 by age.
Matching on: title, company.

One field selector, used for both directions. keywordMatchFields decides which parts of a listing the keywords search, and the same fields apply to include and exclude. That symmetry matters: where include and exclude search different fields, "remote" can keep a job on its description while failing to drop one whose salary text reads "remote work allowance" — a surprise you then have to explain. Here it behaves the same way in both directions.

The default set is title, company, description, bullet points and category. Add location, salary or workType deliberately if you want them.

FilterBehaviour
includeKeywordsKeep a job if it contains at least one
excludeKeywordsDrop a job if it contains any
requireContactDetailsKeep only jobs with an email, a phone, either, or both
maxAgeMinutesKeep only jobs listed in the last N minutes

Two of these cost extra requests. Requiring contact details, or matching keywords against description, both force the per-job detail call even when fetchJobDetails is off — that is where the description and contacts live. Post filters run before company enrichment, so a row about to be dropped never triggers a salary or review lookup.

maxAgeMinutes is for scheduled runs polling for brand-new listings. For coarser windows use postedWithinDays, which filters on Seek's side and costs nothing.

Applicant counts

Seek records how many people have applied to each job, and the actor returns it on every row:

FieldMeaning
applicantCountNumber of applicants so far
applicantsWithResumePercentShare who attached a résumé
applicantsWithCoverLetterPercentShare who attached a cover letter
Registered Nurse - Ivanhoe 16 applicants · 100% résumé · 81% cover letter

minApplicants and maxApplicants filter on it — low counts find roles before the rush, high counts show where demand is proven.

Know the cost. Seek has no applicant filter on its search API, so every job has to be fetched before its count can be checked, and rows outside your range are discarded after that work is done. A narrow range can burn most of a run — the log tells you exactly how many were dropped. Discarded jobs do not count towards maxItems.

Jobs whose applicant count is unavailable are kept, never guessed at. Seek hides these values behind a sign-in on its own site; the API returns them regardless, so no login is needed.

Company ratings, reviews & AI summary

Turn on fetchCompanyReviews and every employer arrives with what their staff actually say:

Qualitas Health 1.8★ from 4 reviews
work/life 3.0 · career 2.0 · management 1.8 · environment 2.0 · perks 1.5 · diversity 1.5
AI summary: "Employees appreciate the great reception and management staff…"
FieldMeaning
companyRating / companyRatingCountOverall star rating and how many reviews it is based on
companyRecommendedPercentShare of reviewers who would recommend the employer
companyRatingBreakdownSix categories: work/life balance, career opportunity, management, environment, perks, diversity
companyReviewsAISummarySeek's own AI summary of the positives and challenges
companyReviewsIndividual reviews — title, job title, rating, pros, cons, employment status, date
companyReviewsTotalTotal reviews on file, so you can see what your sample covers

Fetched once per company and cached. maxReviewsPerCompany controls how many individual reviews come along (1–30); the rating, breakdown and AI summary are always included.

More jobs from the same company

A keyword search only shows the one role that matched. Turn on fetchMoreCompanyJobs and the actor goes back to each employer and pulls more of their open positions:

Expanding 3 companies, up to 4 more job(s) each.
Zurich Financial Services: +4 more job(s)

Companies are matched on Seek's advertiser ID, never the name, so expanding one employer can never drag in a similarly-named company.

ModeBehaviour
nested (default)One row per search result; extras hang off each row in otherJobsAtCompany. 5 requested → 5 rows
separateRowsEvery extra job becomes its own row, tagged foundVia: "company-expansion". 5 requested → 9 rows

Off by default. Results stay deduplicated by job ID across the search and the expansion alike.

Recruitment agencies

Seek is heavily used by recruiters, so a plain search is mostly agencies. Three modes:

ModeBehaviour
off (default)No classification, no cost
flagClassify and label every job, keep them all
excludeDrop agency listings from the dataset and the webhook

A free screen on advertiser name and domain runs first and needs no API key. Adding an openaiApiKey enables an AI pass over the ad text for advertisers the keywords miss — one call per advertiser, cached against their Seek advertiser ID, so a company with 30 listings costs a single call.

Classified rows carry isRecruitmentAgency, recruitmentAgencyReason and recruitmentAgencyMatchedBy (name, domain or ai).

Nothing is dropped on a guess. Advertisers the AI cannot judge — and any whose call fails — are kept and labelled null. In exclude mode a row is only removed on a positive verdict.

Contact details

With fetchJobDetails on, any application email or phone number stated in the ad text is extracted into email and phone.

Be realistic about coverage. Most jobs contain neither — contacts appear mainly on recruiter-posted ads. In testing, 2 of 12 listings carried an email and none a phone. These fields are a bonus when present, not something to plan a pipeline around.

Output

One row per job, 30 fields (34 with details and agency classification):

{
"jobId": "93631135",
"title": "Senior Software Engineer",
"url": "https://www.seek.com.au/job/93631135",
"applyUrl": "https://www.seek.com.au/job/93631135/apply",
"companyName": "Halcyon Knights",
"advertiserId": "22319711",
"advertiserName": "Halcyon Knights Pty Ltd",
"companyUrl": "https://au.seek.com/companies/halcyon-knights-22319711",
"location": "Melbourne VIC",
"locations": ["Melbourne VIC"],
"countryCode": "AU",
"salary": "$150,000 – $180,000 per year",
"workType": "Full time",
"workArrangement": "Hybrid",
"classification": "Information & Communication Technology",
"subClassification": "Developers/Programmers",
"bulletPoints": ["Build AI-Driven Solutions", "Modern Engineering Practices"],
"teaser": "Join a team building…",
"listingDate": "2026-07-29T06:32:59Z",
"listingDateDisplay": "4d ago",
"isFeatured": false,
"isPromoted": false,
"roleId": "senior-software-engineer",
"searchKeyword": "software engineer",
"site": "www.seek.com.au",
"country": "au",
"scrapedAt": "2026-08-01T09:00:00.000Z",
"description": "Full plain-text job description…",
"descriptionHtml": "<p>…</p>",
"abstract": "Short summary",
"email": "careers@example.com",
"phone": "0406 811 336",
"recruiterName": "Chelsea Hoey",
"recruiterPhoto": "https://media.seekrecruiterprofile.com/seek/auto/chelsea-hoey.jpeg",
"recruiterProfileUrl": "https://www.seek.com.au/recruiters/people/chelsea-hoey",
"companySeekUrl": "https://au.seek.com/companies/baptcare-434578",
"companyProfileName": "Baptcare",
"companyWebsite": "http://baptcare.org.au/",
"companyIndustry": "Social & Welfare Services",
"companySize": "More than 10,000 employees",
"companyAddress": "Level 1, 1193 Toorak Road Camberwell.",
"companySpecialities": "NFP, Aged Care, Affordable Housing, FACS and Disability, In Home Care",
"companyDescription": "The employer's own profile text…",
"companyLogo": "https://…/logo.png",
"searchClassification": "6281",
"foundVia": "search",
"expandedFromCompany": null,
"otherJobsAtCompany": [
{ "jobId": "93701234", "title": "Claims Advisor", "location": "North Sydney NSW", "url": "https://www.seek.com.au/job/93701234" }
],
"otherJobsAtCompanyCount": 1,
"companyRating": 1.8,
"companyRatingCount": 4,
"companyRecommendedPercent": 42,
"companyRatingBreakdown": { "workLifeBalance": 3, "careerOpportunity": 2, "executiveManagement": 1.8, "workEnvironment": 2, "perksAndBenefits": 1.5, "diversity": 1.5 },
"companyReviewsAISummary": "Employees appreciate the great reception and management staff…",
"companyReviewsTotal": 4,
"companyReviews": [
{ "title": "Great team, tough workload", "jobTitle": "Registered Nurse", "rating": 2, "pros": "…", "cons": "…", "recommended": false, "employmentStatus": "2 to 3 years in the role, former employee", "date": "18 May 2026" }
],
"companySalaryUpdatedAt": "2 Jul 2026",
"companySalaryRoleCount": 72,
"companySalaryRanges": [
{ "role": "Administration Officer", "salaryRange": "$60K - $77K", "basedOnJobAds": 5, "salaryType": "ANNUAL_PACKAGE", "source": "company" }
],
"isRecruitmentAgency": true,
"recruitmentAgencyReason": "name contains \"Recruitment\"",
"recruitmentAgencyMatchedBy": "name"
}
FieldNotes
advertiserIdSeek's stable advertiser ID — the key used for capping and agency caching
salaryThe advertiser's own stated salary. Many listings have none, and nothing is invented
workArrangementRemote / Hybrid / On-site, when the advertiser set it
email / phoneOnly when stated in the ad text — see the coverage note above
recruiterName / recruiterPhoto / recruiterProfileUrlThe "About the recruiter" card, when the recruiter has an opted-in Seek profile
companySeekUrlThe employer's page on Seek, e.g. au.seek.com/companies/baptcare-434578
companyWebsiteThe employer's own website — not their Seek page
companyIndustry / companySize / companyAddressFrom the employer's Seek profile: "Social & Welfare Services", "More than 10,000 employees", "Level 1, 1193 Toorak Road Camberwell."
companySpecialitiesThe employer's stated specialities, as its own field rather than mixed into the description
companyDescription / companyLogoProfile overview text and logo
isRecruitmentAgencytrue / false, or null when it could not be judged

Use cases

  • Recruiting & sourcing — monitor roles across APAC with agencies filtered out, so you only see employers hiring directly
  • Lead generation — advertiser names, company pages and any stated contacts, pushed into Clay or your CRM by webhook
  • Market research — salary bands, remote/hybrid split, and hiring volume by classification across 8 countries
  • Job boards — feed fresh listings with full descriptions into your product

Notes

  • Salary is only present when the advertiser published one. This actor reports what is stated and never estimates.
  • Each search is capped at 500 results by Seek. Split by location or keyword to gather more.
  • Export as CSV, Excel or JSON from the dataset tab, or via the Apify API.