SEEK Jobs Scraper - Australia and New Zealand Jobs avatar

SEEK Jobs Scraper - Australia and New Zealand Jobs

Pricing

from $0.78 / 1,000 seek jobs

Go to Apify Store
SEEK Jobs Scraper - Australia and New Zealand 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

Dami's Studio

Maintained by Community

Actor stats

0

Bookmarked

3

Total users

3

Monthly active users

3 days ago

Last modified

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.

InputKeywords and a location, or direct SEEK job IDs and URLs
OutputOne row per job: title, company, location, workplace, employment type, salary as written, date, teaser, link
Ceiling1,000 jobs per run
Account neededNone, 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 getField
The site, SEEK's job ID and the linksite, jobId, url
Title and companytitle, company
Where it is, and remote, hybrid or on-sitelocation, workplaceType
Employment typeemploymentType
The pay as written, and the numbers parsed out of itsalary, salaryMin, salaryMax
When SEEK says it was postedlistingDate
The card's teaser and selling pointsteaser, bulletPoints
The applicant count, when you set a minimumapplicantCount
A real row or notok, source

▶️ How to scrape SEEK jobs

  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 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
}
FieldDefaultWhat it is
siteAUAU for seek.com.au, NZ for seek.co.nz.
keywordsnoneJob title or search terms. The Console box starts at software engineer; an API call has to send its own.
locationnoneCity, region or country. Leave it empty for everywhere. The Console box starts at Sydney.
sortByrelevancerelevance is SEEK's usual order. date gets the newest listings first.
jobUrlsnonePublic SEEK job URLs to fetch directly.
jobIdsnoneSEEK numeric job IDs to fetch directly.
maxItems501 to 1,000 unique jobs.
maxPages51 to 50 search pages.
datePostedanytoday, 3days, 7days, 14days or 30days.
workTypesnoneEmployment types to keep, such as Full time or Contract/temp.
workplaceTypesnoneRemote, Hybrid or On-site.
salaryMinnoneKeeps only jobs whose salary was parsed and reaches this number.
minApplicantsnoneKeeps 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.
includeDetailsoffAdds 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.
useProxyFallbackonA second try for a request that fails. On by default.
maxProxyRetries20 to 5 further tries per request.
proxyConfigurationnoneOptional 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"
}
FieldHow to read it
salaryThe advertiser's own wording, untouched. null when they published no pay at all, which is common.
salaryMin, salaryMaxParsed 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.
locationSeveral labels joined with ; when SEEK lists more than one.
jobIdStable. Use it as your deduplication key across runs.
bulletPointsThe short selling points from the search card, when the advertiser wrote any.
applicantCountOnly with minApplicants set: the applicant count SEEK showed when the job was checked.
sourceseek-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

RowHow to spot itCharged
A jobok: true and source: "seek-api"yes
A job without its detailsdetailsError is setno
A job ID SEEK does not knownotFound: true, only with includeDetails offyes
The sample row_sample: trueno
A diagnosticok: false and a codeno

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:

CodeWhat it means
SAMPLE_INPUTYou started the run without keywords, IDs or URLs, so nothing was searched.
BAD_INPUTsortBy held something other than relevance or date, so nothing was searched.
NO_RESULTSThe search ran and matched nothing, or your filters removed everything.
NOT_SERVEDThis job was not served this run. Re-run it later. Until 12 October 2026 this code was called BLOCKED.
NETWORKSEEK was unreachable or answered with something unreadable. Re-run it.
TIME_LIMITThe 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 salary rather 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 workplaceTypes across 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 wantUse
Jobs in Australia and New Zealand, with the pay as writtenThis one
Public LinkedIn jobs by keyword and locationLinkedIn Jobs Scraper
Every open job at companies you name, read from their own hiring systemCareer Site Jobs Scraper
Remote jobs, with the region the employer hires fromRemotive 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.

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.