SEEK Jobs Scraper
Scrape SEEK jobs in Australia and New Zealand: salary ranges, workplace type and full descriptions. No login. $0.81 per 1,000, flat at every volume.
How it works
- 1Open it on Apify
Hit Run on Apify — it opens the tool in the cloud, no install.
- 2Set the inputs
Adjust
site,keywords,location(sensible defaults are pre-filled). - 3Click Run
The tool runs on Apify’s cloud and collects the data for you.
- 4Export the results
Download as JSON, CSV or Excel, or pipe straight into your app, Google Sheets, or an AI agent.
Pricing
$0.00081 per SEEK job = $0.81 per 1,000
| You are charged for | When | Price |
|---|---|---|
| SEEK job | One real, deduplicated SEEK Australia or New Zealand job result. | $0.00081 |
Pay-per-event pricing: you are billed per result, not per subscription. Billing is handled by Apify on your own account. These are the live Apify store prices, in effect since 2026-08-04, and they are what you are actually charged.
Inputs
| Field | What it does | Type |
|---|---|---|
site | Search SEEK Australia or New Zealand. | string |
keywords | Job title or search terms, for example software engineer or registered nurse. | string |
location | City, region, or country. Leave blank for all locations. | string |
sortBy | Relevance keeps SEEK's usual order. Date gets the newest listings first, sorted by SEEK itself. SEEK still puts up to two sponsored ads at the top of every results page whatever their age; with Date they are kept and moved to where their own listing date puts them. | string |
jobUrls | Public SEEK job URLs to fetch directly. Direct URLs are deduplicated with search results. | array |
jobIds | SEEK numeric job IDs to fetch directly. | array |
maxItems | Maximum unique job records returned. | integer |
maxPages | Maximum pages to request. SEEK normally returns up to 22 jobs per page. | integer |
datePosted | Optional client-side age filter. | string |
workTypes | Optional client-side employment type filters, such as Full time or Contract/temp. | array |
workplaceTypes | Optional client-side workplace filters: Remote, Hybrid, or On-site. | array |
salaryMin | Optional minimum numeric salary filter when SEEK exposes salary data. | number |
minApplicants | Optional. Keeps only jobs SEEK shows at least this many applicants for. Jobs with no count shown are left out. Each job is checked one at a time, so the run takes longer, and one run checks at most twice Maximum jobs (1,000 at most). A high minimum can return fewer jobs than you asked for. | integer |
includeDetails | Fetch each job page and add description, requirements, and structured metadata. This uses more requests. | boolean |
useProxyFallback | Retry a refused or rate-limited request through Apify Proxy. | boolean |
maxProxyRetries | Maximum fresh proxy sessions across the run after a request is blocked. | integer |
What you get
A structured dataset — each result includes fields like:
titlecompanylocationworkplaceTypeemploymentTypesalarylistingDateurlExport every run as JSON, CSV or Excel, or send it to your app, a database, Google Sheets, or an AI agent.
Related tools in Job Market Scrapers
Other ready-to-run tools in the same category — all pay-per-use on the Apify cloud.
Career Site Jobs Scraper
Scrape open jobs from a career page, a domain or a company name. Works with 10 ATS platforms. Get title, location, department and apply URL.
Internshala Scraper
Scrape Internshala internships and fresher jobs by keyword, city, category, stipend or work from home. Duration, apply-by date, openings. $0.34/1,000.
XING Jobs Scraper
Scrape XING jobs in Germany, Austria and Switzerland. Company, employment type, career level, posted date, apply URL and salary. $0.51 per 1,000 jobs.
ZipRecruiter Scraper
Scrape ZipRecruiter jobs by keyword, city, remote or salary. Exact posted dates, apply URLs, pay marked published or estimated. $0.80 per 1,000.
LinkedIn Company Employees Scraper
Find a company's employees on LinkedIn, no login. Give a company URL or name. Get name, headline, job title, location and profile URL. $1.80 per 1,000.
Indeed Jobs Scraper
Scrape Indeed jobs by keyword and location in 11 countries. Get company, salary, benefits, remote flag, employer rating and apply URL. $4.00 per 1,000.
Where this tool sits
- Categories
- Job Market Scrapers
- Platforms
- Job Boards & ATS
SEEK Jobs Scraper: jobs from Australia and New Zealand, with the pay as written
Search SEEK by keyword and location and get one row per job. 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.
includeDetails is not returning details at the moment. Rows still come back with everything the search card carries, plus a detailsError, but no description.
| Input | Keywords and a location, or direct SEEK job IDs and URLs |
| Output | One row per job |
| Ceiling | 1,000 jobs per run |
| Account needed | None, and no SEEK login |
| Price | $0.81 per 1,000 jobs, flat on every plan |
🔍 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 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. SEEK normally returns up to 22 jobs a page. |
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 | Fetches each job page for the description and structured fields. Not returning details at the moment: rows keep the search card's fields and get a detailsError. |
useProxyFallback | on | Retries a request that came back refused. Leave it on. |
maxProxyRetries | 2 | 0 to 5 retries across the run after a refusal. |
proxyConfiguration | Apify network | Optional network settings. Your own servers, if you give any, are used exactly as supplied. |
If you feed jobIds or jobUrls with includeDetails off, the row comes back holding only the ID and the URL, and it is charged. The job page is never opened, so the title and company stay null, and an ID that does not exist is billed the same as one that does. Turn descriptions on when you feed IDs directly.
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 | What it is |
|---|---|
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. |
listingDate | When SEEK says it was posted. |
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, requirements, education, experience, validThrough, datePosted and hiringOrganization, plus detailsError when that page could not be read. Detail fetching is best effort: a row stays useful when an employer's page has changed or gone.
🧾 Reading the output
Three kinds of row can land in your dataset.
| Row | How to spot it | Charged |
|---|---|---|
| A job | ok: true and source: "seek-api" | 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. |
BLOCKED | SEEK refused the request. Re-run it. |
NETWORK | SEEK was unreachable or answered with something unreadable. Re-run it. |
▶️ How to run it
1. Open SEEK Jobs Scraper and click Try for free. 2. Pick SEEK site, Australia or New Zealand. 3. Type your terms into Keywords and a city into Location. 4. Leave Maximum jobs at 50 for a first run, then click Start. 5. Download the dataset as JSON, CSV or Excel, or read it from the Apify API.
💰 How much does it cost?
$0.81 per 1,000 jobs. Flat on every Apify plan, no volume tiers.
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.
💡 What people use it for
- Recruiters pricing a role against what is actually being advertised this week, reading
salary
rather than the parsed numbers.
- Job boards pulling 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.
- Pulling full adverts with
includeDetailsto see which skills keep appearing.
🚧 What it does not do
- Australia and New Zealand only. No other SEEK market, and no other job board.
- 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.
🧭 Which jobs scraper do you need?
| If you want | Use |
|---|---|
| Jobs in Australia and New Zealand | This one |
| Jobs in Germany, Austria and Switzerland | XING Jobs Scraper |
| Jobs in Germany, Austria, the UK, the Netherlands and Belgium | StepStone Jobs Scraper |
| Jobs across 11 countries on Indeed | Indeed Jobs Scraper |
| Jobs posted on LinkedIn | LinkedIn 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.
Is scraping job listings 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 scraping and the law 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.