SEEK Jobs Scraper - Australia and New Zealand Jobs
Pricing
from $0.78 / 1,000 seek jobs
SEEK Jobs Scraper - Australia and New Zealand Jobs
Scrape SEEK jobs in Australia and New Zealand. SEEK lets advertisers type the pay in free text, so the label is kept as written, with min and max parsed out where there are numbers. Each row has the title, company, location, remote or on-site, type, date and link. $0.81 per 1,000 jobs.
Pricing
from $0.78 / 1,000 seek jobs
Rating
0.0
(0)
Developer
Dami's Studio
Maintained by CommunityActor stats
0
Bookmarked
4
Total users
4
Monthly active users
3 days ago
Last modified
Categories
Share
Scrape SEEK jobs in Australia and New Zealand, with the pay exactly as the advertiser wrote it: search by keyword and location and get one row per job with the title, company, where it is, whether it is remote, hybrid or on-site, employment type, the posting date, the teaser and the link. No login, no cookies, no API key.
Salary is the part worth understanding before you build a report on it. SEEK lets the advertiser
type the pay in free text, so one search comes back with $130K - $160K + Super sitting next to
Rewarding hourly rates $$$. The label is kept exactly as written, and salaryMin and salaryMax
are pulled out of it when there are numbers to pull.
| Input | Keywords and a location, or direct SEEK job IDs and URLs |
| Output | One row per job: title, company, location, workplace, employment type, salary as written, date, teaser, link |
| Ceiling | 1,000 jobs per run |
| Account needed | None, and no SEEK login |
| Price | $0.81 per 1,000 jobs on the Free plan, a little less on paid plans. The free plan's $5 a month covers about 6,100 |
🔍 What SEEK Jobs Scraper does
One actor covers both SEEK sites. site picks AU or NZ, and the rest of the input works the
same either way.
It runs your search, pages through the results, and deduplicates on job ID. You can also hand it job IDs or job URLs directly, and those are merged with the search results rather than duplicating them.
datePosted, workTypes, workplaceTypes and salaryMin are applied to the rows after they come
back, not by SEEK. So they narrow what you receive, and a tight filter on a broad search can leave
you with far fewer rows than maxItems. Widen maxPages when that happens.
minApplicants runs after the fetch too, and it is slower. The search results carry no applicant
count, so each job that passes your other filters is checked on its own, up to twice maxItems a
run.
sortBy works the other way round. SEEK does the sorting itself, so date really starts at the
newest listing and pages back from there. SEEK also pins up to two sponsored ads to the top of every
page, whatever their age. With date they are kept but moved to where their own listingDate puts
them, so a small run can end with an older sponsored job or two.
📋 What data you get from each SEEK job
| What you get | Field |
|---|---|
| The site, SEEK's job ID and the link | site, jobId, url |
| Title and company | title, company |
| Where it is, and remote, hybrid or on-site | location, workplaceType |
| Employment type | employmentType |
| The pay as written, and the numbers parsed out of it | salary, salaryMin, salaryMax |
| When SEEK says it was posted | listingDate |
| The card's teaser and selling points | teaser, bulletPoints |
| The applicant count, when you set a minimum | applicantCount |
| A real row or not | ok, source |
▶️ How to scrape SEEK jobs
- Open SEEK Jobs Scraper and click Try for free.
- Pick SEEK site, Australia or New Zealand.
- Type your terms into Keywords and a city into Location.
- Leave Maximum jobs at 50 for a first run, then click Start.
- Download the dataset as JSON, CSV or Excel, or read it from the Apify API.
💰 How much does it cost to scrape SEEK jobs?
$0.81 per 1,000 jobs on the Free plan, less on paid plans. On the free plan, the $5 Apify gives you each month covers about 6,100 jobs.
You pay per job row delivered. Duplicates across search and direct IDs, jobs your filters removed, the sample row and diagnostic rows are all free, and switching descriptions on costs nothing extra per job. With descriptions on, a job whose details could not be read still arrives and is not charged. If you set a maximum cost for the run, it stops when that is reached.
📥 What you give it
{"site": "NZ","keywords": "data analyst","location": "Auckland","workplaceTypes": ["Remote"],"datePosted": "7days","maxItems": 100}
| Field | Default | What it is |
|---|---|---|
site | AU | AU for seek.com.au, NZ for seek.co.nz. |
keywords | none | Job title or search terms. The Console box starts at software engineer; an API call has to send its own. |
location | none | City, region or country. Leave it empty for everywhere. The Console box starts at Sydney. |
sortBy | relevance | relevance is SEEK's usual order. date gets the newest listings first. |
jobUrls | none | Public SEEK job URLs to fetch directly. |
jobIds | none | SEEK numeric job IDs to fetch directly. |
maxItems | 50 | 1 to 1,000 unique jobs. |
maxPages | 5 | 1 to 50 search pages. |
datePosted | any | today, 3days, 7days, 14days or 30days. |
workTypes | none | Employment types to keep, such as Full time or Contract/temp. |
workplaceTypes | none | Remote, Hybrid or On-site. |
salaryMin | none | Keeps only jobs whose salary was parsed and reaches this number. |
minApplicants | none | Keeps only jobs SEEK shows at least this many applicants for. Jobs with no count shown are left out. One run checks at most twice maxItems jobs, 1,000 at most, so a high minimum can return fewer rows than asked. |
includeDetails | off | Adds each job's full description, closing date and hiring company. A job whose details could not be read keeps the search card's fields, gets a detailsError, and is not charged. |
useProxyFallback | on | A second try for a request that fails. On by default. |
maxProxyRetries | 2 | 0 to 5 further tries per request. |
proxyConfiguration | none | Optional network settings. Your own servers, if you give any, are used exactly as supplied. |
Jobs given by ID or URL are looked up either way. With includeDetails on, each is filled in,
description included, and an ID SEEK does not know is left out and not charged. With it off,
each gets its title, company, location and dates without the description, and an ID SEEK does
not know still comes back as a row, with notFound: true, and is charged. A run given IDs and no
keywords reads only those jobs; add keywords to search as well.
salaryMin drops every job whose salary could not be parsed, which on SEEK is a lot of them.
Use it to shortlist, not to survey a market.
📤 What you get back
A real row from a recent run, with the teaser cut short:
{"ok": true,"site": "AU","jobId": "94483533","title": "Graduate Software Engineer","company": "Arturia AI","location": "Macquarie Park, Sydney NSW","workplaceType": "On-site","employmentType": "Full time","salary": null,"salaryMin": null,"salaryMax": null,"listingDate": "2026-09-08T03:09:03Z","teaser": "Graduate Software Engineer ...","bulletPoints": [],"url": "https://www.seek.com.au/job/94483533","source": "seek-api"}
| Field | How to read it |
|---|---|
salary | The advertiser's own wording, untouched. null when they published no pay at all, which is common. |
salaryMin, salaryMax | Parsed out of that label. The parser takes the first two numbers it finds, so a label like 3 days a week, $500 per day gives you 3 and 500. Treat salary as the truth and these two as a convenience. |
location | Several labels joined with ; when SEEK lists more than one. |
jobId | Stable. Use it as your deduplication key across runs. |
bulletPoints | The short selling points from the search card, when the advertiser wrote any. |
applicantCount | Only with minApplicants set: the applicant count SEEK showed when the job was checked. |
source | seek-api on a real job row. |
With includeDetails on, rows also carry description (plain text, one line per paragraph or
bullet), validThrough (when the ad closes), datePosted and hiringOrganization. Jobs given by ID
carry the last three either way. A job whose details could not be read carries
detailsError instead, and is not charged.
🧾 Reading the output
| Row | How to spot it | Charged |
|---|---|---|
| A job | ok: true and source: "seek-api" | yes |
| A job without its details | detailsError is set | no |
| A job ID SEEK does not know | notFound: true, only with includeDetails off | yes |
| The sample row | _sample: true | no |
| A diagnostic | ok: false and a code | no |
Filter on _sample being absent, not on ok. The sample row is ok: true and looks like a
real job in the table, which is exactly how it slips into a pipeline.
Diagnostics carry code, not errorCode:
| Code | What it means |
|---|---|
SAMPLE_INPUT | You started the run without keywords, IDs or URLs, so nothing was searched. |
BAD_INPUT | sortBy held something other than relevance or date, so nothing was searched. |
NO_RESULTS | The search ran and matched nothing, or your filters removed everything. |
NOT_SERVED | This job was not served this run. Re-run it later. Until 12 October 2026 this code was called BLOCKED. |
NETWORK | SEEK was unreachable or answered with something unreadable. Re-run it. |
TIME_LIMIT | The run reached its time limit and stopped on its own. The jobs already delivered are kept and charged as usual; give the run more time, or ask for fewer jobs, to get the rest. The run ends as failed only when the time limit stopped it before any job came back. |
💡 What people use it for
- Recruiters pricing a role against what is actually being advertised this week, reading
salaryrather than the parsed numbers. - Tracking Australian and New Zealand listings on a schedule and deduplicating on
jobId. - Tracking how many remote roles a sector is posting, using
workplaceTypesacross repeat runs. - Watching a shortlist of employers by running their name as the keyword.
🚧 What it does not do
- Australia and New Zealand only. No other SEEK market, and no other job board.
- No separate requirements or education fields. Whatever the advertiser wrote about them is in
description. - No logins, no applications. It reads public listings and does not apply to anything.
- No candidate data. Job adverts only.
- Salary parsing is rough by nature, because the source is free text. Numbers that are not pay
can end up in
salaryMin. - 1,000 jobs per run is the ceiling. For more, split by location, by keyword, or run AU and NZ separately.
- Filters run after the fetch, so a narrow filter on a broad search returns few rows unless you
raise
maxPages. - Rows land at the end of the run. If a search page fails partway through, the run finishes with a diagnostic and the jobs already collected do not arrive. Re-run it, ideally smaller.
- It is not an official SEEK tool. Dami's Studio is independent and is not affiliated with or endorsed by SEEK, or by any other company named on this page.
🧭 Which job scraper do you need?
| If you want | Use |
|---|---|
| Jobs in Australia and New Zealand, with the pay as written | This one |
| Public LinkedIn jobs by keyword and location | LinkedIn Jobs Scraper |
| Every open job at companies you name, read from their own hiring system | Career Site Jobs Scraper |
| Remote jobs, with the region the employer hires from | Remotive Jobs Scraper |
❓ Questions people ask
Do I need a SEEK account?
No. A keyword is enough.
Does it cover New Zealand?
Yes. Set site to NZ.
Why is salary null on so many rows?
Because the advertiser did not publish pay. SEEK does not require it, and a large share of listings leave it out.
Why did salaryMin cut my results in half?
It only keeps jobs whose pay could be read as numbers. Adverts that say "competitive" have nothing to compare.
How many jobs can one run return?
Up to 1,000, with the default at 50.
Can I call it from code or connect it to an AI assistant?
Yes. The API tab has ready-made code
for Python, JavaScript and the command line. For Claude, ChatGPT or another MCP client, connect
https://mcp.apify.com/?tools=fetch-actor-details,dami_studio/seek-jobs-scraper. Either way the run
happens on your Apify account at the same price.
Is scraping SEEK legal?
These are public job adverts. They can name real people, which GDPR and similar laws cover, so have a reason for collecting them, and keep to SEEK's terms and a sensible request rate. Apify's write-up on the legality of web scraping is a good place to start, and we are not lawyers.
🆘 If something breaks
Open the Issues tab on the actor page. Send the site, the keywords and the run ID. The code on
the diagnostic row usually names the problem on its own.