SEEK Jobs Scraper: Australian Job Listings in Python
How to pull SEEK.com.au job listings by keyword, location, work type and salary band in Python: title, company, salary range, apply link, no login or API key.
The actor referenced in this article. Pay only for results delivered.
SEEK is the dominant job board in Australia and New Zealand, which makes it the default dataset for anything involving the Australian labour market: salary benchmarking, hiring demand by region, competitor headcount signals, or building a niche job aggregator.
There is no open SEEK API for reading listings. The partner APIs exist for posting jobs and for approved ATS integrations, not for pulling the board. So the practical options are a browser automation script you maintain yourself, or a scraper that already handles pagination and deduplication.
Try it live: SEEK Jobs Scraper: Australia Job Listings API. Pay per result delivered. Failed and empty results are never charged.
The SEEK Jobs Scraper queries SEEK’s own search backend rather than rendering pages, so it returns structured JSON in seconds. A recent run pulled 41 listings in under eight seconds.
What you get per listing
| Field | Notes |
|---|---|
title | Job title as advertised |
company | Advertiser name, absent on confidential listings |
location | Suburb and state as SEEK classifies it |
salary_min, salary_max | Parsed from the advertised range where present |
salary_text | The raw advertised string, so you can audit the parse |
work_type | Full time, part time, contract, casual |
listed_at | Publication date |
apply_url | Direct link to the listing |
keyword, where | The query that produced the row, useful when you run many |
Filtering
The four filters map onto SEEK’s own search parameters:
keywords: an array, so one run can cover several roleswhere: a location string such asSydney NSW,Melbourne VICorAll AustraliaworkType: restrict to full time, contract and so onsalaryMinandsalaryMax: an advertised salary band
Passing several keywords in one run is cheaper than several runs, and results are deduplicated on SEEK’s own job id across the whole run, so a listing matching two of your keywords is delivered and charged once.
A salary benchmarking example
from apify_client import ApifyClient
from statistics import median
client = ApifyClient("YOUR_APIFY_TOKEN")
run = client.actor("themineworks/seek-jobs-scraper").call(run_input={
"keywords": ["data engineer", "analytics engineer"],
"where": "Sydney NSW",
"workType": "full time",
"maxJobsPerKeyword": 200,
})
mids = []
for job in client.dataset(run["defaultDatasetId"]).iterate_items():
if job.get("_type") == "summary":
continue
lo, hi = job.get("salary_min"), job.get("salary_max")
if lo and hi:
mids.append((lo + hi) / 2)
print(f"{len(mids)} listings with advertised salary")
print(f"median advertised midpoint: ${median(mids):,.0f}")
Only a subset of listings advertise a salary, so report the count alongside the median. A median drawn from eleven listings is a very different claim from one drawn from three hundred.
Where it stops
The actor stops a keyword after two consecutive pages with nothing new, and caps at 100 pages. That matters because SEEK’s search does not usefully paginate into the deep tail: past a few thousand results the same listings recycle. Stopping early is what keeps a run fast and keeps you from paying for duplicates.
Pricing
Pay per job delivered, from $0.70 per 1,000 on higher Apify plans and $0.85 per 1,000 on the free plan. Duplicates are filtered before billing, and a keyword that returns nothing is never charged.
Use it from an AI agent
https://mcp.apify.com/?tools=themineworks/seek-jobs-scraper
An agent can then answer questions like “what does a mid level data engineer in Melbourne advertise at” directly.
Related
- LinkedIn Jobs Scraper for the same roles on LinkedIn
- Indeed Scraper for broader coverage outside SEEK’s markets
- ATS Jobs Scraper to read employer career pages directly
Explore the scraper referenced in this article: inputs, outputs, and pricing, then run it on Apify.
Frequently asked questions
Does SEEK have a public API? +
Not for general developers. SEEK offers partner APIs for job posting and for approved ATS integrations, but there is no open endpoint for reading listings, so anyone doing labour market analysis on SEEK data is working from scraped listings.
Does it return salary figures? +
Where the employer published them. A large share of Australian listings advertise a salary range, and those are parsed into structured fields. Listings without a stated salary return the other fields and leave salary absent rather than inventing a number.
Can I scrape New Zealand listings too? +
Yes. SEEK covers Australia and New Zealand, and the location field accepts either, for example Auckland or All New Zealand.
Build a List of Funded Startups That Are Hiring on Wellfound
Turn Wellfound job listings into one row per startup with website, stage, total raised and latest round, using the Wellfound Jobs Scraper.
Compare Salary Bands in Lakhs by City and Experience on Foundit
Build a salary table for one role across Indian cities and experience bands from Foundit.in listings that publish pay, and drop the placeholder figures.
Compare Pay for a Role by Experience Level on Shine
Run one Shine.com search per experience band, keep the listings that show pay, and turn them into salary ranges in lakhs for each band.
Compare Startup Salary and Equity Ranges by Role on Wellfound
Pull Wellfound jobs for several roles and cities, then compute median salary and equity ranges per role with the Wellfound Jobs Scraper and Python.